From 616cc2fe8ce3393928a4ecb5953d6846a1397f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Wei=C3=9F?= Date: Sun, 6 Dec 2020 20:54:03 +0100 Subject: [PATCH] feat: Move to tuist as a project generation tool --- README.md | 35 +- cookiecutter.json | 6 +- hooks/post_gen_project.sh | 19 +- {{cookiecutter.projectDirectory}}/.gitignore | 113 +-- .../.swift-version | 2 + .../.swiftformat | 16 + .../.swiftlint.yml | 649 ------------------ .../.tuist-version | 1 + {{cookiecutter.projectDirectory}}/Gemfile | 2 +- {{cookiecutter.projectDirectory}}/Mintfile | 3 +- .../Project.swift | 147 ++++ {{cookiecutter.projectDirectory}}/README.md | 5 +- .../Scripts/SwiftFormatRunScript.sh | 5 + {{cookiecutter.projectDirectory}}/Setup.swift | 4 + .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/icon-ios-20@2x.png | Bin .../AppIcon.appiconset/icon-ios-20@3x.png | Bin .../AppIcon.appiconset/icon-ios-29@2x.png | Bin .../AppIcon.appiconset/icon-ios-29@3x.png | Bin .../AppIcon.appiconset/icon-ios-40@2x.png | Bin .../AppIcon.appiconset/icon-ios-40@3x.png | Bin .../AppIcon.appiconset/icon-ios-60@2x.png | Bin .../AppIcon.appiconset/icon-ios-60@3x.png | Bin .../Resources/Assets.xcassets/Contents.json | 6 + .../iOS}/Sources/AppDelegate.swift | 7 + .../iOS/Sources/Helpers}/Configuration.swift | 0 .../iOS}/Sources/SceneDelegate.swift | 13 +- .../Targets/iOS/Sources/ViewController.swift | 37 + .../Config/Configuration.xcconfig | 0 .../Config/Development.xcconfig | 0 .../Config/Production.xcconfig | 0 .../SupportingFiles/Config/Staging.xcconfig | 0 .../Tests/UITests/SupportingFiles}/Info.plist | 0 ...jectName|replace(' ', '_')}}UITests.swift} | 4 +- .../UnitTests/SupportingFiles}/Info.plist | 0 ...rojectName|replace(' ', '_')}}Tests.swift} | 4 +- .../{{cookiecutter.projectName}}Kit.h | 0 .../{{cookiecutter.projectName}}Kit.swift | 16 + .../SupportingFiles}/.gitkeep | 0 .../Tests/SupportingFiles}/Info.plist | 0 ...{{cookiecutter.projectName}}KitTests.swift | 0 .../Tuist/Config.swift | 8 + .../Project+Templates.swift | 75 ++ .../fastlane/Fastfile | 20 +- .../AppIcon-dev.appiconset/Contents.json | 106 --- .../dev-icon-ios-20@2x.png | Bin 1356 -> 0 bytes .../dev-icon-ios-20@3x.png | Bin 2124 -> 0 bytes .../dev-icon-ios-29@2x.png | Bin 2028 -> 0 bytes .../dev-icon-ios-29@3x.png | Bin 3215 -> 0 bytes .../dev-icon-ios-40@2x.png | Bin 2889 -> 0 bytes .../dev-icon-ios-40@3x.png | Bin 4485 -> 0 bytes .../dev-icon-ios-60@2x.png | Bin 4485 -> 0 bytes .../dev-icon-ios-60@3x.png | Bin 6863 -> 0 bytes .../AppIcon-staging.appiconset/Contents.json | 106 --- .../staging-icon-ios-20@2x.png | Bin 1477 -> 0 bytes .../staging-icon-ios-20@3x.png | Bin 2446 -> 0 bytes .../staging-icon-ios-29@2x.png | Bin 2272 -> 0 bytes .../staging-icon-ios-29@3x.png | Bin 3588 -> 0 bytes .../staging-icon-ios-40@2x.png | Bin 3253 -> 0 bytes .../staging-icon-ios-40@3x.png | Bin 5007 -> 0 bytes .../staging-icon-ios-60@2x.png | Bin 5007 -> 0 bytes .../staging-icon-ios-60@3x.png | Bin 7627 -> 0 bytes .../Assets/Assets.xcassets/Contents.json | 6 - .../Sources/Base.lproj/Main.storyboard | 39 -- .../iOSApplication/Sources/Generated/.gitkeep | 0 .../Helpers/Appearance/Appearance.swift | 37 - .../Helpers/Localization/Localization.swift | 20 - .../Helpers/UserDefaults/UserDefaults.swift | 84 --- .../iOSApplication/Sources/Protocols/.gitkeep | 0 .../Sources/ViewController.swift | 21 - .../iOSApplication/Sources/Views/.gitkeep | 0 .../Base.lproj/LaunchScreen.storyboard | 25 - {{cookiecutter.projectDirectory}}/project.yml | 179 ----- .../SupportingFiles/Info.plist | 24 - 74 files changed, 396 insertions(+), 1448 deletions(-) create mode 100644 {{cookiecutter.projectDirectory}}/.swift-version create mode 100644 {{cookiecutter.projectDirectory}}/.swiftformat delete mode 100644 {{cookiecutter.projectDirectory}}/.swiftlint.yml create mode 100644 {{cookiecutter.projectDirectory}}/.tuist-version create mode 100644 {{cookiecutter.projectDirectory}}/Project.swift create mode 100755 {{cookiecutter.projectDirectory}}/Scripts/SwiftFormatRunScript.sh create mode 100644 {{cookiecutter.projectDirectory}}/Setup.swift rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-20@2x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-20@3x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-29@2x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-29@3x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-40@2x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-40@3x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-60@2x.png (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Assets => Targets/iOS/Resources}/Assets.xcassets/AppIcon.appiconset/icon-ios-60@3x.png (100%) create mode 100644 {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/Contents.json rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/Sources/AppDelegate.swift (91%) rename {{cookiecutter.projectDirectory}}/{iOSApplication/Sources/Helpers/Configuration => Targets/iOS/Sources/Helpers}/Configuration.swift (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/Sources/SceneDelegate.swift (82%) create mode 100644 {{cookiecutter.projectDirectory}}/Targets/iOS/Sources/ViewController.swift rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/SupportingFiles/Config/Configuration.xcconfig (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/SupportingFiles/Config/Development.xcconfig (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/SupportingFiles/Config/Production.xcconfig (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplication => Targets/iOS}/SupportingFiles/Config/Staging.xcconfig (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplicationTests => Targets/iOS/Tests/UITests/SupportingFiles}/Info.plist (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplicationUITests/{{cookiecutter.projectName}}UITests.swift => Targets/iOS/Tests/UITests/{{cookiecutter.projectName|replace(' ', '_')}}UITests.swift} (89%) rename {{cookiecutter.projectDirectory}}/{iOSApplicationUITests => Targets/iOS/Tests/UnitTests/SupportingFiles}/Info.plist (100%) rename {{cookiecutter.projectDirectory}}/{iOSApplicationTests/{{cookiecutter.projectName}}Tests.swift => Targets/iOS/Tests/UnitTests/{{cookiecutter.projectName|replace(' ', '_')}}Tests.swift} (87%) rename {{cookiecutter.projectDirectory}}/{{{cookiecutter.projectName}}Kit => Targets/{{cookiecutter.projectName}}Kit/Sources}/{{cookiecutter.projectName}}Kit.h (100%) create mode 100644 {{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.swift rename {{cookiecutter.projectDirectory}}/{iOSApplication/Sources/Extensions => Targets/{{cookiecutter.projectName}}Kit/SupportingFiles}/.gitkeep (100%) rename {{cookiecutter.projectDirectory}}/{{{cookiecutter.projectName}}KitTests => Targets/{{cookiecutter.projectName}}Kit/Tests/SupportingFiles}/Info.plist (100%) rename {{cookiecutter.projectDirectory}}/{{{cookiecutter.projectName}}KitTests => Targets/{{cookiecutter.projectName}}Kit/Tests}/{{cookiecutter.projectName}}KitTests.swift (100%) create mode 100644 {{cookiecutter.projectDirectory}}/Tuist/Config.swift create mode 100644 {{cookiecutter.projectDirectory}}/Tuist/ProjectDescriptionHelpers/Project+Templates.swift delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/Contents.json delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-20@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-20@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-29@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-29@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-40@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-40@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/Contents.json delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-29@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-29@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-40@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-40@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@2x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@3x.png delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/Contents.json delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Base.lproj/Main.storyboard delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Generated/.gitkeep delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Appearance/Appearance.swift delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Localization/Localization.swift delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/UserDefaults/UserDefaults.swift delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Protocols/.gitkeep delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/ViewController.swift delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Views/.gitkeep delete mode 100644 {{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Base.lproj/LaunchScreen.storyboard delete mode 100644 {{cookiecutter.projectDirectory}}/project.yml delete mode 100644 {{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/SupportingFiles/Info.plist diff --git a/README.md b/README.md index ba620b6..ca6bf7a 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ # iOS-Starter -![version](https://img.shields.io/badge/version-v0.5.1-green) +![version](https://img.shields.io/badge/version-v1.0.0-green) This is a template project for boostrapping iOS applications ## Prequisites -Install [cookiecutter](https://cookiecutter.readthedocs.io/en/latest/index.html),[XcodeGen](https://github.com/yonaskolb/XcodeGen) and [Mint](https://github.com/yonaskolb/Mint) in order to create a new project from this template: +Install [cookiecutter](https://cookiecutter.readthedocs.io/en/latest/index.html),[tuist](https://github.com/tuist/tuist) and [Mint](https://github.com/yonaskolb/Mint) in order to create a new project from this template: ```sh brew install cookiecutter -brew install xcodegen +bash <(curl -Ls https://install.tuist.io) brew install mint ``` @@ -25,7 +25,7 @@ cookiecutter https://github.com/alexanderwe/ios-starter.git - Apple Developer Team details - other details necessary for the project - `cookiecutter` will create all necessary files -- `XcodeGen` runs and automatically creates a `.xcodeproj` file +- `tuist` runs and automatically creates a `.xcodeproj` file - Afterwards `mint bootstratp` will run to download all necessary build tools - Finally `Xcode` will launch your new project - All code dependencies are managed with the `Swift Package Manager` @@ -36,45 +36,44 @@ cookiecutter https://github.com/alexanderwe/ios-starter.git - Logging Helper - [LoggingKit](https://github.com/alexanderwe/LoggingKit) - A small micro-framework for logging - Code Style - - [SwiftLint](https://www.github.com/realm/SwiftLint) - Common linting rules -- Helpers - - [Rswift](https://github.com/mac-cain13/R.swift) - Type safe access to string resources + - [swiftformat](https://github.com/nicklockwood/SwiftFormat) - Format and lint your source code + ## Structure -The structure of the template project tries to follow the idea in [this article](https://theswiftdev.com/2016/07/06/conventions-for-xcode/) from `The.Swift.Dev` +The structure of the template project tries to follow the idea of having a directory for each of your target. In each of these targets you can find it sources and the corresponding tests. External dependencies are managed via `Swift Package Manager`. Therefore it is mandatory to use **Xcode 11**. ### External build tools -External build tools like `swiftlint` and `R.swift` are managed by `Mint` This is necessary because the `Swift Package Manager` is not handling binaries, and therefore `Mint` is doing this job for us. +External build tools like `swiftformat` are managed by `Mint`. ### Modules The project is divided into several modules: -- `iOSApplication` - Contains UI code, navigation flows, views if used for SwiftUI or view controllers when UIKit is used -- `iOSApplicationTests` - Unit tests for the iOS application -- `iOSApplicationUITests` - UI tests for the iOS application +- `iOS` - Contains UI code, navigation flows, views if used for SwiftUI or view controllers when UIKit is used +- `Tests iOS` - Unit tests for the iOS application +- `UI Tests iOS` - UI tests for the iOS application - `Kit` - Source files for your service layer or generally speaking files that could be reused for example for an macOS or watchOS target -- `KitTests` - Unit test for the `Kit` target +- `Kit Tests` - Unit test for the `Kit` target ### Schemes -In general each target has its own scheme but the `iOSApplication` target has three: +In general each target has its own scheme but the `iOS` target has three: - development - staging - production -Each scheme is used in combination with the files located in `iOSApplication/SupportingFiles/Config`. There you can find four different files. Three for each scheme and one which contains the values for the active configuration. Each scheme has a `pre-build` action which copies the content from one of "release type" configs to `Configuration.xcconfig` which is then used when the app is running. +Each scheme is used in combination with the files located in `Targets/iOS/SupportingFiles/Config`. There you can find four different files. Three for each scheme and one which contains the values for the active configuration. Each scheme has a `pre-build` action which copies the content from one of "release type" configs to `Configuration.xcconfig` which is then used when the app is running. So for example if you are running the `iOS Applcation staging` scheme, the content of the `Staging.xcconfig` file is copied over to `Configuration.xcconfig` and can then be used within the app. Currently this mechanism is used to change the app identifier and set some environment variable. This can be extended to for example use different backend urls for different schemes. -If you want to access one of the variables you declare inside the `.xcconfig` files you need to make them accessible to the app by putting them into the `iOSApplication/Sources/SupportingFiles/Info.plist` file. As an example you can have a look at the `_ServerEnvironment` variable which is later accessed within the `ViewController`. +If you want to access one of the variables you declare inside the `.xcconfig` files you need to make them accessible to the app by putting them into the `Derived/InfoPlists/` file. As an example you can have a look at the `_ServerEnvironment` variable which is later accessed within the `ViewController`. #### External configuration files @@ -88,7 +87,7 @@ The mechanism described above can also be used for external configuration files. Inside the `pre-build` actions for the different schemes you copy the content of the corresponding file to `GoogleService-Info.plist` which is then used by your Google frameworks in the app. Such an `pre-build` command could like like the following. ```sh -cp -f "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Firebase/GoogleService-Info.development.plist" "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Firebase/GoogleService-Info.plist" +cp -f "${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Firebase/GoogleService-Info.development.plist" "${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Firebase/GoogleService-Info.plist" ``` ### UIKit or SwiftUI @@ -112,7 +111,7 @@ The template uses [fastlane](https://fastlane.tools) for CI/CD. It comes with a Be sure to run `bundle install` first and then execute fastlane through `bundle exec`. ```sh -bundle exec fastlane run tests +bundle exec fastlane tests ``` ### Included Actions diff --git a/cookiecutter.json b/cookiecutter.json index 70482da..fbaf294 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -1,13 +1,11 @@ { "projectName": "Example", - "projectDirectory": "{{cookiecutter.projectName|lower|replace(' ', '-')}}-ios", + "projectDirectory": "{{cookiecutter.projectName|lower|replace(' ', '-')}}", "teamId": "TeamID", "teamName": "TeamName", "companyName": "CompanyName", "bundleIdentifier": "com.example.{{cookiecutter.projectName|lower|replace(' ', '-')}}", - "deploymentTarget": "13.0", - "runMintBootstrap": "y", - "runXcodeGen": "y", + "deploymentTarget": "14.0", "gitRepository": "https://github.com/alexanderwe/ios-starter.git", "_copy_without_render": [ "*.tpl.md" diff --git a/hooks/post_gen_project.sh b/hooks/post_gen_project.sh index 1cdd582..1e23cb9 100644 --- a/hooks/post_gen_project.sh +++ b/hooks/post_gen_project.sh @@ -1,23 +1,14 @@ #! /bin/bash -# Run xcodegen to create .xcodeproj file -{%- if cookiecutter.runXcodeGen == 'y' %} - xcodegen -{%- endif %} - -# Install Mint dependecies -{%- if cookiecutter.runMintBootstrap == 'y' %} - mint bootstrap -{%- endif %} - -# If xcodegen has generated a .xcodeproj file we want to open it -{%- if cookiecutter.runXcodeGen == 'y' %} - xed . -{%- endif %} +# Run tuist to create .xcodeproj file +tuist generate # Set up git git init +# If tuist has generated a .xcodeproj file we want to open it +xed . + ## Configure git hooks chmod +x ./.githooks/commit-msg git config core.hooksPath .githooks diff --git a/{{cookiecutter.projectDirectory}}/.gitignore b/{{cookiecutter.projectDirectory}}/.gitignore index ff6dfbe..c8512da 100644 --- a/{{cookiecutter.projectDirectory}}/.gitignore +++ b/{{cookiecutter.projectDirectory}}/.gitignore @@ -1,27 +1,10 @@ -# Custom ignores - -*.generated.swift - - - -# Created by https://www.gitignore.io/api/xcode,swift,macos,swiftpm,cocoapods,swiftpackagemanager -# Edit at https://www.gitignore.io/?templates=xcode,swift,macos,swiftpm,cocoapods,swiftpackagemanager - -### CocoaPods ### -## CocoaPods GitIgnore Template - -# CocoaPods - Only use to conserve bandwidth / Save time on Pushing -# - Also handy if you have a large number of dependant pods -# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE -Pods/ - ### macOS ### # General .DS_Store .AppleDouble .LSOverride -# Icon must end with two \r +# Icon must end with two Icon # Thumbnails @@ -43,16 +26,22 @@ Network Trash Folder Temporary Items .apdisk -### Swift ### +### Xcode ### # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore -## Build generated +## 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/ - -## Various settings +*.moved-aside *.pbxuser !default.pbxuser *.mode1v3 @@ -61,84 +50,18 @@ DerivedData/ !default.mode2v3 *.perspectivev3 !default.perspectivev3 -xcuserdata/ - -## Other -*.moved-aside -*.xccheckout -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa -*.dSYM.zip -*.dSYM -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -# Package.resolved -.build/ - -# CocoaPods -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# Pods/ -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace - -# Carthage -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# Accio dependency management -Dependencies/ -.accio/ - -# fastlane -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output - -# Code Injection -# After new code Injection tools there's a generated folder /iOSInjectionProject -# https://github.com/johnno1962/injectionforxcode - -iOSInjectionProject/ - -### Xcode ### -# Xcode -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## User settings - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) - -## Xcode Patch +### Xcode Patch ### *.xcodeproj/* !*.xcodeproj/project.pbxproj !*.xcodeproj/xcshareddata/ !*.xcworkspace/contents.xcworkspacedata /*.gcno -### Xcode Patch ### -**/xcshareddata/WorkspaceSettings.xcsettings - -# End of https://www.gitignore.io/api/xcode,swift,macos,swiftpm,cocoapods,swiftpackagemanager +### Projects ### +*.xcodeproj +*.xcworkspace +### Tuist derived files ### +graph.dot +Derived/ diff --git a/{{cookiecutter.projectDirectory}}/.swift-version b/{{cookiecutter.projectDirectory}}/.swift-version new file mode 100644 index 0000000..5fbc5b2 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/.swift-version @@ -0,0 +1,2 @@ + +5.3 \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/.swiftformat b/{{cookiecutter.projectDirectory}}/.swiftformat new file mode 100644 index 0000000..48acc3b --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/.swiftformat @@ -0,0 +1,16 @@ +# format options +--indent tab +--tabwidth 4 + +# Enabled rules +--rules duplicateImports +--rules elseOnSameLine +--rules emptyBraces +--rules hoistPatternLet +--rules redundantParens + + +# Disabled rules +--disable indent #Rationale: Until decided, too many false positives +--disable redundantType #Rationale: Sometimes it makes the code easier to understand to explicitly declare the type, even if its obvious for the compiler +--disable redundantReturn #Rationale: Omitting the `return` keyword is a new feature in Swift 5.3. It could be confusing for new developers to omit it diff --git a/{{cookiecutter.projectDirectory}}/.swiftlint.yml b/{{cookiecutter.projectDirectory}}/.swiftlint.yml deleted file mode 100644 index 04d232e..0000000 --- a/{{cookiecutter.projectDirectory}}/.swiftlint.yml +++ /dev/null @@ -1,649 +0,0 @@ -disabled_rules: # rule identifiers to exclude from running - # Rationale: Xcode auto indentation can cause this warning - # https://github.com/realm/SwiftLint/blob/master/Rules.md#closure-end-indentation - - closure_end_indentation - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#cyclomatic-complexity - - cyclomatic_complexity - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-object-literal - - discouraged_object_literal - - # Rationale: Current implementation triggers on system APIs. Disabling until rule is configurable to fix this. An optional collection can have two "empty" states: nil and empty. If nil and empty are to mean different things, consider modeling it differently using an enum with associated values. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-optional-collection - - discouraged_optional_collection - - # Rationale: Doesn't really add any clarity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-acl - - explicit_acl - - # Rationale: Heavy handed in telling someone how to code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-enum-raw-value - - explicit_enum_raw_value - - # Rationale: Doesn't really add any clarity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-top-level-acl - - explicit_top_level_acl - - # Rationale: We don't want to fight the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-type-interface - - explicit_type_interface - - # Rationale: Unclear on what it enforces - # https://github.com/realm/SwiftLint/blob/master/Rules.md#extension-access-modifier - - extension_access_modifier - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#file-line-length - - file_length - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#function-body-length - - function_body_length - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#function-parameter-count - - function_parameter_count - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#generic-type-name - - generic_type_name - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#identifier-name - - identifier_name - - # Rationale: Being consise and not fighting the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#implicit-return - - implicit_return - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#large-tuple - - large_tuple - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#variable-declaration-whitespace - - let_var_whitespace - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#line-length - - line_length - - # Rationale: Xcode auto indentation can cause this warning - # https://github.com/realm/SwiftLint/blob/master/Rules.md#literal-expression-end-indentation - - literal_expression_end_indentation - - # Rationale: Functions with parameters followed by multiple closures trigger this warning when placed on separate lines. The default Xcode formatting for this behavior is inconsistent, and auto indentation is poor. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-arguments - - multiline_arguments - - # Rationale: Functions with closures followed by a parenthesis trigger this warning. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-arguments-brackets - - multiline_arguments_brackets - - # Rationale: Arbitrary restriction. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-literal-brackets - - multiline_literal_brackets - - # Rationale: Arbitrary restriction. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-parameters-brackets - - multiline_parameters_brackets - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#nesting - - nesting - - # Rationale: We don't use nimble - # https://github.com/realm/SwiftLint/blob/master/Rules.md#nimble-operator - - nimble_operator - - # Rationale: Protocol conformance can require public declaration - # https://github.com/realm/SwiftLint/blob/master/Rules.md#no-extension-access-modifier - - no_extension_access_modifier - - # Rationale: Heavy handed in telling someone how to program a specific way - # https://github.com/realm/SwiftLint/blob/master/Rules.md#no-grouping-extension - - no_grouping_extension - - # Rationale: Unintuitive - # https://github.com/realm/SwiftLint/blob/master/Rules.md#number-separator - - number_separator - - # Rationale: Doesn't really add anything other than telling someone how to code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#object-literal - - object_literal - - # Rationale: Old outdated convention - # https://github.com/realm/SwiftLint/blob/master/Rules.md#prefixed-top-level-constant - - prefixed_toplevel_constant - - # Rationale: We don't use Quick - # https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-call - - quick_discouraged_call - - # Rationale: We don't use Quick - # https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-focused-test - - quick_discouraged_focused_test - - # Rationale: We don't use Quick - # https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-pending-test - - quick_discouraged_pending_test - - # Rationale: There are cases where you may want to declare the string enum value explicitly - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-string-enum-value - - redundant_string_enum_value - - # Rationale: Do not require a deinit function, as it is not always necessary. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#required-deinit - - required_deinit - - # Rationale: Provides no value - # https://github.com/realm/SwiftLint/blob/master/Rules.md#sorted-imports - - sorted_imports - - # Rationale: Usage of proper access level - # https://github.com/realm/SwiftLint/blob/master/Rules.md#strict-fileprivate - - strict_fileprivate - - # Rationale: Doesn't really add anything other than telling someone how to code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#switch-case-on-newline - - switch_case_on_newline - - # Rationale: Naming the parameters can be important for clarity in some instances - # https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-closure - - trailing_closure - - # Rationale: Xcode auto indentation can cause this warning - # https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-whitespace - - trailing_whitespace - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#type-body-length - - type_body_length - - # Rationale: Arbitrary restriction - # https://github.com/realm/SwiftLint/blob/master/Rules.md#type-name - - type_name - - # Rationale: For typed parameters in closures, parentheses are required by swift, making this rule inherently inconsistent. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unneeded-parentheses-in-closure-argument - - unneeded_parentheses_in_closure_argument - - # Rationale: Custom rule overrides to allow todos when issue links are provided. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#todo - - todo - - # Rationale: Allows for more readable code when defining new properties or functions on types. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-whitespace-after-opening-braces - - vertical_whitespace_opening_braces - - # Rationale: Unnecessary whitespace. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-whitespace-between-cases - - vertical_whitespace_between_cases - - # Rationale: Allow using XCTest functions as defined by the framework. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#xctest-specific-matcher - - xct_specific_matcher - - # Rationale: Arbitrary restriction. The default bundle will be suitable for most projects. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#nslocalizedstring-require-bundle - - nslocalizedstring_require_bundle - - # Rationale: The current rule set does not allow for enforcement of our preferred ordering (namely, private classes at the bottom of the file). - # https://github.com/realm/SwiftLint/blob/master/Rules.md#file-types-order - - file_types_order - - # Rationale: The benefit of this rule is a minor performance improvement, at the potential cost of legibility. Leave up to the developer's discrection. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#reduce-into - - reduce_into - -opt_in_rules: # some rules are only opt-in - # Rationale: When using map, we think of it being used to transform a current array into something else - # https://github.com/realm/SwiftLint/blob/master/Rules.md#array-init - - array_init - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#attributes - - attributes - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#block-based-kvo - - block_based_kvo - - # Rationale: Prevents retain cycles - # https://github.com/realm/SwiftLint/blob/master/Rules.md#class-delegate-protocol - - class_delegate_protocol - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#closing-brace-spacing - - closing_brace - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#closure-parameter-position - - closure_parameter_position - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#closure-spacing - - closure_spacing - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#colon - - colon - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#comma-spacing - - comma - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#compiler-protocol-init - - compiler_protocol_init - - # Rationale: Encourages usage of assertion failures and thinking about what you are returning - # https://github.com/realm/SwiftLint/blob/master/Rules.md#conditional-returns-on-newline - - conditional_returns_on_newline - - # Rationale: A more clear and consise way to check if something exists - # https://github.com/realm/SwiftLint/blob/master/Rules.md#contains-over-first-not-nil - - contains_over_first_not_nil - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#control-statement - - control_statement - - # Rationale: Encourages proper memory practices - # https://github.com/realm/SwiftLint/blob/master/Rules.md#discarded-notification-center-observer - - discarded_notification_center_observer - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-direct-initialization - - discouraged_direct_init - - # Rationale: A nil bool is a tri-state variable which can be modeled more clearly - # https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-optional-boolean - - discouraged_optional_boolean - - # Rationale: Imports are not required more than once. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#duplicate-imports - - duplicate_imports - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#dynamic-inline - - dynamic_inline - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-count - - empty_count - - # Rationale: Provides consistency in coding style and brevity. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-enum-arguments - - empty_enum_arguments - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-parameters - - empty_parameters - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-parentheses-with-trailing-closure - - empty_parentheses_with_trailing_closure - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-string - - empty_string - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-init - - explicit_init - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#fallthrough - - fallthrough - - # Rationale: Encourages better documentation - # https://github.com/realm/SwiftLint/blob/master/Rules.md#fatal-error-message - - fatal_error_message - - # Rationale: Provides consistency - # https://github.com/realm/SwiftLint/blob/master/Rules.md#file-header - - file_header - - # Rationale: Encourages using the right API to solve a problem - # https://github.com/realm/SwiftLint/blob/master/Rules.md#first-where - - first_where - - # Rationale: Encourages using the right API to solve a problem - # https://github.com/realm/SwiftLint/blob/master/Rules.md#for-where - - for_where - - # Rationale: Prevents coder error, doesn't crash, makes coder be explicit about their assumptions - # https://github.com/realm/SwiftLint/blob/master/Rules.md#force-cast - - force_cast - - # Rationale: Prevents coder error, doesn't crash, makes coder be explicit about their assumptions - # https://github.com/realm/SwiftLint/blob/master/Rules.md#force-try - - force_try - - # Rationale: Prevents coder error, doesn't crash, makes coder be explicit about their assumptions - # https://github.com/realm/SwiftLint/blob/master/Rules.md#force-unwrapping - - force_unwrapping - - # Rationale: Provides consistency in coding style and brevity. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#implicit-getter - - implicit_getter - - # Rationale: Prevents coder error, doesn't crash, makes coder be explicit about their assumptions - # https://github.com/realm/SwiftLint/blob/master/Rules.md#implicitly-unwrapped-optional - - implicitly_unwrapped_optional - - # Rationale: Encourages using the right API to solve a problem - # https://github.com/realm/SwiftLint/blob/master/Rules.md#is-disjoint - - is_disjoint - - # Rationale: Provides clarity and consistency by using the default parameter - # https://github.com/realm/SwiftLint/blob/master/Rules.md#joined-default-parameter - - joined_default_parameter - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#last-where - - last_where - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#leading-whitespace - - leading_whitespace - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-cggeometry-functions - - legacy_cggeometry_functions - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-constant - - legacy_constant - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-constructor - - legacy_constructor - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-hashing - - legacy_hashing - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-nsgeometry-functions - - legacy_nsgeometry_functions - - # Rationale: Usage of proper access level - # https://github.com/realm/SwiftLint/blob/master/Rules.md#lower-acl-than-parent - - lower_acl_than_parent - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#mark - - mark - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-parameters - - multiline_parameters - - # Rationale: Clarity of code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiple-closures-with-trailing-closure - - multiple_closures_with_trailing_closure - - # Rationale: Encourages coder best practices though language feature likely makes this obsolete - # https://github.com/realm/SwiftLint/blob/master/Rules.md#multiple-closures-with-trailing-closure - - notification_center_detachment - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#opening-brace-spacing - - opening_brace - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#operator-usage-whitespace - - operator_usage_whitespace - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#operator-function-whitespace - - operator_whitespace - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#overridden-methods-call-super - - overridden_super_call - - # Rationale: Prevents unpredictable behavior - # https://github.com/realm/SwiftLint/blob/master/Rules.md#override-in-extension - - override_in_extension - - # Rationale: Promotes consistency and reduces duplication. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#pattern-matching-keywords - - pattern_matching_keywords - - # Rationale: UI elements should only be configurable by their owners and not be exposed to others - # https://github.com/realm/SwiftLint/blob/master/Rules.md#private-actions - - private_action - - # Rationale: UI elements should only be configurable by their owners and not be exposed to others - # https://github.com/realm/SwiftLint/blob/master/Rules.md#private-outlets - - private_outlet - - # Rationale: Keep internal details from being overexposed - # https://github.com/realm/SwiftLint/blob/master/Rules.md#private-over-fileprivate - - private_over_fileprivate - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#private-unit-test - - private_unit_test - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#prohibited-calls-to-super - - prohibited_super_call - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#protocol-property-accessors-order - - protocol_property_accessors_order - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-discardable-let - - redundant_discardable_let - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-nil-coalescing - - redundant_nil_coalescing - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-objc-attribute - - redundant_objc_attribute - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-optional-initialization - - redundant_optional_initialization - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-void-return - - redundant_void_return - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#required-enum-case - - required_enum_case - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#returning-whitespace - - return_arrow_whitespace - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#shorthand-operator - - shorthand_operator - - # Rationale: There should be only XCTestCase per file - # https://github.com/realm/SwiftLint/blob/master/Rules.md#single-test-class - - single_test_class - - # Rationale: Provides consistency and clarity in coding style and is less code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#min-or-max-over-sorted-first-or-last - - sorted_first_last - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#statement-position - - statement_position - - # Rationale: Provides cleaniness of code - # https://github.com/realm/SwiftLint/blob/master/Rules.md#superfluous-disable-command - - superfluous_disable_command - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#switch-and-case-statement-alignment - - switch_case_alignment - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#syntactic-sugar - - syntactic_sugar - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-comma - - trailing_comma - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-newline - - trailing_newline - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-semicolon - - trailing_semicolon - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unneeded-break-in-switch - - unneeded_break_in_switch - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-control-flow-label - - unused_control_flow_label - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-closure-parameter - - unused_closure_parameter - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-enumerated - - unused_enumerated - - # Rationale: Provides consistency in coding style and brevity - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-optional-binding - - unused_optional_binding - - # Rationale: Avoids issues where the setter is not using the value passed in. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-setter-value - - unused_setter_value - - # Rationale: Prevents coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#valid-ibinspectable - - valid_ibinspectable - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-parameter-alignment - - vertical_parameter_alignment - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-parameter-alignment-on-call - - vertical_parameter_alignment_on_call - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-whitespace - - vertical_whitespace - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-whitespace-before-closing-braces - - vertical_whitespace_closing_braces - - # Rationale: Provides consistency in coding style and follows modern practices of the language - # https://github.com/realm/SwiftLint/blob/master/Rules.md#void-return - - void_return - - # Rationale: Avoids using weak when it has no effect. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#weak-computed-property - - weak_computed_property - - # Rationale: Prevents retain cycles and coder error - # https://github.com/realm/SwiftLint/blob/master/Rules.md#weak-delegate - - weak_delegate - - # Rationale: Encourages better documentation - # https://github.com/realm/SwiftLint/blob/master/Rules.md#xctfail-message - - xctfail_message - - # Rationale: Provides consistency in coding style - # https://github.com/realm/SwiftLint/blob/master/Rules.md#yoda-condition-rule - - yoda_condition - - # Rationale: Encourages documentation - # https://github.com/realm/SwiftLint/blob/master/Rules.md#todo - - custom_todo - - # Rationale: Provides consistency in coding style. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#reduce-boolean - - reduce_boolean - - # Rationale: == is not used for NSObject comparison, and could lead to confusion. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#nsobject-prefer-isequal - - nsobject_prefer_isequal - - # Rationale: Provides consistency of ordering within a type. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#type-contents-order - - type_contents_order - - # Rationale: Provides consistency in coding style. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unused-capture-list - - unused_capture_list - - # Rationale: Prevents issues with using unowned. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#unowned-variable-capture - - unowned_variable_capture - - # Rationale: Ensures all enums can be switched upon. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#duplicate-enum-cases - - duplicate_enum_cases - - # Rationale: Provides consistency in coding style. - # https://github.com/realm/SwiftLint/blob/master/Rules.md#legacy-multiple - - legacy_multiple - -excluded: # paths to ignore during linting. Takes precedence over `included`. - - Carthage - - Pods - - "iOSApplication/Sources/Generated/R.generated.swift" - -file_header: - required_pattern: | - \/\/ - \/\/ .*? - \/\/ .*? - \/\/ - \/\/ Created by .*? on \d{1,2}\/\d{1,2}\/(\d{2}|\d{4})\. - \/\/ Copyright (©|\(c\)) \d{4} .*?\. All rights reserved\. - \/\/ -attributes: - always_on_same_line: - ["@IBAction", "@NSManaged", "@discardableResult", "@escaping", "@objc"] - -type_contents_order: - order: - - case - - associated_type - - type_alias - - subtype - - ib_outlet - - ib_inspectable - - [type_property, instance_property] - - [ - initializer, - type_method, - view_life_cycle_method, - subscript, - other_method, - ib_action, - ] - -custom_rules: - force_https: - name: "Force HTTPS over HTTP" - regex: "((?i)http(?!s))" - match_kinds: string - message: "HTTPS should be favored over HTTP" - severity: warning diff --git a/{{cookiecutter.projectDirectory}}/.tuist-version b/{{cookiecutter.projectDirectory}}/.tuist-version new file mode 100644 index 0000000..c1af674 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/.tuist-version @@ -0,0 +1 @@ +1.19.0 \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/Gemfile b/{{cookiecutter.projectDirectory}}/Gemfile index 2db3954..41ee80c 100644 --- a/{{cookiecutter.projectDirectory}}/Gemfile +++ b/{{cookiecutter.projectDirectory}}/Gemfile @@ -1,3 +1,3 @@ source 'https://rubygems.org' do - gem 'fastlane', "2.144.0" + gem 'fastlane', "2.170.0" end \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/Mintfile b/{{cookiecutter.projectDirectory}}/Mintfile index 68fd9a0..cb38e55 100644 --- a/{{cookiecutter.projectDirectory}}/Mintfile +++ b/{{cookiecutter.projectDirectory}}/Mintfile @@ -1,2 +1 @@ -realm/SwiftLint@0.35.0 -https://github.com/mac-cain13/R.swift.git@v5.2.2 \ No newline at end of file +nicklockwood/SwiftFormat@0.47.4 \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/Project.swift b/{{cookiecutter.projectDirectory}}/Project.swift new file mode 100644 index 0000000..989b06a --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Project.swift @@ -0,0 +1,147 @@ +import ProjectDescription +//import ProjectDescriptionHelpers + +let project = Project.init( + name: "{{cookiecutter.projectName}}", + organizationName: "Kevin Chromik", + packages: [ + .package(url: "https://github.com/alexanderwe/LoggingKit", .exact("3.0.0")), + ], + targets: [ + .init(name: "{{cookiecutter.projectName}} (iOS)", + platform: .iOS, + product: .app, + productName: "{{cookiecutter.projectName|replace(' ', '_')}}", + bundleId: "$(PRODUCT_BUNDLE_IDENTIFIER)", + infoPlist: .extendingDefault(with: [ + "CFBundleShortVersionString": .string("0.0.1"), + "CFBundleVersion": .string("1"), + "CFBundleIdentifier": .string("$(PRODUCT_BUNDLE_IDENTIFIER)"), + "CFBundleDisplayName": .string("{{cookiecutter.projectName}}$(SERVER_ENVIRONMENT_SUFFIX)"), + "UIApplicationSceneManifest" : .dictionary([ + "UIApplicationSupportsMultipleScenes": .boolean(true), + "UISceneConfigurations": .dictionary([ + "UIWindowSceneSessionRoleApplication": .array([ + .dictionary([ + "UISceneConfigurationName": "Default Configuration", + "UISceneDelegateClassName":"$(PRODUCT_MODULE_NAME).SceneDelegate" + ]) + ]) + ]) + ]), + "UIApplicationSupportsIndirectInputEvents": .boolean(true), + "UILaunchScreen": .dictionary([:]), + "_ServerEnvironment": .string("$(SERVER_ENVIRONMENT)") + ]), + sources: [ + "Targets/iOS/Sources/**" + ], resources: [ + "Targets/iOS/Resources/**", + "Targets/iOS/SupportingFiles/**" + ], + actions: [ + TargetAction.pre(path: "Scripts/SwiftFormatRunScript.sh", + arguments: "", + name: "Swiftformat (LintMode)") + ], + dependencies: [ + .target(name: "{{cookiecutter.projectName}}Kit") + ], + settings: Settings( + debug: Configuration(xcconfig: "Targets/iOS/SupportingFiles/Config/Configuration.xcconfig"), + release: Configuration(xcconfig: "Targets/iOS/SupportingFiles/Config/Configuration.xcconfig") + ) + ), + .init(name: "Tests iOS", + platform: .iOS, + product: .unitTests, + productName: "Tests_iOS", + bundleId: "{{cookiecutter.bundleIdentifier}}-ios-tests", + infoPlist: .default, + sources: [ + "Targets/iOS/Tests/UnitTests/**" + ], + dependencies: [ + .target(name: "{{cookiecutter.projectName}} (iOS)") + ] + ), + .init(name: "UI Tests iOS", + platform: .iOS, + product: .uiTests, + productName: "UI_Tests_iOS", + bundleId: "{{cookiecutter.bundleIdentifier}}-ios-ui-tests", + infoPlist: .default, + sources: [ + "Targets/iOS/Tests/UITests/**" + ], + dependencies: [ + .target(name: "{{cookiecutter.projectName}} (iOS)") + ] + ), + .init(name: "{{cookiecutter.projectName}}Kit", + platform: .iOS, + product: .framework, + productName: "{{cookiecutter.projectName|replace(' ', '_')}}Kit", + bundleId: "{{cookiecutter.bundleIdentifier}}kit", + infoPlist: .default, + sources: [ + "Targets/{{cookiecutter.projectName}}Kit/Sources/**" + ], + dependencies: [ + .package(product: "LoggingKit") + ] + ), + .init(name: "{{cookiecutter.projectName}}Kit Tests", + platform: .iOS, + product: .unitTests, + productName: "Tests_{{cookiecutter.projectName|replace(' ', '_')}}Kit", + bundleId: "{{cookiecutter.bundleIdentifier}}kit-tests", + infoPlist: .default, + sources: [ + "Targets/{{cookiecutter.projectName}}Kit/Tests/**" + ], + dependencies: [ + .target(name: "{{cookiecutter.projectName}} (iOS)") + ] + ), + ], + schemes: [ + .init(name: "{{cookiecutter.projectName}} (iOS) Development", + shared: true, + buildAction: BuildAction(targets: ["{{cookiecutter.projectName}} (iOS)"], + preActions: [ + .init(scriptText: "cp -f \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Development.xcconfig\" \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Configuration.xcconfig\"", + target: "{{cookiecutter.projectName}} (iOS)" + )] + ), + testAction: TestAction(targets: ["Tests iOS", "UI Tests iOS"]), + runAction: RunAction(executable: "{{cookiecutter.projectName}} (iOS)") + ), + .init(name: "{{cookiecutter.projectName}} (iOS) Staging", + shared: true, + buildAction: BuildAction(targets: ["{{cookiecutter.projectName}} (iOS)"], + preActions: [ + .init(scriptText: "cp -f \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Staging.xcconfig\" \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Configuration.xcconfig\"", + target: "{{cookiecutter.projectName}} (iOS)" + )] + ), + testAction: TestAction(targets: ["Tests iOS", "UI Tests iOS"]), + runAction: RunAction(executable: "{{cookiecutter.projectName}} (iOS)") + ), + .init(name: "{{cookiecutter.projectName}} (iOS) Production", + shared: true, + buildAction: BuildAction(targets: ["{{cookiecutter.projectName}} (iOS)"], + preActions: [ + .init(scriptText: "cp -f \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Production.xcconfig\" \"${PROJECT_DIR}/Targets/iOS/SupportingFiles/Config/Configuration.xcconfig\"", + target: "{{cookiecutter.projectName}} (iOS)" + )] + ), + testAction: TestAction(targets: ["Tests iOS", "UI Tests iOS"]), + runAction: RunAction(executable: "{{cookiecutter.projectName}} (iOS)") + ), + .init(name: "{{cookiecutter.projectName}}Kit", + shared: true, + testAction: TestAction(targets: ["{{cookiecutter.projectName}}Kit Tests"]) + ), + ] +) diff --git a/{{cookiecutter.projectDirectory}}/README.md b/{{cookiecutter.projectDirectory}}/README.md index 369a0f7..a2c0cdf 100644 --- a/{{cookiecutter.projectDirectory}}/README.md +++ b/{{cookiecutter.projectDirectory}}/README.md @@ -4,7 +4,6 @@ - Fill the README - Initially build the project -- Add `R.generated.swift` from `iOSApplication/Sources/Generated` to the project and untick `Copy items if needed` - Delete this TODO section. (And enjoy your fresh and clean Project-setup 🙌) --- @@ -13,7 +12,7 @@ --- -⚡️ Swift: 5.1 📱 iOS {{cookiecutter.deploymentTarget}} +⚡️ Swift: 5.3 📱 iOS {{cookiecutter.deploymentTarget}} --- @@ -31,4 +30,4 @@ Where do I find API docs, wireframes, etc.? ## CI/CD -Is Bamboo set up ? +IS Ci/CD set up ? diff --git a/{{cookiecutter.projectDirectory}}/Scripts/SwiftFormatRunScript.sh b/{{cookiecutter.projectDirectory}}/Scripts/SwiftFormatRunScript.sh new file mode 100755 index 0000000..c8fa9e8 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Scripts/SwiftFormatRunScript.sh @@ -0,0 +1,5 @@ + if mint list | grep -q 'SwiftFormat'; then + mint run swiftformat --lenient --lint "$SRCROOT" +else + echo "error: SwiftFormat not installed; run 'mint bootstrap' to install" +fi \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/Setup.swift b/{{cookiecutter.projectDirectory}}/Setup.swift new file mode 100644 index 0000000..ca85ca0 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Setup.swift @@ -0,0 +1,4 @@ +import ProjectDescription +let setup = Setup([ + .mint() +]) \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-20@2x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-20@2x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-20@2x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-20@2x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-20@3x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-20@3x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-20@3x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-20@3x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-29@2x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-29@2x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-29@2x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-29@2x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-29@3x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-29@3x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-29@3x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-29@3x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-40@2x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-40@2x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-40@2x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-40@2x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-40@3x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-40@3x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-40@3x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-40@3x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-60@2x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-60@2x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-60@2x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-60@2x.png diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-60@3x.png b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-60@3x.png similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon.appiconset/icon-ios-60@3x.png rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/AppIcon.appiconset/icon-ios-60@3x.png diff --git a/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/Contents.json b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000..121dee6 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "version": 1, + "author": "xcode" + } +} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/AppDelegate.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/AppDelegate.swift similarity index 91% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Sources/AppDelegate.swift rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Sources/AppDelegate.swift index 1f0b326..22d4b1d 100644 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/AppDelegate.swift +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/AppDelegate.swift @@ -7,6 +7,8 @@ // import UIKit +import {{cookiecutter.projectName}}Kit +import LoggingKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -16,6 +18,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. + // Register log providers for the logging system + LogService.register(logProviders: OSLogProvider()) + + // Verify that target dependency is correctly resolved + {{cookiecutter.projectName}}Kit.hello() return true } diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Configuration/Configuration.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/Helpers/Configuration.swift similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Configuration/Configuration.swift rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Sources/Helpers/Configuration.swift diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/SceneDelegate.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/SceneDelegate.swift similarity index 82% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Sources/SceneDelegate.swift rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Sources/SceneDelegate.swift index dd8046f..bfe0f1f 100644 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/SceneDelegate.swift +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/SceneDelegate.swift @@ -15,10 +15,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } + guard let windowScene = (scene as? UIWindowScene) else { return } // INFO: If you want to use SwiftUI remove the line above and comment in the following lines // // Create the SwiftUI view that provides the window contents. @@ -31,6 +31,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // self.window = window // window.makeKeyAndVisible() // } + + //INFO: This is one way of initializing the when using UIKit + + let window = UIWindow(frame: windowScene.coordinateSpace.bounds) + self.window = window + window.windowScene = windowScene + let navigationController = UINavigationController(rootViewController: ViewController()) + window.rootViewController = navigationController + window.makeKeyAndVisible() } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/ViewController.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/ViewController.swift new file mode 100644 index 0000000..b04d867 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Sources/ViewController.swift @@ -0,0 +1,37 @@ +// +// ViewController.swift +// {{cookiecutter.projectName}} +// +// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. +// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. +// + +import UIKit +import LoggingKit + +class ViewController: UIViewController { + + + private lazy var label: UILabel = { + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.text = "Hello {{cookiecutter.projectName}}" + return label + + }() + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + view.addSubview(label) + + NSLayoutConstraint.activate([ + label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + label.centerXAnchor.constraint(equalTo: view.centerXAnchor) + ]) + + // Do any additional setup after loading the view. + LogService.shared.info("Welcome to your iOS starter project!", logCategory: \.default) + LogService.shared.info("Current Server environment is \(try? Configuration.value(for: "_ServerEnvironment") as String)", logCategory: \.default) + } +} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Configuration.xcconfig b/{{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Configuration.xcconfig similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Configuration.xcconfig rename to {{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Configuration.xcconfig diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Development.xcconfig b/{{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Development.xcconfig similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Development.xcconfig rename to {{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Development.xcconfig diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Production.xcconfig b/{{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Production.xcconfig similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Production.xcconfig rename to {{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Production.xcconfig diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Staging.xcconfig b/{{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Staging.xcconfig similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Config/Staging.xcconfig rename to {{cookiecutter.projectDirectory}}/Targets/iOS/SupportingFiles/Config/Staging.xcconfig diff --git a/{{cookiecutter.projectDirectory}}/iOSApplicationTests/Info.plist b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UITests/SupportingFiles/Info.plist similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplicationTests/Info.plist rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UITests/SupportingFiles/Info.plist diff --git a/{{cookiecutter.projectDirectory}}/iOSApplicationUITests/{{cookiecutter.projectName}}UITests.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UITests/{{cookiecutter.projectName|replace(' ', '_')}}UITests.swift similarity index 89% rename from {{cookiecutter.projectDirectory}}/iOSApplicationUITests/{{cookiecutter.projectName}}UITests.swift rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UITests/{{cookiecutter.projectName|replace(' ', '_')}}UITests.swift index 1a8e5d8..972e12f 100644 --- a/{{cookiecutter.projectDirectory}}/iOSApplicationUITests/{{cookiecutter.projectName}}UITests.swift +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UITests/{{cookiecutter.projectName|replace(' ', '_')}}UITests.swift @@ -1,5 +1,5 @@ // -// {{cookiecutter.projectName}}UITests.swift +// {{cookiecutter.projectName|replace(' ', '_')}}UITests.swift // {{cookiecutter.projectName}}UITests // // Created by Automated on {% now 'utc', '%d/%m/%Y' %}. @@ -8,7 +8,7 @@ import XCTest -class {{cookiecutter.projectName}}UITests: XCTestCase { +class {{cookiecutter.projectName|replace(' ', '_')}}UITests: XCTestCase { override func setUp() { super.setUp() diff --git a/{{cookiecutter.projectDirectory}}/iOSApplicationUITests/Info.plist b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UnitTests/SupportingFiles/Info.plist similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplicationUITests/Info.plist rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UnitTests/SupportingFiles/Info.plist diff --git a/{{cookiecutter.projectDirectory}}/iOSApplicationTests/{{cookiecutter.projectName}}Tests.swift b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UnitTests/{{cookiecutter.projectName|replace(' ', '_')}}Tests.swift similarity index 87% rename from {{cookiecutter.projectDirectory}}/iOSApplicationTests/{{cookiecutter.projectName}}Tests.swift rename to {{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UnitTests/{{cookiecutter.projectName|replace(' ', '_')}}Tests.swift index 13804c0..8979283 100644 --- a/{{cookiecutter.projectDirectory}}/iOSApplicationTests/{{cookiecutter.projectName}}Tests.swift +++ b/{{cookiecutter.projectDirectory}}/Targets/iOS/Tests/UnitTests/{{cookiecutter.projectName|replace(' ', '_')}}Tests.swift @@ -7,9 +7,9 @@ // import XCTest -@testable import iOSApplication +@testable import {{cookiecutter.projectName|replace(' ', '_')}} -class {{cookiecutter.projectName}}Tests: XCTestCase { +class {{cookiecutter.projectName|replace(' ', '_')}}Tests: XCTestCase { override func setUp() { // Put setup code here. This method is called before the invocation of each test method in the class. diff --git a/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/{{cookiecutter.projectName}}Kit.h b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.h similarity index 100% rename from {{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/{{cookiecutter.projectName}}Kit.h rename to {{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.h diff --git a/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.swift b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.swift new file mode 100644 index 0000000..2ef8224 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Sources/{{cookiecutter.projectName}}Kit.swift @@ -0,0 +1,16 @@ +// +// {{cookiecutter.projectName}}Kit.swift +// {{cookiecutter.projectName}}Kit +// +// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. +// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. +// + +import Foundation +import LoggingKit + +public struct {{cookiecutter.projectName}}Kit { + public static func hello() { + LogService.shared.info("Hello from {{cookiecutter.projectName}}Kit", logCategory: \.default) + } +} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Extensions/.gitkeep b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/SupportingFiles/.gitkeep similarity index 100% rename from {{cookiecutter.projectDirectory}}/iOSApplication/Sources/Extensions/.gitkeep rename to {{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/SupportingFiles/.gitkeep diff --git a/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}KitTests/Info.plist b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Tests/SupportingFiles/Info.plist similarity index 100% rename from {{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}KitTests/Info.plist rename to {{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Tests/SupportingFiles/Info.plist diff --git a/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}KitTests/{{cookiecutter.projectName}}KitTests.swift b/{{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Tests/{{cookiecutter.projectName}}KitTests.swift similarity index 100% rename from {{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}KitTests/{{cookiecutter.projectName}}KitTests.swift rename to {{cookiecutter.projectDirectory}}/Targets/{{cookiecutter.projectName}}Kit/Tests/{{cookiecutter.projectName}}KitTests.swift diff --git a/{{cookiecutter.projectDirectory}}/Tuist/Config.swift b/{{cookiecutter.projectDirectory}}/Tuist/Config.swift new file mode 100644 index 0000000..f3d5c92 --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Tuist/Config.swift @@ -0,0 +1,8 @@ +import ProjectDescription + +let config = Config( + compatibleXcodeVersions: .list(["12.0", "12.0.1", "12.1", "12.2"]), + generationOptions: [ + .disableAutogeneratedSchemes + ] +) diff --git a/{{cookiecutter.projectDirectory}}/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/{{cookiecutter.projectDirectory}}/Tuist/ProjectDescriptionHelpers/Project+Templates.swift new file mode 100644 index 0000000..2d5e9dc --- /dev/null +++ b/{{cookiecutter.projectDirectory}}/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -0,0 +1,75 @@ +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://tuist.io/docs/usage/helpers/ + +extension Project { + /// Helper function to create the Project for this ExampleApp + public static func app(name: String, platform: Platform, additionalTargets: [String]) -> Project { + var targets = makeAppTargets(name: name, + platform: platform, + dependencies: additionalTargets.map { TargetDependency.target(name: $0) }) + targets += additionalTargets.flatMap({ makeFrameworkTargets(name: $0, platform: platform) }) + 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, platform: Platform) -> [Target] { + let sources = Target(name: name, + platform: platform, + product: .framework, + bundleId: "io.tuist.\(name)", + infoPlist: .default, + sources: ["Targets/\(name)/Sources/**"], + resources: [], + dependencies: []) + let tests = Target(name: "\(name)Tests", + platform: platform, + 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, platform: Platform, dependencies: [TargetDependency]) -> [Target] { + let platform: Platform = platform + let infoPlist: [String: InfoPlist.Value] = [ + "CFBundleShortVersionString": "1.0", + "CFBundleVersion": "1", + "UIMainStoryboardFile": "" + ] + + let mainTarget = Target( + name: name, + platform: platform, + product: .app, + bundleId: "io.tuist.\(name)", + infoPlist: .extendingDefault(with: infoPlist), + sources: ["Targets/\(name)/Sources/**"], + resources: [], + dependencies: dependencies + ) + + let testTarget = Target( + name: "\(name)Tests", + platform: platform, + product: .unitTests, + bundleId: "io.tuist.\(name)Tests", + infoPlist: .default, + sources: ["Targets/\(name)/Tests/**"], + dependencies: [ + .target(name: "\(name)") + ]) + return [mainTarget, testTarget] + } +} diff --git a/{{cookiecutter.projectDirectory}}/fastlane/Fastfile b/{{cookiecutter.projectDirectory}}/fastlane/Fastfile index ff8445c..010da7e 100644 --- a/{{cookiecutter.projectDirectory}}/fastlane/Fastfile +++ b/{{cookiecutter.projectDirectory}}/fastlane/Fastfile @@ -3,22 +3,24 @@ lane :tests do desc "Build and test application" run_tests(project: "{{cookiecutter.projectName}}.xcodeproj", - devices: ["iPhone 11"], - scheme: "iOSApplicationTests") + devices: ["iPhone 12 mini"], + scheme: "{{cookiecutter.projectName}} (iOS) Development", + only_testing: ["Tests iOS"] + + ) run_tests(project: "{{cookiecutter.projectName}}.xcodeproj", - devices: ["iPhone 11"], - scheme: "{{cookiecutter.projectName}}KitTests") + devices: ["iPhone 12 mini"], + scheme: "{{cookiecutter.projectName}}Kit" + ) end # Beta deployment to testflight lane :beta do desc "Build, test and upload a new build to TestFlight" - rescue => exception - on_error(exception) - end - -end +rescue => exception + on_error(exception) +end # Release deployment to App Store lane :release do diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/Contents.json b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/Contents.json deleted file mode 100644 index 2d71f8d..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/Contents.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "dev-icon-ios-20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "dev-icon-ios-20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "dev-icon-ios-29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "dev-icon-ios-29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "dev-icon-ios-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "dev-icon-ios-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "dev-icon-ios-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "dev-icon-ios-60@3x.png", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-20@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-20@2x.png deleted file mode 100644 index 9a3a43c99a336e00f9da9d21a9011a58e180233b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1356 zcmV-S1+)5zP)72;*L{;sCH?0|#g>zy-Jfcnw5{)k2_o zD3$zQs-;F%nKek|=zc^6s?5sFmw(Ft(-<=-A-FD2We^F&prjz^2S=I`fa5sivLYO3 zG?SoZS&2w;A%Y;&YIn#P45>dH5RF~%qKUN_1YXi^3_%&wBrBUGJC|LEuo1@wL9E?s zQ>W9BWW4L4AIyaC6XCB}su?Pk3Y1QzC@LZoY%#HRyG>tZquqdx;A}x5SeiB!3VBL| zAQpXks*^JuQkaIK5CrfUY;@(#N~qcc2|A+@)oM@D#-bo9!EdVzT3xLKs$2vu7KhwI z;JLAe8=yq31Zz^Q0}6ucx-?)nzyX$m2T5{-rsy|bQ zJz5y!z)i?_$Wm=Kn^fa57^?#!gi6&uf{jK?PO2kU=Y>X2xJP@5x;&;HKoXjO<^l;$ zY^qN>yfm82ISr3(U=9s%0C=T1N3hfF$(^Xs<-QTe!es&J!**4`+TOl7g8jZ;dhJe| z5;*%MTCg{b84U*WkzB;Fbli)y}wQ3#8JkNv8%}qK!KBn{Yb2>OU zkZmCQ@#Eigd3h<{udlD=|A&VMy1l*i%;_lC;$&^kQ3PJ_z&XJlX}kX!`PzW#@3(J% zrThDP`s?V3-oO8YGnE2eTwKtnPgnHv(x9`mGj1zt=Jq@?@tq{Vc+yj+9aBiwW$4=w zh>N8X{d0FmCnqPe{Wn(syLZ3S9k*fTjm-^;44M5-ex|3#5_E2GcA?U;5Gj_hBFgi} zH#awOwlWhe7K`-Z!=E$KC2rf_->2Q(U0+%yQieLQ#qr2IrhT)s7$-&M}Pfw+Nq78jlS69-R@cT7P&aPL=CEr?5>-zfoY(sO&!spNb zvIPB-g2y!)4GIf`-ee&N1>R6D>rWt18vL^U^Xz>t4qBF}oXj#UIWQ@}lvLyZ)12op zN6@q^rK><9`Me$GMv(vs+j)IGlF4NC1oL)|NF%9&ZL=e(B^(Es!`9@6(2{Kj5EQ7m zn1~MLQc>0s3xmg&%SCOssVMe+s}=GfsFq@ii<=5pVkwqFoEsf{i!pMnra*#SmWzJ! zK7vw;Y$Lk$rzGKpm^6qe`rI+>Hy=n2-k*~ub7KV&*cCJ;wQd?XsO z4oUH1D4HzFaAd%ygOKJZv08bf?9&oNc2oUQiip$9l^;}osgbdU~+M6G#0@b5l+3jy&m=Wk+p>^6}~15G)coIcbS5$ zjLGM#B~PMQ&a(_b6=9SN$Qkj6+bTGjDz1GOf>Zn-xBQ7*qHB=I#{UEP7Q(?bk14?b O0000T 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 KMNUMnLSTZTX2}cy diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-29@3x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-29@3x.png deleted file mode 100644 index fe6fcf2c837801759538c7ed46aaa8419be3c2cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3215 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 BD6#+m diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-40@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-40@2x.png deleted file mode 100644 index a0f007fd742e2cbdfd5ba2e6909fc99fd493eb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 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

84u&neCw|~?lxw(y;uZ8wSZ*bcX1xy%l z5x4X>_M(7#UYC)Nxq7|yQY;&pl5pT&IX|;rkFV}y6AUAPTjDUYabjm#ImX(%#C$#y zD43nmKrsAaxfU~$jCH97i`p$8#m+#|>WrOfrEx`L7AFR+kjQR_ns%6_cx7=xpl-8F zs#-c6IC-?edxRY{=-h0wlS~s4jI#uAWGW{Y@Qc@076VmX0+MkLeYzK@X3pfkKR8xC zY5(X%1jAsMovq6QkU0Uh)1cYjFM$|?T--~YxoJ3t9H)yXQO`i)&k}O;P)3q-z@??v`0J*dE;-XfZ^t3i(9#CT~7%P+zlkR zcblzYU(2FeFhOduB^S}RmBohEqwf$gG)zlsu`I}ZFcx}f-G8td9E>IO0u5Ynx+%6z zg6O2pT+$zm6$BZO96|h?Gxc{EKnd)Rm8GT32UW5hZHG4Y2kq98TSB;j)_`d8>A4Sy z)^oI-Kd5D{NdJ~ID|8&Nwj(6TakL#vk?s<$#VDk6y?hR*#6aVLei!HoX7^a7Dr zF(4g3_xpiCXjcZBW*2Wh_M(_%D5Hv-TtJIXLX@jgsnUf{Nsa=@ ztyXI^W{W}xv@JSF8dz3kO7bxPxt48u^2tOFZi|s22 zKd!GVlf@iwS0ER1Cm2Aa2?3G)R!g4NY33x&c@r!fpwpuYSR>0bfWPY1+y^v-dMwl*w!^Bo86SYQC%askvim@SBAxtzR8VP+a)y+-t zD6uGxD^eXFhOr}9K@lwvr8a{`rdib;7r`)|;P&{2DHAK$?J;h|DvT|`3LqMFU#)g~ zcxqZ&veOcbAqpCB2NfTXR&2AGpPMawjg7+C6C4J}MtKg(gVc$rGI6h}HX>AcT!Iy$ z-k>fE1EffWw2sUA8V3_aa2QaNIF$`V<2)u=y)iiBDJan~9+vG4Fj{n{ZanB?6%Z-6 z_LAyF(@?Z33U+bS#$Hm7!o(7M7*H1mi3^^Cv;ExAF*Z1V0)IyrdjLd&I7p;z2W31U zb&@1B3Z)`A3hDrhs5bazLUC1QQ{;jv!6nC(;F4oXaLF+xxa61;Tyl(GiGMLDt*iKd XWLgCH0ez}V00000NkvXXu0mjfx^pv} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@2x.png deleted file mode 100644 index aefbe1afef5a51e058ed10222f6470857d30979b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4485 zcmV;05qj>4P)RV#0f#C z+n3KXwTd_?FvS$5#+2ZaV@hzzF(tUbcpvl))o zW+6BXMYc<1&lAy$i;b}*dh7@WvAcWwQd%t{)iRPx>QUe#SOFskvK`l#5x#{-9WBHva1$H`q+Z5bjwKn#et)aDCBv7K$?e%GiaAgt$Ia~x* zI^Dp?s#Yvns)Gm`0uL42CW9v^*C`4$Sl2QhZ&PTqF1Wx(Fa{Fle-W;bBJ`ls6}?`M zi1mi0I%ZJrA%FJVpk&80eQ6)45*=yc(En^A8D!TfkzcD;awi;Px3jw^s`TB}3J*0b zZW64(yFYHwAbPn*sE}H09dsnIUJSPHSc;sOHSB zsxw&;dt_9>I@L)or1mZ%Vq`p3GLXvwRC87-f8FhN#m45&VC~lfj48$z)h?MnN2CO- zX1GMQ#u10x^?(8Z@Vf9AmqZ1w#S%d>AJ?c0n9y*YoPqV92B`@~MTVs@VGqMiR(upJ zwMRi!Z8Tdgu|?Oa3#e1e66H!oFlJP%eIVCEZeYE=N3mJdYe5~3b9zyx|17BNj=W~I z2Z|HWkXWWV^hkqL1VeglO)k*}%~k{?3J!)P0!Z*EaI&E(o@_}~oi2=-co>!R>Ii5+ zEl(P`3W{VM>N<-QCmu?*_HqNpN}HlmlSr-th`=5y9flXA_<+VIDH07Qq<3F~^upax z2GyjaLSut_>GsmCnMVPW2bwc!aX=!1u^*S)a>k_DAy)w8mZ4q?_W=83lUyinqYE)9 zL=KZ65y5ipWhMdY%pixpOvQLIHclyn?OopW*rvc)QZ*f$U`U$UpUVZPW?ZmU!cHMj zshv)bRaGOp1rE@fBKCXYz7QE4?ky%z%|#Tz=LM*0Zi5RPv^(*oI5xqs4ms5`CXDa7 zrIcO;%w1%@aIajzcqLKOv4$7MLWfyB?~o^zUcSo)u3&{j_-X)mO!%k3K5K6;RVC?L{*+4)}vsjcCJo93pG7pjxnZ zhO3zU-o`dvos(EaD}o<;>@l&h5L6rP?d^$Mw{8tz^V(~#NurNJ)|#v=z$m*Yhds3_ zIM8!EvAVJ>OM8z)v;;#vGwD;TzkR1KYIge1d-KgVrNk;Un@#cg=bwxB-g{3zKssJC zZom+FXp&0nFh@Z>I{n32(<8qrP|rNzG}aUvjfS{<`LcNT-FM~h*REX?-+lL;7)uy} zZ5_shiBqc;DZ$Y5Tn16kakLp%km`#UFG^{C|NZxWBIOE@_D?^#CcgUWOZht{$K#Jb z{*(3l_U+s9{lFV60(Tvkt>e@!f2n z<&c_J?#^-8+1VYwP7!zE!V6M@!tbxm%!+59eNKG&!U*;_xx;2KSs>jmx##(K{vwSmSkaTy-&_pW z*E0i2#_y0`;QIA%C26C$b?c^lzCCyy@Eoaby!HzsUJA+EE8J z&edz=zx7#Cg*Eyvw})MNA~kHwJT_3F2v)D_b{^I+{q3_)#c^o2_J^PSyWd_Cf4+J} zT>ti4QTJ&AgkDMvgd0;cC-mS$v;03Pi9J!Qptcl0@Jzw?|>r zS_bewydUoa$-v7mzbvwVt11SQC5|?TBpBHWu10K_z1&URK+KgZSHwH-yd!@{!eKPJ zqzM1`qYuPqfBodp_rLh!i$8I#0FVoJ2F3`jt5A}X@<_ka9T{Dnw{ zKO6oG5Qm8oo;YDV^UO1H5+L%GIC?dJ7ce4Dukob|*Vm$ZctjG6fcBkx_hq9l4qyi% z_R|(olcfR^|NHNMq-uu5g0Q2A=EoL-OYrxmF$pyyG|!R6eb zLyfGl7R4dUI+_+P4PbqSuius-57CTP_p!th2Q~UkL2|6azTCNUa-a^t#JzI>L5{ec z@L~~MsZ<0LztT;ZB`N00s!Rev2uf?XS|cKf6!!?+Sl@_+oU>^)I>wzKer12HImRw| z;395&#RLQkHnj>>#i

84u&neCw|~?lxw(y;uZ8wSZ*bcX1xy%l z5x4X>_M(7#UYC)Nxq7|yQY;&pl5pT&IX|;rkFV}y6AUAPTjDUYabjm#ImX(%#C$#y zD43nmKrsAaxfU~$jCH97i`p$8#m+#|>WrOfrEx`L7AFR+kjQR_ns%6_cx7=xpl-8F zs#-c6IC-?edxRY{=-h0wlS~s4jI#uAWGW{Y@Qc@076VmX0+MkLeYzK@X3pfkKR8xC zY5(X%1jAsMovq6QkU0Uh)1cYjFM$|?T--~YxoJ3t9H)yXQO`i)&k}O;P)3q-z@??v`0J*dE;-XfZ^t3i(9#CT~7%P+zlkR zcblzYU(2FeFhOduB^S}RmBohEqwf$gG)zlsu`I}ZFcx}f-G8td9E>IO0u5Ynx+%6z zg6O2pT+$zm6$BZO96|h?Gxc{EKnd)Rm8GT32UW5hZHG4Y2kq98TSB;j)_`d8>A4Sy z)^oI-Kd5D{NdJ~ID|8&Nwj(6TakL#vk?s<$#VDk6y?hR*#6aVLei!HoX7^a7Dr zF(4g3_xpiCXjcZBW*2Wh_M(_%D5Hv-TtJIXLX@jgsnUf{Nsa=@ ztyXI^W{W}xv@JSF8dz3kO7bxPxt48u^2tOFZi|s22 zKd!GVlf@iwS0ER1Cm2Aa2?3G)R!g4NY33x&c@r!fpwpuYSR>0bfWPY1+y^v-dMwl*w!^Bo86SYQC%askvim@SBAxtzR8VP+a)y+-t zD6uGxD^eXFhOr}9K@lwvr8a{`rdib;7r`)|;P&{2DHAK$?J;h|DvT|`3LqMFU#)g~ zcxqZ&veOcbAqpCB2NfTXR&2AGpPMawjg7+C6C4J}MtKg(gVc$rGI6h}HX>AcT!Iy$ z-k>fE1EffWw2sUA8V3_aa2QaNIF$`V<2)u=y)iiBDJan~9+vG4Fj{n{ZanB?6%Z-6 z_LAyF(@?Z33U+bS#$Hm7!o(7M7*H1mi3^^Cv;ExAF*Z1V0)IyrdjLd&I7p;z2W31U zb&@1B3Z)`A3hDrhs5bazLUC1QQ{;jv!6nC(;F4oXaLF+xxa61;Tyl(GiGMLDt*iKd XWLgCH0ez}V00000NkvXXu0mjfx^pv} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@3x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-dev.appiconset/dev-icon-ios-60@3x.png deleted file mode 100644 index c77da7c1119c01a25ea201e14f11c1e0ebf999bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6863 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 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/Contents.json b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/Contents.json deleted file mode 100644 index 9326fa7..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/Contents.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "staging-icon-ios-20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "staging-icon-ios-20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "staging-icon-ios-29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "staging-icon-ios-29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "staging-icon-ios-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "staging-icon-ios-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "staging-icon-ios-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "staging-icon-ios-60@3x.png", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@2x.png deleted file mode 100644 index 363ad47051fd6d60381ac64533baa5080a53bb4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1477 zcmV;$1v>hPP)C$f;x z`#F=kB{VRa>5+t#liYLqz^ET}yB^(Dt=SA36D*6D(uj0Tqj5o}|2e`m2DDl&ve*!< zR@>2FBoY~mCZ9zRWJ=`yqgks_nwUsZI258mF)+ar6Dya?^q?E%22=zcfx6DxG%1-( z&{zmU=-pk8TFoZ)v(O*}0StqWPQ94wYxY2bt#+HT**o#EK`UGw3i`x9H@oJ%v&Mi#QXq4iyDD{ILGU%I` zG!0A;0Z}TI0(}n0OqrWTkI{^!>?bCc|CwyUOi-MUnIM>nB&B=;$75pnU8P!4l0*Mp zE>9JXXkD`dHzDUCYqeM`QkLgnt_nCI{7mg3SSXZaQ5Cry3u?FeM|3Yyi|6D5NWv1Z zTp+=YPt{3<`$BQFpy9a%tf2rdfL<-S2v({!*@+*j+}Gx_a8yA1@LfMZc5k1HV7;!^ zUb#}HG2H!v68uf!MvaF1yU-P_vq>ectOv$I1V zKAh9W#)go1`EpTypPQQ(lV4t43IX&%Yj56c((Bhh%7J}#b>(OkW3KohmNpcW?C?}G+$Eun?OAr_`n_uJhEiJL}|$u4LiMm%n+p zUQ;9DV4{A<;L~IQ8-cb!2tn1|L>Ec^j>o(S1WJSNX1{g5T?COiH+@npIBzDK<&d`r zCKv>`(#*`XZ(rDm&~*BR^XsOynv)U8z)!GswnQW!F6 znjA<5jS8$`Dsn@Z*E9nN>ZrJwhzgSvDXAl#4W2tWnNoHeKE=LAS~3BG{#p!iag*js zEW}zE=0yi%F-PVq3MBaDWXen4Lr}EHKBAJ}C5b4+qCrH_XW8)IL?Af?S6p1k+pjE| zGGDpcYWL6okm(?qz&YCHD^Zg=B*el{G({*HF=W$0=#AWg2qL@5e9aD(K@VLQ3j>`i zx*6ph<<_w4>2!Lupy&s!BO~ysr0>%QYciL|RaaA{W6s!tpFV8TIcR43kQ<0#7e%hP zs`9F3jYv?FAWV(x@#rZK2={!qHo0!_E3Q-oJ5P1GL~4@B4dbIj5p;;~-CV8JsKyPo zg*;$t4|g$jURXPCnL0(H1{oZsxQT`eo>2(;5k|>iTec*=c&$Q^`JHS33BfM@jaUA$ fJfbTwmW}@dQ%X7Jx681i00000NkvXXu0mjfU5&I& diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@3x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-20@3x.png deleted file mode 100644 index 796eb00cbda563be9633bc5da683e3c012deba3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2446 zcmV;9332v`P)m;>6NU4bFlO?7oM^vFpz4 zTWXBmRat$ZC+YJFx~nU*@<&8QMnonNn?VzXVOm7|R$bR< z!mua)#!rnu2>;fh(->i~duTM8)NHm0uA*(U$+m1~4pW5mXoRBCC`BUtIi^!Q7NdAP z#`mK%E<{G{v_P_4u28GhrgpnUT7-m<8z783(dbSC!%$crd|#(jDn;pZa@6GQkr8e* zn^Y=Q$Y3pMOt6dN4)i0uV`R1?ykycLo=hZY1Q?#MVVbnDu}P-s5LIgvOxO+6a){^i z*5N2Ks%fxYrsV}s!XTlN`9Lt0T9pO}i9-X%R%HKx6(9((OyuOA{dnE1*Xv3eE3+w+HC!+f z2JoMis+#4Y0O5rm!qA#w1jna%uFgTlq+@EBwu+WfZSgYeo^=?KQ8DLMvrW1dk!9%N z!-ur8vO>9Bj?SGsNAvUZG%moj5xr$IY2W8S0rj+WYUeuMqhVx3n!=o{H5{`)bLNbY zK6dOF9XN1+E?&GyuU@^9XKvlPMbDoYIdA{Yo@Wo4BPA3jW9eDUY)b`a9?@-ofM&B+Bo zfWXqylJtf95G<;nDzH3~ogQ7N`?x!`T z;_nn-Dx1Zk%qI*CrVBuemo8n}p2HX@GpO;cCNI{$E>%@r@bpQT+`3}0keRBEMxhtrN5F zULB;q9ihK|_uY=$nM}?#4nM|QmkS!UEZr9>i9wgHN2OAMi01EqyG`$YT$RtbDwVR7 zQSlk$ukv?%u2!AMXJKJMJm?$Ns%)`ve-PNqmoH?B;Mq5CUQ63Qu?6hgw~t=FctP`Q z(hF?HXjdrYC=u5c$J%vu3k5`iDmgJO&A{|9XHT6vB})?1qbOrz5lSIpa)X$zPQ}zkm}sWca!HozPl?PMRtN!F6zU);j|!32*Rs>R7F1D zyN7}h)#F_2+U>q&duUiK6VP>?>s-IAhn=;v8{GoHcPa6>CKt4K`}S=i2!X(fx!3mY z{^PMYDUC7KThQszFv7OtW-&0@DsxI$=S*pkP}-}e1(H~{3WWllJbAK5P#s9^Dwm}U z?=JcQade@ut2?ypE#hIh`SIQRz|xMzX0^sOVU5Dqsrwc2RA6x1J+srYuk8B{3(w7p zgLR>Is|6+^s*^0sLp4d(SX7~!i9O~nvI0*L$GAqULIfF$ZBH;ibiW(oEAh zPkW*7H17)sIjRm4OxDYsfxccN&tB3}R2?iLmPm|+H2Or}Dy9sGC8YZo2l^6DCgKzg zvB|Z&kf$WS$Q+@4%TWjJ6Md@!+Qr!W!FOGl+O>=4gSu0K7IHkNk(LdkZRbEsMAl?g z%>szP3OWDd5P_R%D6-c$0f>aC)|s4~qg|uk*iIsL{@#BxjW=mHl}xc&rj(;Tr!72l zmJ^q(?_+A)r60DoODP;cywT#Vk9w1fgDtEo(uY%Yw4FqSa8Hv^HO{7(;dNFE8IXX2 zrt@~`%yi(RY8&Fl)`mC@SA#}r$mUe6*>Z#jPm0WI*u!TQ3v3n};`)d-!~u|AV@;3Z z$ipzFczVEQGd-n57EnLMgAS*scFPNXEx>}Xn;oknSwX1L<5&WuX%Cb#j1E%wf*H@u z$e6+)w7MWo93au6I(>q}^xF<s!&WQdP6+^m&S9+0S*-OT*5)pZ z;BYBBvm#e1nho_0^ss~x;v(vs3OQdrFv{b@EvnXPLfq?&v>R&2hn=(2Iuk`)?-wqH zz~~5f0F9$eROih$({R>XO;bA{4ozY(x}1!65(aIQhepOh*bR`!ZX_;j(xH5W=*!8q zas1y&MG<9byxb*Ni#P~AVv=r*mvBG)@&A@4h~MRZIm;y?$xd;kCd M07*qoM6N<$f-^d@tpET3 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-29@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-29@2x.png deleted file mode 100644 index 2f025977837169bf419fe2e6872d77a592ea9b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2272 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 KMNUMnLSTYWKE$X1 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-40@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-40@2x.png deleted file mode 100644 index 4946439a265a72563eec6319948f48ed8bc4fe73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3253 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 Z{4?yozwhU1T@(NS002ovPDHLkV1iPP&ny4{ diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@2x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@2x.png deleted file mode 100644 index 213e8a8394e005ad1c93c3c718ce300f4423b907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5007 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 Z{4?yozwhU1T@(NS002ovPDHLkV1iPP&ny4{ diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@3x.png b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/AppIcon-staging.appiconset/staging-icon-ios-60@3x.png deleted file mode 100644 index b8068e66ced44d626fcf4c20bb3159e448ddb1a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7627 zcmaJ`*E<{z(?#^&$!d#55=5|i?*iT+!2%GOI;5jMlyP}~H zQ2b};XlWU=Pb9jlrjjgL`7r(N6Tq~VQIkPKtBNDIGsi+hV=z;Zm(lVbj1c`#j5!hCKWTbd3`=*RwlNBfLA~f zj2s&If&~GoC3TH+!pL8&YcSR=+cTp_w{u^aRzWQf_SxFnH_XBtCWf|YE6>JgrgZ~c!uIZ9U(V02pZH!vF#sKRgrzGH zpC{3asq94k`CNt%%nqn+&V{eQB0^`Lx z!$4=d`fnK+vSa##Hp^@=X2=c9lD}@mGV&4*vVNK1UC87ZXl<=4dJT9Tv+-jr4hEZA z9V>!UjMi^`?JiMW{}MT-Mjm{`w`B&*1^ZBZ89<#|^!?n+0s=MV6 z1Rd>jS^14Wn{UJFr^909m>4r@3rM`t;Z=Xo2SXlyPZt8-`g>5Ty)iH2v3D$D$#tUk zS$rk*S-WDR2XtkZV?WCmI*@9s%R@74Kod0@x^}pv=@CU18(XR0?E;*9T2L;ax$|kCL5YvJ|EP z|8{=F51Y=(7%HcWd(}E-xUKx9%DE(oo6HN5Tff8NyTx1Q+N)=d%jlm7cHqzctM=^~ zAO9&%s`CTJouXV~TBt1xusyjli-uY>zA44*yUwGdGAjD6KXX(#C>Yrj#_Y}|<>y4{ z$_CC6aYmEVD{r*XgIO#yw=UwU1wAa^D>0{iApiSfJk;}OQ|vl{Ajj7^$b?<(&pWF> zVdr(H-JU;(jZxSI(X@;p|r+{-W_;g#Qr_RoCMD&?l8;=rFP9#dM% zJVrp*cBK-;ucpSbeoE(EFzgXc*-Q?t0I({|aWX|)b6)Cuoc0QA0*3Lp$zpTaHxqTo z58c$vY0h%}Zy9GAeT^#Nxo=3DHOFEX?Owc`v6(5WF>FWnLtPw8E1sm#aE&n46iSuqH_2L{Vu3AiGdYXv5c%AW@dUB}8gCG0zY z-vw{g%tuX-)eBA&$T`e^KazdnC}(=v+_mpvm1Dp3&LHK4I cWOmZ!#v31wJ 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 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/Contents.json b/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Assets/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Base.lproj/Main.storyboard b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Base.lproj/Main.storyboard deleted file mode 100644 index 68520e8..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Base.lproj/Main.storyboard +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Generated/.gitkeep b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Generated/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Appearance/Appearance.swift b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Appearance/Appearance.swift deleted file mode 100644 index af33d23..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Appearance/Appearance.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// Appearence.swift -// {{cookiecutter.projectName}} -// -// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. -// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. -// - -import Foundation -import UIKit - -struct Appearence { - - struct Fonts { - -/// Custom dynamic adjustable font -/// static let customFont: UIFont = { -/// let font = UIFont(name: "", size: 17) -/// let fontMetrics = UIFontMetrics(forTextStyle: .body) -/// return fontMetrics.scaledFont(for: font!) -/// }() - - static let title = UIFont.preferredFont(forTextStyle: .title1) - static let heading = UIFont.preferredFont(forTextStyle: .headline) - static let subheading = UIFont.preferredFont(forTextStyle: .subheadline) - static let body = UIFont.preferredFont(forTextStyle: .body) - static let small = UIFont.preferredFont(forTextStyle: .title2) - } - - struct Colors { - static let title = UIColor.blue - static let heading = UIColor.black - static let background = UIColor.white - } - - struct Icons { } -} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Localization/Localization.swift b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Localization/Localization.swift deleted file mode 100644 index 513a389..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/Localization/Localization.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Localization.swift -// {{cookiecutter.projectName}} -// -// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. -// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. -// - -import Foundation -import UIKit - -extension String { - var localized: String { - let loca = NSLocalizedString(self, comment: "") - if loca.isEmpty || loca == self { - return self - } - return loca - } -} \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/UserDefaults/UserDefaults.swift b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/UserDefaults/UserDefaults.swift deleted file mode 100644 index 64086c8..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Helpers/UserDefaults/UserDefaults.swift +++ /dev/null @@ -1,84 +0,0 @@ -// -// UserDefaults.swift -// {{cookiecutter.projectName}} -// -// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. -// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. -// - -import Foundation - -public let Defaults = UserDefaults.standard - -extension UserDefaults { - struct Key { - var name: String - } - - subscript(key: Key) -> T? { - get { - return value(forKey: key.name) as? T - } - set { - setValue(newValue, forKey: key.name) - } - } - - subscript( - key: Key, - default defaultProvider: @autoclosure () -> T - ) -> T { - get { - return value(forKey: key.name) as? T - ?? defaultProvider() - } - set { - setValue(newValue, forKey: key.name) - } - } -} - -// Usage: -// Extend UserDefaults.Key with your desired keys and then use them -// extension UserDefaults.Key { -// static var bookmarks: UserDefaults.Key<[String]> { -// return .init(name: "bookmarks") -// } - -// static var notificationSnoozed: UserDefaults.Key { -// return .init(name: "notificationSnoozed") -// } -// } - -// class SettingsViewModel { -// private let userDefaults: UserDefaults - -// init(userDefaults: UserDefaults = .standard) { -// self.userDefaults = userDefaults -// } - -// func snoozeNotifications() { -// userDefaults[.bookmarks, default: []].append("name") -// let snoozed = userDefaults[.notificationSnoozed, default: true] -// } -// } - -@propertyWrapper -struct UserDefault { - let key: String - let wrappedValue: T - - var value: T { - get { - return UserDefaults.standard.object(forKey: key) as? T ?? wrappedValue - } - set { - UserDefaults.standard.set(newValue, forKey: key) - } - } - - init(_ key: String, defaultValue: T) { - self.key = key - self.wrappedValue = defaultValue - } -} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Protocols/.gitkeep b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Protocols/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/ViewController.swift b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/ViewController.swift deleted file mode 100644 index c251ea1..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/ViewController.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ViewController.swift -// {{cookiecutter.projectName}} -// -// Created by Automated on {% now 'utc', '%d/%m/%Y' %}. -// Copyright © {% now 'utc', '%Y' %} {{cookiecutter.companyName}}. All rights reserved. -// - -import UIKit -import {{cookiecutter.projectName}}Kit -import LoggingKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - logger.info("Welcome to your iOS starter project!", logCategory: \.default) - logger.info("Current Server environment is \(try? Configuration.value(for: "_ServerEnvironment") as String)", logCategory: \.default) - } -} diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Views/.gitkeep b/{{cookiecutter.projectDirectory}}/iOSApplication/Sources/Views/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Base.lproj/LaunchScreen.storyboard b/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index bfa3612..0000000 --- a/{{cookiecutter.projectDirectory}}/iOSApplication/SupportingFiles/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/{{cookiecutter.projectDirectory}}/project.yml b/{{cookiecutter.projectDirectory}}/project.yml deleted file mode 100644 index bc64728..0000000 --- a/{{cookiecutter.projectDirectory}}/project.yml +++ /dev/null @@ -1,179 +0,0 @@ -name: {{cookiecutter.projectName}} -options: - xcodeVersion: 11.0 -configs: - Debug: debug - Release: release -settings: - base: - DEVELOPMENT_TEAM: {{cookiecutter.teamId}} - SWIFT_VERSION: "5.1" - configs: - Debug: - SWIFT_COMPILATION_MODE: "incremental" - Release: - SWIFT_COMPILATION_MODE: "wholemodule" -attributes: - ORGANIZATIONNAME: {{cookiecutter.teamName}} -packages: - Rswift: - url: https://github.com/mac-cain13/R.swift.Library - version: "5.2.0" - LoggingKit: - url: https://github.com/alexanderwe/LoggingKit - version: "1.0.0" -targets: - iOSApplication: - type: application - platform: iOS - deploymentTarget: "{{cookiecutter.deploymentTarget}}" - configFiles: - Debug: iOSApplication/SupportingFiles/Config/Configuration.xcconfig - Release: iOSApplication/SupportingFiles/Config/Configuration.xcconfig - settings: - base: - ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon$(SERVER_ENVIRONMENT_SUFFIX) - info: - path: iOSApplication/SupportingFiles/Info.plist - properties: - CFBundleDisplayName: {{cookiecutter.projectName}}$(SERVER_ENVIRONMENT_SUFFIX) - UISupportedInterfaceOrientations: - - UIInterfaceOrientationPortrait - - UIInterfaceOrientationLandscapeLeft - - UIInterfaceOrientationLandscapeRight - UILaunchStoryboardName: LaunchScreen - UIMainStoryboardFile: Main - UIRequiredDeviceCapabilities: [armv7] - ITSAppUsesNonExemptEncryption: NO - LSRequiresIPhoneOS: YES - _Configuration: $(CONFIGURATION) - _ServerEnvironment: $(SERVER_ENVIRONMENT) - CFBundleVersion: "1" - CFBundleShortVersionString: "0.0.1" - UIApplicationSceneManifest: - UIApplicationSupportsMultipleScenes: NO - UISceneConfigurations: - UIWindowSceneSessionRoleApplication: - - UISceneConfigurationName: "Default Configuration" - UISceneDelegateClassName: "$(PRODUCT_MODULE_NAME).SceneDelegate" - UISceneStoryboardFile: "Main" - sources: - - iOSApplication/ - dependencies: - - target: {{cookiecutter.projectName}}Kit - - package: Rswift - preBuildScripts: - - script: | - if mint list | grep -q 'R.swift'; then - mint run R.swift rswift generate "$SRCROOT/iOSApplication/Sources/Generated/R.generated.swift" - else - echo "error: R.swift not installed; run 'mint bootstrap' to install" - return -1 - fi - name: R.Swift generate - inputFiles: - - $(TEMP_DIR)/rswift-lastrun - outputFiles: - - $(SRCROOT)/iOSApplication/Sources/Generated/R.generated.swift - postCompileScripts: - - script: | - mint run swiftlint - name: SwiftLint - {{cookiecutter.projectName}}Kit: - type: framework - platform: iOS - deploymentTarget: "{{cookiecutter.deploymentTarget}}" - settings: - PRODUCT_BUNDLE_IDENTIFIER: {{cookiecutter.bundleIdentifier}}Kit - info: - path: {{cookiecutter.projectName}}Kit/SupportingFiles/Info.plist - properties: - CFBundleVersion: $(CURRENT_PROJECT_VERSION) - sources: - - {{cookiecutter.projectName}}Kit - dependencies: - - package: LoggingKit - {{cookiecutter.projectName}}KitTests: - platform: iOS - type: bundle.unit-test - sources: - - {{cookiecutter.projectName}}KitTests/ - dependencies: - - target: {{cookiecutter.projectName}}Kit - scheme: - testTargets: - - {{cookiecutter.projectName}}KitTests - gatherCoverageData: true - iOSApplicationTests: - platform: iOS - type: bundle.unit-test - sources: - - iOSApplicationTests/ - dependencies: - - target: iOSApplication - - target: {{cookiecutter.projectName}}Kit - scheme: - testTargets: - - iOSApplicationTests - gatherCoverageData: true - iOSApplicationUITests: - platform: iOS - type: bundle.ui-testing - sources: - - iOSApplicationUITests/ - dependencies: - - target: iOSApplication - - target: {{cookiecutter.projectName}}Kit - scheme: - testTargets: - - iOSApplicationUITests - gatherCoverageData: true -schemes: - iOS Application development: - build: - preActions: - - script: | - cp -f "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Development.xcconfig" "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Configuration.xcconfig" - settingsTarget: iOSApplication - targets: - iOSApplication: all - run: - config: Debug - profile: - config: Release - analyze: - config: Release - archive: - config: Release - iOS Application staging: - build: - preActions: - - script: | - cp -f "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Staging.xcconfig" "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Configuration.xcconfig" - settingsTarget: iOSApplication - targets: - iOSApplication: all - run: - config: Debug - profile: - config: Release - analyze: - config: Release - archive: - config: Release - iOS Application production: - build: - preActions: - - script: | - cp -f "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Production.xcconfig" "${PROJECT_DIR}/iOSApplication/SupportingFiles/Config/Configuration.xcconfig" - settingsTarget: iOSApplication - targets: - iOSApplication: all - run: - config: Debug - profile: - config: Release - analyze: - config: Release - archive: - config: Release \ No newline at end of file diff --git a/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/SupportingFiles/Info.plist b/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/SupportingFiles/Info.plist deleted file mode 100644 index cf22d10..0000000 --- a/{{cookiecutter.projectDirectory}}/{{cookiecutter.projectName}}Kit/SupportingFiles/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.0.1 - CFBundleVersion - 1 - NSPrincipalClass - - -