Skip to content

Instantly share code, notes, and snippets.

@devxoul
Last active September 14, 2020 02:10
Show Gist options
  • Save devxoul/6fe972cb4ab64c1ef92bc32621961b30 to your computer and use it in GitHub Desktop.
Save devxoul/6fe972cb4ab64c1ef92bc32621961b30 to your computer and use it in GitHub Desktop.
import io
import requests
import subprocess
import zipfile
FIREBASE_VERSION = '6.29.0'
def main():
json_urls = [
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseAuthBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseCrashlyticsBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseDatabaseBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseDynamicLinksBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseMessagingBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebasePerformanceBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseProtobufBinary.json",
"https://dl.google.com/dl/firebase/ios/carthage/FirebaseRemoteConfigBinary.json",
]
downloader = Downloader(json_urls)
framework_maps = downloader.download()
print(ProjectYMLFormatter(framework_maps).get_formatted())
print(RomefileFormatter(framework_maps).get_formatted())
class Downloader:
def __init__(self, json_urls):
self.json_urls = json_urls
def download(self):
all_frameworks_maps = []
for json_url in self.json_urls:
zip_url = self._get_zip_url(json_url)
print(zip_url)
z = self._download_zip(zip_url)
frameworks_maps = self._get_framework_maps(json_url=json_url,
zip_namelist=z.namelist())
all_frameworks_maps += frameworks_maps
return all_frameworks_maps
def _get_zip_url(self, json_url):
r = requests.get(json_url)
return r.json()[FIREBASE_VERSION]
def _download_zip(self, zip_url):
r = requests.get(zip_url, stream=True)
z = zipfile.ZipFile(io.BytesIO(r.content))
return z
def _get_framework_maps(self, json_url, zip_namelist):
frameworks_dict = {}
all_frameworks = [name for name in zip_namelist if name.endswith('.framework/')]
for framework in all_frameworks:
directory_name = framework.split('/')[0]
frameworks_dict.setdefault(directory_name, set())
frameworks_dict[directory_name].add(framework.split('/')[1])
framework_maps = []
for (directory_name, frameworks) in frameworks_dict.items():
framework_map = FrameworkMap(json_url=json_url,
directory_name=directory_name,
frameworks=frameworks)
framework_maps.append(framework_map)
return sorted(framework_maps, key=lambda m: m.directory_name)
class FrameworkMap:
def __init__(self, json_url, directory_name, frameworks):
self.json_url = json_url
self.directory_name = directory_name
self.frameworks = sorted(set(frameworks))
class ProjectYMLFormatter:
def __init__(self, framework_maps):
self.framework_maps = framework_maps
def get_formatted(self):
formatted = ''
for framework_map in self.framework_maps:
for framework in framework_map.frameworks:
formatted += f" - carthage: {framework.split('.')[0]}\n"
formatted += ' embed: false\n'
return formatted
class RomefileFormatter:
def __init__(self, framework_maps):
self.framework_maps = framework_maps
def get_formatted(self):
formatted = ''
for framework_map in self.framework_maps:
carthage_name = framework_map.json_url.split('/')[-1].split('.json')[0]
formatted += f'- {carthage_name}:\n'
for framework in framework_map.frameworks:
formatted += f" - name: {framework.split('.framework')[0]}\n"
return formatted
if __name__ == '__main__':
main()
@devxoul
Copy link
Author

devxoul commented Jul 25, 2020

Example Output

project.yml

      - carthage: FirebaseCoreDiagnostics
        embed: false
      - carthage: PromisesObjC
        embed: false
      - carthage: FirebaseAnalytics
        embed: false
      - carthage: GoogleUtilities
        embed: false
      - carthage: nanopb
        embed: false
      - carthage: FIRAnalyticsConnector
        embed: false
      - carthage: FirebaseCore
        embed: false
      - carthage: GoogleAppMeasurement
        embed: false
      - carthage: GoogleDataTransport
        embed: false
      - carthage: Firebase
        embed: false
      - carthage: FirebaseInstallations
        embed: false
      - carthage: GTMSessionFetcher
        embed: false
      - carthage: FirebaseAuth
        embed: false
      - carthage: FirebaseCrashlytics
        embed: false
      - carthage: FirebaseDatabase
        embed: false
      - carthage: leveldb-library
        embed: false
      - carthage: FirebaseDynamicLinks
        embed: false
      - carthage: FirebaseInstanceID
        embed: false
      - carthage: FirebaseMessaging
        embed: false
      - carthage: GoogleToolboxForMac
        embed: false
      - carthage: FirebaseRemoteConfig
        embed: false
      - carthage: FirebasePerformance
        embed: false
      - carthage: GTMSessionFetcher
        embed: false
      - carthage: FirebaseABTesting
        embed: false
      - carthage: Protobuf
        embed: false
      - carthage: FirebaseRemoteConfig
        embed: false
      - carthage: FirebaseABTesting
        embed: false

Romefile

- FirebaseAnalytics:
  - name: FirebaseCoreDiagnostics
  - name: PromisesObjC
  - name: FirebaseAnalytics
  - name: GoogleUtilities
  - name: nanopb
  - name: FIRAnalyticsConnector
  - name: FirebaseCore
  - name: GoogleAppMeasurement
  - name: GoogleDataTransport
  - name: Firebase
  - name: FirebaseInstallations
- FirebaseAuth:
  - name: GTMSessionFetcher
  - name: FirebaseAuth
- FirebaseCrashlytics:
  - name: FirebaseCrashlytics
- FirebaseDatabase:
  - name: FirebaseDatabase
  - name: leveldb-library
- FirebaseDynamicLinks:
  - name: FirebaseDynamicLinks
- FirebaseMessaging:
  - name: FirebaseInstanceID
  - name: FirebaseMessaging
- FirebasePerformance:
  - name: GoogleToolboxForMac
  - name: FirebaseRemoteConfig
  - name: FirebasePerformance
  - name: GTMSessionFetcher
  - name: FirebaseABTesting
- FirebaseProtobuf:
  - name: Protobuf
- FirebaseRemoteConfig:
  - name: FirebaseRemoteConfig
  - name: FirebaseABTesting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment