From a5d80160fe76c6b0d57e0224f3d60f288dc7a923 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Sat, 11 Mar 2023 09:00:21 +0100 Subject: [PATCH 1/3] poetry: Support the poetry 2.0 metadata format accomodate for missing category in package Fixes https://github.com/flatpak/flatpak-builder-tools/issues/371 --- poetry/flatpak-poetry-generator.py | 44 ++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/poetry/flatpak-poetry-generator.py b/poetry/flatpak-poetry-generator.py index abe806c2..b145a444 100755 --- a/poetry/flatpak-poetry-generator.py +++ b/poetry/flatpak-poetry-generator.py @@ -63,19 +63,23 @@ def get_module_sources(parsed_lockfile: dict, include_devel: bool = True) -> lis for section, packages in parsed_lockfile.items(): if section == "package": for package in packages: - if ( - package["category"] == "dev" - and include_devel - and not package["optional"] - or package["category"] == "main" - and not package["optional"] + if "category" not in package or ( + ( + package.get("category") == "dev" + and include_devel + and not package.get("optional") + ) + or ( + package.get("category") == "main" + and not package.get("optional") + ) ): + hashes = [] # Check for old metadata format (poetry version < 1.0.0b2) if "hashes" in parsed_lockfile["metadata"]: hashes = parsed_lockfile["metadata"]["hashes"][package["name"]] - # Else new metadata format - else: - hashes = [] + # metadata format 1.1 + elif "files" in parsed_lockfile["metadata"]: for package_name in parsed_lockfile["metadata"]["files"]: if package_name == package["name"]: package_files = parsed_lockfile["metadata"]["files"][ @@ -86,6 +90,12 @@ def get_module_sources(parsed_lockfile: dict, include_devel: bool = True) -> lis match = hash_re.search(package_files[num]["hash"]) if match: hashes.append(match.group(2)) + # metadata format 2.0 + else: + for file in package["files"]: + match = hash_re.search(file["hash"]) + if match: + hashes.append(match.group(2)) package_source = package.get("source") if package_source and package_source["type"] == "directory": print(f'Skipping download url and hash extraction for {package["name"]}, source type is directory') @@ -112,12 +122,16 @@ def get_dep_names(parsed_lockfile: dict, include_devel: bool = True) -> list: for section, packages in parsed_lockfile.items(): if section == "package": for package in packages: - if ( - package["category"] == "dev" - and include_devel - and not package["optional"] - or package["category"] == "main" - and not package["optional"] + if "category" not in package or ( + ( + package.get("category") == "dev" + and include_devel + and not package.get("optional") + ) + or ( + package.get("category") == "main" + and not package.get("optional") + ) ): dep_names.append(package["name"]) return dep_names From 1ae847cfe51efe84f2f426b8f1a385a6c7df58af Mon Sep 17 00:00:00 2001 From: bbhtt Date: Sun, 4 May 2025 07:47:38 +0530 Subject: [PATCH 2/3] poetry: Simplify some logic when looping over packages --- poetry/flatpak-poetry-generator.py | 32 +++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/poetry/flatpak-poetry-generator.py b/poetry/flatpak-poetry-generator.py index b145a444..9774f7c2 100755 --- a/poetry/flatpak-poetry-generator.py +++ b/poetry/flatpak-poetry-generator.py @@ -63,16 +63,12 @@ def get_module_sources(parsed_lockfile: dict, include_devel: bool = True) -> lis for section, packages in parsed_lockfile.items(): if section == "package": for package in packages: - if "category" not in package or ( - ( - package.get("category") == "dev" - and include_devel - and not package.get("optional") - ) - or ( - package.get("category") == "main" - and not package.get("optional") - ) + category = package.get("category") + optional = package.get("optional", False) + if ( + not category + or (category == "dev" and include_devel and not optional) + or (category == "main" and not optional) ): hashes = [] # Check for old metadata format (poetry version < 1.0.0b2) @@ -122,16 +118,12 @@ def get_dep_names(parsed_lockfile: dict, include_devel: bool = True) -> list: for section, packages in parsed_lockfile.items(): if section == "package": for package in packages: - if "category" not in package or ( - ( - package.get("category") == "dev" - and include_devel - and not package.get("optional") - ) - or ( - package.get("category") == "main" - and not package.get("optional") - ) + category = package.get("category") + optional = package.get("optional", False) + if ( + not category + or (category == "dev" and include_devel and not optional) + or (category == "main" and not optional) ): dep_names.append(package["name"]) return dep_names From 325ec58af81000619d0e51f3d62ac53c5850a8a8 Mon Sep 17 00:00:00 2001 From: bbhtt Date: Sun, 4 May 2025 07:58:31 +0530 Subject: [PATCH 3/3] poetry: Exclude items in dev group for v2 metadata on production arg This should later be expanded to support any group akin to poetry's --with and --without GROUP args --- poetry/flatpak-poetry-generator.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/poetry/flatpak-poetry-generator.py b/poetry/flatpak-poetry-generator.py index 9774f7c2..53039875 100755 --- a/poetry/flatpak-poetry-generator.py +++ b/poetry/flatpak-poetry-generator.py @@ -64,6 +64,7 @@ def get_module_sources(parsed_lockfile: dict, include_devel: bool = True) -> lis if section == "package": for package in packages: category = package.get("category") + groups = package.get("groups", []) optional = package.get("optional", False) if ( not category @@ -88,6 +89,8 @@ def get_module_sources(parsed_lockfile: dict, include_devel: bool = True) -> lis hashes.append(match.group(2)) # metadata format 2.0 else: + if groups == ["dev"] and not include_devel: + continue for file in package["files"]: match = hash_re.search(file["hash"]) if match: @@ -119,7 +122,10 @@ def get_dep_names(parsed_lockfile: dict, include_devel: bool = True) -> list: if section == "package": for package in packages: category = package.get("category") + groups = package.get("groups", []) optional = package.get("optional", False) + if groups == ["dev"] and not include_devel: + continue if ( not category or (category == "dev" and include_devel and not optional)