Skip to content

Commit b08e1bb

Browse files
authored
feat: populate properties cdx:python:package:source:vcs:... (#790)
populate the newly added/fixed CycloneDX properties `cdx:python:package:source:vcs:...` in accordance with <CycloneDX/cyclonedx-property-taxonomy#96> and <CycloneDX/cyclonedx-property-taxonomy#98>. the deprecated properties are still used, so no breaking changes exist. fixes #789 --------- Signed-off-by: Jan Kowalleck <[email protected]>
1 parent 39c426b commit b08e1bb

File tree

46 files changed

+333
-24
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+333
-24
lines changed

cyclonedx_py/_internal/__init__.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,29 +45,39 @@ def __call__(self, **kwargs: Any) -> 'Bom': # pragma: no cover
4545
...
4646

4747

48-
class PropertyName(Enum):
48+
class PropertyValue(Enum):
4949
# region general
5050
# see https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx.md
5151
BooleanTrue = 'true'
5252
BooleanFalse = 'false'
53+
# endregion general
54+
5355

56+
class PropertyName(Enum):
57+
# region general
58+
# see https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx.md
5459
Reproducible = 'cdx:reproducible'
5560
# endregion general
5661

5762
# region python
5863
# see https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx/python.md
59-
PackageExtra = 'cdx:python:package:required-extra'
60-
PackageSourceSubdirectory = 'cdx:python:package:source:subdirectory'
61-
PackageSourceVcsRequestedRevision = 'cdx:poetry:package:source:vcs:requested_revision'
62-
PackageSourceVcsCommitId = 'cdx:poetry:package:source:vcs:commit_id'
63-
PackageSourceLocalEditable = 'cdx:python:package:source:local:editable'
64+
PythonPackageExtra = 'cdx:python:package:required-extra'
65+
PythonPackageSourceSubdirectory = 'cdx:python:package:source:subdirectory'
66+
PythonPackageSourceVcsRequestedRevision = 'cdx:python:package:source:vcs:requested_revision'
67+
PythonPackageSourceVcsCommitId = 'cdx:python:package:source:vcs:commit_id'
68+
PythonPackageSourceLocalEditable = 'cdx:python:package:source:local:editable'
6469
# endregion python
6570

6671
# region poetry
6772
# see https://github.com/CycloneDX/cyclonedx-property-taxonomy/blob/main/cdx/poetry.md
6873
PoetryGroup = 'cdx:poetry:group'
69-
PoetryPackageSourceReference = 'cdx:poetry:source:package:reference'
74+
# region poetry-deprecated
75+
# the following property names are deprecated
76+
PoetryPackageSourceReference_misspelled = 'cdx:poetry:source:package:reference'
7077
PoetryPackageSourceResolvedReference = 'cdx:poetry:package:source:resolved_reference'
78+
PoetryPackageSourceVcsRequestedRevision = 'cdx:poetry:package:source:vcs:requested_revision'
79+
PoetryPackageSourceVcsCommitId = 'cdx:poetry:package:source:vcs:commit_id'
80+
# endregion poetry-deprecated
7181
# endregion poetry
7282

7383
# region pipenv

cyclonedx_py/_internal/cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from cyclonedx.validation import make_schemabased_validator
2828

2929
from .. import __version__
30-
from . import PropertyName
30+
from . import PropertyName, PropertyValue
3131
from .environment import EnvironmentBB
3232
from .pipenv import PipenvBB
3333
from .poetry import PoetryBB
@@ -230,7 +230,7 @@ def _make_output(self, bom: 'Bom') -> str:
230230

231231
if self._output_reproducible:
232232
bom.metadata.properties.add(Property(name=PropertyName.Reproducible.value,
233-
value=PropertyName.BooleanTrue.value))
233+
value=PropertyValue.BooleanTrue.value))
234234
# dirty hacks to remove these mandatory properties
235235
bom.serial_number = None # type:ignore[assignment]
236236
bom.metadata.timestamp = None # type:ignore[assignment]

cyclonedx_py/_internal/environment.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def __finalize_dependencies(self, bom: 'Bom', all_components: 'T_AllComponents')
224224
component_deps.append(req_component)
225225
req_component.properties.update(
226226
Property(
227-
name=PropertyName.PackageExtra.value,
227+
name=PropertyName.PythonPackageExtra.value,
228228
value=normalize_packagename(extra)
229229
) for extra in req.extras
230230
)
@@ -236,16 +236,25 @@ def __component_add_extref_and_purl(self, component: 'Component',
236236
purl_subpath = None
237237
if packagesource is not None:
238238
if packagesource.subdirectory:
239-
component.properties.add(Property(name=PropertyName.PackageSourceSubdirectory.value,
240-
value=packagesource.subdirectory))
239+
component.properties.add(Property(
240+
name=PropertyName.PythonPackageSourceSubdirectory.value,
241+
value=packagesource.subdirectory))
241242
purl_subpath = packagesource.subdirectory
242243
if isinstance(packagesource, PackageSourceVcs):
243244
purl_qs['vcs_url'] = f'{packagesource.vcs}+{packagesource.url}@{packagesource.commit_id}'
244-
component.properties.add(Property(name=PropertyName.PackageSourceVcsCommitId.value,
245-
value=packagesource.commit_id))
245+
component.properties.add(Property(
246+
name=PropertyName.PythonPackageSourceVcsCommitId.value,
247+
value=packagesource.commit_id))
248+
component.properties.add(Property(
249+
name=PropertyName.PoetryPackageSourceVcsCommitId.value, # deprecated
250+
value=packagesource.commit_id))
246251
if packagesource.requested_revision:
247-
component.properties.add(Property(name=PropertyName.PackageSourceVcsRequestedRevision.value,
248-
value=packagesource.requested_revision))
252+
component.properties.add(Property(
253+
name=PropertyName.PythonPackageSourceVcsRequestedRevision.value,
254+
value=packagesource.requested_revision))
255+
component.properties.add(Property(
256+
name=PropertyName.PoetryPackageSourceVcsRequestedRevision.value, # deprecated
257+
value=packagesource.requested_revision))
249258
elif isinstance(packagesource, PackageSourceArchive):
250259
if '://files.pythonhosted.org/' not in packagesource.url:
251260
# skip PURL bloat, do not add implicit information

cyclonedx_py/_internal/pipenv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def _make_bom(self, root_c: Optional['Component'],
187187
))
188188
component.properties.update(
189189
Property(
190-
name=PropertyName.PackageExtra.value,
190+
name=PropertyName.PythonPackageExtra.value,
191191
value=normalize_packagename(package_extra)
192192
) for package_extra in package_data.get('extras', ())
193193
)

cyclonedx_py/_internal/poetry.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def _make_bom(self, project: 'T_NameDict', locker: 'T_NameDict',
261261
root_c.bom_ref.value = root_c.name
262262
root_c.properties.update(
263263
Property(
264-
name=PropertyName.PackageExtra.value,
264+
name=PropertyName.PythonPackageExtra.value,
265265
value=extra
266266
) for extra in use_extras
267267
)
@@ -344,7 +344,7 @@ def __add_dep(self, bom: 'Bom', lock_entry: _LockEntry, use_extras: Iterable[str
344344
use_extras = frozenset(map(normalize_packagename, use_extras))
345345
lock_entry.component.properties.update(
346346
Property(
347-
name=PropertyName.PackageExtra.value,
347+
name=PropertyName.PythonPackageExtra.value,
348348
value=extra
349349
) for extra in use_extras
350350
)
@@ -403,20 +403,30 @@ def __make_component4lock(self, package: 'T_NameDict') -> 'Component':
403403
description=package.get('description'),
404404
scope=ComponentScope.OPTIONAL if package.get('optional') else None,
405405
external_references=self.__extrefs4lock(package),
406-
properties=filter(lambda p: p and p.value, [ # type: ignore[arg-type]
406+
properties=filter(lambda p: p and p.value, ( # type: ignore[arg-type]
407+
Property(
408+
name=PropertyName.PythonPackageSourceVcsRequestedRevision.value,
409+
value=source['reference']
410+
) if is_vcs and 'reference' in source else None,
411+
Property(
412+
name=PropertyName.PythonPackageSourceVcsCommitId.value,
413+
value=source['resolved_reference']
414+
) if is_vcs and 'resolved_reference' in source else None,
407415
Property( # for backwards compatibility: category -> group
408416
name=PropertyName.PoetryGroup.value,
409417
value=package['category']
410418
) if 'category' in package else None,
419+
# region deprecated
411420
Property(
412-
name=PropertyName.PoetryPackageSourceReference.value,
421+
name=PropertyName.PoetryPackageSourceReference_misspelled.value, # deprecated
413422
value=source['reference']
414423
) if is_vcs and 'reference' in source else None,
415424
Property(
416-
name=PropertyName.PoetryPackageSourceResolvedReference.value,
425+
name=PropertyName.PoetryPackageSourceResolvedReference.value, # deprecated
417426
value=source['resolved_reference']
418427
) if is_vcs and 'resolved_reference' in source else None,
419-
]),
428+
# endregion deprecated
429+
)),
420430
purl=PackageURL(
421431
type=PurlTypePypi,
422432
name=package['name'],

cyclonedx_py/_internal/requirements.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def _make_component(self, req: 'InstallRequirement',
225225
) if not is_local and name else None,
226226
external_references=external_references,
227227
properties=(Property(
228-
name=PropertyName.PackageExtra.value,
228+
name=PropertyName.PythonPackageExtra.value,
229229
value=normalize_packagename(extra)
230230
) for extra in req.extras)
231231
)

tests/_data/snapshots/environment/plain_with-urls_1.3.json.bin

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/_data/snapshots/environment/plain_with-urls_1.3.xml.bin

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/_data/snapshots/environment/plain_with-urls_1.4.json.bin

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/_data/snapshots/environment/plain_with-urls_1.4.xml.bin

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)