diff --git a/.github/actions/create-release/action.yml b/.github/actions/create-release/action.yml deleted file mode 100644 index 9a29a5d..0000000 --- a/.github/actions/create-release/action.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Create release - -inputs: - gh-token: - description: A token to perform REST API calls to GitHub - required: true - repository: - description: The repository name including the org - required: true - tag-name: - description: The tag to use for the release - required: true - -outputs: - release-id: - description: The ID of the release - value: ${{ steps.create-release.outputs.release_id }} - -runs: - using: composite - steps: - - name: Create release - id: create-release - shell: bash - run: | - RELEASE_ID=`curl -L \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ inputs.gh-token }}" \ - "https://api.github.com/repos/${{ inputs.repository }}/releases" \ - -d '{"tag_name":"${{ inputs.tag-name }}","generate_release_notes":true}' | jq -r '.id'` - echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" diff --git a/.github/actions/create-universal-binary/action.yml b/.github/actions/create-universal-binary/action.yml deleted file mode 100644 index 494c885..0000000 --- a/.github/actions/create-universal-binary/action.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Create universal binary - -inputs: - tool-name: - description: The name of the tool - required: true - -outputs: - zip-filename: - description: The filename of the generated .zip - value: ${{ steps.zip-universal-binary.outputs.zip_filename }} - zip-path: - description: The path to .zip containing the universal binary - value: ${{ steps.zip-universal-binary.outputs.zip_path }} - -runs: - using: composite - steps: - - name: Create bin folder - shell: bash - run: | - rm -rf bin - mkdir -p bin - - name: Delete build artifacts - shell: bash - working-directory: ./${{ inputs.tool-name }} - run: swift package clean - - name: Build binary (arm64) - shell: bash - working-directory: ./${{ inputs.tool-name }} - run: swift build -c release --arch arm64 - - name: Build binary (x86_64) - shell: bash - working-directory: ./${{ inputs.tool-name }} - run: swift build -c release --arch x86_64 - - name: Create universal binary - shell: bash - working-directory: ./${{ inputs.tool-name }} - run: | - lipo -create -output \ - ${{ inputs.tool-name }} \ - .build/arm64-apple-macosx/release/${{ inputs.tool-name }} \ - .build/x86_64-apple-macosx/release/${{ inputs.tool-name }} - - name: Move universal binary to bin folder - shell: bash - run: | - mv ./${{ inputs.tool-name }}/${{ inputs.tool-name }} bin/${{ inputs.tool-name }} - - name: Zip universal binary - id: zip-universal-binary - shell: bash - working-directory: bin - run: | - zip -r ${{ env.ZIP_FILE }} ${{ inputs.tool-name }} - echo "zip_filename=${{ env.ZIP_FILE }}" >> $GITHUB_OUTPUT - echo "zip_path=bin/${{ env.ZIP_FILE }}" >> $GITHUB_OUTPUT - env: - ZIP_FILE: ${{ inputs.tool-name }}-macOS-universal-binary.zip diff --git a/.github/actions/select-xcode/action.yml b/.github/actions/select-xcode/action.yml deleted file mode 100644 index 84c24c4..0000000 --- a/.github/actions/select-xcode/action.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Select Xcode - -inputs: - xcode-version: - description: The version of Xcode to select - required: true - -runs: - using: composite - steps: - - name: Select Xcode - shell: bash - run: | - sudo xcode-select \ - -s /Applications/Xcode_${{ inputs.xcode-version }}.app/Contents/Developer diff --git a/.github/actions/upload-release-asset/action.yml b/.github/actions/upload-release-asset/action.yml deleted file mode 100644 index c00aab5..0000000 --- a/.github/actions/upload-release-asset/action.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Upload release asset - -inputs: - asset-filename: - description: The filename of the asset to upload - required: true - asset-path: - description: The local path to the asset to upload - required: true - gh-token: - description: A token to perform REST API calls to GitHub - required: true - repository: - description: The repository name including the org - required: true - release-id: - description: The ID of the release - required: true - -outputs: - zip-filename: - description: "Filename of the generated .zip" - value: ${{ steps.zip-fat-binary.outputs.zip_filename }} - zip-path: - description: "Path to .zip containing fat binary" - value: ${{ steps.zip-fat-binary.outputs.zip_path }} - -runs: - using: composite - steps: - - name: Upload release asset (${{ inputs.asset-path }}) - shell: bash - run: | - curl -L \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ inputs.gh-token }}" \ - -H "Content-Type: application/octet-stream" \ - "https://uploads.github.com/repos/${{ inputs.repository }}/releases/${{ inputs.release-id }}/assets?name=${{ inputs.asset-filename }}" \ - --data-binary "@${{ inputs.asset-path }}" diff --git a/.github/workflows/build-TogglesDemo.yml b/.github/workflows/build-TogglesDemo.yml index 886f49a..103b82f 100644 --- a/.github/workflows/build-TogglesDemo.yml +++ b/.github/workflows/build-TogglesDemo.yml @@ -8,32 +8,37 @@ on: branches: - main -env: - XCODE_VERSION: 16.2.0 - jobs: test: - name: Build + name: Build TogglesDemo runs-on: macos-15 + steps: - name: Show macOS version run: sw_vers + - name: Code Checkout uses: actions/checkout@v4 + - name: Select Xcode - uses: ./.github/actions/select-xcode + uses: TogglesPlatform/Pipelines/actions/select-xcode@v1 with: - xcode-version: ${{ env.XCODE_VERSION }} + xcode-version: 16.4.0 + - name: Check xcodebuild version run: xcodebuild -version + - name: Check xcode embedded SDKs run: xcodebuild -showsdks + - name: Show buildable schemes working-directory: ./TogglesDemo run: xcodebuild -list + - name: Show eligible build destinations for TogglesDemo working-directory: ./TogglesDemo run: xcodebuild -showdestinations -scheme TogglesDemo + - name: Build for destination TogglesDemo working-directory: ./TogglesDemo - run: xcodebuild build -scheme TogglesDemo -destination "platform=iOS Simulator,OS=18.2,name=iPhone 16 Pro" + run: xcodebuild build -scheme TogglesDemo -destination "platform=iOS Simulator,OS=18.4,name=iPhone 16 Pro" diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index eeccfe2..4779d10 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -5,65 +5,17 @@ on: tags: - '*' -env: - XCODE_VERSION: 16.2.0 - jobs: publish-release: name: Publish release ${{ github.ref_name }} - runs-on: macos-15 + runs-on: ubuntu-latest + steps: - - name: Show macOS version (${{ env.XCODE_VERSION }}) - run: sw_vers - - name: Code Checkout - uses: actions/checkout@v4 - - name: Select Xcode - uses: ./.github/actions/select-xcode - with: - xcode-version: ${{ env.XCODE_VERSION }} - name: Create release id: create-release - uses: ./.github/actions/create-release + uses: TogglesPlatform/Pipelines/actions/create-release@v1 with: gh-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} tag-name: ${{ github.ref_name }} - - name: Create universal binary (ToggleGen) - id: create-universal-binary-ToggleGen - uses: ./.github/actions/create-universal-binary - with: - tool-name: ToggleGen - - name: Upload universal binary (ToggleGen) - uses: ./.github/actions/upload-release-asset - with: - asset-filename: ${{ steps.create-universal-binary-ToggleGen.outputs.zip-filename }} - asset-path: ${{ steps.create-universal-binary-ToggleGen.outputs.zip-path }} - gh-token: ${{ secrets.GITHUB_TOKEN }} - repository: ${{ github.repository }} - release-id: ${{ steps.create-release.outputs.release-id }} - - name: Create universal binary (ToggleCipher) - id: create-universal-binary-ToggleCipher - uses: ./.github/actions/create-universal-binary - with: - tool-name: ToggleCipher - - name: Upload universal binary (ToggleCipher) - uses: ./.github/actions/upload-release-asset - with: - asset-filename: ${{ steps.create-universal-binary-ToggleCipher.outputs.zip-filename }} - asset-path: ${{ steps.create-universal-binary-ToggleCipher.outputs.zip-path }} - gh-token: ${{ secrets.GITHUB_TOKEN }} - repository: ${{ github.repository }} - release-id: ${{ steps.create-release.outputs.release-id }} - - name: Create universal binary (JustTweakMigrator) - id: create-universal-binary-JustTweakMigrator - uses: ./.github/actions/create-universal-binary - with: - tool-name: JustTweakMigrator - - name: Upload universal binary (JustTweakMigrator) - uses: ./.github/actions/upload-release-asset - with: - asset-filename: ${{ steps.create-universal-binary-JustTweakMigrator.outputs.zip-filename }} - asset-path: ${{ steps.create-universal-binary-JustTweakMigrator.outputs.zip-path }} - gh-token: ${{ secrets.GITHUB_TOKEN }} - repository: ${{ github.repository }} - release-id: ${{ steps.create-release.outputs.release-id }} + \ No newline at end of file diff --git a/.github/workflows/run-tests-JustTweakMigrator.yml b/.github/workflows/run-tests-JustTweakMigrator.yml deleted file mode 100644 index be5a508..0000000 --- a/.github/workflows/run-tests-JustTweakMigrator.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: JustTweakMigrator - -on: - push: - branches: - - main - pull_request: - branches: - - main - -env: - XCODE_VERSION: 16.2.0 - -jobs: - test: - name: Run tests - runs-on: macos-15 - steps: - - name: Code Checkout - uses: actions/checkout@v4 - - name: Select Xcode - uses: ./.github/actions/select-xcode - with: - xcode-version: ${{ env.XCODE_VERSION }} - - name: Run tests - working-directory: ./JustTweakMigrator - run: swift test diff --git a/.github/workflows/run-tests-ToggleCipher.yml b/.github/workflows/run-tests-ToggleCipher.yml deleted file mode 100644 index 2817d85..0000000 --- a/.github/workflows/run-tests-ToggleCipher.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: ToggleCipher - -on: - push: - branches: - - main - pull_request: - branches: - - main - -env: - XCODE_VERSION: 16.2.0 - -jobs: - test: - name: Run tests - runs-on: macos-15 - steps: - - name: Code Checkout - uses: actions/checkout@v4 - - name: Select Xcode - uses: ./.github/actions/select-xcode - with: - xcode-version: ${{ env.XCODE_VERSION }} - - name: Run tests - working-directory: ./ToggleCipher - run: swift test diff --git a/.github/workflows/run-tests-ToggleGen.yml b/.github/workflows/run-tests-ToggleGen.yml deleted file mode 100644 index 706d557..0000000 --- a/.github/workflows/run-tests-ToggleGen.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: ToggleGen - -on: - push: - branches: - - main - pull_request: - branches: - - main - -env: - XCODE_VERSION: 16.2.0 - -jobs: - test: - name: Run tests - runs-on: macos-15 - steps: - - name: Code Checkout - uses: actions/checkout@v4 - - name: Select Xcode - uses: ./.github/actions/select-xcode - with: - xcode-version: ${{ env.XCODE_VERSION }} - - name: Run tests - working-directory: ./ToggleGen - run: swift test diff --git a/.github/workflows/run-tests-Toggles.yml b/.github/workflows/run-tests-Toggles.yml deleted file mode 100644 index 657d2ed..0000000 --- a/.github/workflows/run-tests-Toggles.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Toggles - -on: - push: - branches: - - main - pull_request: - branches: - - main - -env: - XCODE_VERSION: 16.2.0 - -jobs: - test: - name: Run tests - runs-on: macos-15 - steps: - - name: Code Checkout - uses: actions/checkout@v4 - - name: Select Xcode - uses: ./.github/actions/select-xcode - with: - xcode-version: ${{ env.XCODE_VERSION }} - - name: Run tests - run: swift test diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 0000000..9a5dd51 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,16 @@ +name: Run tests + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + run-tests: + uses: TogglesPlatform/Pipelines/.github/workflows/run-tests.yml@v1 + with: + xcode-version: 16.4.0 + runner: 'macos-15' diff --git a/JustTweakMigrator/.gitignore b/JustTweakMigrator/.gitignore deleted file mode 100644 index 3b29812..0000000 --- a/JustTweakMigrator/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -/.build -/Packages -/*.xcodeproj -xcuserdata/ -DerivedData/ -.swiftpm/config/registries.json -.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata -.netrc diff --git a/JustTweakMigrator/.swiftpm/xcode/xcshareddata/xcschemes/JustTweakMigrator.xcscheme b/JustTweakMigrator/.swiftpm/xcode/xcshareddata/xcschemes/JustTweakMigrator.xcscheme deleted file mode 100644 index 8926638..0000000 --- a/JustTweakMigrator/.swiftpm/xcode/xcshareddata/xcschemes/JustTweakMigrator.xcscheme +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/JustTweakMigrator/Package.resolved b/JustTweakMigrator/Package.resolved deleted file mode 100644 index 98fb44e..0000000 --- a/JustTweakMigrator/Package.resolved +++ /dev/null @@ -1,15 +0,0 @@ -{ - "originHash" : "846ebd03be50595995c94aae129f45ae3963bac40cdb07e8080d5e01778514f7", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - } - ], - "version" : 3 -} diff --git a/JustTweakMigrator/Package.swift b/JustTweakMigrator/Package.swift deleted file mode 100644 index c57dbce..0000000 --- a/JustTweakMigrator/Package.swift +++ /dev/null @@ -1,42 +0,0 @@ -// swift-tools-version: 6.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "JustTweakMigrator", - platforms: [ - .macOS(.v12) - ], - products: [ - .executable(name: "JustTweakMigrator", targets: ["JustTweakMigrator"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser.git", .upToNextMinor(from: "1.5.0")) - ], - targets: [ - .executableTarget( - name: "JustTweakMigrator", - dependencies: [ - .product(name: "ArgumentParser", package: "swift-argument-parser") - ], - path: "Sources", - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ), - .testTarget( - name: "JustTweakMigratorTests", - dependencies: ["JustTweakMigrator"], - path: "Tests", - resources: [ - .process("Resources") - ], - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ) - ] -) diff --git a/JustTweakMigrator/README.md b/JustTweakMigrator/README.md deleted file mode 100644 index d6010ec..0000000 --- a/JustTweakMigrator/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# JustTweakMigrator - -A tools to help migrating from [JustTweak](https://github.com/justeat/JustTweak) to Toggles. diff --git a/JustTweakMigrator/Sources/Core/Converter.swift b/JustTweakMigrator/Sources/Core/Converter.swift deleted file mode 100644 index 0e627e5..0000000 --- a/JustTweakMigrator/Sources/Core/Converter.swift +++ /dev/null @@ -1,38 +0,0 @@ -// Converter.swift - -import Foundation - -final class Converter { - - enum ConverterError: Error { - case invalidValue - } - - static func convert(tweaksDatasource: TweaksDatasource) throws -> TogglesDatasource { - let toggles = try tweaksDatasource.fullTweaks.map { - let toggleValue: ToggleValue - switch $0.value { - case is Bool: - toggleValue = .bool($0.value as! Bool) - case is Int: - toggleValue = .int($0.value as! Int) - case is Double: - toggleValue = .number($0.value as! Double) - case is String where $0.encrypted: - toggleValue = .secure($0.value as! String) - case is String: - toggleValue = .string($0.value as! String) - default: - throw ConverterError.invalidValue - } - - let toggleMetadata = ToggleMetadata(description: $0.title, - group: $0.group, - propertyName: $0.generatedPropertyName) - - return Toggle(variable: $0.variable, value: toggleValue, metadata: toggleMetadata) - } - try TogglesValidator.validate(toggles) - return TogglesDatasource(toggles: toggles.sorted()) - } -} diff --git a/JustTweakMigrator/Sources/Core/TogglesValidator.swift b/JustTweakMigrator/Sources/Core/TogglesValidator.swift deleted file mode 100644 index 27afc64..0000000 --- a/JustTweakMigrator/Sources/Core/TogglesValidator.swift +++ /dev/null @@ -1,19 +0,0 @@ -// TogglesValidator.swift - -import Foundation - -final class TogglesValidator { - - enum LoaderError: Equatable, Error { - case foundDuplicateVariables([ToggleVariable]) - } - - static func validate(_ toggles: [Toggle]) throws { - let duplicateVariables = Dictionary(grouping: toggles, by: \.variable) - .filter { $1.count > 1 } - .keys - if duplicateVariables.count > 0 { - throw LoaderError.foundDuplicateVariables(Array(duplicateVariables)) - } - } -} diff --git a/JustTweakMigrator/Sources/Extensions/Toggle+Encodable.swift b/JustTweakMigrator/Sources/Extensions/Toggle+Encodable.swift deleted file mode 100644 index 79fc3e6..0000000 --- a/JustTweakMigrator/Sources/Extensions/Toggle+Encodable.swift +++ /dev/null @@ -1,63 +0,0 @@ -// Toggle+Codable.swift - -import Foundation - -extension Toggle: Codable { - - enum CodingError: Error { - case missingValue - } - - enum CodingKeys: String, CodingKey { - case variable - case bool - case int - case number - case string - case secure - case metadata - } - - init(from decoder: any Decoder) throws { - let values = try decoder.container(keyedBy: CodingKeys.self) - variable = try values.decode(ToggleVariable.self, forKey: .variable) - if let boolValue = try? values.decode(Bool.self, forKey: .bool) { - self.value = .bool(boolValue) - } - else if let intValue = try? values.decode(Int.self, forKey: .int) { - self.value = .int(intValue) - } - else if let numberValue = try? values.decode(Double.self, forKey: .number) { - self.value = .number(numberValue) - } - else if let stringValue = try? values.decode(String.self, forKey: .string) { - self.value = .string(stringValue) - } - else if let secureValue = try? values.decode(String.self, forKey: .secure) { - self.value = .secure(secureValue) - } - else { - throw CodingError.missingValue - } - metadata = (try? values.decode(ToggleMetadata.self, forKey: .metadata)) ?? ToggleMetadata(description: "", group: "", propertyName: nil) - } - - func encode(to encoder: any Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(variable, forKey: .variable) - - switch value { - case .bool(let value): - try container.encode(value, forKey: .bool) - case .int(let value): - try container.encode(value, forKey: .int) - case .number(let value): - try container.encode(value, forKey: .number) - case .string(let value): - try container.encode(value, forKey: .string) - case .secure(let value): - try container.encode(value, forKey: .secure) - } - try container.encode(metadata, forKey: .metadata) - } -} diff --git a/JustTweakMigrator/Sources/Extensions/Tweak+Decodable.swift b/JustTweakMigrator/Sources/Extensions/Tweak+Decodable.swift deleted file mode 100644 index b2b499e..0000000 --- a/JustTweakMigrator/Sources/Extensions/Tweak+Decodable.swift +++ /dev/null @@ -1,42 +0,0 @@ -// Tweak+Codable.swift - -import Foundation - -extension Tweak: Decodable { - - enum CodingError: Error { - case invalidValue - } - - enum CodingKeys: String, CodingKey { - case title = "Title" - case group = "Group" - case value = "Value" - case encrypted = "Encrypted" - case generatedPropertyName = "GeneratedPropertyName" - } - - init(from decoder: any Decoder) throws { - let values = try decoder.container(keyedBy: CodingKeys.self) - self.title = try values.decode(String.self, forKey: .title) - self.group = try values.decode(String.self, forKey: .group) - self.encrypted = (try? values.decodeIfPresent(Bool.self, forKey: .encrypted)) ?? false - self.generatedPropertyName = try? values.decodeIfPresent(String.self, forKey: .generatedPropertyName) - - if let boolValue = try? values.decode(Bool.self, forKey: .value) { - self.value = boolValue - } - else if let intValue = try? values.decode(Int.self, forKey: .value) { - self.value = intValue - } - else if let doubleValue = try? values.decode(Double.self, forKey: .value) { - self.value = doubleValue - } - else if let stringValue = try? values.decode(String.self, forKey: .value) { - self.value = stringValue - } - else { - throw CodingError.invalidValue - } - } -} diff --git a/JustTweakMigrator/Sources/Extensions/TweakDatasource+Decodable.swift b/JustTweakMigrator/Sources/Extensions/TweakDatasource+Decodable.swift deleted file mode 100644 index 1eadbed..0000000 --- a/JustTweakMigrator/Sources/Extensions/TweakDatasource+Decodable.swift +++ /dev/null @@ -1,15 +0,0 @@ -// TweaksDatasource+Codable.swift - -import Foundation - -extension TweaksDatasource: Decodable { - - enum CodingError: Error { - case missingValue - } - - init(from decoder: any Decoder) throws { - let values = try decoder.singleValueContainer() - tweaks = try values.decode([TweakFeature: [TweakVariable: Tweak]].self) - } -} diff --git a/JustTweakMigrator/Sources/Extensions/TweaksDatasource+FullTweaks.swift b/JustTweakMigrator/Sources/Extensions/TweaksDatasource+FullTweaks.swift deleted file mode 100644 index f3ead66..0000000 --- a/JustTweakMigrator/Sources/Extensions/TweaksDatasource+FullTweaks.swift +++ /dev/null @@ -1,25 +0,0 @@ -// TweaksDatasource+FullTweaks.swift - -import Foundation - -extension TweaksDatasource { - - var fullTweaks: [FullTweak] { - var fullTweaks: [FullTweak] = [] - - for (feature, togglesByVariable) in tweaks { - for (variable, tweak) in togglesByVariable { - let fullTweak = FullTweak(title: tweak.title, - group: tweak.group, - value: tweak.value, - encrypted: tweak.encrypted, - generatedPropertyName: tweak.generatedPropertyName, - variable: variable, - feature: feature) - fullTweaks.append(fullTweak) - } - } - - return fullTweaks.sorted() - } -} diff --git a/JustTweakMigrator/Sources/JustTweakMigrator.swift b/JustTweakMigrator/Sources/JustTweakMigrator.swift deleted file mode 100644 index a9a0c26..0000000 --- a/JustTweakMigrator/Sources/JustTweakMigrator.swift +++ /dev/null @@ -1,15 +0,0 @@ -// JustTweakMigrator.swift - -import ArgumentParser -import Foundation - -@main -struct JustTweakMigrator: ParsableCommand { - - static let configuration = CommandConfiguration( - abstract: "", - subcommands: [ - ConvertDatasource.self - ] - ) -} diff --git a/JustTweakMigrator/Sources/Models/Toggles/Toggle.swift b/JustTweakMigrator/Sources/Models/Toggles/Toggle.swift deleted file mode 100644 index 0dd0934..0000000 --- a/JustTweakMigrator/Sources/Models/Toggles/Toggle.swift +++ /dev/null @@ -1,22 +0,0 @@ -// Toggle.swift - -import Foundation - -struct Toggle { - let variable: ToggleVariable - let value: ToggleValue - let metadata: ToggleMetadata -} - -extension Toggle: Comparable { - - static func < (lhs: Toggle, rhs: Toggle) -> Bool { - if lhs.variable != rhs.variable { - return lhs.variable < rhs.variable - } - if lhs.value != rhs.value { - return lhs.value < rhs.value - } - return lhs.metadata < rhs.metadata - } -} diff --git a/JustTweakMigrator/Sources/Models/Toggles/ToggleMetadata.swift b/JustTweakMigrator/Sources/Models/Toggles/ToggleMetadata.swift deleted file mode 100644 index 9dd1626..0000000 --- a/JustTweakMigrator/Sources/Models/Toggles/ToggleMetadata.swift +++ /dev/null @@ -1,31 +0,0 @@ -// ToggleMetadata.swift - -import Foundation - -struct ToggleMetadata: Codable { - let description: String - let group: String - let propertyName: String? -} - -extension ToggleMetadata: Comparable { - - static func < (lhs: ToggleMetadata, rhs: ToggleMetadata) -> Bool { - if lhs.description != rhs.description { - return lhs.description < rhs.description - } - if lhs.group != rhs.group { - return lhs.group < rhs.group - } - switch (lhs.propertyName, rhs.propertyName) { - case (.some(let lhsPropertyName), .some(let rhsPropertyName)): - return lhsPropertyName < rhsPropertyName - case (.some, .none): - return false - case (.none, .some): - return true - case (.none, .none): - return false - } - } -} diff --git a/JustTweakMigrator/Sources/Models/Toggles/ToggleValue.swift b/JustTweakMigrator/Sources/Models/Toggles/ToggleValue.swift deleted file mode 100644 index 94f66a5..0000000 --- a/JustTweakMigrator/Sources/Models/Toggles/ToggleValue.swift +++ /dev/null @@ -1,31 +0,0 @@ -// ToggleValue.swift - -import Foundation - -enum ToggleValue: Equatable, Encodable { - case bool(Bool) - case int(Int) - case number(Double) - case string(String) - case secure(String) -} - -extension ToggleValue: Comparable { - - static func < (lhs: ToggleValue, rhs: ToggleValue) -> Bool { - switch (lhs, rhs) { - case (.bool(let a), .bool(let b)): - return a != b - case (.int(let a), .int(let b)): - return a < b - case (.number(let a), .number(let b)): - return a < b - case (.string(let a), .string(let b)): - return a < b - case (.secure(let a), .secure(let b)): - return a < b - default: - return false - } - } -} diff --git a/JustTweakMigrator/Sources/Models/Toggles/ToggleVariable.swift b/JustTweakMigrator/Sources/Models/Toggles/ToggleVariable.swift deleted file mode 100644 index 9b91952..0000000 --- a/JustTweakMigrator/Sources/Models/Toggles/ToggleVariable.swift +++ /dev/null @@ -1,5 +0,0 @@ -// ToggleVariable.swift - -import Foundation - -typealias ToggleVariable = String diff --git a/JustTweakMigrator/Sources/Models/Toggles/TogglesDatasource.swift b/JustTweakMigrator/Sources/Models/Toggles/TogglesDatasource.swift deleted file mode 100644 index 4270253..0000000 --- a/JustTweakMigrator/Sources/Models/Toggles/TogglesDatasource.swift +++ /dev/null @@ -1,7 +0,0 @@ -// TogglesDatasource.swift - -import Foundation - -struct TogglesDatasource: Encodable, Equatable { - let toggles: [Toggle] -} diff --git a/JustTweakMigrator/Sources/Models/Tweaks/FullTweak.swift b/JustTweakMigrator/Sources/Models/Tweaks/FullTweak.swift deleted file mode 100644 index 9f8b916..0000000 --- a/JustTweakMigrator/Sources/Models/Tweaks/FullTweak.swift +++ /dev/null @@ -1,44 +0,0 @@ -// FullTweak.swift - -import Foundation - -struct FullTweak { - let title: String - let group: String - let value: Any - let encrypted: Bool - let generatedPropertyName: String? - let variable: String - let feature: String -} - -extension FullTweak: Equatable { - - static func == (lhs: FullTweak, rhs: FullTweak) -> Bool { - guard lhs.title == rhs.title else { return false } - guard lhs.group == rhs.group else { return false } - guard lhs.encrypted == rhs.encrypted else { return false } - guard lhs.generatedPropertyName == rhs.generatedPropertyName else { return false } - guard lhs.variable == rhs.variable else { return false } - guard lhs.feature == rhs.feature else { return false } - switch (lhs.value, rhs.value) { - case (let lhsValue as Bool, let rhsValue as Bool): - return lhsValue == rhsValue - case (let lhsValue as Int, let rhsValue as Int): - return lhsValue == rhsValue - case (let lhsValue as Double, let rhsValue as Double): - return lhsValue == rhsValue - case (let lhsValue as String, let rhsValue as String): - return lhsValue == rhsValue - default: - return false - } - } -} - -extension FullTweak: Comparable { - - static func < (lhs: FullTweak, rhs: FullTweak) -> Bool { - lhs.variable < rhs.variable - } -} diff --git a/JustTweakMigrator/Sources/Models/Tweaks/Tweak.swift b/JustTweakMigrator/Sources/Models/Tweaks/Tweak.swift deleted file mode 100644 index 72a73d7..0000000 --- a/JustTweakMigrator/Sources/Models/Tweaks/Tweak.swift +++ /dev/null @@ -1,11 +0,0 @@ -// Tweak.swift - -import Foundation - -struct Tweak { - let title: String - let group: String - let value: Any - let encrypted: Bool - let generatedPropertyName: String? -} diff --git a/JustTweakMigrator/Sources/Models/Tweaks/TweakFeature.swift b/JustTweakMigrator/Sources/Models/Tweaks/TweakFeature.swift deleted file mode 100644 index 10125df..0000000 --- a/JustTweakMigrator/Sources/Models/Tweaks/TweakFeature.swift +++ /dev/null @@ -1,5 +0,0 @@ -// TweakFeature.swift - -import Foundation - -typealias TweakFeature = String diff --git a/JustTweakMigrator/Sources/Models/Tweaks/TweakVariable.swift b/JustTweakMigrator/Sources/Models/Tweaks/TweakVariable.swift deleted file mode 100644 index 23c9b43..0000000 --- a/JustTweakMigrator/Sources/Models/Tweaks/TweakVariable.swift +++ /dev/null @@ -1,5 +0,0 @@ -// TweakVariable.swift - -import Foundation - -typealias TweakVariable = String diff --git a/JustTweakMigrator/Sources/Models/Tweaks/TweaksDatasource.swift b/JustTweakMigrator/Sources/Models/Tweaks/TweaksDatasource.swift deleted file mode 100644 index 9f91fa8..0000000 --- a/JustTweakMigrator/Sources/Models/Tweaks/TweaksDatasource.swift +++ /dev/null @@ -1,7 +0,0 @@ -// TweaksDatasource.swift - -import Foundation - -struct TweaksDatasource { - let tweaks: [TweakFeature: [TweakVariable: Tweak]] -} diff --git a/JustTweakMigrator/Sources/Resources/Toggles.json b/JustTweakMigrator/Sources/Resources/Toggles.json deleted file mode 100644 index 597912a..0000000 --- a/JustTweakMigrator/Sources/Resources/Toggles.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "toggles" : [ - { - "int" : 42, - "metadata" : { - "description" : "Definitive answer", - "group" : "General", - "propertyName" : "definitiveAnswer" - }, - "variable" : "answer_to_the_universe" - }, - { - "bool" : true, - "metadata" : { - "description" : "Display Green View", - "group" : "UI Customization" - }, - "variable" : "display_green_view" - }, - { - "bool" : false, - "metadata" : { - "description" : "Display Red View", - "group" : "UI Customization" - }, - "variable" : "display_red_view" - }, - { - "bool" : false, - "metadata" : { - "description" : "Display Yellow View", - "group" : "UI Customization" - }, - "variable" : "display_yellow_view" - }, - { - "metadata" : { - "description" : "Encrypted definitive answer", - "group" : "General", - "propertyName" : "definitiveAnswerEncrypted" - }, - "secure" : "24 ton yletinifeD", - "variable" : "encrypted_answer_to_the_universe" - }, - { - "bool" : false, - "metadata" : { - "description" : "Greet on app launch", - "group" : "General" - }, - "variable" : "greet_on_app_did_become_active" - }, - { - "metadata" : { - "description" : "Label Text", - "group" : "UI Customization" - }, - "string" : "Test value", - "variable" : "label_text" - }, - { - "metadata" : { - "description" : "Red View Alpha Component", - "group" : "UI Customization" - }, - "number" : 0.80000000000000004, - "variable" : "red_view_alpha_component" - }, - { - "bool" : true, - "metadata" : { - "description" : "Tap to change views color", - "group" : "General" - }, - "variable" : "tap_to_change_color_enabled" - } - ] -} \ No newline at end of file diff --git a/JustTweakMigrator/Sources/Resources/Tweaks.json b/JustTweakMigrator/Sources/Resources/Tweaks.json deleted file mode 100644 index 77d3952..0000000 --- a/JustTweakMigrator/Sources/Resources/Tweaks.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "ui_customization": { - "display_red_view": { - "Title": "Display Red View", - "Description": "shows a red view in the main view controller", - "Group": "UI Customization", - "Value": false - }, - "display_yellow_view": { - "Title": "Display Yellow View", - "Description": "shows a yellow view in the main view controller", - "Group": "UI Customization", - "Value": false - }, - "display_green_view": { - "Title": "Display Green View", - "Description": "shows a green view in the main view controller", - "Group": "UI Customization", - "Value": true - }, - "red_view_alpha_component": { - "Title": "Red View Alpha Component", - "Description": "defines the alpha level of the red view", - "Group": "UI Customization", - "Value": 0.8 - }, - "label_text": { - "Title": "Label Text", - "Description": "the title of the main label", - "Group": "UI Customization", - "Value": "Test value" - } - }, - "general": { - "encrypted_answer_to_the_universe": { - "Title": "Encrypted definitive answer", - "Description": "Encrypted answer to the Ultimate Question of Life, the Universe, and Everything", - "Group": "General", - "Value": "24 ton yletinifeD", - "GeneratedPropertyName": "definitiveAnswerEncrypted", - "Encrypted": true - }, - "answer_to_the_universe": { - "Title": "Definitive answer", - "Description": "Answer to the Ultimate Question of Life, the Universe, and Everything", - "Group": "General", - "Value": 42, - "GeneratedPropertyName": "definitiveAnswer" - }, - "greet_on_app_did_become_active": { - "Title": "Greet on app launch", - "Description": "shows an alert on applicationDidBecomeActive", - "Group": "General", - "Value": false - }, - "tap_to_change_color_enabled": { - "Title": "Tap to change views color", - "Description": "change the colour of the main view when receiving a tap", - "Group": "General", - "Value": true - } - } -} diff --git a/JustTweakMigrator/Sources/Subcommands/ConvertDatasource.swift b/JustTweakMigrator/Sources/Subcommands/ConvertDatasource.swift deleted file mode 100644 index 790721d..0000000 --- a/JustTweakMigrator/Sources/Subcommands/ConvertDatasource.swift +++ /dev/null @@ -1,39 +0,0 @@ -// ConvertDatasource.swift - -import ArgumentParser -import Foundation - -struct ConvertDatasource: ParsableCommand { - - @Option(name: .long, help: "The path to the JustTweak datasource.") - var inputDatasourceFilePath: String - - @Option(name: .long, help: "The path to where save the Toggles datasource.") - var outputDatasourceFilePath: String - - func run() throws { - let tweaksDatasourceUrl = URL(fileURLWithPath: inputDatasourceFilePath) - let data = try Data(contentsOf: tweaksDatasourceUrl) - let tweaksDatasource = try JSONDecoder().decode(TweaksDatasource.self, from: data) - - print("*** Converting Tweaks Datasource ***") - for (_, togglesByVariable) in tweaksDatasource.tweaks { - for (variable, toggle) in togglesByVariable { - print(variable + ": " + String(describing: toggle.value)) - } - } - - let togglesDatasource = try Converter.convert(tweaksDatasource: tweaksDatasource) - print("\n") - print("*** Generated Toggles Datasource ***") - for toggle in togglesDatasource.toggles { - print(toggle.variable + ": " + String(describing: toggle.value)) - } - - let togglesDatasourceUrl = URL(fileURLWithPath: outputDatasourceFilePath) - let encoder = JSONEncoder() - encoder.outputFormatting = [.prettyPrinted, .sortedKeys] - let jsonData = try encoder.encode(togglesDatasource) - try jsonData.write(to: togglesDatasourceUrl) - } -} diff --git a/JustTweakMigrator/Tests/ConverterTests.swift b/JustTweakMigrator/Tests/ConverterTests.swift deleted file mode 100644 index be38899..0000000 --- a/JustTweakMigrator/Tests/ConverterTests.swift +++ /dev/null @@ -1,45 +0,0 @@ -// ConverterTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class ConverterTests: XCTestCase { - - func test_convertDatasource() throws { - let tweaksDatasource = TweaksDatasourceFactory.makeTestTweaksDatasource() - let togglesDatasource = try Converter.convert(tweaksDatasource: tweaksDatasource) - let toggles = [ - Toggle(variable: "variable_1", - value: .bool(true), - metadata: ToggleMetadata(description: "Var 1", group: "group_1", propertyName: "var1")), - Toggle(variable: "variable_2", - value: .int(42), - metadata: ToggleMetadata(description: "Var 2", group: "group_1", propertyName: "var2")), - Toggle(variable: "variable_3", - value: .number(3.1416), - metadata: ToggleMetadata(description: "Var 3", group: "group_2", propertyName: "var3")), - Toggle(variable: "variable_4", - value: .string("Hello World"), - metadata: ToggleMetadata(description: "Var 4", group: "group_2", propertyName: "var4")), - Toggle(variable: "variable_5", - value: .secure("__encrypted_value__"), - metadata: ToggleMetadata(description: "Var 5", group: "group_2", propertyName: "var5")) - ] - let expectedTogglesDatasource = TogglesDatasource(toggles: toggles) - XCTAssertEqual(togglesDatasource, expectedTogglesDatasource) - } - - func test_convertDatasourceFailsInCaseOfInvalidValue() throws { - let tweaksDatasource = TweaksDatasourceFactory.makeTestTweaksDatasourceWithInvalidValue() - XCTAssertThrowsError(try Converter.convert(tweaksDatasource: tweaksDatasource)) { error in - XCTAssertEqual(error as! Converter.ConverterError, Converter.ConverterError.invalidValue) - } - } - - func test_convertDatasourceFailsInCaseOfDuplicates() throws { - let tweaksDatasource = TweaksDatasourceFactory.makeTestTweaksDatasourceWithDuplicate() - XCTAssertThrowsError(try Converter.convert(tweaksDatasource: tweaksDatasource)) { error in - XCTAssertEqual(error as! TogglesValidator.LoaderError, TogglesValidator.LoaderError.foundDuplicateVariables(["variable_3"])) - } - } -} diff --git a/JustTweakMigrator/Tests/Resources/TestTweaks.json b/JustTweakMigrator/Tests/Resources/TestTweaks.json deleted file mode 100644 index 77d3952..0000000 --- a/JustTweakMigrator/Tests/Resources/TestTweaks.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "ui_customization": { - "display_red_view": { - "Title": "Display Red View", - "Description": "shows a red view in the main view controller", - "Group": "UI Customization", - "Value": false - }, - "display_yellow_view": { - "Title": "Display Yellow View", - "Description": "shows a yellow view in the main view controller", - "Group": "UI Customization", - "Value": false - }, - "display_green_view": { - "Title": "Display Green View", - "Description": "shows a green view in the main view controller", - "Group": "UI Customization", - "Value": true - }, - "red_view_alpha_component": { - "Title": "Red View Alpha Component", - "Description": "defines the alpha level of the red view", - "Group": "UI Customization", - "Value": 0.8 - }, - "label_text": { - "Title": "Label Text", - "Description": "the title of the main label", - "Group": "UI Customization", - "Value": "Test value" - } - }, - "general": { - "encrypted_answer_to_the_universe": { - "Title": "Encrypted definitive answer", - "Description": "Encrypted answer to the Ultimate Question of Life, the Universe, and Everything", - "Group": "General", - "Value": "24 ton yletinifeD", - "GeneratedPropertyName": "definitiveAnswerEncrypted", - "Encrypted": true - }, - "answer_to_the_universe": { - "Title": "Definitive answer", - "Description": "Answer to the Ultimate Question of Life, the Universe, and Everything", - "Group": "General", - "Value": 42, - "GeneratedPropertyName": "definitiveAnswer" - }, - "greet_on_app_did_become_active": { - "Title": "Greet on app launch", - "Description": "shows an alert on applicationDidBecomeActive", - "Group": "General", - "Value": false - }, - "tap_to_change_color_enabled": { - "Title": "Tap to change views color", - "Description": "change the colour of the main view when receiving a tap", - "Group": "General", - "Value": true - } - } -} diff --git a/JustTweakMigrator/Tests/Toggle+ComparableTests.swift b/JustTweakMigrator/Tests/Toggle+ComparableTests.swift deleted file mode 100644 index 8e917fe..0000000 --- a/JustTweakMigrator/Tests/Toggle+ComparableTests.swift +++ /dev/null @@ -1,127 +0,0 @@ -// Toggle+ComparableTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class Toggle_ComparableTests: XCTestCase { - - func test_toggleComparable_Variable() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var2", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_ValueBool() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(false), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_ValueInt() throws { - let toggle1 = Toggle(variable: "var1", - value: .int(42), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .int(108), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_ValueNumber() throws { - let toggle1 = Toggle(variable: "var1", - value: .number(3.1416), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .number(3.15), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_ValueString() throws { - let toggle1 = Toggle(variable: "var1", - value: .string("ABC"), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .string("BCD"), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_ValueSecure() throws { - let toggle1 = Toggle(variable: "var1", - value: .secure("ABC"), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .secure("BCD"), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataDescription() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc2", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataGroup() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group2", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataPropertyNameSomeSome() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property2")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataPropertyNameSomeNone() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: nil)) - XCTAssertFalse(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataPropertyNameNoneSome() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: nil)) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: "property1")) - XCTAssertTrue(toggle1 < toggle2) - } - - func test_toggleComparable_MetadataPropertyNameNoneNone() throws { - let toggle1 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: nil)) - let toggle2 = Toggle(variable: "var1", - value: .bool(true), - metadata: ToggleMetadata(description: "desc1", group: "group1", propertyName: nil)) - XCTAssertFalse(toggle1 < toggle2) - } -} diff --git a/JustTweakMigrator/Tests/Toggle+EncodableTests.swift b/JustTweakMigrator/Tests/Toggle+EncodableTests.swift deleted file mode 100644 index fba0029..0000000 --- a/JustTweakMigrator/Tests/Toggle+EncodableTests.swift +++ /dev/null @@ -1,52 +0,0 @@ -// Toggle+EncodableTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class Toggle_CodableTests: XCTestCase { - - func test_codableBooleanToggle() throws { - let toggle = Toggle(variable: "var", - value: .bool(true), - metadata: ToggleMetadata(description: "desc", group: "group", propertyName: "property")) - let data = try! JSONEncoder().encode(toggle) - let decodedToggle = try JSONDecoder().decode(Toggle.self, from: data) - XCTAssertEqual(toggle, decodedToggle) - } - - func test_codableIntegerToggle() throws { - let toggle = Toggle(variable: "var", - value: .int(42), - metadata: ToggleMetadata(description: "desc", group: "group", propertyName: "property")) - let data = try! JSONEncoder().encode(toggle) - let decodedToggle = try JSONDecoder().decode(Toggle.self, from: data) - XCTAssertEqual(toggle, decodedToggle) - } - - func test_codableNumericToggle() throws { - let toggle = Toggle(variable: "var", - value: .number(3.1416), - metadata: ToggleMetadata(description: "desc", group: "group", propertyName: "property")) - let data = try! JSONEncoder().encode(toggle) - let decodedToggle = try JSONDecoder().decode(Toggle.self, from: data) - XCTAssertEqual(toggle, decodedToggle) - } - - func test_codableStringToggle() throws { - let toggle = Toggle(variable: "var", - value: .string("Hello World"), - metadata: ToggleMetadata(description: "desc", group: "group", propertyName: "property")) - let data = try! JSONEncoder().encode(toggle) - let decodedToggle = try JSONDecoder().decode(Toggle.self, from: data) - XCTAssertEqual(toggle, decodedToggle) - } - - func test_codableSecureToggle() throws { - let toggle = Toggle(variable: "var", - value: .secure("secret"), - metadata: ToggleMetadata(description: "desc", group: "group", propertyName: "property")) - let data = try! JSONEncoder().encode(toggle) - let decodedToggle = try JSONDecoder().decode(Toggle.self, from: data) - XCTAssertEqual(toggle, decodedToggle) - } -} diff --git a/JustTweakMigrator/Tests/TogglesValidatorTests.swift b/JustTweakMigrator/Tests/TogglesValidatorTests.swift deleted file mode 100644 index 472c0d5..0000000 --- a/JustTweakMigrator/Tests/TogglesValidatorTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -// TogglesValidatorTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class TogglesValidatorTests: XCTestCase { - - func test_validateNoDuplicates() throws { - let toggles = [ - Toggle(variable: "variable_1", - value: .bool(true), - metadata: ToggleMetadata(description: "Var 1", group: "group_1", propertyName: "var1")), - Toggle(variable: "variable_2", - value: .int(42), - metadata: ToggleMetadata(description: "Var 2", group: "group_1", propertyName: "var2")), - ] - XCTAssertNoThrow(try TogglesValidator.validate(toggles)) - } - - func test_validateDuplicates() throws { - let toggles = [ - Toggle(variable: "variable_1", - value: .bool(true), - metadata: ToggleMetadata(description: "Var 1", group: "group_1", propertyName: "var1")), - Toggle(variable: "variable_1", - value: .int(42), - metadata: ToggleMetadata(description: "Var 2", group: "group_1", propertyName: "var2")), - ] - XCTAssertThrowsError(try TogglesValidator.validate(toggles)) - } -} diff --git a/JustTweakMigrator/Tests/TweaksDatasource+DecodableTests.swift b/JustTweakMigrator/Tests/TweaksDatasource+DecodableTests.swift deleted file mode 100644 index c2e2558..0000000 --- a/JustTweakMigrator/Tests/TweaksDatasource+DecodableTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -// TweaksDatasource+DecodableTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class TweaksDatasource_DecodableTests: XCTestCase { - - func test_tweakDecoding() throws { - let tweaksDatasourceUrl = Bundle.module.url(forResource: "TestTweaks", withExtension: "json")! - let data = try Data(contentsOf: tweaksDatasourceUrl) - let tweaksDatasource = try JSONDecoder().decode(TweaksDatasource.self, from: data) - XCTAssertEqual(tweaksDatasource.tweaks.keys.count, 2) - let uiCustomizationTweaks = tweaksDatasource.tweaks["ui_customization"]! - XCTAssertEqual(uiCustomizationTweaks.count, 5) - let generalTweaks = tweaksDatasource.tweaks["general"]! - XCTAssertEqual(generalTweaks.count, 4) - } -} diff --git a/JustTweakMigrator/Tests/TweaksDatasource+FullTweaksTests.swift b/JustTweakMigrator/Tests/TweaksDatasource+FullTweaksTests.swift deleted file mode 100644 index bb71c94..0000000 --- a/JustTweakMigrator/Tests/TweaksDatasource+FullTweaksTests.swift +++ /dev/null @@ -1,50 +0,0 @@ -// TweaksDatasource+FullTweaksTests.swift - -import XCTest -@testable import JustTweakMigrator - -final class TweaksDatasource_FullTweaksTests: XCTestCase { - - func test_fullTweaks() throws { - let tweaksDatasource = TweaksDatasourceFactory.makeTestTweaksDatasource() - let fullTweaks = tweaksDatasource.fullTweaks - let expectedFullTweaks = [ - FullTweak(title: "Var 1", - group: "group_1", - value: true, - encrypted: false, - generatedPropertyName: "var1", - variable: "variable_1", - feature: "feature_1"), - FullTweak(title: "Var 2", - group: "group_1", - value: 42, - encrypted: false, - generatedPropertyName: "var2", - variable: "variable_2", - feature: "feature_1"), - FullTweak(title: "Var 3", - group: "group_2", - value: 3.1416, - encrypted: false, - generatedPropertyName: "var3", - variable: "variable_3", - feature: "feature_1"), - FullTweak(title: "Var 4", - group: "group_2", - value: "Hello World", - encrypted: false, - generatedPropertyName: "var4", - variable: "variable_4", - feature: "feature_2"), - FullTweak(title: "Var 5", - group: "group_2", - value: "__encrypted_value__", - encrypted: true, - generatedPropertyName: "var5", - variable: "variable_5", - feature: "feature_2") - ] - XCTAssertEqual(fullTweaks, expectedFullTweaks) - } -} diff --git a/JustTweakMigrator/Tests/Utilities/TweaksDatasourceFactory.swift b/JustTweakMigrator/Tests/Utilities/TweaksDatasourceFactory.swift deleted file mode 100644 index 1642e82..0000000 --- a/JustTweakMigrator/Tests/Utilities/TweaksDatasourceFactory.swift +++ /dev/null @@ -1,117 +0,0 @@ -// TweaksDatasourceFactory.swift - -import Foundation -@testable import JustTweakMigrator - -class TweaksDatasourceFactory { - - static func makeTestTweaksDatasource() -> TweaksDatasource { - let tweaks: [TweakFeature : [TweakVariable : Tweak]] = [ - "feature_1": [ - "variable_1": Tweak(title: "Var 1", - group: "group_1", - value: true, - encrypted: false, - generatedPropertyName: "var1"), - "variable_2": Tweak(title: "Var 2", - group: "group_1", - value: 42, - encrypted: false, - generatedPropertyName: "var2"), - "variable_3": Tweak(title: "Var 3", - group: "group_2", - value: 3.1416, - encrypted: false, - generatedPropertyName: "var3"), - ], - "feature_2": [ - "variable_4": Tweak(title: "Var 4", - group: "group_2", - value: "Hello World", - encrypted: false, - generatedPropertyName: "var4"), - "variable_5": Tweak(title: "Var 5", - group: "group_2", - value: "__encrypted_value__", - encrypted: true, - generatedPropertyName: "var5") - ] - ] - return TweaksDatasource(tweaks: tweaks) - } - - static func makeTestTweaksDatasourceWithDuplicate() -> TweaksDatasource { - let tweaks: [TweakFeature : [TweakVariable : Tweak]] = [ - "feature_1": [ - "variable_1": Tweak(title: "Var 1", - group: "group_1", - value: true, - encrypted: false, - generatedPropertyName: "var1"), - "variable_2": Tweak(title: "Var 2", - group: "group_1", - value: 42, - encrypted: false, - generatedPropertyName: "var2"), - "variable_3": Tweak(title: "Var 3", - group: "group_2", - value: 3.1416, - encrypted: false, - generatedPropertyName: "var3"), - ], - "feature_2": [ - "variable_3": Tweak(title: "Var 3", - group: "group_2", - value: 3.1416, - encrypted: false, - generatedPropertyName: "var3"), - "variable_4": Tweak(title: "Var 4", - group: "group_2", - value: "Hello World", - encrypted: false, - generatedPropertyName: "var4"), - "variable_5": Tweak(title: "Var 5", - group: "group_2", - value: "Hello World", - encrypted: true, - generatedPropertyName: "var5") - ] - ] - return TweaksDatasource(tweaks: tweaks) - } - - static func makeTestTweaksDatasourceWithInvalidValue() -> TweaksDatasource { - let tweaks: [TweakFeature : [TweakVariable : Tweak]] = [ - "feature_1": [ - "variable_1": Tweak(title: "Var 1", - group: "group_1", - value: true, - encrypted: false, - generatedPropertyName: "var1"), - "variable_2": Tweak(title: "Var 2", - group: "group_1", - value: 42, - encrypted: false, - generatedPropertyName: "var2"), - "variable_3": Tweak(title: "Var 3", - group: "group_2", - value: ["invalid"], - encrypted: false, - generatedPropertyName: "var3"), - ], - "feature_2": [ - "variable_4": Tweak(title: "Var 4", - group: "group_2", - value: "Hello World", - encrypted: false, - generatedPropertyName: "var4"), - "variable_5": Tweak(title: "Var 5", - group: "group_2", - value: "Hello World", - encrypted: true, - generatedPropertyName: "var5") - ] - ] - return TweaksDatasource(tweaks: tweaks) - } -} diff --git a/ToggleCipher/.gitignore b/ToggleCipher/.gitignore deleted file mode 100644 index 3b29812..0000000 --- a/ToggleCipher/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -/.build -/Packages -/*.xcodeproj -xcuserdata/ -DerivedData/ -.swiftpm/config/registries.json -.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata -.netrc diff --git a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [decrypt].xcscheme b/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [decrypt].xcscheme deleted file mode 100644 index bc5131f..0000000 --- a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [decrypt].xcscheme +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [encrypt].xcscheme b/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [encrypt].xcscheme deleted file mode 100644 index ba9ea89..0000000 --- a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher [encrypt].xcscheme +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher.xcscheme b/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher.xcscheme deleted file mode 100644 index 060cb2f..0000000 --- a/ToggleCipher/.swiftpm/xcode/xcshareddata/xcschemes/ToggleCipher.xcscheme +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ToggleCipher/Package.resolved b/ToggleCipher/Package.resolved deleted file mode 100644 index f37e65d..0000000 --- a/ToggleCipher/Package.resolved +++ /dev/null @@ -1,15 +0,0 @@ -{ - "originHash" : "63afab39f29cfaa6bb7b11a572048e87c16a4d8a4f890b580e8e6290524fcbf5", - "pins" : [ - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - } - ], - "version" : 3 -} diff --git a/ToggleCipher/Package.swift b/ToggleCipher/Package.swift deleted file mode 100644 index d15c53f..0000000 --- a/ToggleCipher/Package.swift +++ /dev/null @@ -1,39 +0,0 @@ -// swift-tools-version: 6.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "ToggleCipher", - platforms: [ - .macOS(.v12) - ], - products: [ - .executable(name: "ToggleCipher", targets: ["ToggleCipher"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser.git", .upToNextMinor(from: "1.5.0")) - ], - targets: [ - .executableTarget( - name: "ToggleCipher", - dependencies: [ - .product(name: "ArgumentParser", package: "swift-argument-parser") - ], - path: "Sources", - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ), - .testTarget( - name: "ToggleCipherTests", - dependencies: ["ToggleCipher"], - path: "Tests", - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ) - ] -) diff --git a/ToggleCipher/README.md b/ToggleCipher/README.md deleted file mode 100644 index 4987068..0000000 --- a/ToggleCipher/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ToggleCipher - -A description of this package. diff --git a/ToggleCipher/Sources/ChaCha20Poly1305.swift b/ToggleCipher/Sources/ChaCha20Poly1305.swift deleted file mode 100644 index ef36022..0000000 --- a/ToggleCipher/Sources/ChaCha20Poly1305.swift +++ /dev/null @@ -1,45 +0,0 @@ -// ChaCha20Poly1305.swift - -import Foundation -import CryptoKit - -struct ChaCha20Poly1305 { - - enum CipherError: Error { - case invalidKey(String) - case invalidValue(String) - case invalidDecryptedData(Data) - } - - let key: String - - func encrypt(_ value: String) throws -> String { - guard let dataToEncrypt = value.data(using: .utf8) else { - throw CipherError.invalidValue(value) - } - let symmetricKey = try makeSymmetricKey(key: key) - let encryptedData = try ChaChaPoly.seal(dataToEncrypt, using: symmetricKey) - return encryptedData.combined.base64EncodedString() - } - - func decrypt(_ value: String) throws -> String { - guard let base64StringData = Data(base64Encoded: value) else { - throw CipherError.invalidValue(value) - } - let symmetricKey = try makeSymmetricKey(key: key) - let sealedBox = try ChaChaPoly.SealedBox(combined: base64StringData) - let decryptedData = try ChaChaPoly.open(sealedBox, using: symmetricKey) - guard let base64StringData = String(data: decryptedData, encoding: .utf8) else { - throw CipherError.invalidDecryptedData(decryptedData) - } - return base64StringData - } - - private func makeSymmetricKey(key: String) throws -> SymmetricKey { - guard let keyData = key.data(using: .utf8) else { - throw CipherError.invalidKey(key) - } - let hash = SHA256.hash(data: keyData) - return SymmetricKey(data: hash) - } -} diff --git a/ToggleCipher/Sources/Decrypt.swift b/ToggleCipher/Sources/Decrypt.swift deleted file mode 100644 index ae37ee1..0000000 --- a/ToggleCipher/Sources/Decrypt.swift +++ /dev/null @@ -1,30 +0,0 @@ -// Decrypt.swift - -import ArgumentParser -import Foundation - -struct Decrypt: ParsableCommand { - - @Option(name: .long, help: "The algorithm to use.") - var algorithm: Algorithm - - @Option(name: .long, help: "The key to use for the algorithm.") - var key: String - - @Option(name: .long, help: "The value to encrypt.") - var value: String - - enum Algorithm: String, ExpressibleByArgument { - case chaCha20Poly1305 = "chaChaPoly" - } - - mutating func run() throws { - switch algorithm { - case .chaCha20Poly1305: - let cipher = ChaCha20Poly1305(key: key) - let decryptedValue = try cipher.decrypt(value) - print("Encrypted value: \"\(value)\"") - print("Decrypted value: \"\(decryptedValue)\"") - } - } -} diff --git a/ToggleCipher/Sources/Encrypt.swift b/ToggleCipher/Sources/Encrypt.swift deleted file mode 100644 index c27cc07..0000000 --- a/ToggleCipher/Sources/Encrypt.swift +++ /dev/null @@ -1,30 +0,0 @@ -// Encrypt.swift - -import ArgumentParser -import Foundation - -struct Encrypt: ParsableCommand { - - @Option(name: .long, help: "The algorithm to use.") - var algorithm: Algorithm - - @Option(name: .long, help: "The key to use for the algorithm.") - var key: String - - @Option(name: .long, help: "The value to encrypt.") - var value: String - - enum Algorithm: String, ExpressibleByArgument { - case chaCha20Poly1305 = "chaChaPoly" - } - - mutating func run() throws { - switch algorithm { - case .chaCha20Poly1305: - let cipher = ChaCha20Poly1305(key: key) - let encryptedValue = try cipher.encrypt(value) - print("Plaintext value: \"\(value)\"") - print("Encrypted value: \"\(encryptedValue)\"") - } - } -} diff --git a/ToggleCipher/Sources/ToggleCypher.swift b/ToggleCipher/Sources/ToggleCypher.swift deleted file mode 100644 index 84b4bcf..0000000 --- a/ToggleCipher/Sources/ToggleCypher.swift +++ /dev/null @@ -1,16 +0,0 @@ -// Generator.swift - -import ArgumentParser -import Foundation - -@main -struct Generator: AsyncParsableCommand { - - static let configuration = CommandConfiguration( - abstract: "", - subcommands: [ - Encrypt.self, - Decrypt.self - ] - ) -} diff --git a/ToggleCipher/Tests/ChaCha20Poly1305Tests.swift b/ToggleCipher/Tests/ChaCha20Poly1305Tests.swift deleted file mode 100644 index 71fb734..0000000 --- a/ToggleCipher/Tests/ChaCha20Poly1305Tests.swift +++ /dev/null @@ -1,26 +0,0 @@ -// ChaCha20Poly1305Tests.swift - -import XCTest -@testable import ToggleCipher - -final class ChaCha20Poly1305Tests: XCTestCase { - - var cipher: ChaCha20Poly1305! - let value = "some secret value" - - override func setUp() { - super.setUp() - cipher = ChaCha20Poly1305(key: "") - } - - override func tearDown() { - cipher = nil - super.tearDown() - } - - func test_encryptAndDecrypt() throws { - let encryptedValue = try cipher.encrypt(value) - let decryptedValue = try cipher.decrypt(encryptedValue) - XCTAssertEqual(decryptedValue, value) - } -} diff --git a/ToggleGen/.gitignore b/ToggleGen/.gitignore deleted file mode 100644 index 3b29812..0000000 --- a/ToggleGen/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -/.build -/Packages -/*.xcodeproj -xcuserdata/ -DerivedData/ -.swiftpm/config/registries.json -.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata -.netrc diff --git a/ToggleGen/.swiftpm/xcode/xcshareddata/xcschemes/ToggleGen.xcscheme b/ToggleGen/.swiftpm/xcode/xcshareddata/xcschemes/ToggleGen.xcscheme deleted file mode 100644 index d9fc329..0000000 --- a/ToggleGen/.swiftpm/xcode/xcshareddata/xcschemes/ToggleGen.xcscheme +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ToggleGen/Demo/DemoDatasource.json b/ToggleGen/Demo/DemoDatasource.json deleted file mode 100644 index 9e1491e..0000000 --- a/ToggleGen/Demo/DemoDatasource.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "toggles": [ - { - "variable": "boolean_toggle", - "bool": true - }, - { - "variable": "integer_toggle", - "int": 42 - }, - { - "variable": "numeric_toggle", - "number": 3.1416 - }, - { - "variable": "string_toggle", - "string": "Hello World" - }, - { - "variable": "encrypted_toggle", - "secure": "eDUxAQXW6dobqAMxhZIJLkyQKb8+36bFHc36eabacXDahMipVnGy/Q==" - }, - { - "variable": "boolean_toggle_2", - "bool": true, - "propertyName": "userDefinedBooleanToggle" - }, - { - "variable": "integer_toggle_2", - "int": 108, - "propertyName": "userDefinedIntegerToggle" - }, - { - "variable": "numeric_toggle_2", - "number": 1.618, - "propertyName": "userDefinedNumericToggle" - }, - { - "variable": "string_toggle_2", - "string": "Ciao Mondo", - "propertyName": "userDefinedStringToggle" - }, - { - "variable": "object_toggle", - "object": { - "boolProperty" : true, - "stringProperty" : "value", - "intProperty" : 420, - "numberProperty": 13.6 - }, - "propertyName": "userDefinedObjectToggle" - } - ] -} diff --git a/ToggleGen/GeneratedCode/ToggleAccessor.swift b/ToggleGen/GeneratedCode/ToggleAccessor.swift deleted file mode 100644 index 2933073..0000000 --- a/ToggleGen/GeneratedCode/ToggleAccessor.swift +++ /dev/null @@ -1,71 +0,0 @@ -// ToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -public class ToggleAccessor { - - private(set) var manager: ToggleManager - - public init(manager: ToggleManager) { - self.manager = manager - } -} - -extension ToggleAccessor { - - public var booleanToggle: Bool { - get { manager.value(for: ToggleVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: ToggleVariables.booleanToggle) } - } - - public var integerToggle: Int { - get { manager.value(for: ToggleVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: ToggleVariables.integerToggle) } - } - - public var numericToggle: Double { - get { manager.value(for: ToggleVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: ToggleVariables.numericToggle) } - } - - public var stringToggle: String { - get { manager.value(for: ToggleVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: ToggleVariables.stringToggle) } - } - - public var encryptedToggle: String { - get { manager.value(for: ToggleVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: ToggleVariables.encryptedToggle) } - } - - public var booleanToggle2: Bool { - get { manager.value(for: ToggleVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: ToggleVariables.booleanToggle2) } - } - - public var integerToggle2: Int { - get { manager.value(for: ToggleVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: ToggleVariables.integerToggle2) } - } - - public var numericToggle2: Double { - get { manager.value(for: ToggleVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: ToggleVariables.numericToggle2) } - } - - public var stringToggle2: String { - get { manager.value(for: ToggleVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: ToggleVariables.stringToggle2) } - } - - public var objectToggle: Object { - get { manager.value(for: ToggleVariables.objectToggle).objectValue! } - set { manager.set(.object(newValue), for: ToggleVariables.objectToggle) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/GeneratedCode/ToggleVariables.swift b/ToggleGen/GeneratedCode/ToggleVariables.swift deleted file mode 100644 index 7f6312e..0000000 --- a/ToggleGen/GeneratedCode/ToggleVariables.swift +++ /dev/null @@ -1,31 +0,0 @@ -// ToggleVariables.swift - -// swiftlint:disable file_length - -import Foundation - -public enum ToggleVariables { - - public static let booleanToggle = "boolean_toggle" - - public static let integerToggle = "integer_toggle" - - public static let numericToggle = "numeric_toggle" - - public static let stringToggle = "string_toggle" - - public static let encryptedToggle = "encrypted_toggle" - - public static let booleanToggle2 = "boolean_toggle_2" - - public static let integerToggle2 = "integer_toggle_2" - - public static let numericToggle2 = "numeric_toggle_2" - - public static let stringToggle2 = "string_toggle_2" - - public static let objectToggle = "object_toggle" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Package.resolved b/ToggleGen/Package.resolved deleted file mode 100644 index af424fb..0000000 --- a/ToggleGen/Package.resolved +++ /dev/null @@ -1,42 +0,0 @@ -{ - "originHash" : "10bd945cafbf5fd5a04f3e154ea5980c17116a5d1c1e7557d397352110c0eedd", - "pins" : [ - { - "identity" : "pathkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kylef/PathKit.git", - "state" : { - "revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574", - "version" : "1.0.1" - } - }, - { - "identity" : "spectre", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kylef/Spectre.git", - "state" : { - "revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7", - "version" : "0.10.1" - } - }, - { - "identity" : "stencil", - "kind" : "remoteSourceControl", - "location" : "https://github.com/stencilproject/Stencil.git", - "state" : { - "revision" : "4f222ac85d673f35df29962fc4c36ccfdaf9da5b", - "version" : "0.15.1" - } - }, - { - "identity" : "swift-argument-parser", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser.git", - "state" : { - "revision" : "41982a3656a71c768319979febd796c6fd111d5c", - "version" : "1.5.0" - } - } - ], - "version" : 3 -} diff --git a/ToggleGen/Package.swift b/ToggleGen/Package.swift deleted file mode 100644 index 95e6c78..0000000 --- a/ToggleGen/Package.swift +++ /dev/null @@ -1,44 +0,0 @@ -// swift-tools-version: 6.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "ToggleGen", - platforms: [ - .iOS(.v15), - .macOS(.v12) - ], - products: [ - .executable(name: "ToggleGen", - targets: ["ToggleGen"]) - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-argument-parser.git", .upToNextMinor(from: "1.5.0")), - .package(url: "https://github.com/stencilproject/Stencil.git", exact: "0.15.1"), - ], - targets: [ - .executableTarget( - name: "ToggleGen", - dependencies: [ - .product(name: "ArgumentParser", package: "swift-argument-parser"), - .product(name: "Stencil", package: "Stencil"), - ], - path: "Sources", - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ), - .testTarget( - name: "ToggleGenTests", - dependencies: ["ToggleGen"], - path: "Tests", - resources: [.process("Resources")], - swiftSettings: [ - .enableUpcomingFeature("InternalImportsByDefault"), - .enableUpcomingFeature("ExistentialAny") - ] - ) - ] -) diff --git a/ToggleGen/README.md b/ToggleGen/README.md deleted file mode 100644 index 0b032dd..0000000 --- a/ToggleGen/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ToggleGen - -A description of this package. diff --git a/ToggleGen/Sources/Core/Generator.swift b/ToggleGen/Sources/Core/Generator.swift deleted file mode 100644 index 69f7071..0000000 --- a/ToggleGen/Sources/Core/Generator.swift +++ /dev/null @@ -1,128 +0,0 @@ -// Generator.swift - -import Foundation - -enum AccessControl: String { - enum Error: Swift.Error { - case unknownAccessControl - } - - case `open` - case `public` - case `package` - case `internal` - - init(value: String) throws { - guard let accessControl = AccessControl(rawValue: value) else { - throw Error.unknownAccessControl - } - self = accessControl - } -} - -struct Constant { - let name: String - let value: String -} - -struct AccessorInfo { - var variable: Toggle.Variable - var type: String - var propertyName: String - var constant: Constant - var toggleType: String -} - -class Generator { - - private enum Constants: String { - case className - case enumName - case accessorInfos - case variables - case accessControl - } - - enum LoaderError: Error, Equatable { - case foundDuplicateVariables([Toggle.Variable]) - case foundDuplicatePropertyNames([String]) - } - - private let datasource: Datasource - - init(datasourceUrl: URL) throws { - let content = try Data(contentsOf: datasourceUrl) - datasource = try JSONDecoder().decode(Datasource.self, from: content) - try validate() - } - - func generateVariables(variablesTemplatePath: String, - variablesEnumName: String, - accessControl: AccessControl?) throws -> String { - let templater = Templater() - let variablesTemplateUrl = URL(fileURLWithPath: variablesTemplatePath) - var variablesContext: [String: Any] = [ - Constants.enumName.rawValue: variablesEnumName, - Constants.variables.rawValue: loadVariables() - ] - if let accessControlValue = accessControl?.rawValue { - variablesContext[Constants.accessControl.rawValue] = accessControlValue - } - - return try templater.renderTemplate(at: variablesTemplateUrl, with: variablesContext) - } - - func generateAccessor(accessorTemplatePath: String, - variablesEnumName: String, - accessorClassName: String, - accessControl: AccessControl?) throws -> String { - let templater = Templater() - let accessorTemplateUrl = URL(fileURLWithPath: accessorTemplatePath) - var accessorContext: [String: Any] = [ - Constants.className.rawValue: accessorClassName, - Constants.enumName.rawValue: variablesEnumName, - Constants.accessorInfos.rawValue: loadAccessorInfos() - ] - if let accessControlValue = accessControl?.rawValue { - accessorContext[Constants.accessControl.rawValue] = accessControlValue - } - - return try templater.renderTemplate(at: accessorTemplateUrl, with: accessorContext) - } - - private func validate() throws { - let duplicateVariables = Dictionary(grouping: datasource.toggles, by: \.variable) - .filter { $1.count > 1 } - .compactMap { String($0.0) } - .map { String($0) } - if duplicateVariables.count > 0 { - throw LoaderError.foundDuplicateVariables(duplicateVariables) - } - - let duplicatePropertyNames = Dictionary(grouping: datasource.toggles, by: \.computedPropertyName) - .filter { $1.count > 1 } - .compactMap { $0.0 } - if duplicatePropertyNames.count > 0 { - throw LoaderError.foundDuplicatePropertyNames(duplicatePropertyNames) - } - } - - private func loadVariables() -> [Constant] { - datasource.toggles.map { - Constant(name: $0.variable.codeVariableValue, - value: $0.variable) - } - } - - private func loadAccessorInfos() -> [AccessorInfo] { - datasource.toggles.map { toggle in - let constant = Constant(name: toggle.variable.codeVariableValue, - value: toggle.variable) - return AccessorInfo(variable: toggle.variable, - type: toggle.type, - propertyName: toggle.computedPropertyName, - constant: constant, - toggleType: toggle.toggleType) - } - } -} diff --git a/ToggleGen/Sources/Core/Templater.swift b/ToggleGen/Sources/Core/Templater.swift deleted file mode 100644 index d452c6a..0000000 --- a/ToggleGen/Sources/Core/Templater.swift +++ /dev/null @@ -1,13 +0,0 @@ -// Templater.swift - -import Foundation -import Stencil - -class Templater { - - func renderTemplate(at url: URL, with context: [String: Any]) throws -> String { - let templateString = try String(contentsOf: url) - let template = Template(templateString: templateString) - return try template.render(context) - } -} diff --git a/ToggleGen/Sources/Core/Writer.swift b/ToggleGen/Sources/Core/Writer.swift deleted file mode 100644 index cb50a72..0000000 --- a/ToggleGen/Sources/Core/Writer.swift +++ /dev/null @@ -1,48 +0,0 @@ -// Writer.swift - -import Foundation - -typealias Content = String - -class Writer { - - private enum Constants: String { - case swift - } - - func saveVariables(_ content: Content, outputPath: String, variablesEnumName: String) throws { - let variablesFileName = URL(fileURLWithPath: outputPath) - .appendingPathComponent(variablesEnumName) - .appendingPathExtension(Constants.swift.rawValue) - try write(content, to: variablesFileName) - } - - func saveAccessor(_ content: Content, outputPath: String, accessorClassName: String) throws { - let accessorFileName = URL(fileURLWithPath: outputPath) - .appendingPathComponent(accessorClassName) - .appendingPathExtension(Constants.swift.rawValue) - try write(content, to: accessorFileName) - } - - private func write(_ content: Content, to url: URL) throws { - let existingContent = try? String(contentsOf: url, encoding: .utf8) - switch (existingContent, content) { - case (.none, let newContent): - try writeContent(newContent, at: url) - case (.some(let existingContent), let newContent) where existingContent != newContent: - try writeContent(newContent, at: url) - case (.some, _): - break - } - } - - private func writeContent(_ content: String, at url: URL) throws { - let fileManager = FileManager.default - let absolutePathToFolder = url.deletingLastPathComponent().path - var fileIsDirectory: ObjCBool = true - if !fileManager.fileExists(atPath: absolutePathToFolder, isDirectory: &fileIsDirectory) { - try fileManager.createDirectory(atPath: absolutePathToFolder, withIntermediateDirectories: true, attributes: nil) - } - try content.write(to: url, atomically: true, encoding: .utf8) - } -} diff --git a/ToggleGen/Sources/Extensions/Models+Decodable.swift b/ToggleGen/Sources/Extensions/Models+Decodable.swift deleted file mode 100644 index 5f6dd45..0000000 --- a/ToggleGen/Sources/Extensions/Models+Decodable.swift +++ /dev/null @@ -1,48 +0,0 @@ -// Models+Codable.swift - -import Foundation - -extension Toggle: Decodable { - - enum CodingError: Error { - case missingValue - } - - enum CodingKeys: String, CodingKey { - case variable - case bool - case int - case number - case string - case secure - case object - case metadata - } - - public init(from decoder: any Decoder) throws { - let values = try decoder.container(keyedBy: CodingKeys.self) - variable = try values.decode(Variable.self, forKey: .variable) - if let boolValue = try? values.decode(Bool.self, forKey: .bool) { - self.value = .bool(boolValue) - } - else if let intValue = try? values.decode(Int.self, forKey: .int) { - self.value = .int(intValue) - } - else if let doubleValue = try? values.decode(Double.self, forKey: .number) { - self.value = .number(doubleValue) - } - else if let stringValue = try? values.decode(String.self, forKey: .string) { - self.value = .string(stringValue) - } - else if let secureValue = try? values.decode(String.self, forKey: .secure) { - self.value = .secure(secureValue) - } - else if let objectValue = try? values.decode(Object.self, forKey: .object) { - self.value = .object(objectValue) - } - else { - throw CodingError.missingValue - } - metadata = try values.decodeIfPresent(Toggle.ToggleMetadata.self, forKey: .metadata) - } -} diff --git a/ToggleGen/Sources/Extensions/Models+Utilities.swift b/ToggleGen/Sources/Extensions/Models+Utilities.swift deleted file mode 100644 index 671d089..0000000 --- a/ToggleGen/Sources/Extensions/Models+Utilities.swift +++ /dev/null @@ -1,54 +0,0 @@ -// Models+Utilities.swift - -import Foundation - -extension Toggle.Variable { - var codeVariableValue: String { - camelCased() - } -} - -extension Toggle { - var computedPropertyName: String { - if let propertyName = metadata?.propertyName { - return propertyName - } - return variable.codeVariableValue - } -} - -extension Toggle { - var type: String { - switch value { - case .bool: - return "Bool" - case .int: - return "Int" - case .number: - return "Double" - case .string: - return "String" - case .secure: - return "String" - case .object: - return "Object" - } - } - - var toggleType: String { - switch value { - case .bool: - return "bool" - case .int: - return "int" - case .number: - return "number" - case .string: - return "string" - case .secure: - return "secure" - case .object: - return "object" - } - } -} diff --git a/ToggleGen/Sources/Extensions/String+Casing.swift b/ToggleGen/Sources/Extensions/String+Casing.swift deleted file mode 100644 index 6abf6ef..0000000 --- a/ToggleGen/Sources/Extensions/String+Casing.swift +++ /dev/null @@ -1,21 +0,0 @@ -// String+Casing.swift - -import Foundation - -extension String { - - func camelCased(with separator: Character = "_") -> String { - split(separator: separator) - .enumerated() - .map { $0.offset == 0 ? String($0.element).lowercasedFirstChar() : String($0.element).capitalisedFirstChar() } - .joined() - } - - func lowercasedFirstChar() -> String { - prefix(1).lowercased() + self.dropFirst() - } - - func capitalisedFirstChar() -> String { - prefix(1).uppercased() + self.dropFirst() - } -} diff --git a/ToggleGen/Sources/Models/Models.swift b/ToggleGen/Sources/Models/Models.swift deleted file mode 100644 index 1da08ea..0000000 --- a/ToggleGen/Sources/Models/Models.swift +++ /dev/null @@ -1,29 +0,0 @@ -// Models.swift - -import Foundation - -struct Toggle: Equatable { - - typealias Variable = String - - struct ToggleMetadata: Equatable, Decodable { - let propertyName: String? - } - - enum Value: Equatable, Decodable { - case bool(Bool) - case int(Int) - case number(Double) - case string(String) - case secure(String) - case object(Object) - } - - let variable: Variable - let value: Value - let metadata: ToggleMetadata? -} - -struct Datasource: Equatable, Decodable { - public let toggles: [Toggle] -} diff --git a/ToggleGen/Sources/Models/Object.swift b/ToggleGen/Sources/Models/Object.swift deleted file mode 100644 index 404a15f..0000000 --- a/ToggleGen/Sources/Models/Object.swift +++ /dev/null @@ -1,28 +0,0 @@ -// Object.swift - -import Foundation - -struct Object: Equatable, Decodable { - let map: [String: ObjectSupportedType] - - init(from decoder: any Decoder) throws { - let container = try decoder.singleValueContainer() - - if let dictionary = try? container.decode([String: ObjectSupportedType].self) { - var map = [String: ObjectSupportedType]() - for (key, item) in dictionary { - guard !key.isEmpty else { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "JSON contained empty key. Invalid data.") - } - map[key] = item - } - if map.isEmpty { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "Empty object. Invalid data.") - } - - self.map = map - } else { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "Unsupported type. Invalid data.") - } - } -} diff --git a/ToggleGen/Sources/Models/ObjectSupportedType.swift b/ToggleGen/Sources/Models/ObjectSupportedType.swift deleted file mode 100644 index e452404..0000000 --- a/ToggleGen/Sources/Models/ObjectSupportedType.swift +++ /dev/null @@ -1,27 +0,0 @@ -// ObjectSupportedType.swift - -import Foundation - -enum ObjectSupportedType: Equatable, Decodable { - case bool(Bool) - case int(Int) - case number(Double) - case string(String) - - init(from decoder: any Decoder) throws { - let container = try decoder.singleValueContainer() - - if let bool = try? container.decode(Bool.self) { - self = .bool(bool) - } else if let int = try? container.decode(Int.self) { - self = .int(int) - } else if let number = try? container.decode(Double.self) { - self = .number(number) - } else if let string = try? container.decode(String.self) { - self = .string(string) - } else { - throw DecodingError.dataCorruptedError(in: container, debugDescription: "ObjectSupportedType tried to decode unsupported type, could not decode") - } - } -} - diff --git a/ToggleGen/Sources/ToggleGen.swift b/ToggleGen/Sources/ToggleGen.swift deleted file mode 100644 index c97905c..0000000 --- a/ToggleGen/Sources/ToggleGen.swift +++ /dev/null @@ -1,59 +0,0 @@ -// ToggleGen.swift - -import ArgumentParser -import Foundation - -@main -struct ToggleGen: ParsableCommand { - - @Option(name: .long, help: "The path of the template to use to generate the variables.") - var variablesTemplatePath: String - - @Option(name: .long, help: "The path of the template to use to generate the accessor.") - var accessorTemplatePath: String - - @Option(name: .long, help: "The name of the variables enum to generate.") - var variablesEnumName: String - - @Option(name: .long, help: "The name of the accessor class to generate.") - var accessorClassName: String - - @Option(name: .long, help: "The path of the datas source to use.") - var datasourcePath: String - - @Option(name: .long, help: "The path to the folder to write the ToggleAccessor file to.") - var accessorOutputPath: String - - @Option(name: .long, help: "The path to the folder to write the ToggleVariables file to.") - var variablesOutputPath: String - - @Option(name: .long, help: "Access control level for the variables enum.") - var variablesAccessControl: String? - - @Option(name: .long, help: "Access control level for the accessor class.") - var accessorAccessControl: String? - - mutating func run() throws { - let datasourceUrl = URL(fileURLWithPath: datasourcePath) - let generator = try Generator(datasourceUrl: datasourceUrl) - - let variablesAccessControl = try variablesAccessControl.flatMap { try AccessControl(value: $0) } - let accessorAccessControl = try accessorAccessControl.flatMap { try AccessControl(value: $0) } - - let variablesContent = try generator.generateVariables(variablesTemplatePath: variablesTemplatePath, - variablesEnumName: variablesEnumName, - accessControl: variablesAccessControl) - let accessorContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplatePath, - variablesEnumName: variablesEnumName, - accessorClassName: accessorClassName, - accessControl: accessorAccessControl) - let writer = Writer() - try writer.saveAccessor(accessorContent, - outputPath: accessorOutputPath, - accessorClassName: accessorClassName) - try writer.saveVariables(variablesContent, - outputPath: variablesOutputPath, - variablesEnumName: variablesEnumName) - - } -} diff --git a/ToggleGen/Templates/Accessor.stencil b/ToggleGen/Templates/Accessor.stencil deleted file mode 100644 index ab0bcb8..0000000 --- a/ToggleGen/Templates/Accessor.stencil +++ /dev/null @@ -1,26 +0,0 @@ -// {{ className }}.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -{{ accessControl }} class {{ className }} { - - private(set) var manager: ToggleManager - - {{ accessControl }} init(manager: ToggleManager) { - self.manager = manager - } -} - -extension {{ className }} { -{% for accessorInfo in accessorInfos %} - {{ accessControl }} var {{ accessorInfo.propertyName }}: {{ accessorInfo.type }} { - get { manager.value(for: {{ enumName }}.{{ accessorInfo.constant.name }}).{{ accessorInfo.toggleType }}Value! } - set { manager.set(.{{ accessorInfo.toggleType }}(newValue), for: {{ enumName }}.{{ accessorInfo.constant.name }}) } - } -{% endfor %} -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Templates/Variables.stencil b/ToggleGen/Templates/Variables.stencil deleted file mode 100644 index 33daebd..0000000 --- a/ToggleGen/Templates/Variables.stencil +++ /dev/null @@ -1,13 +0,0 @@ -// {{ enumName }}.swift - -// swiftlint:disable file_length - -import Foundation - -{{ accessControl }} enum {{ enumName }} { -{% for variable in variables %} - {{ accessControl }} static let {{ variable.name }} = "{{ variable.value }}" -{% endfor %} -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/GeneratorTests.swift b/ToggleGen/Tests/GeneratorTests.swift deleted file mode 100644 index 9937168..0000000 --- a/ToggleGen/Tests/GeneratorTests.swift +++ /dev/null @@ -1,146 +0,0 @@ -// GeneratorTests.swift - -import XCTest -@testable import ToggleGen - -final class GeneratorTests: XCTestCase { - - func test_variablesContent_accessControlOpen() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let variablesTemplateUrl = Bundle.module.path(forResource: "Variables", ofType: "stencil")! - let generatedContent = try generator.generateVariables(variablesTemplatePath: variablesTemplateUrl, - variablesEnumName: "TestVariables", - accessControl: .open) - let variablesUrl = Bundle.module.url(forResource: "TestVariables_open", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_accessorContent_accessControlOpen() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let accessorTemplateUrl = Bundle.module.path(forResource: "Accessor", ofType: "stencil")! - let generatedContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplateUrl, - variablesEnumName: "TestVariables", - accessorClassName: "TestToggleAccessor", - accessControl: .open) - let variablesUrl = Bundle.module.url(forResource: "TestToggleAccessor_open", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_variablesContent_accessControlPublic() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let variablesTemplateUrl = Bundle.module.path(forResource: "Variables", ofType: "stencil")! - let generatedContent = try generator.generateVariables(variablesTemplatePath: variablesTemplateUrl, - variablesEnumName: "TestVariables", - accessControl: .public) - let variablesUrl = Bundle.module.url(forResource: "TestVariables_public", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_variablesContent_accessControlPackage() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let variablesTemplateUrl = Bundle.module.path(forResource: "Variables", ofType: "stencil")! - let generatedContent = try generator.generateVariables(variablesTemplatePath: variablesTemplateUrl, - variablesEnumName: "TestVariables", - accessControl: .package) - let variablesUrl = Bundle.module.url(forResource: "TestVariables_package", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_givenAccessControlNil_whenGenerateVariables_thenAccessControlIsDefault() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let variablesTemplateUrl = Bundle.module.path(forResource: "Variables", ofType: "stencil")! - let generatedContent = try generator.generateVariables(variablesTemplatePath: variablesTemplateUrl, - variablesEnumName: "TestVariables", - accessControl: nil) - let variablesUrl = Bundle.module.url(forResource: "TestVariables_nil", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_accessorContent_accessControlPublic() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let accessorTemplateUrl = Bundle.module.path(forResource: "Accessor", ofType: "stencil")! - let generatedContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplateUrl, - variablesEnumName: "TestVariables", - accessorClassName: "TestToggleAccessor", - accessControl: .public) - let variablesUrl = Bundle.module.url(forResource: "TestToggleAccessor_public", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_variablesContent_accessControlInternal() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let variablesTemplateUrl = Bundle.module.path(forResource: "Variables", ofType: "stencil")! - let generatedContent = try generator.generateVariables(variablesTemplatePath: variablesTemplateUrl, - variablesEnumName: "TestVariables", - accessControl: .internal) - let variablesUrl = Bundle.module.url(forResource: "TestVariables_internal", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_accessorContent_accessControlInternal() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let accessorTemplateUrl = Bundle.module.path(forResource: "Accessor", ofType: "stencil")! - let generatedContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplateUrl, - variablesEnumName: "TestVariables", - accessorClassName: "TestToggleAccessor", - accessControl: .internal) - let variablesUrl = Bundle.module.url(forResource: "TestToggleAccessor_internal", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_accessorContent_accessControlPackage() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let accessorTemplateUrl = Bundle.module.path(forResource: "Accessor", ofType: "stencil")! - let generatedContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplateUrl, - variablesEnumName: "TestVariables", - accessorClassName: "TestToggleAccessor", - accessControl: .package) - let variablesUrl = Bundle.module.url(forResource: "TestToggleAccessor_package", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_givenAccessControlNil_whenGenerateAccessor_thenAccessControlIsDefault() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasource", withExtension: "json")! - let generator = try Generator(datasourceUrl: datasourceUrl) - let accessorTemplateUrl = Bundle.module.path(forResource: "Accessor", ofType: "stencil")! - let generatedContent = try generator.generateAccessor(accessorTemplatePath: accessorTemplateUrl, - variablesEnumName: "TestVariables", - accessorClassName: "TestToggleAccessor", - accessControl: nil) - let variablesUrl = Bundle.module.url(forResource: "TestToggleAccessor_nil", withExtension: "txt")! - let expectedContent = try String(contentsOf: variablesUrl) - XCTAssertEqual(generatedContent, expectedContent) - } - - func test_accessorDoesNotSupportDatasourceWithDuplicateVariables() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasourceWithDuplicateVariables", withExtension: "json")! - XCTAssertThrowsError(try Generator(datasourceUrl: datasourceUrl)) { error in - XCTAssertEqual(error as? Generator.LoaderError, Generator.LoaderError.foundDuplicateVariables(["boolean_toggle"])) - } - } - - func test_accessorDoesNotSupportDatasourceWithDuplicatePropertyNames() throws { - let datasourceUrl = Bundle.module.url(forResource: "TestDatasourceWithDuplicatePropertyNames", withExtension: "json")! - XCTAssertThrowsError(try Generator(datasourceUrl: datasourceUrl)) { error in - XCTAssertEqual(error as? Generator.LoaderError, Generator.LoaderError.foundDuplicatePropertyNames(["userDefinedBooleanToggle"])) - } - } -} diff --git a/ToggleGen/Tests/Resources/Accessor.stencil b/ToggleGen/Tests/Resources/Accessor.stencil deleted file mode 100644 index 88af721..0000000 --- a/ToggleGen/Tests/Resources/Accessor.stencil +++ /dev/null @@ -1,26 +0,0 @@ -// {{ className }}.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -{% if accessControl %}{{ accessControl }} {% endif %}class {{ className }} { - - private(set) var manager: ToggleManager - - {% if accessControl %}{{ accessControl }} {% endif %}init(manager: ToggleManager) { - self.manager = manager - } -} - -extension {{ className }} { -{% for accessorInfo in accessorInfos %} - {% if accessControl %}{{ accessControl }} {% endif %}var {{ accessorInfo.propertyName }}: {{ accessorInfo.type }} { - get { manager.value(for: {{ enumName }}.{{ accessorInfo.constant.name }}).{{ accessorInfo.toggleType }}Value! } - set { manager.set(.{{ accessorInfo.toggleType }}(newValue), for: {{ enumName }}.{{ accessorInfo.constant.name }}) } - } -{% endfor %} -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestDatasource.json b/ToggleGen/Tests/Resources/TestDatasource.json deleted file mode 100644 index 77b5485..0000000 --- a/ToggleGen/Tests/Resources/TestDatasource.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "toggles": [ - { - "variable": "boolean_toggle", - "bool": true - }, - { - "variable": "integer_toggle", - "int": 42 - }, - { - "variable": "numeric_toggle", - "number": 3.1416 - }, - { - "variable": "string_toggle", - "string": "Hello World" - }, - { - "variable": "encrypted_toggle", - "secure": "eDUxAQXW6dobqAMxhZIJLkyQKb8+36bFHc36eabacXDahMipVnGy/Q==" - }, - { - "variable": "boolean_toggle_2", - "bool": true, - "metadata": { - "propertyName": "userDefinedBooleanToggle" - } - }, - { - "variable": "integer_toggle_2", - "int": 108, - "metadata": { - "propertyName": "userDefinedIntegerToggle" - } - }, - { - "variable": "numeric_toggle_2", - "number": 1.618, - "metadata": { - "propertyName": "userDefinedNumericToggle" - } - }, - { - "variable": "string_toggle_2", - "string": "Ciao Mondo", - "metadata": { - "propertyName": "userDefinedStringToggle" - } - } - ] -} diff --git a/ToggleGen/Tests/Resources/TestDatasourceWithDuplicatePropertyNames.json b/ToggleGen/Tests/Resources/TestDatasourceWithDuplicatePropertyNames.json deleted file mode 100644 index 9993446..0000000 --- a/ToggleGen/Tests/Resources/TestDatasourceWithDuplicatePropertyNames.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "toggles": [ - { - "variable": "boolean_toggle", - "bool": true, - "metadata": { - "propertyName": "userDefinedBooleanToggle" - } - }, - { - "variable": "integer_toggle", - "int": 42 - }, - { - "variable": "numeric_toggle", - "number": 3.1416 - }, - { - "variable": "string_toggle", - "string": "Hello World" - }, - { - "variable": "boolean_toggle_2", - "bool": true, - "metadata": { - "propertyName": "userDefinedBooleanToggle" - } - } - ] -} diff --git a/ToggleGen/Tests/Resources/TestDatasourceWithDuplicateVariables.json b/ToggleGen/Tests/Resources/TestDatasourceWithDuplicateVariables.json deleted file mode 100644 index 8b7008a..0000000 --- a/ToggleGen/Tests/Resources/TestDatasourceWithDuplicateVariables.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "toggles": [ - { - "variable": "boolean_toggle", - "bool": true - }, - { - "variable": "integer_toggle", - "int": 42 - }, - { - "variable": "numeric_toggle", - "number": 3.1416 - }, - { - "variable": "string_toggle", - "string": "Hello World" - }, - { - "variable": "boolean_toggle", - "bool": false - } - ] -} diff --git a/ToggleGen/Tests/Resources/TestToggleAccessor_internal.txt b/ToggleGen/Tests/Resources/TestToggleAccessor_internal.txt deleted file mode 100644 index 74a436f..0000000 --- a/ToggleGen/Tests/Resources/TestToggleAccessor_internal.txt +++ /dev/null @@ -1,66 +0,0 @@ -// TestToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -internal class TestToggleAccessor { - - private(set) var manager: ToggleManager - - internal init(manager: ToggleManager) { - self.manager = manager - } -} - -extension TestToggleAccessor { - - internal var booleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle) } - } - - internal var integerToggle: Int { - get { manager.value(for: TestVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle) } - } - - internal var numericToggle: Double { - get { manager.value(for: TestVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle) } - } - - internal var stringToggle: String { - get { manager.value(for: TestVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle) } - } - - internal var encryptedToggle: String { - get { manager.value(for: TestVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: TestVariables.encryptedToggle) } - } - - internal var userDefinedBooleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle2) } - } - - internal var userDefinedIntegerToggle: Int { - get { manager.value(for: TestVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle2) } - } - - internal var userDefinedNumericToggle: Double { - get { manager.value(for: TestVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle2) } - } - - internal var userDefinedStringToggle: String { - get { manager.value(for: TestVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle2) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestToggleAccessor_nil.txt b/ToggleGen/Tests/Resources/TestToggleAccessor_nil.txt deleted file mode 100644 index 1bbcda4..0000000 --- a/ToggleGen/Tests/Resources/TestToggleAccessor_nil.txt +++ /dev/null @@ -1,66 +0,0 @@ -// TestToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -class TestToggleAccessor { - - private(set) var manager: ToggleManager - - init(manager: ToggleManager) { - self.manager = manager - } -} - -extension TestToggleAccessor { - - var booleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle) } - } - - var integerToggle: Int { - get { manager.value(for: TestVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle) } - } - - var numericToggle: Double { - get { manager.value(for: TestVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle) } - } - - var stringToggle: String { - get { manager.value(for: TestVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle) } - } - - var encryptedToggle: String { - get { manager.value(for: TestVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: TestVariables.encryptedToggle) } - } - - var userDefinedBooleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle2) } - } - - var userDefinedIntegerToggle: Int { - get { manager.value(for: TestVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle2) } - } - - var userDefinedNumericToggle: Double { - get { manager.value(for: TestVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle2) } - } - - var userDefinedStringToggle: String { - get { manager.value(for: TestVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle2) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestToggleAccessor_open.txt b/ToggleGen/Tests/Resources/TestToggleAccessor_open.txt deleted file mode 100644 index 278b27e..0000000 --- a/ToggleGen/Tests/Resources/TestToggleAccessor_open.txt +++ /dev/null @@ -1,66 +0,0 @@ -// TestToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -open class TestToggleAccessor { - - private(set) var manager: ToggleManager - - open init(manager: ToggleManager) { - self.manager = manager - } -} - -extension TestToggleAccessor { - - open var booleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle) } - } - - open var integerToggle: Int { - get { manager.value(for: TestVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle) } - } - - open var numericToggle: Double { - get { manager.value(for: TestVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle) } - } - - open var stringToggle: String { - get { manager.value(for: TestVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle) } - } - - open var encryptedToggle: String { - get { manager.value(for: TestVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: TestVariables.encryptedToggle) } - } - - open var userDefinedBooleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle2) } - } - - open var userDefinedIntegerToggle: Int { - get { manager.value(for: TestVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle2) } - } - - open var userDefinedNumericToggle: Double { - get { manager.value(for: TestVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle2) } - } - - open var userDefinedStringToggle: String { - get { manager.value(for: TestVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle2) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestToggleAccessor_package.txt b/ToggleGen/Tests/Resources/TestToggleAccessor_package.txt deleted file mode 100644 index ccf7951..0000000 --- a/ToggleGen/Tests/Resources/TestToggleAccessor_package.txt +++ /dev/null @@ -1,66 +0,0 @@ -// TestToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -package class TestToggleAccessor { - - private(set) var manager: ToggleManager - - package init(manager: ToggleManager) { - self.manager = manager - } -} - -extension TestToggleAccessor { - - package var booleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle) } - } - - package var integerToggle: Int { - get { manager.value(for: TestVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle) } - } - - package var numericToggle: Double { - get { manager.value(for: TestVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle) } - } - - package var stringToggle: String { - get { manager.value(for: TestVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle) } - } - - package var encryptedToggle: String { - get { manager.value(for: TestVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: TestVariables.encryptedToggle) } - } - - package var userDefinedBooleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle2) } - } - - package var userDefinedIntegerToggle: Int { - get { manager.value(for: TestVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle2) } - } - - package var userDefinedNumericToggle: Double { - get { manager.value(for: TestVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle2) } - } - - package var userDefinedStringToggle: String { - get { manager.value(for: TestVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle2) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestToggleAccessor_public.txt b/ToggleGen/Tests/Resources/TestToggleAccessor_public.txt deleted file mode 100644 index 788f556..0000000 --- a/ToggleGen/Tests/Resources/TestToggleAccessor_public.txt +++ /dev/null @@ -1,66 +0,0 @@ -// TestToggleAccessor.swift - -// swiftlint:disable file_length - -import Foundation -import Toggles - -public class TestToggleAccessor { - - private(set) var manager: ToggleManager - - public init(manager: ToggleManager) { - self.manager = manager - } -} - -extension TestToggleAccessor { - - public var booleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle) } - } - - public var integerToggle: Int { - get { manager.value(for: TestVariables.integerToggle).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle) } - } - - public var numericToggle: Double { - get { manager.value(for: TestVariables.numericToggle).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle) } - } - - public var stringToggle: String { - get { manager.value(for: TestVariables.stringToggle).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle) } - } - - public var encryptedToggle: String { - get { manager.value(for: TestVariables.encryptedToggle).secureValue! } - set { manager.set(.secure(newValue), for: TestVariables.encryptedToggle) } - } - - public var userDefinedBooleanToggle: Bool { - get { manager.value(for: TestVariables.booleanToggle2).boolValue! } - set { manager.set(.bool(newValue), for: TestVariables.booleanToggle2) } - } - - public var userDefinedIntegerToggle: Int { - get { manager.value(for: TestVariables.integerToggle2).intValue! } - set { manager.set(.int(newValue), for: TestVariables.integerToggle2) } - } - - public var userDefinedNumericToggle: Double { - get { manager.value(for: TestVariables.numericToggle2).numberValue! } - set { manager.set(.number(newValue), for: TestVariables.numericToggle2) } - } - - public var userDefinedStringToggle: String { - get { manager.value(for: TestVariables.stringToggle2).stringValue! } - set { manager.set(.string(newValue), for: TestVariables.stringToggle2) } - } - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestVariables_internal.txt b/ToggleGen/Tests/Resources/TestVariables_internal.txt deleted file mode 100644 index beebdf1..0000000 --- a/ToggleGen/Tests/Resources/TestVariables_internal.txt +++ /dev/null @@ -1,29 +0,0 @@ -// TestVariables.swift - -// swiftlint:disable file_length - -import Foundation - -internal enum TestVariables { - - internal static let booleanToggle = "boolean_toggle" - - internal static let integerToggle = "integer_toggle" - - internal static let numericToggle = "numeric_toggle" - - internal static let stringToggle = "string_toggle" - - internal static let encryptedToggle = "encrypted_toggle" - - internal static let booleanToggle2 = "boolean_toggle_2" - - internal static let integerToggle2 = "integer_toggle_2" - - internal static let numericToggle2 = "numeric_toggle_2" - - internal static let stringToggle2 = "string_toggle_2" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestVariables_nil.txt b/ToggleGen/Tests/Resources/TestVariables_nil.txt deleted file mode 100644 index 89bef70..0000000 --- a/ToggleGen/Tests/Resources/TestVariables_nil.txt +++ /dev/null @@ -1,29 +0,0 @@ -// TestVariables.swift - -// swiftlint:disable file_length - -import Foundation - -enum TestVariables { - - static let booleanToggle = "boolean_toggle" - - static let integerToggle = "integer_toggle" - - static let numericToggle = "numeric_toggle" - - static let stringToggle = "string_toggle" - - static let encryptedToggle = "encrypted_toggle" - - static let booleanToggle2 = "boolean_toggle_2" - - static let integerToggle2 = "integer_toggle_2" - - static let numericToggle2 = "numeric_toggle_2" - - static let stringToggle2 = "string_toggle_2" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestVariables_open.txt b/ToggleGen/Tests/Resources/TestVariables_open.txt deleted file mode 100644 index 5571d82..0000000 --- a/ToggleGen/Tests/Resources/TestVariables_open.txt +++ /dev/null @@ -1,29 +0,0 @@ -// TestVariables.swift - -// swiftlint:disable file_length - -import Foundation - -open enum TestVariables { - - open static let booleanToggle = "boolean_toggle" - - open static let integerToggle = "integer_toggle" - - open static let numericToggle = "numeric_toggle" - - open static let stringToggle = "string_toggle" - - open static let encryptedToggle = "encrypted_toggle" - - open static let booleanToggle2 = "boolean_toggle_2" - - open static let integerToggle2 = "integer_toggle_2" - - open static let numericToggle2 = "numeric_toggle_2" - - open static let stringToggle2 = "string_toggle_2" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestVariables_package.txt b/ToggleGen/Tests/Resources/TestVariables_package.txt deleted file mode 100644 index 1526c21..0000000 --- a/ToggleGen/Tests/Resources/TestVariables_package.txt +++ /dev/null @@ -1,29 +0,0 @@ -// TestVariables.swift - -// swiftlint:disable file_length - -import Foundation - -package enum TestVariables { - - package static let booleanToggle = "boolean_toggle" - - package static let integerToggle = "integer_toggle" - - package static let numericToggle = "numeric_toggle" - - package static let stringToggle = "string_toggle" - - package static let encryptedToggle = "encrypted_toggle" - - package static let booleanToggle2 = "boolean_toggle_2" - - package static let integerToggle2 = "integer_toggle_2" - - package static let numericToggle2 = "numeric_toggle_2" - - package static let stringToggle2 = "string_toggle_2" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/TestVariables_public.txt b/ToggleGen/Tests/Resources/TestVariables_public.txt deleted file mode 100644 index 540a2c3..0000000 --- a/ToggleGen/Tests/Resources/TestVariables_public.txt +++ /dev/null @@ -1,29 +0,0 @@ -// TestVariables.swift - -// swiftlint:disable file_length - -import Foundation - -public enum TestVariables { - - public static let booleanToggle = "boolean_toggle" - - public static let integerToggle = "integer_toggle" - - public static let numericToggle = "numeric_toggle" - - public static let stringToggle = "string_toggle" - - public static let encryptedToggle = "encrypted_toggle" - - public static let booleanToggle2 = "boolean_toggle_2" - - public static let integerToggle2 = "integer_toggle_2" - - public static let numericToggle2 = "numeric_toggle_2" - - public static let stringToggle2 = "string_toggle_2" - -} - -// swiftlint:enable file_length diff --git a/ToggleGen/Tests/Resources/Variables.stencil b/ToggleGen/Tests/Resources/Variables.stencil deleted file mode 100644 index e5fe219..0000000 --- a/ToggleGen/Tests/Resources/Variables.stencil +++ /dev/null @@ -1,13 +0,0 @@ -// {{ enumName }}.swift - -// swiftlint:disable file_length - -import Foundation - -{% if accessControl %}{{ accessControl }} {% endif %}enum {{ enumName }} { -{% for variable in variables %} - {% if accessControl %}{{ accessControl }} {% endif %}static let {{ variable.name }} = "{{ variable.value }}" -{% endfor %} -} - -// swiftlint:enable file_length