From 53fa2d8c1326192f47151f5209f53f31494dd6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=20M=C3=A5rtensson?= <53905247+Jon-b-m@users.noreply.github.com> Date: Sat, 18 May 2024 20:42:04 +0200 Subject: [PATCH] Release 4 0 4 (#688) * Remove unnecessary conversion Nightscout (#672) * IOB correction * Sync IOB count for overrides * Contact Image - small optimizations (#683) * Contact Image - don't do anything if no contacts configured or access to contacts is not granted * Contact Image - only save contacts in store if they get changed * Update add_identifiers.yml Xcode15/Node 20 support * Update build_iAPS.yml Xcode 15.3 * Update create_certs.yml Xcode 15.3/Node 20 * Update validate_secrets.yml Xcode 15.3/Node 20 * Update Gemfile.lock New versions * Sharing View UI edits. * Defaults --------- Co-authored-by: Mike Plante <82073483+MikePlante1@users.noreply.github.com> Co-authored-by: yurique --- .github/workflows/add_identifiers.yml | 4 +- .github/workflows/build_iAPS.yml | 6 +- .github/workflows/create_certs.yml | 4 +- .github/workflows/validate_secrets.yml | 8 +- Config.xcconfig | 2 +- .../Resources/javascript/prepare/profile.js | 8 +- FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift | 52 +++++----- FreeAPS/Sources/Models/FreeAPSSettings.swift | 4 +- .../BolusCalculatorStateModel.swift | 4 +- .../NightscoutConfigStateModel.swift | 6 +- .../Sharing/View/SharingRootView.swift | 22 +++-- .../ContactTrick/ContactTrickManager.swift | 54 ++++++----- Gemfile.lock | 94 ++++++++++--------- 13 files changed, 138 insertions(+), 130 deletions(-) diff --git a/.github/workflows/add_identifiers.yml b/.github/workflows/add_identifiers.yml index f42408a0e2..1bceae8dde 100644 --- a/.github/workflows/add_identifiers.yml +++ b/.github/workflows/add_identifiers.yml @@ -11,7 +11,7 @@ jobs: identifiers: needs: validate - runs-on: macos-13 + runs-on: macos-14 steps: # Uncomment to manually select Xcode version if needed - name: Select Xcode version @@ -19,7 +19,7 @@ jobs: # Checks-out the repo - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Patch Fastlane Match to not print tables - name: Patch Match Tables diff --git a/.github/workflows/build_iAPS.yml b/.github/workflows/build_iAPS.yml index afdc535039..15cf43f543 100644 --- a/.github/workflows/build_iAPS.yml +++ b/.github/workflows/build_iAPS.yml @@ -125,7 +125,7 @@ jobs: build: name: Build needs: [validate, check_alive_and_permissions, check_latest_from_upstream] - runs-on: macos-13 + runs-on: macos-14 permissions: contents: write if: | # runs if started manually, or if sync schedule is set and enabled and scheduled on the first Saturday each month, or if sync schedule is set and enabled and new commits were found @@ -136,7 +136,7 @@ jobs: ) steps: - name: Select Xcode version - run: "sudo xcode-select --switch /Applications/Xcode_15.0.1.app/Contents/Developer" + run: "sudo xcode-select --switch /Applications/Xcode_15.3.app/Contents/Developer" - name: Checkout Repo for syncing if: | @@ -225,7 +225,7 @@ jobs: # Upload Build artifacts - name: Upload build log, IPA and Symbol artifacts if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-artifacts path: | diff --git a/.github/workflows/create_certs.yml b/.github/workflows/create_certs.yml index e1b7a2b7b7..3f10b54415 100644 --- a/.github/workflows/create_certs.yml +++ b/.github/workflows/create_certs.yml @@ -12,7 +12,7 @@ jobs: certificates: name: Create Certificates needs: validate - runs-on: macos-13 + runs-on: macos-14 steps: # Uncomment to manually select Xcode version if needed - name: Select Xcode version @@ -20,7 +20,7 @@ jobs: # Checks-out the repo - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Patch Fastlane Match to not print tables - name: Patch Match Tables diff --git a/.github/workflows/validate_secrets.yml b/.github/workflows/validate_secrets.yml index 9acc599373..be42ddf323 100644 --- a/.github/workflows/validate_secrets.yml +++ b/.github/workflows/validate_secrets.yml @@ -5,7 +5,7 @@ on: [workflow_call, workflow_dispatch] jobs: validate-access-token: name: Access - runs-on: macos-13 + runs-on: macos-14 env: GH_PAT: ${{ secrets.GH_PAT }} GH_TOKEN: ${{ secrets.GH_PAT }} @@ -74,7 +74,7 @@ jobs: validate-match-secrets: name: Match-Secrets needs: validate-access-token - runs-on: macos-13 + runs-on: macos-14 env: GH_TOKEN: ${{ secrets.GH_PAT }} steps: @@ -112,7 +112,7 @@ jobs: validate-fastlane-secrets: name: Fastlane needs: [validate-access-token, validate-match-secrets] - runs-on: macos-13 + runs-on: macos-14 env: GH_PAT: ${{ secrets.GH_PAT }} GH_TOKEN: ${{ secrets.GH_PAT }} @@ -123,7 +123,7 @@ jobs: TEAMID: ${{ secrets.TEAMID }} steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Install project dependencies - name: Install Project Dependencies diff --git a/Config.xcconfig b/Config.xcconfig index 8d828d81b7..6fab780d76 100644 --- a/Config.xcconfig +++ b/Config.xcconfig @@ -1,5 +1,5 @@ APP_DISPLAY_NAME = iAPS -APP_VERSION = 4.0.3 +APP_VERSION = 4.0.4 APP_BUILD_NUMBER = 1 COPYRIGHT_NOTICE = DEVELOPER_TEAM = ##TEAM_ID## diff --git a/FreeAPS/Resources/javascript/prepare/profile.js b/FreeAPS/Resources/javascript/prepare/profile.js index 32441f0994..5d67701e91 100644 --- a/FreeAPS/Resources/javascript/prepare/profile.js +++ b/FreeAPS/Resources/javascript/prepare/profile.js @@ -1,7 +1,7 @@ //для pumpprofile.json параметры: settings/settings.json settings/bg_targets.json settings/insulin_sensitivities.json settings/basal_profile.json preferences.json settings/carb_ratios.json settings/temptargets.json settings/model.json //для profile.json параметры: settings/settings.json settings/bg_targets.json settings/insulin_sensitivities.json settings/basal_profile.json preferences.json settings/carb_ratios.json settings/temptargets.json settings/model.json settings/autotune.json -function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data, preferences_input = false, carbratio_input = false, temptargets_input = false, model_input = false, autotune_input = false, freeaps_data) { +function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data, preferences_input = false, carbratio_input = false, temptargets_input = false, model_input = false, autotune_input = false, freeaps_data, dynamicVariables) { if (bgtargets_data.units !== 'mg/dL') { if (bgtargets_data.units === 'mmol/L') { for (var i = 0, len = bgtargets_data.targets.length; i < len; i++) { @@ -95,6 +95,12 @@ function generate(pumpsettings_data, bgtargets_data, isf_data, basalprofile_data //set these after to make sure nothing happens if they are also set in preferences inputs.settings = pumpsettings_data; inputs.targets = bgtargets_data; + + if (dynamicVariables.useOverride && dynamicVariables.overridePercentage != 100) { + basalprofile_data.forEach( basal => basal.rate *= (dynamicVariables.overridePercentage / 100)); + console.log("Override basal IOB"); + } + inputs.basals = basalprofile_data; inputs.isf = isf_data; inputs.carbratio = carbratio_data; diff --git a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift index 23802d29b6..8413f7b571 100644 --- a/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift +++ b/FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift @@ -24,17 +24,17 @@ final class OpenAPS { debug(.openAPS, "Start determineBasal") // clock self.storage.save(clock, as: Monitor.clock) - - // temp_basal let tempBasal = currentTemp.rawJSON self.storage.save(tempBasal, as: Monitor.tempBasal) - - // meal let pumpHistory = self.loadFileFromStorage(name: OpenAPS.Monitor.pumpHistory) let carbs = self.loadFileFromStorage(name: Monitor.carbHistory) let glucose = self.loadFileFromStorage(name: Monitor.glucose) + let preferences = self.loadFileFromStorage(name: Settings.preferences) + let preferencesData = Preferences(from: preferences) let profile = self.loadFileFromStorage(name: Settings.profile) let basalProfile = self.loadFileFromStorage(name: Settings.basalProfile) + // To do: remove this struct. + let dynamicVariables = self.loadFileFromStorage(name: Monitor.dynamicVariables) var now = Date.now let meal = self.meal( @@ -63,17 +63,6 @@ final class OpenAPS { // determine-basal let reservoir = self.loadFileFromStorage(name: Monitor.reservoir) - let preferences = self.loadFileFromStorage(name: Settings.preferences) - let preferencesData = Preferences(from: preferences) - - // TDD - let tdd = self.tdd(preferencesData: preferencesData) - if let insulin = tdd, (insulin.basal + insulin.bolus) > 0 { - CoreDataStorage().saveTDD(insulin) - } - - // To do: remove this struct. - let dynamicVariables = self.dynamicVariables(preferencesData) // The Middleware layer. Has anything been updated? let alteredProfile = self.middleware( @@ -110,8 +99,7 @@ final class OpenAPS { reason: suggestion.reason, suggestion: suggestion, preferences: preferencesData, - profile: alteredProfile, - tdd: tdd + profile: alteredProfile ) // Update time suggestion.timestamp = suggestion.deliverAt ?? clock @@ -215,6 +203,12 @@ final class OpenAPS { let model = self.loadFileFromStorage(name: Settings.model) let autotune = useAutotune ? self.loadFileFromStorage(name: Settings.autotune) : .empty let freeaps = self.loadFileFromStorage(name: FreeAPS.settings) + let preferencesData = Preferences(from: preferences) + let tdd = self.tdd(preferencesData: preferencesData) + if let insulin = tdd, (insulin.basal + insulin.bolus) > 0 { + CoreDataStorage().saveTDD(insulin) + } + let dynamicVariables = self.dynamicVariables(preferencesData) let pumpProfile = self.makeProfile( preferences: preferences, @@ -226,7 +220,8 @@ final class OpenAPS { tempTargets: tempTargets, model: model, autotune: RawJSON.null, - freeaps: freeaps + freeaps: freeaps, + dynamicVariables: dynamicVariables ) let profile = self.makeProfile( @@ -239,7 +234,8 @@ final class OpenAPS { tempTargets: tempTargets, model: model, autotune: autotune.isEmpty ? .null : autotune, - freeaps: freeaps + freeaps: freeaps, + dynamicVariables: dynamicVariables ) self.storage.save(pumpProfile, as: Settings.pumpProfile) @@ -261,11 +257,11 @@ final class OpenAPS { reason: String, suggestion: Suggestion, preferences: Preferences?, - profile: RawJSON, - tdd: (bolus: Decimal, basal: Decimal, hours: Double)? + profile: RawJSON ) -> String { var reasonString = reason let startIndex = reasonString.startIndex + let tdd = tdd(preferencesData: preferences) // Autosens.ratio / Dynamic Ratios if let isf = suggestion.sensitivityRatio { @@ -570,14 +566,6 @@ final class OpenAPS { } } - private func tdd(preferences: Preferences?) -> Decimal { - let pumpData = pumpStorage.recent() - // let preferences = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) - - let insulin = TotalDailyDose().totalDailyDose(pumpData, increment: Double(preferences?.bolusIncrement ?? 0.1)) - return insulin.basal + insulin.bolus - } - private func meal(pumphistory: JSON, profile: JSON, basalProfile: JSON, clock: JSON, carbs: JSON, glucose: JSON) -> RawJSON { dispatchPrecondition(condition: .onQueue(processQueue)) return jsWorker.inCommonContext { worker in @@ -727,7 +715,8 @@ final class OpenAPS { tempTargets: JSON, model: JSON, autotune: JSON, - freeaps: JSON + freeaps: JSON, + dynamicVariables: JSON ) -> RawJSON { dispatchPrecondition(condition: .onQueue(processQueue)) return jsWorker.inCommonContext { worker in @@ -746,7 +735,8 @@ final class OpenAPS { tempTargets, model, autotune, - freeaps + freeaps, + dynamicVariables ] ) } diff --git a/FreeAPS/Sources/Models/FreeAPSSettings.swift b/FreeAPS/Sources/Models/FreeAPSSettings.swift index a00c225300..eb5a3975c8 100644 --- a/FreeAPS/Sources/Models/FreeAPSSettings.swift +++ b/FreeAPS/Sources/Models/FreeAPSSettings.swift @@ -58,8 +58,8 @@ struct FreeAPSSettings: JSON, Equatable { var profilesOrTempTargets: Bool = false var allowBolusShortcut: Bool = false var allowedRemoteBolusAmount: Decimal = 0.0 - var eventualBG: Bool = false - var minumimPrediction: Bool = false + var eventualBG: Bool = true + var minumimPrediction: Bool = true var minimumSMB: Decimal = 0.3 var useInsulinBars: Bool = false var disableCGMError: Bool = true diff --git a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift index 3cc9e30492..7f86f5facd 100644 --- a/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift +++ b/FreeAPS/Sources/Modules/BolusCalculatorConfig/BolusCalculatorStateModel.swift @@ -10,8 +10,8 @@ extension BolusCalculatorConfig { @Published var displayPredictions: Bool = true @Published var allowBolusShortcut: Bool = false @Published var allowedRemoteBolusAmount: Decimal = 0 - @Published var eventualBG: Bool = false - @Published var minumimPrediction: Bool = false + @Published var eventualBG: Bool = true + @Published var minumimPrediction: Bool = true override func subscribe() { subscribeSetting(\.overrideFactor, on: $overrideFactor, initial: { diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 7963fd46af..d1e26b52b6 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -212,7 +212,7 @@ extension NightscoutConfig { let sensitivities = fetchedProfile.sens.map { sensitivity -> InsulinSensitivityEntry in InsulinSensitivityEntry( - sensitivity: self.units == .mmolL ? sensitivity.value : sensitivity.value.asMgdL, + sensitivity: sensitivity.value, offset: self.offset(sensitivity.time) / 60, start: sensitivity.time ) @@ -233,8 +233,8 @@ extension NightscoutConfig { let targets = fetchedProfile.target_low .map { target -> BGTargetEntry in BGTargetEntry( - low: self.units == .mmolL ? target.value : target.value.asMgdL, - high: self.units == .mmolL ? target.value : target.value.asMgdL, + low: target.value, + high: target.value, start: target.time, offset: self.offset(target.time) / 60 ) } diff --git a/FreeAPS/Sources/Modules/Sharing/View/SharingRootView.swift b/FreeAPS/Sources/Modules/Sharing/View/SharingRootView.swift index 40100fad22..63908169a9 100644 --- a/FreeAPS/Sources/Modules/Sharing/View/SharingRootView.swift +++ b/FreeAPS/Sources/Modules/Sharing/View/SharingRootView.swift @@ -33,17 +33,18 @@ extension Sharing { Form { Section { Toggle("Share all of your Statistics", isOn: $state.uploadStats) - - Picker("Sex", selection: $state.sex) { - ForEach(Sex.allCases) { sex in - Text(NSLocalizedString(sex.rawValue, comment: "")).tag(Optional(sex.rawValue)) + if state.uploadStats { + Picker("Sex", selection: $state.sex) { + ForEach(Sex.allCases) { sex in + Text(NSLocalizedString(sex.rawValue, comment: "")).tag(Optional(sex.rawValue)) + } + }.onChange(of: state.sex) { _ in + state.saveSetting() + } + HStack { + DatePicker("Birth Date", selection: $state.birtDate, in: dateRange, displayedComponents: [.date]) + .datePickerStyle(.compact) } - }.onChange(of: state.sex) { _ in - state.saveSetting() - } - HStack { - DatePicker("Birth Date", selection: $state.birtDate, in: dateRange, displayedComponents: [.date]) - .datePickerStyle(.compact) } } header: { Text("Statistics") } @@ -82,6 +83,7 @@ extension Sharing { header: { Text("Your identifier") } footer: { Text((copied && display) ? "Copied" : "") } } + .dynamicTypeSize(...DynamicTypeSize.xxLarge) .onAppear { configureView() state.savedSettings() diff --git a/FreeAPS/Sources/Services/ContactTrick/ContactTrickManager.swift b/FreeAPS/Sources/Services/ContactTrick/ContactTrickManager.swift index 8c55bdfd50..48f6215e1d 100644 --- a/FreeAPS/Sources/Services/ContactTrick/ContactTrickManager.swift +++ b/FreeAPS/Sources/Services/ContactTrick/ContactTrickManager.swift @@ -65,32 +65,38 @@ final class BaseContactTrickManager: NSObject, ContactTrickManager, Injectable { workItem.cancel() } - let readings = coreDataStorage.fetchGlucose(interval: DateFilter().twoHours) - let glucoseValues = glucoseText(readings) - - let suggestion: Suggestion? = storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) - - let state = ContactTrickState( - glucose: glucoseValues.glucose, - trend: glucoseValues.trend, - delta: glucoseValues.delta, - lastLoopDate: suggestion?.timestamp, - iob: suggestion?.iob, - iobText: suggestion?.iob.map { iob in - iobFormatter.string(from: iob as NSNumber)! - }, - cob: suggestion?.cob, - cobText: suggestion?.cob.map { cob in - cobFormatter.string(from: cob as NSNumber)! - }, - eventualBG: eventualBGString(suggestion), - maxIOB: settingsManager.preferences.maxIOB, - maxCOB: settingsManager.preferences.maxCOB - ) + if contacts.isNotEmpty, CNContactStore.authorizationStatus(for: .contacts) == .authorized { + let readings = coreDataStorage.fetchGlucose(interval: DateFilter().twoHours) + let glucoseValues = glucoseText(readings) + + let suggestion: Suggestion? = storage.retrieve(OpenAPS.Enact.suggested, as: Suggestion.self) + + let state = ContactTrickState( + glucose: glucoseValues.glucose, + trend: glucoseValues.trend, + delta: glucoseValues.delta, + lastLoopDate: suggestion?.timestamp, + iob: suggestion?.iob, + iobText: suggestion?.iob.map { iob in + iobFormatter.string(from: iob as NSNumber)! + }, + cob: suggestion?.cob, + cobText: suggestion?.cob.map { cob in + cobFormatter.string(from: cob as NSNumber)! + }, + eventualBG: eventualBGString(suggestion), + maxIOB: settingsManager.preferences.maxIOB, + maxCOB: settingsManager.preferences.maxCOB + ) - contacts = contacts.enumerated().map { index, entry in renderContact(entry, index + 1, state) } + let newContacts = contacts.enumerated().map { index, entry in renderContact(entry, index + 1, state) } - storage.save(contacts, as: OpenAPS.Settings.contactTrick) + if newContacts != contacts { + // when we create new contacts we store the IDs, in that case we need to write into the settings storage + storage.save(newContacts, as: OpenAPS.Settings.contactTrick) + } + contacts = newContacts + } workItem = DispatchWorkItem(block: { print("in renderContacts, no updates received for more than 5 minutes") diff --git a/Gemfile.lock b/Gemfile.lock index b7e7dc2310..82b2a4d319 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,30 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) rexml - addressable (2.8.5) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) - artifactory (3.0.15) + artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.2.0) - aws-partitions (1.824.0) - aws-sdk-core (3.181.1) - aws-eventstream (~> 1, >= 1.0.2) + aws-eventstream (1.3.0) + aws-partitions (1.921.0) + aws-sdk-core (3.193.0) + aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.71.0) - aws-sdk-core (~> 3, >= 3.177.0) + aws-sdk-kms (1.80.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.134.0) - aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-s3 (1.148.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.6) - aws-sigv4 (1.6.0) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.2.0) claide (1.1.0) colored (1.2) colored2 (3.1.2) @@ -36,7 +37,7 @@ GEM unf (>= 0.0.5, < 1.0.0) dotenv (2.8.1) emoji_regex (3.2.3) - excon (0.103.0) + excon (0.109.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -65,15 +66,15 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.7) - fastlane (2.215.0) + fastimage (2.3.1) + fastlane (2.220.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) - colored + colored (~> 1.2) commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) @@ -85,6 +86,7 @@ GEM gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-env (>= 1.6.0, < 2.0.0) google-cloud-storage (~> 1.31) highline (~> 2.0) http-cookie (~> 1.0.5) @@ -93,10 +95,10 @@ GEM mini_magick (>= 4.9.4, < 5.0.0) multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) - optparse (~> 0.1.1) + optparse (>= 0.1.1, < 1.0.0) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) + security (= 0.1.5) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (~> 3) @@ -105,11 +107,11 @@ GEM word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.49.0) + google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.1) + google-apis-core (0.11.3) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -117,28 +119,27 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml - webrick google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.13.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.19.0) - google-apis-core (>= 0.9.0, < 2.a) - google-cloud-core (1.6.0) - google-cloud-env (~> 1.0) + google-apis-storage_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.6.1) + google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) + google-cloud-storage (1.45.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) + google-apis-storage_v1 (~> 0.29.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.8.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) multi_json (~> 1.11) @@ -149,19 +150,21 @@ GEM domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) - json (2.6.3) - jwt (2.7.1) + json (2.7.2) + jwt (2.8.1) + base64 mini_magick (4.12.0) mini_mime (1.1.5) multi_json (1.15.0) - multipart-post (2.3.0) + multipart-post (2.4.0) nanaimo (0.3.0) naturally (2.2.1) - optparse (0.1.1) + nkf (0.2.0) + optparse (0.5.0) os (1.1.4) - plist (3.7.0) - public_suffix (5.0.3) - rake (13.0.6) + plist (3.7.1) + public_suffix (5.0.5) + rake (13.2.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -171,7 +174,7 @@ GEM rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) - security (0.1.3) + security (0.1.5) signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) @@ -185,17 +188,17 @@ GEM unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) - tty-screen (0.8.1) + tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8.2) - unicode-display_width (2.4.2) + unf_ext (0.0.9.1) + unicode-display_width (2.5.0) webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.22.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -210,10 +213,11 @@ GEM PLATFORMS arm64-darwin-21 arm64-darwin-22 + arm64-darwin-23 x86_64-darwin-19 DEPENDENCIES fastlane BUNDLED WITH - 2.4.19 \ No newline at end of file + 2.4.19