diff --git a/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitLight.swift b/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitLight.swift index 136fd94..c07a55b 100644 --- a/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitLight.swift +++ b/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitLight.swift @@ -10,9 +10,29 @@ import Foundation import CoreBluetooth extension BlePeripheral { + // MARK: - Custom properties + private struct CustomPropertiesKeys { + static var adafruitLightResponseDataTimer: Timer? + } + + private var adafruitLightResponseDataTimer: Timer? { + get { + return objc_getAssociatedObject(self, &CustomPropertiesKeys.adafruitLightResponseDataTimer) as! Timer? + } + set { + objc_setAssociatedObject(self, &CustomPropertiesKeys.adafruitLightResponseDataTimer, newValue, .OBJC_ASSOCIATION_RETAIN) + } + } + // MARK: - Actions func adafruitLightEnable(responseHandler: @escaping(Result<(Float, UUID), Error>) -> Void, completion: ((Result) -> Void)?) { + adafruitLightResponseDataTimer = Timer.scheduledTimer(withTimeInterval: BlePeripheral.kAdafruitSensorDefaultPeriod, repeats: true) { [weak self] _ in + guard let self = self else { return } + guard let value = self.adafruitLightLastValue() else { return } + responseHandler(.success((value, self.identifier))) + } + completion?(.success(())) } @@ -21,6 +41,8 @@ extension BlePeripheral { } func adafruitLightDisable() { + adafruitLightResponseDataTimer?.invalidate() + adafruitLightResponseDataTimer = nil } func adafruitLightLastValue() -> Float? { diff --git a/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitQuaternion.swift b/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitQuaternion.swift index 06cfe4d..339c761 100644 --- a/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitQuaternion.swift +++ b/BluefruitPlayground/AdafruitKit/Ble/Tests/BlePeripheralSimulated+AdafruitQuaternion.swift @@ -29,8 +29,7 @@ extension BlePeripheral { return self.adafruitManufacturerData()?.boardModel == .clue_nRF52840 } - func adafruitQuaternionDisable() { - + func adafruitQuaternionDisable() { } func adafruitQuaternionLastValue() -> QuaternionValue? { diff --git a/BluefruitPlayground/Config.swift b/BluefruitPlayground/Config.swift index 8168db5..4da096a 100644 --- a/BluefruitPlayground/Config.swift +++ b/BluefruitPlayground/Config.swift @@ -18,7 +18,7 @@ struct Config { static let isDebugEnabled = _isDebugAssertConfiguration() // Fastlane snapshots - private static let areFastlaneSnapshotsRunning = UserDefaults.standard.bool(forKey: "FASTLANE_SNAPSHOT") + static let areFastlaneSnapshotsRunning = UserDefaults.standard.bool(forKey: "FASTLANE_SNAPSHOT") // Bluetooth #if SIMULATEBLUETOOTH diff --git a/BluefruitPlayground/Model/AdafruitBoard/QuaternionUtils.swift b/BluefruitPlayground/Model/AdafruitBoard/QuaternionUtils.swift index 5626129..404d6f0 100644 --- a/BluefruitPlayground/Model/AdafruitBoard/QuaternionUtils.swift +++ b/BluefruitPlayground/Model/AdafruitBoard/QuaternionUtils.swift @@ -69,4 +69,10 @@ struct QuaternionUtils { let twistNormalized = twist.normalized return twistNormalized } + + + static func isQuaternionValid(_ quaternion: simd_quatf) -> Bool { + let vector = quaternion.vector + return vector.x.isFinite && vector.y.isFinite && vector.z.isFinite && vector.w.isFinite + } } diff --git a/BluefruitPlayground/ViewControllers/Accelerometer/AccelerometerViewController.swift b/BluefruitPlayground/ViewControllers/Accelerometer/AccelerometerViewController.swift index 88de142..7ddcafe 100644 --- a/BluefruitPlayground/ViewControllers/Accelerometer/AccelerometerViewController.swift +++ b/BluefruitPlayground/ViewControllers/Accelerometer/AccelerometerViewController.swift @@ -30,7 +30,7 @@ class AccelerometerViewController: ModuleViewController { // Load scene if let scene = AdafruitBoardsManager.shared.currentBoard?.assetScene { - boardNode = scene.rootNode.childNode(withName: "root", recursively: false)! + boardNode = scene.rootNode.childNode(withName: "root", recursively: false) // Setup scene sceneView.scene = scene diff --git a/BluefruitPlayground/ViewControllers/Home/HomeViewController.swift b/BluefruitPlayground/ViewControllers/Home/HomeViewController.swift index c2e5f25..c3d656c 100644 --- a/BluefruitPlayground/ViewControllers/Home/HomeViewController.swift +++ b/BluefruitPlayground/ViewControllers/Home/HomeViewController.swift @@ -163,7 +163,7 @@ class HomeViewController: UIViewController { if board.isToneGeneratorEnabled { result.append(.tone) } - if (!board.isQuaternionEnabled || Config.isDebugEnabled) && board.isAccelerometerEnabled { + if (!board.isQuaternionEnabled || (Config.isDebugEnabled && !Config.areFastlaneSnapshotsRunning)) && board.isAccelerometerEnabled { result.append(.accelerometer) } if board.isQuaternionEnabled { diff --git a/BluefruitPlayground/ViewControllers/Puppet/PuppetViewController.swift b/BluefruitPlayground/ViewControllers/Puppet/PuppetViewController.swift index 2f2cf07..13fccfd 100644 --- a/BluefruitPlayground/ViewControllers/Puppet/PuppetViewController.swift +++ b/BluefruitPlayground/ViewControllers/Puppet/PuppetViewController.swift @@ -48,9 +48,9 @@ class PuppetViewController: UIViewController { let scene = SCNScene(named: "Sparky_Gold1.scn")! scene.background.contents = UIColor.clear - jawNode = scene.rootNode.childNode(withName: "jaw", recursively: true)! - headNode = scene.rootNode.childNode(withName: "SparkyHead", recursively: true)! - sparkyFaceNode = scene.rootNode.childNode(withName: "Face", recursively: true)! + jawNode = scene.rootNode.childNode(withName: "jaw", recursively: true) + headNode = scene.rootNode.childNode(withName: "SparkyHead", recursively: true) + sparkyFaceNode = scene.rootNode.childNode(withName: "Face", recursively: true) // Setup scene sceneView.scene = scene diff --git a/BluefruitPlayground/ViewControllers/Quaternion/QuaternionViewController.swift b/BluefruitPlayground/ViewControllers/Quaternion/QuaternionViewController.swift index 436876a..dcf364a 100644 --- a/BluefruitPlayground/ViewControllers/Quaternion/QuaternionViewController.swift +++ b/BluefruitPlayground/ViewControllers/Quaternion/QuaternionViewController.swift @@ -33,7 +33,7 @@ class QuaternionViewController: ModuleViewController { // Load scene if let scene = AdafruitBoardsManager.shared.currentBoard?.assetScene { - boardNode = scene.rootNode.childNode(withName: "root", recursively: false)! + boardNode = scene.rootNode.childNode(withName: "root", recursively: false) // Setup scene sceneView.scene = scene @@ -88,8 +88,13 @@ class QuaternionViewController: ModuleViewController { if QuaternionViewController.kIsZAxisDisabled { // Calculate rotation around the z axis. let twist = QuaternionUtils.twist_decomposition(rotation: scnQuaternion, direction: simd_float3(0, 0, 1)) - // Remove z axis rotation - boardNode.simdOrientation = scnQuaternion * twist.inverse + if QuaternionUtils.isQuaternionValid(twist) { // Check twist singularity + // Remove z axis rotation + boardNode.simdOrientation = scnQuaternion * twist.inverse + } + else { + boardNode.simdOrientation = scnQuaternion + } } else { boardNode.simdOrientation = scnQuaternion diff --git a/BluefruitPlayground/ViewControllers/Tips/TipWelcomeViewController.swift b/BluefruitPlayground/ViewControllers/Tips/TipWelcomeViewController.swift index ef5f10c..751d7a9 100644 --- a/BluefruitPlayground/ViewControllers/Tips/TipWelcomeViewController.swift +++ b/BluefruitPlayground/ViewControllers/Tips/TipWelcomeViewController.swift @@ -28,7 +28,7 @@ class TipWelcomeViewController: TipAnimationViewController { } } - private var circuitNode: SCNNode! + private var boardNode: SCNNode! // MARK: - Lifecycle override func viewDidLoad() { @@ -38,7 +38,7 @@ class TipWelcomeViewController: TipAnimationViewController { let scene = SCNScene(named: "clue.scn")! scene.background.contents = UIColor.clear - circuitNode = scene.rootNode.childNode(withName: "root", recursively: false)! + boardNode = scene.rootNode.childNode(withName: "root", recursively: false)! // Setup scene sceneView.scene = scene @@ -56,13 +56,13 @@ class TipWelcomeViewController: TipAnimationViewController { sceneView.alpha = 1 sceneView.transform = .identity - circuitNode.opacity = 1 - circuitNode.removeAllActions() - circuitNode.removeAllAnimations() + boardNode.opacity = 1 + boardNode.removeAllActions() + boardNode.removeAllAnimations() //circuitNode.position = SCNVector3(0, -5, 0) - circuitNode.localTranslate(by: SCNVector3(0, -5, 0)) - circuitNode.scale = SCNVector3(0.3, 0.3, 0.3) - circuitNode.rotation = SCNVector4(0, 50 * CGFloat.pi / 180, 0, 1) + boardNode.localTranslate(by: SCNVector3(0, -5, 0)) + boardNode.scale = SCNVector3(0.3, 0.3, 0.3) + boardNode.rotation = SCNVector4(0, 50 * CGFloat.pi / 180, 0, 1) } private func animateIntro() { @@ -76,8 +76,8 @@ class TipWelcomeViewController: TipAnimationViewController { ]) // appearAction.timingMode = .easeOut - circuitNode.runAction(appearAction, forKey: "intro") { - self.circuitNode.runAction( + boardNode.runAction(appearAction, forKey: "intro") { + self.boardNode.runAction( SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: -2 * .pi, z: 0, duration: 30)) ) } @@ -116,10 +116,10 @@ class TipWelcomeViewController: TipAnimationViewController { animateIntro() } else { // If coming from intro, stop the animations and restore the rotation - let isTransitioningFromIntro = circuitNode.action(forKey: "intro") != nil + let isTransitioningFromIntro = boardNode.action(forKey: "intro") != nil if isTransitioningFromIntro { - circuitNode.removeAction(forKey: "intro") - self.circuitNode.runAction( + boardNode.removeAction(forKey: "intro") + self.boardNode.runAction( SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: -2 * .pi, z: 0, duration: 30)) ) } diff --git a/BluefruitPlaygroundUITests/BluefruitPlaygroundUITests.swift b/BluefruitPlaygroundUITests/BluefruitPlaygroundUITests.swift index 8519dec..4b247ca 100644 --- a/BluefruitPlaygroundUITests/BluefruitPlaygroundUITests.swift +++ b/BluefruitPlaygroundUITests/BluefruitPlaygroundUITests.swift @@ -26,70 +26,104 @@ class BluefruitPlaygroundUITests: XCTestCase { override func tearDown() { // Put teardown code here. This method is called after the invocation of each test method in the class. } - - func testSnapshots() { - /* - // UI tests must launch the application that they test. + + func testSnapsthotsClue() { + let app = XCUIApplication() - app.launch() -*/ - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - - let app = XCUIApplication() - let scrollViewsQuery = app.scrollViews - let elementsQuery = scrollViewsQuery.otherElements - - sleep(2) // Wait for the intro animation + let elementsQuery = app.scrollViews.otherElements + + sleep(1) // Wait for the intro animation snapshot("01a_Welcome") - elementsQuery.buttons["LET'S GET STARTED..."].tap() + snapshot("01b_PowerUp") - elementsQuery.buttons["NEXT"].tap() + snapshot("01c_Discover") - elementsQuery.buttons["BEGIN PAIRING"].tap() - + elementsQuery.buttons["FIND DEVICES"].tap() + let tablesQuery = app.tables - tablesQuery.staticTexts["Simulated Peripheral"].tap() - - snapshot("02_Modules") - - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Control LED color & animation"]/*[[".cells.staticTexts[\"Control LED color & animation\"]",".staticTexts[\"Control LED color & animation\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - - let element = scrollViewsQuery.children(matching: .other).element - element.children(matching: .other).element(boundBy: 0).children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element(boundBy: 0).children(matching: .other).element(boundBy: 0).children(matching: .other).element(boundBy: 0).children(matching: .other).element.children(matching: .other).element.children(matching: .button).element.tap() - snapshot("03_Neopixels_LightSequence") - + + // CLUE + snapshot("01d_Scanner") + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["CLUE"]/*[[".cells.staticTexts[\"CLUE\"]",".staticTexts[\"CLUE\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("02_CLUE_Modules") + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["NeoPixels"]/*[[".cells.staticTexts[\"NeoPixels\"]",".staticTexts[\"NeoPixels\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + sleep(1) + snapshot("03_CLUE_Neopixels_LightSequence") elementsQuery.staticTexts["Light Sequence"].swipeLeft() - element.children(matching: .other).element(boundBy: 1).children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element(boundBy: 0).children(matching: .other).element(boundBy: 1).children(matching: .button).element(boundBy: 2).tap() - - snapshot("04a_Neopixels_ColorPalette") - + snapshot("04a_CLUE_Neopixels_ColorPalette") elementsQuery.staticTexts["Color Palette"].swipeLeft() - element.children(matching: .other).element(boundBy: 2).children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element.children(matching: .other).element(boundBy: 0).children(matching: .other).element(boundBy: 0).children(matching: .other).element.children(matching: .other).element.tap() - - snapshot("04b_Neopixels_ColorWheel") - + snapshot("04b_CLUE_Neopixels_ColorWheel") app.navigationBars["NeoPixels"].buttons["Modules"].tap() - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["View continuous light sensor readings"]/*[[".cells.staticTexts[\"View continuous light sensor readings\"]",".staticTexts[\"View continuous light sensor readings\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - snapshot("05_LightSensor") - app.navigationBars["Light Sensor"].buttons["Modules"].tap() - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Button Status"]/*[[".cells.staticTexts[\"Button Status\"]",".staticTexts[\"Button Status\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - snapshot("06_ButtonStatus") - app.navigationBars["Button Status"].buttons["Modules"].tap() - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Turn CPB into a musical instrument"]/*[[".cells.staticTexts[\"Turn CPB into a musical instrument\"]",".staticTexts[\"Turn CPB into a musical instrument\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - snapshot("07_ToneGenerator") - app.navigationBars["Tone Generator"].buttons["Modules"].tap() - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Accelerometer"]/*[[".cells.staticTexts[\"Accelerometer\"]",".staticTexts[\"Accelerometer\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - snapshot("08_Accelerometer") - app.navigationBars["Accelerometer"].buttons["Modules"].tap() - tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["View current temperature readings"]/*[[".cells.staticTexts[\"View current temperature readings\"]",".staticTexts[\"View current temperature readings\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() - snapshot("09_Temperature") - app.navigationBars["Temperature"].buttons["Modules"].tap() - tablesQuery.staticTexts["Puppets"].tap() - snapshot("10_Puppets") + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Light Sensor"]/*[[".cells.staticTexts[\"Light Sensor\"]",".staticTexts[\"Light Sensor\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("05a_CLUE_LightSensor") + elementsQuery.staticTexts["Luminance Reading"].swipeLeft() + snapshot("05b_CLUE_LightSensor_Chart") + app.navigationBars["Light Sensor"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Button Status"]/*[[".cells.staticTexts[\"Button Status\"]",".staticTexts[\"Button Status\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("06_CLUE_ButtonStatus") + app.navigationBars["Button Status"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Tone Generator"]/*[[".cells.staticTexts[\"Tone Generator\"]",".staticTexts[\"Tone Generator\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("07_CLUE_ToneGenerator") + app.navigationBars["Tone Generator"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Orientation"]/*[[".cells.staticTexts[\"Orientation\"]",".staticTexts[\"Orientation\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("08_CLUE_Orientation") + app.navigationBars["Orientation"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Temperature"]/*[[".cells.staticTexts[\"Temperature\"]",".staticTexts[\"Temperature\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("09_CLUE_Temperature") + app.navigationBars["Temperature"].buttons["Modules"].tap() + + /* + let buttonStatusStaticText = tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Button Status"]/*[[".cells.staticTexts[\"Button Status\"]",".staticTexts[\"Button Status\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/ + buttonStatusStaticText.swipeUp() // Swipe up to see more modules + */ + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Humidity"]/*[[".cells.staticTexts[\"Humidity\"]",".staticTexts[\"Humidity\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("10_CLUE_Humidity") + app.navigationBars["Humidity"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Pressure"]/*[[".cells.staticTexts[\"Pressure\"]",".staticTexts[\"Pressure\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("11_CLUE_Pressure") + app.navigationBars["Pressure"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Puppets"]/*[[".cells.staticTexts[\"Puppets\"]",".staticTexts[\"Puppets\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + sleep(2) // Wait for the puppet animation + snapshot("12_Puppets") + app.navigationBars["Puppets"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Disconnect"]/*[[".cells.staticTexts[\"Disconnect\"]",".staticTexts[\"Disconnect\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + app.alerts.scrollViews.otherElements.buttons["OK"].tap() + + // CPB + XCUIApplication().tables/*@START_MENU_TOKEN@*/.staticTexts["CPB"]/*[[".cells.staticTexts[\"CPB\"]",".staticTexts[\"CPB\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["NeoPixels"]/*[[".cells.staticTexts[\"NeoPixels\"]",".staticTexts[\"NeoPixels\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("03_CPB_Neopixels_LightSequence") + elementsQuery.staticTexts["Light Sequence"].swipeLeft() + snapshot("04a_CPB_Neopixels_ColorPalette") + elementsQuery.staticTexts["Color Palette"].swipeLeft() + snapshot("04b_CPB_Neopixels_ColorWheel") + app.navigationBars["NeoPixels"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Light Sensor"]/*[[".cells.staticTexts[\"Light Sensor\"]",".staticTexts[\"Light Sensor\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("05a_CPB_LightSensor") + elementsQuery.staticTexts["Luminance Reading"].swipeLeft() + snapshot("05b_CPB_LightSensor_Chart") + app.navigationBars["Light Sensor"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Button Status"]/*[[".cells.staticTexts[\"Button Status\"]",".staticTexts[\"Button Status\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("06_CPB_ButtonStatus") + app.navigationBars["Button Status"].buttons["Modules"].tap() + + tablesQuery/*@START_MENU_TOKEN@*/.staticTexts["Accelerometer"]/*[[".cells.staticTexts[\"Accelerometer\"]",".staticTexts[\"Accelerometer\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + snapshot("08_CPB_Accelerometer") + app.navigationBars["Accelerometer"].buttons["Modules"].tap() } func testLaunchPerformance() { diff --git a/Gemfile.lock b/Gemfile.lock index f2e4d33..0fe42cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,16 @@ GEM addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) atomos (0.1.3) + aws-eventstream (1.0.3) + aws-sdk (2.11.471) + aws-sdk-resources (= 2.11.471) + aws-sdk-core (2.11.471) + aws-sigv4 (~> 1.0) + jmespath (~> 1.0) + aws-sdk-resources (2.11.471) + aws-sdk-core (= 2.11.471) + aws-sigv4 (1.1.1) + aws-eventstream (~> 1.0, >= 1.0.2) babosa (1.0.3) claide (1.0.3) colored (1.2) @@ -13,13 +23,13 @@ GEM highline (~> 1.7.2) declarative (0.0.10) declarative-option (0.1.0) - digest-crc (0.4.1) + digest-crc (0.5.1) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.5) emoji_regex (1.0.1) - excon (0.71.1) - faraday (0.17.1) + excon (0.73.0) + faraday (0.17.3) multipart-post (>= 1.2, < 3) faraday-cookie_jar (0.0.6) faraday (>= 0.7.4) @@ -27,9 +37,10 @@ GEM faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) fastimage (2.1.7) - fastlane (2.138.0) + fastlane (2.143.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) + aws-sdk (~> 2.3) babosa (>= 1.0.2, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) colored @@ -42,7 +53,7 @@ GEM faraday_middleware (~> 0.13.1) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.21.2, < 0.24.0) + google-api-client (>= 0.29.2, < 0.37.0) google-cloud-storage (>= 1.15.0, < 2.0.0) highline (>= 1.7.2, < 2.0.0) json (< 3.0.0) @@ -65,41 +76,44 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) gh_inspector (1.1.3) - google-api-client (0.23.9) + google-api-client (0.36.4) addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.5, < 0.7.0) + googleauth (~> 0.9) httpclient (>= 2.8.1, < 3.0) - mime-types (~> 3.0) + mini_mime (~> 1.0) representable (~> 3.0) retriable (>= 2.0, < 4.0) - signet (~> 0.9) - google-cloud-core (1.4.1) + signet (~> 0.12) + google-cloud-core (1.5.0) google-cloud-env (~> 1.0) - google-cloud-env (1.3.0) - faraday (~> 0.11) - google-cloud-storage (1.16.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.3.1) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.0) + google-cloud-storage (1.25.1) + addressable (~> 2.5) digest-crc (~> 0.4) - google-api-client (~> 0.23) + google-api-client (~> 0.33) google-cloud-core (~> 1.2) - googleauth (>= 0.6.2, < 0.10.0) - googleauth (0.6.7) - faraday (~> 0.12) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.11.0) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.7) + signet (~> 0.12) highline (1.7.10) http-cookie (1.0.3) domain_name (~> 0.5) httpclient (2.8.3) + jmespath (1.4.0) json (2.3.0) jwt (2.1.0) memoist (0.16.2) - mime-types (3.3) - mime-types-data (~> 3.2015) - mime-types-data (3.2019.1009) - mini_magick (4.9.5) + mini_magick (4.10.1) + mini_mime (1.0.2) multi_json (1.14.1) multi_xml (0.6.0) multipart-post (2.0.0) @@ -116,29 +130,29 @@ GEM rouge (2.0.7) rubyzip (1.3.0) security (0.1.3) - signet (0.12.0) + signet (0.13.0) addressable (~> 2.3) - faraday (~> 0.9) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.7) + simctl (1.6.8) CFPropertyList naturally slack-notifier (2.3.2) terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - tty-cursor (0.7.0) - tty-screen (0.7.0) - tty-spinner (0.9.2) + tty-cursor (0.7.1) + tty-screen (0.7.1) + tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) unf (0.1.4) unf_ext unf_ext (0.0.7.6) - unicode-display_width (1.6.0) + unicode-display_width (1.7.0) word_wrap (1.0.0) - xcodeproj (1.14.0) + xcodeproj (1.15.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0)