Эх сурвалжийг харах

Podspecs for CoreInternal and AppCheckInterop (#9300)

Paul Beusterien 4 жил өмнө
parent
commit
6361347a22
24 өөрчлөгдсөн 134 нэмэгдсэн , 143 устгасан
  1. 2 5
      .github/workflows/cocoapods-integration.yml
  2. 0 6
      CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_staticLibs/Gemfile
  3. 0 30
      CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_staticLibs/Podfile
  4. 30 0
      FirebaseAppCheckInterop.podspec
  5. 1 4
      FirebaseCore/Internal/FirebaseCoreInternal.h
  6. 29 0
      FirebaseCoreInternal.podspec
  7. 6 1
      FirebaseFunctionsSwift.podspec
  8. 0 4
      FirebaseFunctionsSwift/Sources/Functions.swift
  9. 35 76
      FirebaseFunctionsSwift/Tests/Unit/FunctionsTests.swift
  10. 5 1
      FirebaseFunctionsSwift/Tests/Unit/SerializerTests.swift
  11. 1 1
      Firestore/Example/Benchmarks/remote_document_cache_benchmark.mm
  12. 1 1
      Firestore/Example/Tests/API/FIRFirestoreTests.mm
  13. 1 1
      Firestore/Example/Tests/Integration/API/FIRDatabaseTests.mm
  14. 1 1
      Firestore/Example/Tests/Integration/API/FIRValidationTests.mm
  15. 3 1
      Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm
  16. 3 1
      Firestore/Source/API/FIRFirestore.mm
  17. 7 1
      Firestore/Source/API/FSTFirestoreComponent.mm
  18. 1 1
      Firestore/core/src/credentials/firebase_app_check_credentials_provider_apple.mm
  19. 2 1
      Firestore/core/src/credentials/firebase_auth_credentials_provider_apple.mm
  20. 1 1
      Firestore/core/src/util/log_apple.mm
  21. 1 1
      Firestore/core/test/unit/credentials/firebase_app_check_credentials_provider_test.mm
  22. 0 1
      Firestore/core/test/unit/credentials/firebase_auth_credentials_provider_test.mm
  23. 2 1
      Firestore/core/test/unit/testutil/app_testing.mm
  24. 2 3
      SymbolCollisionTest/Podfile

+ 2 - 5
.github/workflows/cocoapods-integration.yml

@@ -20,9 +20,6 @@ jobs:
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
 
     runs-on: macos-11
-    strategy:
-      matrix:
-        config: [Cocoapods_multiprojects_frameworks, Cocoapods_multiprojects_staticLibs]
     steps:
     - uses: actions/checkout@v2
     - uses: mikehardy/buildcache-action@50738c6c77de7f34e66b870e4f8ede333b69d077
@@ -33,5 +30,5 @@ jobs:
     - name: Build and test
       run: |
         scripts/third_party/travis/retry.sh ./CocoapodsIntegrationTest/scripts/build_with_environment.sh \
-          --gemfile=./CocoapodsIntegrationTest/TestEnvironments/${{ matrix.config }}/Gemfile \
-          --podfile=./CocoapodsIntegrationTest/TestEnvironments/${{ matrix.config }}/Podfile
+          --gemfile=./CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Gemfile \
+          --podfile=./CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_frameworks/Podfile

+ 0 - 6
CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_staticLibs/Gemfile

@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-source "https://rubygems.org"
-
-# Don't allow 1.7.0.rc.1 because of https://github.com/CocoaPods/CocoaPods/issues/8765
-gem 'cocoapods', '1.10.0.rc.1'

+ 0 - 30
CocoapodsIntegrationTest/TestEnvironments/Cocoapods_multiprojects_staticLibs/Podfile

@@ -1,30 +0,0 @@
-source 'https://github.com/firebase/SpecsDev.git'
-source 'https://github.com/firebase/SpecsStaging.git'
-source 'https://cdn.cocoapods.org/'
-
-# Uncomment the next line to define a global platform for your project
-platform :ios, '10.0'
-
-target 'CocoapodsIntegrationTest' do
-  pod 'FirebaseABTesting', :path => '../'
-  pod 'FirebaseAppDistribution', :path => '../'
-  pod 'FirebaseCore', :path => '../'
-  pod 'FirebaseCoreDiagnostics', :path => '../'
-  pod 'FirebaseCrashlytics', :path => '../'
-  pod 'FirebaseAuth', :path => '../'
-  pod 'FirebaseDatabase', :path => '../'
-  pod 'FirebaseDynamicLinks', :path => '../'
-  pod 'FirebaseFirestore', :path => '../'
-  pod 'FirebaseFunctions', :path => '../'
-  pod 'FirebaseInAppMessaging', :path => '../'
-  pod 'FirebaseInstallations', :path => '../'
-  pod 'FirebaseMessaging', :path => '../'
-  pod 'FirebasePerformance', :path => '../'
-  pod 'FirebaseStorage', :path => '../'
-end
-
-# Using the new speed-enhancing features available with CocoaPods 1.7+
-# [sudo] gem install cocoapods --pre
-install! 'cocoapods',
-          :generate_multiple_pod_projects => true,
-          :incremental_installation => true

+ 30 - 0
FirebaseAppCheckInterop.podspec

@@ -0,0 +1,30 @@
+Pod::Spec.new do |s|
+  s.name             = 'FirebaseAppCheckInterop'
+  s.version          = '9.0.0'
+  s.summary          = 'Interfaces that allow other Firebase SDKs to use AppCheck functionality.'
+
+  s.description      = <<-DESC
+  Not for public use.
+  A set of protocols that other Firebase SDKs can use to interoperate with FirebaseAppCheck in a safe
+  and reliable manner.
+                       DESC
+
+  s.homepage         = 'https://firebase.google.com'
+  s.license          = { :type => 'Apache', :file => 'LICENSE' }
+  s.authors          = 'Google, Inc.'
+
+  # NOTE that these should not be used externally, this is for Firebase pods to depend on each
+  # other.
+  s.source           = {
+    :git => 'https://github.com/firebase/firebase-ios-sdk.git',
+    :tag => 'AuthInterop-' + s.version.to_s
+  }
+  s.social_media_url = 'https://twitter.com/Firebase'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.12'
+  s.tvos.deployment_target = '10.0'
+  s.watchos.deployment_target = '6.0'
+
+  s.source_files = 'FirebaseAppCheck/Interop/*.[hm]'
+  s.public_header_files = 'FirebaseAppCheck/Interop/*.h'
+end

+ 1 - 4
FirebaseCore/Internal/FirebaseCoreInternal.h

@@ -12,10 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// An umbrella header, for any other libraries in this repo to access Firebase Public and Private
-// headers. Any package manager complexity should be handled here.
-
-#import <FirebaseCore/FirebaseCore.h>
+@import FirebaseCore;
 
 #import "FIRAppInternal.h"
 #import "FIRComponent.h"

+ 29 - 0
FirebaseCoreInternal.podspec

@@ -0,0 +1,29 @@
+Pod::Spec.new do |s|
+  s.name             = 'FirebaseCoreInternal'
+  s.version          = '9.0.0'
+  s.summary          = 'APIs only for Firebase internal usage'
+
+  s.description      = <<-DESC
+  Not for public use.
+  Common APIs for internal Firebase usage.
+                       DESC
+
+  s.homepage         = 'https://firebase.google.com'
+  s.license          = { :type => 'Apache', :file => 'LICENSE' }
+  s.authors          = 'Google, Inc.'
+
+  s.source           = {
+    :git => 'https://github.com/firebase/firebase-ios-sdk.git',
+    :tag => 'CocoaPods-' + s.version.to_s
+  }
+  s.social_media_url = 'https://twitter.com/Firebase'
+  s.ios.deployment_target = '9.0'
+  s.osx.deployment_target = '10.12'
+  s.tvos.deployment_target = '10.0'
+  s.watchos.deployment_target = '6.0'
+
+  s.source_files = 'FirebaseCore/Internal/*.[hm]'
+  s.public_header_files = 'FirebaseCore/Internal/*.h'
+
+  s.dependency 'FirebaseCore', '~> 8.12'
+end

+ 6 - 1
FirebaseFunctionsSwift.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name                    = 'FirebaseFunctionsSwift'
-  s.version                 = '8.15.0-beta'
+  s.version                 = '9.0.0-beta'
   s.summary                 = 'Swift Extensions for Firebase Functions'
 
   s.description      = <<-DESC
@@ -36,9 +36,14 @@ Swift SDK Extensions for Cloud Functions for Firebase.
   ]
 
   s.dependency 'FirebaseCore', '~> 8.12'
+  s.dependency 'FirebaseCoreInternal', '~> 9.0'
+  s.dependency 'FirebaseAppCheckInterop', '~> 9.0'
   s.dependency 'FirebaseSharedSwift', '~> 8.12'
   s.dependency 'GTMSessionFetcher/Core', '~> 1.5'
 
+  # Maybe TODO: The unit tests depend on setting up a podspec for SharedTestUtilities
+  # OTOH, we are running them with SwiftPM.
+
   s.test_spec 'integration' do |int_tests|
     int_tests.platforms = {
       :ios => ios_deployment_target,

+ 0 - 4
FirebaseFunctionsSwift/Sources/Functions.swift

@@ -32,10 +32,6 @@ import FirebaseSharedSwift
   var fcmToken: String { get }
 }
 
-// @objc public protocol AppCheckInterop {
-//  func getToken(forcingRefresh: Bool, callback: (String?, Error?) -> Void)
-// }
-
 // END PLACEHOLDERS
 
 /// File specific constants.

+ 35 - 76
FirebaseFunctionsSwift/Tests/Unit/FunctionsTests.swift

@@ -16,7 +16,11 @@ import Foundation
 
 import FirebaseCore
 @testable import FirebaseFunctionsSwift
-import GTMSessionFetcherCore
+#if COCOAPODS
+  import GTMSessionFetcher
+#else
+  import GTMSessionFetcherCore
+#endif
 
 import XCTest
 import SharedTestUtilities
@@ -124,8 +128,7 @@ class FunctionsTests: XCTestCase {
     FirebaseApp.configure(options: options)
 
     let functions1 = Functions.functions()
-    let functions2 = Functions
-      .functions(app: FirebaseApp.app()!, region: "") // (app:FirebaseApp.app)
+    let functions2 = Functions.functions(app: FirebaseApp.app()!)
     XCTAssertEqual(functions1, functions2)
   }
 
@@ -201,11 +204,11 @@ class FunctionsTests: XCTestCase {
 
     let httpRequestExpectation = expectation(description: "HTTPRequestExpectation")
     fetcherService.testBlock = { fetcherToTest, testResponse in
-      httpRequestExpectation.fulfill()
       let appCheckTokenHeader = fetcherToTest.request?
         .value(forHTTPHeaderField: "X-Firebase-AppCheck")
       XCTAssertEqual(appCheckTokenHeader, "valid_token")
       testResponse(nil, nil, networkError)
+      httpRequestExpectation.fulfill()
     }
 
     let completionExpectation = expectation(description: "completionExpectation")
@@ -221,76 +224,32 @@ class FunctionsTests: XCTestCase {
     waitForExpectations(timeout: 1.5)
   }
 
-  // - (void)testCallFunctionWhenAppCheckIsInstalledAndFACTokenError {
-//  NSError *appCheckError = [NSError errorWithDomain:self.name code:-1 userInfo:nil];
-//  _appCheckFake.tokenResult = [[FIRAppCheckTokenResultFake alloc] initWithToken:@"dummy_token"
-//                                                                          error:appCheckError];
-//
-//  NSError *networkError = [NSError errorWithDomain:self.name code:-2 userInfo:nil];
-//
-//  XCTestExpectation *httpRequestExpectation =
-//      [self expectationWithDescription:@"HTTPRequestExpectation"];
-//  __weak __auto_type weakSelf = self;
-//  _fetcherService.testBlock = ^(GTMSessionFetcher *_Nonnull fetcherToTest,
-//                                GTMSessionFetcherTestResponse _Nonnull testResponse) {
-//    // __unused to avoid warning in Xcode 12+ in g3.
-//    __unused __auto_type self = weakSelf;
-//    [httpRequestExpectation fulfill];
-//
-//    NSString *appCheckTokenHeader =
-//        [fetcherToTest.request valueForHTTPHeaderField:@"X-Firebase-AppCheck"];
-//    XCTAssertNil(appCheckTokenHeader);
-//
-//    testResponse(nil, nil, networkError);
-//  };
-//
-//  XCTestExpectation *completionExpectation =
-//      [self expectationWithDescription:@"completionExpectation"];
-//  [_functions callFunction:@"fake_func"
-//                withObject:nil
-//                   timeout:10
-//                completion:^(FIRHTTPSCallableResult *_Nullable result, NSError *_Nullable error) {
-//                  XCTAssertEqualObjects(error, networkError);
-//                  [completionExpectation fulfill];
-//                }];
-//
-//  [self waitForExpectations:@[ httpRequestExpectation, completionExpectation ] timeout:1.5];
-  // }
-//
-  // - (void)testCallFunctionWhenAppCheckIsNotInstalled {
-//  NSError *networkError = [NSError errorWithDomain:@"testCallFunctionWhenAppCheckIsInstalled"
-//                                              code:-1
-//                                          userInfo:nil];
-//
-//  XCTestExpectation *httpRequestExpectation =
-//      [self expectationWithDescription:@"HTTPRequestExpectation"];
-//  __weak __auto_type weakSelf = self;
-//  _fetcherService.testBlock = ^(GTMSessionFetcher *_Nonnull fetcherToTest,
-//                                GTMSessionFetcherTestResponse _Nonnull testResponse) {
-//    // __unused to avoid warning in Xcode 12+ in g3.
-//    __unused __auto_type self = weakSelf;
-//    [httpRequestExpectation fulfill];
-//
-//    NSString *appCheckTokenHeader =
-//        [fetcherToTest.request valueForHTTPHeaderField:@"X-Firebase-AppCheck"];
-//    XCTAssertNil(appCheckTokenHeader);
-//
-//    testResponse(nil, nil, networkError);
-//  };
-//
-//  XCTestExpectation *completionExpectation =
-//      [self expectationWithDescription:@"completionExpectation"];
-//  [_functionsCustomDomain
-//      callFunction:@"fake_func"
-//        withObject:nil
-//           timeout:10
-//        completion:^(FIRHTTPSCallableResult *_Nullable result, NSError *_Nullable error) {
-//          XCTAssertEqualObjects(error, networkError);
-//          [completionExpectation fulfill];
-//        }];
-//
-//  [self waitForExpectations:@[ httpRequestExpectation, completionExpectation ] timeout:1.5];
-  // }
-//
-  // @end
+  func testCallFunctionWhenAppCheckIsNotInstalled() {
+    let networkError = NSError(
+      domain: "testCallFunctionWhenAppCheckIsInstalled",
+      code: -1,
+      userInfo: nil
+    )
+
+    let httpRequestExpectation = expectation(description: "HTTPRequestExpectation")
+    fetcherService.testBlock = { fetcherToTest, testResponse in
+      let appCheckTokenHeader = fetcherToTest.request?
+        .value(forHTTPHeaderField: "X-Firebase-AppCheck")
+      XCTAssertNil(appCheckTokenHeader)
+      testResponse(nil, nil, networkError)
+      httpRequestExpectation.fulfill()
+    }
+
+    let completionExpectation = expectation(description: "completionExpectation")
+    functionsCustomDomain?.callFunction(name: "fake_func", withObject: nil, timeout: 10) { result in
+      switch result {
+      case .success:
+        XCTFail("Unexpected success from functions?.callFunction")
+      case let .failure(error as NSError):
+        XCTAssertEqual(error, networkError)
+      }
+      completionExpectation.fulfill()
+    }
+    waitForExpectations(timeout: 1.5)
+  }
 }

+ 5 - 1
FirebaseFunctionsSwift/Tests/Unit/SerializerTests.swift

@@ -16,7 +16,11 @@ import Foundation
 
 import FirebaseCore
 @testable import FirebaseFunctionsSwift
-import GTMSessionFetcherCore
+#if COCOAPODS
+  import GTMSessionFetcher
+#else
+  import GTMSessionFetcherCore
+#endif
 
 import XCTest
 

+ 1 - 1
Firestore/Example/Benchmarks/remote_document_cache_benchmark.mm

@@ -15,7 +15,7 @@
  */
 
 #import <FirebaseFirestore/FirebaseFirestore.h>
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
 
 #include "Firestore/core/src/util/autoid.h"
 #include "Firestore/core/src/util/hard_assert.h"

+ 1 - 1
Firestore/Example/Tests/API/FIRFirestoreTests.mm

@@ -19,7 +19,7 @@
 
 #import <XCTest/XCTest.h>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
 
 #include "Firestore/core/test/unit/testutil/app_testing.h"
 

+ 1 - 1
Firestore/Example/Tests/Integration/API/FIRDatabaseTests.mm

@@ -18,7 +18,7 @@
 
 #import <XCTest/XCTest.h>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
 #import "Firestore/Example/Tests/Util/FSTEventAccumulator.h"
 #import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
 #import "Firestore/Source/API/FIRFirestore+Internal.h"

+ 1 - 1
Firestore/Example/Tests/Integration/API/FIRValidationTests.mm

@@ -20,7 +20,7 @@
 
 #include <limits>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIROptionsInternal.h"
 #import "Firestore/Source/API/FIRFieldValue+Internal.h"
 #import "Firestore/Source/API/FIRQuery+Internal.h"
 

+ 3 - 1
Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm

@@ -30,7 +30,9 @@
 #include <string>
 #include <utility>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
+#import "FirebaseCore/Internal/FIRLogger.h"
+#import "FirebaseCore/Internal/FIROptionsInternal.h"
 #import "Firestore/Example/Tests/Util/FIRFirestore+Testing.h"
 #import "Firestore/Example/Tests/Util/FSTEventAccumulator.h"
 #import "Firestore/Source/API/FIRFirestore+Internal.h"

+ 3 - 1
Firestore/Source/API/FIRFirestore.mm

@@ -22,7 +22,9 @@
 
 #import "FIRFirestoreSettings+Internal.h"
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
+#import "FirebaseCore/Internal/FIRComponentContainer.h"
+#import "FirebaseCore/Internal/FIRComponentType.h"
 #import "Firestore/Source/API/FIRCollectionReference+Internal.h"
 #import "Firestore/Source/API/FIRDocumentReference+Internal.h"
 #import "Firestore/Source/API/FIRListenerRegistration+Internal.h"

+ 7 - 1
Firestore/Source/API/FSTFirestoreComponent.mm

@@ -21,7 +21,13 @@
 #include <utility>
 
 #import "FirebaseAppCheck/Interop/FIRAppCheckInterop.h"
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
+#import "FirebaseCore/Internal/FIRComponent.h"
+#import "FirebaseCore/Internal/FIRComponentContainer.h"
+#import "FirebaseCore/Internal/FIRComponentType.h"
+#import "FirebaseCore/Internal/FIRDependency.h"
+#import "FirebaseCore/Internal/FIRLibrary.h"
+#import "FirebaseCore/Internal/FIROptionsInternal.h"
 #import "Firestore/Source/API/FIRFirestore+Internal.h"
 #import "Interop/Auth/Public/FIRAuthInterop.h"
 

+ 1 - 1
Firestore/core/src/credentials/firebase_app_check_credentials_provider_apple.mm

@@ -18,7 +18,7 @@
 
 #import "FirebaseAppCheck/Interop/FIRAppCheckInterop.h"
 #import "FirebaseAppCheck/Interop/FIRAppCheckTokenResultInterop.h"
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
 
 #include "Firestore/core/src/util/error_apple.h"
 #include "Firestore/core/src/util/hard_assert.h"

+ 2 - 1
Firestore/core/src/credentials/firebase_auth_credentials_provider_apple.mm

@@ -16,7 +16,8 @@
 
 #include "Firestore/core/src/credentials/firebase_auth_credentials_provider_apple.h"
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
+
 #import "Interop/Auth/Public/FIRAuthInterop.h"
 
 #include "Firestore/core/src/util/error_apple.h"

+ 1 - 1
Firestore/core/src/util/log_apple.mm

@@ -23,7 +23,7 @@
 #include <cstdarg>
 #include <string>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRLogger.h"
 
 #include "Firestore/core/src/util/string_apple.h"
 

+ 1 - 1
Firestore/core/test/unit/credentials/firebase_app_check_credentials_provider_test.mm

@@ -21,7 +21,7 @@
 
 #import "FirebaseAppCheck/Interop/FIRAppCheckInterop.h"
 #import "FirebaseAppCheck/Interop/FIRAppCheckTokenResultInterop.h"
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
 
 #include "Firestore/core/test/unit/testutil/app_testing.h"
 

+ 0 - 1
Firestore/core/test/unit/credentials/firebase_auth_credentials_provider_test.mm

@@ -20,7 +20,6 @@
 #include <future>  // NOLINT(build/c++11)
 #include <memory>
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
 #import "Interop/Auth/Public/FIRAuthInterop.h"
 
 #include "Firestore/core/src/util/statusor.h"

+ 2 - 1
Firestore/core/test/unit/testutil/app_testing.mm

@@ -14,7 +14,8 @@
  * limitations under the License.
  */
 
-#import "FirebaseCore/Internal/FirebaseCoreInternal.h"
+#import "FirebaseCore/Internal/FIRAppInternal.h"
+#import "FirebaseCore/Internal/FIROptionsInternal.h"
 
 #include "Firestore/core/src/util/string_apple.h"
 #include "Firestore/core/test/unit/testutil/app_testing.h"

+ 2 - 3
SymbolCollisionTest/Podfile

@@ -5,8 +5,7 @@ source 'https://github.com/firebase/SpecsStaging.git'
 source 'https://cdn.cocoapods.org/'
 
 target 'SymbolCollisionTest' do
-  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
-  # use_frameworks!
+  use_frameworks!
 
   # Firebase Pods
     pod 'Firebase', :path => '../'
@@ -36,7 +35,7 @@ target 'SymbolCollisionTest' do
 
   # Other Google Pods
 #    pod 'ARCore' Conflicts with FirebasePerformance via Clearcut and google-cast-sdk
-#    pod 'Blockly' This is a Swift Pod and requires usage of use_frameworks!
+#    pod 'Blockly'  `Blockly` does not specify a Swift version ...
     pod 'DigitsMigrationHelper'
     pod 'EarlGrey'
 #    pod 'GeoFire' -- requires Firebase/Database 4.0