From e75e8729f2918c3221e109307c14b11476189adc Mon Sep 17 00:00:00 2001 From: Marc Wrobel Date: Sat, 9 Aug 2025 21:46:29 +0200 Subject: [PATCH] =?UTF-8?q?[ibm-product-lifecycle]=C2=A0Add=20auto=20metho?= =?UTF-8?q?d=20(#490)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For https://github.com/endoflife-date/endoflife.date/pull/8061. --- src/ibm-product-lifecycle.py | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/ibm-product-lifecycle.py diff --git a/src/ibm-product-lifecycle.py b/src/ibm-product-lifecycle.py new file mode 100644 index 00000000..ee5614fe --- /dev/null +++ b/src/ibm-product-lifecycle.py @@ -0,0 +1,53 @@ +import logging + +from common import dates, http +from common.releasedata import ProductData, config_from_argv + +"""Get release information from IBM's product lifecycle CSV file available. +See https://www.ibm.com/support/pages/product-lifecycle-list. +""" + +def unquote(s: str) -> str: + return s[1:-1] if s.startswith('"') and s.endswith('"') else s + +config = config_from_argv() +with ProductData(config.product) as product_data: + product_selector = config.data["product_selector"] + response = http.fetch_url(config.url) + + records = response.text.splitlines() + for record in records[1:]: # Skip the header line + fields = record.split(',') + if len(fields) < 13: + logging.warning("Skipping record with insufficient fields: %s", record) + continue + + product_name = unquote(fields[1].strip()) + if product_selector != product_name: + continue + + product_version = unquote(fields[2].strip()) + match = config.first_match(product_version) + if not match: + logging.warning("Skipping '%s' version %s, no match found", product_name, product_version) + continue + + release_name = config.render(match) + release = product_data.get_release(release_name) + + release_date_str = fields[6].strip() + if release_date_str: + logging.debug("Release announce for %s %s: %s", product_name, product_version, fields[7].strip()) + release_date = dates.parse_date(release_date_str) + release.set_release_date(release_date) + + eol_date_str = fields[12].strip() + if eol_date_str: + logging.debug("EOL announce for %s %s: %s", product_name, product_version, fields[13].strip()) + eol_date = dates.parse_date(eol_date_str) + release.set_eol(eol_date) + + eoes_date_str = fields[14].strip() + if eoes_date_str: + eoes_date = dates.parse_date(eoes_date_str) + release.set_eoes(eoes_date)