diff --git a/cyclonedx_py/_internal/pipenv.py b/cyclonedx_py/_internal/pipenv.py index 0c1d5997..dc2a7d00 100644 --- a/cyclonedx_py/_internal/pipenv.py +++ b/cyclonedx_py/_internal/pipenv.py @@ -26,7 +26,7 @@ from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, Property, XsUri -from cyclonedx.model.component import Component, ComponentType +from cyclonedx.model.component import Component, ComponentScope, ComponentType from packageurl import PackageURL from . import BomBuilder, PropertyName, PurlTypePypi @@ -160,6 +160,12 @@ def _make_bom(self, root_c: Optional['Component'], if root_c: # root for possible self-installs all_components[normalize_packagename(root_c.name)] = root_c + non_develop_packages = { + normalize_packagename(pkg_name) + for gname, pkgs in locker.items() + if gname != self.__LOCKFILE_META and gname != 'develop' and isinstance(pkgs, dict) + for pkg_name in pkgs + } for group_name in use_groups: self._logger.debug('processing group %r ...', group_name) for package_name, package_data in locker.get(group_name, {}).items(): @@ -167,12 +173,17 @@ def _make_bom(self, root_c: Optional['Component'], if package_name_normalized in all_components: component = all_components[package_name_normalized] self._logger.info('existing component for package %r', package_name) + if group_name != 'develop': + component.scope = None else: component = all_components[package_name_normalized] = Component( bom_ref=f'{package_name}{package_data.get("version", "")}', type=ComponentType.LIBRARY, name=package_name, version=package_data['version'][2:] if 'version' in package_data else None, + scope=ComponentScope.EXCLUDED if ( + group_name == 'develop' and package_name_normalized not in non_develop_packages + ) else None, external_references=self.__make_extrefs(package_name, package_data, source_urls), ) component.purl = PackageURL( diff --git a/cyclonedx_py/_internal/poetry.py b/cyclonedx_py/_internal/poetry.py index d3eaa493..aec38e11 100644 --- a/cyclonedx_py/_internal/poetry.py +++ b/cyclonedx_py/_internal/poetry.py @@ -292,7 +292,9 @@ def _make_bom(self, project: 'T_NameDict', locker: 'T_NameDict', use_extras_dep_names = frozenset(map(normalize_packagename, chain.from_iterable(po_cfg['extras'][e] for e in use_extras))) - for group_name in use_groups: + sorted_groups = sorted(use_groups, key=lambda g: 1 if g == 'dev' else 0) + for group_name in sorted_groups: + is_dev = group_name == 'dev' for dep_name, dep_specs in po_cfg['group'][group_name].get('dependencies', {}).items(): dep_name = normalize_packagename(dep_name) if not isinstance(dep_specs, list): @@ -319,16 +321,20 @@ def _make_bom(self, project: 'T_NameDict', locker: 'T_NameDict', self.__add_dep( bom, lock_entry, chain.from_iterable(ds.get('extras', ()) for ds in dep_specs), - lock_data) + lock_data, + is_dev=is_dev) return bom - def __add_dep(self, bom: 'Bom', lock_entry: _LockEntry, use_extras: Iterable[str], lock_data: 'T_LockData') -> None: + def __add_dep(self, bom: 'Bom', lock_entry: _LockEntry, use_extras: Iterable[str], lock_data: 'T_LockData', + *, is_dev: bool = False) -> None: if lock_entry.added2bom: self._logger.debug('existing component: %r', lock_entry.component) lock_entry_dep = None else: lock_entry.added2bom = True + if is_dev: + lock_entry.component.scope = ComponentScope.EXCLUDED self._logger.info('add component for package %r', lock_entry.name) self._logger.debug('add component: %r', lock_entry.component) bom.components.add(lock_entry.component) @@ -347,7 +353,7 @@ def __add_dep(self, bom: 'Bom', lock_entry: _LockEntry, use_extras: Iterable[str continue for dep_lock_entry in dep_lock_entries: lock_entry_dep.dependencies.add(Dependency(dep_lock_entry.component.bom_ref)) - self.__add_dep(bom, dep_lock_entry, dep_spec.get('extras', ()), lock_data) + self.__add_dep(bom, dep_lock_entry, dep_spec.get('extras', ()), lock_data, is_dev=is_dev) if use_extras: use_extras = frozenset(map(normalize_packagename, use_extras)) lock_entry.component.properties.update( @@ -369,7 +375,7 @@ def __add_dep(self, bom: 'Bom', lock_entry: _LockEntry, use_extras: Iterable[str continue for dep_lock_entry in dep_lock_entries: lock_entry_dep.dependencies.add(Dependency(dep_lock_entry.component.bom_ref)) - self.__add_dep(bom, dep_lock_entry, req.extras, lock_data) + self.__add_dep(bom, dep_lock_entry, req.extras, lock_data, is_dev=is_dev) @staticmethod def _get_lockfile_version(locker: 'T_NameDict') -> tuple[int, ...]: diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.1.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.1.xml.bin index a67ad6b2..e1785e31 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.1.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.1.xml.bin @@ -26,6 +26,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.json.bin index 78c7969f..0e1b1221 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.json.bin @@ -39,6 +39,7 @@ ], "name": "ddt", "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.xml.bin index fda50aaa..b5f2e98b 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.2.xml.bin @@ -40,6 +40,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.json.bin index 2ce86266..4023089f 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.json.bin @@ -91,6 +91,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.xml.bin index b6f9cfe9..77aff3c3 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.3.xml.bin @@ -58,6 +58,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.json.bin index d5eb44ee..badaf0d3 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.json.bin @@ -91,6 +91,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.xml.bin index 2ccb8b03..aef0da47 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.4.xml.bin @@ -85,6 +85,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.json.bin index f01cd89e..7d364873 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.json.bin @@ -91,6 +91,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.xml.bin index e917398f..b3e6040b 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.5.xml.bin @@ -95,6 +95,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.json.bin index ddb893d8..8d9be911 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.json.bin @@ -91,6 +91,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.xml.bin index d37180b1..1a3d34cc 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.6.xml.bin @@ -95,6 +95,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.json.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.json.bin index 34308633..b07b363c 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.json.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.json.bin @@ -91,6 +91,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.xml.bin b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.xml.bin index ce4a761c..a91d2ef0 100644 --- a/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.xml.bin +++ b/tests/_data/snapshots/pipenv/some-categories_category-deps_1.7.xml.bin @@ -95,6 +95,7 @@ ddt 1.7.0 + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.1.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.1.xml.bin index aa16d39d..616a002e 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.1.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.1.xml.bin @@ -4,6 +4,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -26,6 +27,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -37,6 +39,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -48,6 +51,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -70,6 +74,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.json.bin index 40cba5bd..f5d8e413 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.json.bin @@ -11,6 +11,7 @@ ], "name": "arrow", "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -39,6 +40,7 @@ ], "name": "isoduration", "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -53,6 +55,7 @@ ], "name": "python-dateutil", "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -67,6 +70,7 @@ ], "name": "six", "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -95,6 +99,7 @@ ], "name": "types-python-dateutil", "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.xml.bin index 1376a560..84a8f5a2 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.2.xml.bin @@ -18,6 +18,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -40,6 +41,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -51,6 +53,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -62,6 +65,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -84,6 +88,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.json.bin index 0a88905f..c011a240 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.json.bin @@ -27,6 +27,7 @@ } ], "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -87,6 +88,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -117,6 +119,7 @@ } ], "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -147,6 +150,7 @@ } ], "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -207,6 +211,7 @@ } ], "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.xml.bin index 64de1765..26ec502a 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.3.xml.bin @@ -21,6 +21,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -57,6 +58,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -75,6 +77,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -93,6 +96,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -129,6 +133,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.json.bin index 316baa53..fabe7ac5 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.json.bin @@ -27,6 +27,7 @@ } ], "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -87,6 +88,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -117,6 +119,7 @@ } ], "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -147,6 +150,7 @@ } ], "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -207,6 +211,7 @@ } ], "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.xml.bin index 8cc6edbc..4cf95b9b 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.4.xml.bin @@ -48,6 +48,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -84,6 +85,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -102,6 +104,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -120,6 +123,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -156,6 +160,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.json.bin index 8cecd9dc..14cbf1f8 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.json.bin @@ -27,6 +27,7 @@ } ], "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -87,6 +88,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -117,6 +119,7 @@ } ], "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -147,6 +150,7 @@ } ], "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -207,6 +211,7 @@ } ], "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.xml.bin index c67fedea..693be471 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.5.xml.bin @@ -58,6 +58,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -94,6 +95,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -112,6 +114,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -130,6 +133,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -166,6 +170,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.json.bin index 5005754a..fbe2107e 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.json.bin @@ -27,6 +27,7 @@ } ], "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -87,6 +88,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -117,6 +119,7 @@ } ], "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -147,6 +150,7 @@ } ], "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -207,6 +211,7 @@ } ], "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.xml.bin index 142956e5..39069c83 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.6.xml.bin @@ -58,6 +58,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -94,6 +95,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -112,6 +114,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -130,6 +133,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -166,6 +170,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.json.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.json.bin index 67b5e430..7cf10284 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.json.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.json.bin @@ -27,6 +27,7 @@ } ], "purl": "pkg:pypi/arrow@1.3.0", + "scope": "excluded", "type": "library", "version": "1.3.0" }, @@ -87,6 +88,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, @@ -117,6 +119,7 @@ } ], "purl": "pkg:pypi/python-dateutil@2.8.2", + "scope": "excluded", "type": "library", "version": "2.8.2" }, @@ -147,6 +150,7 @@ } ], "purl": "pkg:pypi/six@1.16.0", + "scope": "excluded", "type": "library", "version": "1.16.0" }, @@ -207,6 +211,7 @@ } ], "purl": "pkg:pypi/types-python-dateutil@2.8.19.14", + "scope": "excluded", "type": "library", "version": "2.8.19.14" } diff --git a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.xml.bin b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.xml.bin index 2932b705..10b5ff41 100644 --- a/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.xml.bin +++ b/tests/_data/snapshots/pipenv/with-dev_default-and-dev_1.7.xml.bin @@ -58,6 +58,7 @@ arrow 1.3.0 + excluded pkg:pypi/arrow@1.3.0 @@ -94,6 +95,7 @@ isoduration 20.11.0 + excluded pkg:pypi/isoduration@20.11.0 @@ -112,6 +114,7 @@ python-dateutil 2.8.2 + excluded pkg:pypi/python-dateutil@2.8.2 @@ -130,6 +133,7 @@ six 1.16.0 + excluded pkg:pypi/six@1.16.0 @@ -166,6 +170,7 @@ types-python-dateutil 2.8.19.14 + excluded pkg:pypi/types-python-dateutil@2.8.19.14 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.1.xml.bin index 54b4daf6..f3a44bc0 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.1.xml.bin @@ -21,6 +21,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.json.bin index 97a2754c..05bee56a 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.json.bin @@ -37,6 +37,7 @@ ], "name": "ddt", "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.xml.bin index 6373011d..261397e2 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.2.xml.bin @@ -40,6 +40,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.json.bin index 9bd91cd5..4997430b 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.json.bin @@ -73,6 +73,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.xml.bin index a08ba139..e2d30997 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.3.xml.bin @@ -52,6 +52,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.json.bin index 630bd68f..fef57e93 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.json.bin @@ -73,6 +73,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.xml.bin index b510e44f..adf204c4 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.4.xml.bin @@ -79,6 +79,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.json.bin index 19a9d06d..d3ac1e8b 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.json.bin @@ -73,6 +73,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.xml.bin index b667a314..7df3464d 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.5.xml.bin @@ -89,6 +89,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.json.bin index ea6bc536..5f27369c 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.json.bin @@ -73,6 +73,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.xml.bin index a6489f57..7eee9674 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.6.xml.bin @@ -89,6 +89,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.json.bin index e49ce6f1..7a495c46 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.json.bin @@ -73,6 +73,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.xml.bin index f60276c1..da0c8a97 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock11_1.7.xml.bin @@ -89,6 +89,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.1.xml.bin index 54b4daf6..f3a44bc0 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.1.xml.bin @@ -21,6 +21,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.json.bin index 97a2754c..05bee56a 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.json.bin @@ -37,6 +37,7 @@ ], "name": "ddt", "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.xml.bin index 6373011d..261397e2 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.2.xml.bin @@ -40,6 +40,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.json.bin index af7357be..433a5f05 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.xml.bin index f4d82adc..de3cba7f 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.3.xml.bin @@ -49,6 +49,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.json.bin index 1933d8c6..3978f119 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.xml.bin index 055a6b8c..075406ea 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.4.xml.bin @@ -76,6 +76,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.json.bin index 77dbe89b..3f4a1448 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.xml.bin index 37362470..4cff7665 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.5.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.json.bin index a4bf9fdb..35061f75 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.xml.bin index 523c70ff..bb78aa1e 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.6.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.json.bin index c95ee304..3d27afc8 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.0", + "scope": "excluded", "type": "library", "version": "1.7.0" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.xml.bin index eeb5c7ad..4304d206 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock20_1.7.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.0 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.0 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.1.xml.bin index fa0484dd..bd895761 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.1.xml.bin @@ -21,6 +21,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.json.bin index 522e9f37..15b3e43c 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.json.bin @@ -37,6 +37,7 @@ ], "name": "ddt", "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.xml.bin index f50b3fb0..032bb254 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.2.xml.bin @@ -40,6 +40,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.json.bin index 398d9401..0818bc40 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.xml.bin index 01a87c20..7ea9d099 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.3.xml.bin @@ -49,6 +49,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.json.bin index 2ea7fb53..8766f399 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.xml.bin index 109162d9..23b55f0f 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.4.xml.bin @@ -76,6 +76,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.json.bin index 3827480d..e3e78b26 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.xml.bin index 0e34f17b..48182302 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.5.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.json.bin index 9af28292..3ccfae22 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.xml.bin index a9022269..b84e315e 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.6.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.json.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.json.bin index 83a716fc..92d930e9 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.json.bin @@ -67,6 +67,7 @@ } ], "purl": "pkg:pypi/ddt@1.7.2", + "scope": "excluded", "type": "library", "version": "1.7.2" }, diff --git a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.xml.bin index 8610fa1f..0798143b 100644 --- a/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_group-deps_lock21_1.7.xml.bin @@ -86,6 +86,7 @@ ddt 1.7.2 Data-Driven/Decorated Tests + excluded pkg:pypi/ddt@1.7.2 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.1.xml.bin index b3e98c13..cafff06a 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.1.xml.bin @@ -37,6 +37,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.json.bin index d1c7c243..1ab8d260 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.json.bin @@ -57,6 +57,7 @@ ], "name": "isoduration", "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.xml.bin index 158bef4c..021890ca 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.2.xml.bin @@ -56,6 +56,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.json.bin index fddba02f..ae7c4e90 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.xml.bin index 22238b8b..8e384df6 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.3.xml.bin @@ -77,6 +77,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.json.bin index a92a4ba0..3b35b2f6 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.xml.bin index 803d9a51..e8ab048d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.4.xml.bin @@ -104,6 +104,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.json.bin index 32fa6dd6..c56cbb41 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.xml.bin index fd8a667a..5e8d246d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.5.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.json.bin index 6a0a7fc1..7fc428f5 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.xml.bin index 14d95bb0..83e856d2 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.6.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.json.bin index b4e3ec47..3ac26ee1 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.xml.bin index ed5f9b67..522736bf 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock10_1.7.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.1.xml.bin index b3e98c13..cafff06a 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.1.xml.bin @@ -37,6 +37,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.json.bin index d1c7c243..1ab8d260 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.json.bin @@ -57,6 +57,7 @@ ], "name": "isoduration", "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.xml.bin index 158bef4c..021890ca 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.2.xml.bin @@ -56,6 +56,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.json.bin index fddba02f..ae7c4e90 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.xml.bin index 22238b8b..8e384df6 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.3.xml.bin @@ -77,6 +77,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.json.bin index a92a4ba0..3b35b2f6 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.xml.bin index 803d9a51..e8ab048d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.4.xml.bin @@ -104,6 +104,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.json.bin index 32fa6dd6..c56cbb41 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.xml.bin index fd8a667a..5e8d246d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.5.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.json.bin index 6a0a7fc1..7fc428f5 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.xml.bin index 14d95bb0..83e856d2 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.6.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.json.bin index b4e3ec47..3ac26ee1 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.xml.bin index ed5f9b67..522736bf 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock11_1.7.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.1.xml.bin index b3e98c13..cafff06a 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.1.xml.bin @@ -37,6 +37,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.json.bin index d1c7c243..1ab8d260 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.json.bin @@ -57,6 +57,7 @@ ], "name": "isoduration", "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.xml.bin index 158bef4c..021890ca 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.2.xml.bin @@ -56,6 +56,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.json.bin index 7200d54b..c4c1f102 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.xml.bin index fa306358..20b08b54 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.3.xml.bin @@ -77,6 +77,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.json.bin index 94723c59..324fa66b 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.xml.bin index 2f3e5d14..7836613d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.4.xml.bin @@ -104,6 +104,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.json.bin index 4c32f56b..3f3e12f4 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.xml.bin index 719cbfb1..6be52de7 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.5.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.json.bin index dfcdb105..f8b67b43 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.xml.bin index 7306ef5d..6822eab4 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.6.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.json.bin index b5d8b6e2..48bb0705 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.xml.bin index 4d0869f9..33d1f14f 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock20_1.7.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.1.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.1.xml.bin index 6b35fb48..f0970ed6 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.1.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.1.xml.bin @@ -37,6 +37,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.json.bin index 36d4e47d..7ece116d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.json.bin @@ -57,6 +57,7 @@ ], "name": "isoduration", "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.xml.bin index f93348f8..b67125f1 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.2.xml.bin @@ -56,6 +56,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.json.bin index 58230668..7b7f02c3 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.xml.bin index f37c203f..de66bc8f 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.3.xml.bin @@ -77,6 +77,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.json.bin index 75830b09..75d0e0d3 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.xml.bin index b01a3a56..e665c265 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.4.xml.bin @@ -104,6 +104,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.json.bin index 0c8fe007..72cf0376 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.xml.bin index bbf30935..a6dc8ee2 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.5.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.json.bin index 0e35f51c..ee6f952e 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.xml.bin index f2f35114..009db961 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.6.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.json.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.json.bin index 6beab097..b674230d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.json.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.json.bin @@ -111,6 +111,7 @@ } ], "purl": "pkg:pypi/isoduration@20.11.0", + "scope": "excluded", "type": "library", "version": "20.11.0" }, diff --git a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.xml.bin b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.xml.bin index a9043465..6a62800d 100644 --- a/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.xml.bin +++ b/tests/_data/snapshots/poetry/plain_main-and-dev_lock21_1.7.xml.bin @@ -114,6 +114,7 @@ isoduration 20.11.0 Operations with ISO 8601 durations + excluded pkg:pypi/isoduration@20.11.0 diff --git a/tests/unit/test_pipenv.py b/tests/unit/test_pipenv.py new file mode 100644 index 00000000..66322ac4 --- /dev/null +++ b/tests/unit/test_pipenv.py @@ -0,0 +1,119 @@ +# This file is part of CycloneDX Python +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) OWASP Foundation. All Rights Reserved. + +import logging +from unittest import TestCase + +from cyclonedx.model.component import Component, ComponentScope, ComponentType + +from cyclonedx_py._internal.pipenv import PipenvBB + + +class TestPipenvScope(TestCase): + + def setUp(self) -> None: + self.bb = PipenvBB(logger=logging.getLogger('test-pipenv'), pypi_url=None) + + def test_dev_packages_marked_excluded(self) -> None: + locker = { + '_meta': {}, + 'default': {'colorama': {'version': '==0.4.6'}}, + 'develop': {'arrow': {'version': '==1.3.0'}} + } + bom = self.bb._make_bom(None, locker, frozenset({'default', 'develop'})) + comp_map = {c.name: c for c in bom.components} + + self.assertIn('colorama', comp_map) + self.assertIsNone(comp_map['colorama'].scope) + + self.assertIn('arrow', comp_map) + self.assertEqual(ComponentScope.EXCLUDED, comp_map['arrow'].scope) + + def test_package_in_both_default_and_develop_not_excluded(self) -> None: + locker = { + '_meta': {}, + 'default': {'shared-pkg': {'version': '==1.0.0'}}, + 'develop': { + 'shared-pkg': {'version': '==1.0.0'}, + 'dev-only': {'version': '==2.0.0'} + } + } + bom = self.bb._make_bom(None, locker, frozenset({'default', 'develop'})) + comp_map = {c.name: c for c in bom.components} + + self.assertIn('shared-pkg', comp_map) + self.assertIsNone(comp_map['shared-pkg'].scope) + + self.assertIn('dev-only', comp_map) + self.assertEqual(ComponentScope.EXCLUDED, comp_map['dev-only'].scope) + + def test_package_normalized_name_matching(self) -> None: + locker = { + '_meta': {}, + 'default': {'Types_Python_Dateutil': {'version': '==1.0.0'}}, + 'develop': {'types-python-dateutil': {'version': '==1.0.0'}} + } + bom = self.bb._make_bom(None, locker, frozenset({'default', 'develop'})) + + self.assertEqual(1, len(bom.components)) + comp = next(iter(bom.components)) + self.assertIsNone(comp.scope) + + def test_default_only_groups_leaves_scope_none(self) -> None: + locker = { + '_meta': {}, + 'default': {'colorama': {'version': '==0.4.6'}}, + 'develop': {'arrow': {'version': '==1.3.0'}} + } + bom = self.bb._make_bom(None, locker, frozenset({'default'})) + comp_map = {c.name: c for c in bom.components} + + self.assertIn('colorama', comp_map) + self.assertIsNone(comp_map['colorama'].scope) + self.assertNotIn('arrow', comp_map) + + def test_root_component_scope_not_modified(self) -> None: + root_c = Component(name='my-root-pkg', type=ComponentType.APPLICATION) + locker = { + '_meta': {}, + 'default': {}, + 'develop': {'my-root-pkg': {'version': '==0.1.0'}, 'dev-pkg': {'version': '==1.0.0'}} + } + bom = self.bb._make_bom(root_c, locker, frozenset({'default', 'develop'})) + self.assertIsNone(root_c.scope) + self.assertIs(root_c, bom.metadata.component) + comp_map = {c.name: c for c in bom.components} + self.assertIn('dev-pkg', comp_map) + self.assertEqual(ComponentScope.EXCLUDED, comp_map['dev-pkg'].scope) + + def test_custom_non_develop_category_not_excluded(self) -> None: + locker = { + '_meta': {}, + 'docs': {'sphinx': {'version': '==5.0.0'}}, + 'develop': { + 'sphinx': {'version': '==5.0.0'}, + 'pytest': {'version': '==7.0.0'} + } + } + bom = self.bb._make_bom(None, locker, frozenset({'docs', 'develop'})) + comp_map = {c.name: c for c in bom.components} + + self.assertIn('sphinx', comp_map) + self.assertIsNone(comp_map['sphinx'].scope) + + self.assertIn('pytest', comp_map) + self.assertEqual(ComponentScope.EXCLUDED, comp_map['pytest'].scope) diff --git a/tests/unit/test_poetry.py b/tests/unit/test_poetry.py new file mode 100644 index 00000000..01887303 --- /dev/null +++ b/tests/unit/test_poetry.py @@ -0,0 +1,170 @@ +# This file is part of CycloneDX Python +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) OWASP Foundation. All Rights Reserved. + +import logging +from unittest import TestCase + +from cyclonedx.model.component import ComponentScope, ComponentType + +from cyclonedx_py._internal.poetry import PoetryBB + + +class TestPoetryComponentScope(TestCase): + + def setUp(self) -> None: + self.bb = PoetryBB(logger=logging.getLogger('test-poetry')) + + def test_dev_dependencies_marked_excluded(self) -> None: + project = { + 'tool': { + 'poetry': { + 'name': 'demo', + 'version': '1.0.0', + 'group': { + 'main': {'dependencies': {'prod-pkg': '1.0'}}, + 'dev': {'dependencies': {'dev-pkg': '1.0'}}, + }, + 'extras': {} + } + } + } + locker = { + 'metadata': {'lock-version': '2.0'}, + 'package': [ + {'name': 'prod-pkg', 'version': '1.0', 'dependencies': {}}, + {'name': 'dev-pkg', 'version': '1.0', 'dependencies': {}}, + ] + } + bom = self.bb._make_bom( + project=project, + locker=locker, + use_groups=frozenset({'main', 'dev'}), + use_extras=frozenset(), + mc_type=ComponentType.APPLICATION + ) + c_prod = next(c for c in bom.components if c.name == 'prod-pkg') + c_dev = next(c for c in bom.components if c.name == 'dev-pkg') + + self.assertIsNone(c_prod.scope) + self.assertEqual(ComponentScope.EXCLUDED, c_dev.scope) + + def test_transitive_dev_dependencies_marked_excluded(self) -> None: + project = { + 'tool': { + 'poetry': { + 'name': 'demo', + 'version': '1.0.0', + 'group': { + 'dev': {'dependencies': {'pytest': '7.0'}}, + }, + 'extras': {} + } + } + } + locker = { + 'metadata': {'lock-version': '2.0'}, + 'package': [ + {'name': 'pytest', 'version': '7.0', 'dependencies': {'iniconfig': '1.0'}}, + {'name': 'iniconfig', 'version': '1.0', 'dependencies': {}}, + ] + } + bom = self.bb._make_bom( + project=project, + locker=locker, + use_groups=frozenset({'dev'}), + use_extras=frozenset(), + mc_type=ComponentType.APPLICATION + ) + c_pytest = next(c for c in bom.components if c.name == 'pytest') + c_iniconfig = next(c for c in bom.components if c.name == 'iniconfig') + + self.assertEqual(ComponentScope.EXCLUDED, c_pytest.scope) + self.assertEqual(ComponentScope.EXCLUDED, c_iniconfig.scope) + + def test_shared_dependency_between_main_and_dev_remains_required(self) -> None: + project = { + 'tool': { + 'poetry': { + 'name': 'demo', + 'version': '1.0.0', + 'group': { + 'main': {'dependencies': {'api-server': '1.0'}}, + 'dev': {'dependencies': {'test-tool': '1.0'}}, + }, + 'extras': {} + } + } + } + locker = { + 'metadata': {'lock-version': '2.0'}, + 'package': [ + {'name': 'api-server', 'version': '1.0', 'dependencies': {'pydantic': '2.0'}}, + {'name': 'test-tool', 'version': '1.0', 'dependencies': {'pydantic': '2.0', 'flake8': '5.0'}}, + {'name': 'pydantic', 'version': '2.0', 'dependencies': {}}, + {'name': 'flake8', 'version': '5.0', 'dependencies': {}}, + ] + } + bom = self.bb._make_bom( + project=project, + locker=locker, + use_groups=frozenset({'main', 'dev'}), + use_extras=frozenset(), + mc_type=ComponentType.APPLICATION + ) + c_api = next(c for c in bom.components if c.name == 'api-server') + c_pydantic = next(c for c in bom.components if c.name == 'pydantic') + c_test = next(c for c in bom.components if c.name == 'test-tool') + c_flake = next(c for c in bom.components if c.name == 'flake8') + + self.assertIsNone(c_api.scope) + self.assertIsNone(c_pydantic.scope) # Shared dependency remains runtime + self.assertEqual(ComponentScope.EXCLUDED, c_test.scope) + self.assertEqual(ComponentScope.EXCLUDED, c_flake.scope) + + def test_legacy_dev_dependencies_category_mapping(self) -> None: + project = { + 'tool': { + 'poetry': { + 'name': 'demo', + 'version': '1.0.0', + 'group': { + 'main': {'dependencies': {'prod-lib': '1.0'}}, + 'dev': {'dependencies': {'dev-lib': '1.0'}}, + }, + 'extras': {} + } + } + } + locker = { + 'metadata': {'lock-version': '1.1'}, + 'package': [ + {'name': 'prod-lib', 'version': '1.0', 'category': 'main', 'dependencies': {}}, + {'name': 'dev-lib', 'version': '1.0', 'category': 'dev', 'dependencies': {}}, + ] + } + bom = self.bb._make_bom( + project=project, + locker=locker, + use_groups=frozenset({'main', 'dev'}), + use_extras=frozenset(), + mc_type=ComponentType.APPLICATION + ) + c_prod = next(c for c in bom.components if c.name == 'prod-lib') + c_dev = next(c for c in bom.components if c.name == 'dev-lib') + + self.assertIsNone(c_prod.scope) + self.assertEqual(ComponentScope.EXCLUDED, c_dev.scope)