Support release-level data (#297)

Support retrieving and updating generic release-level data, such as support and eol dates. The JSON format has been changed accordingly to add a new top-level `releases` key.

The `aws-lambda.py` script has been updated to make use of this new feature.
This commit is contained in:
Marc Wrobel
2024-02-11 16:57:59 +01:00
committed by GitHub
parent a0ba2d687e
commit b6f14c8d61
231 changed files with 500 additions and 152 deletions

View File

@@ -1,16 +1,7 @@
from bs4 import BeautifulSoup
from common import dates, endoflife, http, releasedata
"""Fetches AWS lambda runtimes from https://docs.aws.amazon.com.
This script does not retrieve release dates, as they are only available in release announcements.
Instead, it uses the release dates from the endoflife.date product file, or alternatively the
date the release was first detected (or the current date if none is found).
If one day release dates are available in the AWS documentation, it would be better to make use
them though. Note that this would also be unnecessary if it was possible to disable release/latest
release dates updates in the latest.py script."""
"""Fetches AWS lambda runtimes with their support / EOL dates from https://docs.aws.amazon.com."""
with releasedata.ProductData("aws-lambda") as product_data:
product_frontmatter = endoflife.ProductFrontmatter(product_data.name)
@@ -18,17 +9,31 @@ with releasedata.ProductData("aws-lambda") as product_data:
soup = BeautifulSoup(response.text, features="html5lib")
for table in soup.find_all("table"):
headers = [th.get_text().strip().lower() for th in table.find("thead").find_all("tr")[1].find_all("th")]
if "identifier" not in headers:
continue
table_name = table.find("thead").find_all("tr")[0].find("th").get_text().strip().lower()
if table_name != "supported runtimes" and table_name != "deprecated runtimes":
message = f"unexpected table '{table_name}'"
raise ValueError(message)
headers = [th.get_text().strip().lower() for th in table.find("thead").find_all("tr")[1].find_all("th")]
if "identifier" not in headers or "deprecation date" not in headers or "block function update" not in headers:
message = f"table '{table_name}' does not contain the expected headers"
raise ValueError(message)
is_supported_table = table_name == "supported runtimes"
identifier_index = headers.index("identifier")
deprecation_date_index = headers.index("deprecation date")
block_function_update_index = headers.index("block function update")
for row in table.find("tbody").find_all("tr"):
cells = row.find_all("td")
identifier = cells[identifier_index].get_text().strip()
deprecation_date_str = cells[deprecation_date_index].get_text().strip()
deprecation_date = dates.parse_date(deprecation_date_str) if deprecation_date_str else None
block_function_update_str = cells[block_function_update_index].get_text().strip()
block_function_update = dates.parse_date(block_function_update_str) if block_function_update_str else None
date = product_frontmatter.get_release_date(identifier) # use the product releaseDate if available
if date is None:
date = dates.today() # else use today's date
product_data.declare_version(identifier, date)
release = product_data.get_release(identifier)
# if no date is available, use True for supported runtimes and False for deprecated ones
release.set_support(deprecation_date if deprecation_date else is_supported_table)
# if no date is available, use False for supported runtimes and True for deprecated ones
release.set_eol(block_function_update if block_function_update else not is_supported_table)