| #!/usr/bin/env python3 | |
| """ | |
| A script that can be used to query maven.google.com to get information about androidx artifacts to | |
| see what stable/latest versions are available and when they were released. | |
| Usage: | |
| ./librarystats.py | |
| """ | |
| from datetime import datetime | |
| import requests | |
| import re | |
| import os | |
| from xml.dom.minidom import parseString | |
| current_directory = os.path.dirname(__file__) | |
| libraries = [] | |
| docs_public_build = os.path.join(current_directory, r'../docs-public/build.gradle') | |
| with open(docs_public_build, "r") as f: | |
| build_file_contents = f.read() | |
| p = re.compile('\("(androidx\..*)\:[0-9]+\.[0-9]+\.[0-9]+.*"\)') | |
| libraries = [val for val in p.findall(build_file_contents) if not val.endswith("-samples")] | |
| cache_directory = os.path.join(current_directory, r'cache') | |
| if not os.path.exists(cache_directory): | |
| os.makedirs(cache_directory) | |
| def getOrDownloadMetadata(library_to_fetch): | |
| cache_file_name = "cache/" + library_to_fetch + ".xml" | |
| if os.path.isfile(cache_file_name): | |
| with open(cache_file_name, "r") as f: | |
| return f.read() | |
| url = "https://dl.google.com/android/maven2/" + library_to_fetch.replace(".", "/").replace(":", "/") + "/maven-metadata.xml" | |
| r = requests.get(url, allow_redirects=True) | |
| if not r.ok: | |
| return None | |
| with open(cache_file_name, "w") as f: | |
| f.write(r.text) | |
| return r.text | |
| def getOrDownloadUpdatedDate(library_to_fetch, version_to_fetch): | |
| cache_file_name = "cache/" + library_to_fetch + "-" + version_to_fetch + ".txt" | |
| if os.path.isfile(cache_file_name): | |
| with open(cache_file_name, "r") as f: | |
| return f.read() | |
| artifact_id = library_to_fetch.split(":")[-1] | |
| url = "https://dl.google.com/android/maven2/" + library_to_fetch.replace(".", "/").replace(":", "/") + "/" + version_to_fetch + "/" + artifact_id + "-" + version_to_fetch + ".pom" | |
| r = requests.get(url, allow_redirects=True) | |
| last_updated_pattern = "%a, %d %b %Y %H:%M:%S %Z" | |
| timestamp = datetime.strptime(r.headers["Last-Modified"], last_updated_pattern).strftime("%Y %m %d") | |
| with open(cache_file_name, "w") as f: | |
| f.write(timestamp) | |
| return timestamp | |
| print("Library,Latest Stable,Latest Stable Release Date,Latest Version,Latest Version Release Date") | |
| for library in libraries: | |
| metadata = getOrDownloadMetadata(library) | |
| if metadata is None: | |
| print(library + ",-,-,-,-") | |
| continue | |
| document = parseString(metadata) | |
| versions = [a.childNodes[0].nodeValue for a in document.getElementsByTagName("version")] | |
| line = library + "," | |
| latest_stable_version = None | |
| for version in reversed(versions): | |
| if "-" not in version: | |
| latest_stable_version = version | |
| break | |
| if latest_stable_version: | |
| line += latest_stable_version + "," + getOrDownloadUpdatedDate(library, latest_stable_version) + "," | |
| else: | |
| line += "-,-," | |
| latest_version = versions[-1] | |
| line += latest_version + "," + getOrDownloadUpdatedDate(library, latest_version) | |
| print(line) |