Skip to content

Commit 2999022

Browse files
authored
Merge branch 'master' into fix-conda-purl
2 parents cf4a5e4 + b028c2b commit 2999022

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
<!--next-version-placeholder-->
44

5+
## v3.3.0 (2022-06-16)
6+
### Feature
7+
* Add Conda MD5 hash to Component.hashes, if available - thanks @RodneyRichardson ([`772c517`](https://github.com/CycloneDX/cyclonedx-python/commit/772c517521da0fd8ddbd1ed8abdf22243f418217))
8+
59
## v3.2.2 (2022-06-02)
610
### Fix
711
* Add actively used (transitive) dependencies ([#363](https://github.com/CycloneDX/cyclonedx-python/issues/363)) ([`1f45ad9`](https://github.com/CycloneDX/cyclonedx-python/commit/1f45ad9162be511f07e9310414793218c554a097))

cyclonedx_py/parser/conda.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from abc import ABCMeta, abstractmethod
2222
from typing import List
2323

24-
from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
24+
from cyclonedx.model import ExternalReference, ExternalReferenceType, HashAlgorithm, HashType, XsUri
2525
from cyclonedx.model.component import Component
2626
from cyclonedx.parser import BaseParser
2727

@@ -72,6 +72,11 @@ def _conda_packages_to_components(self) -> None:
7272
url=XsUri(conda_package['base_url']),
7373
comment=f"Distribution name {conda_package['dist_name']}"
7474
))
75+
if conda_package['md5_hash'] is not None:
76+
c.hashes.add(HashType(
77+
algorithm=HashAlgorithm.MD5,
78+
hash_value=str(conda_package['md5_hash'])
79+
))
7580

7681
self._components.append(c)
7782

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "cyclonedx-bom"
3-
version = "3.2.2"
3+
version = "3.3.0"
44
description = "CycloneDX Software Bill of Materials (SBOM) generation utility"
55
authors = ["Steven Springett <steve.springett@owasp.org>", "Paul Horton <phorton@sonatype.com>"]
66
license = "Apache-2.0"

tests/test_parser_conda.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import re
2222
from unittest import TestCase
2323

24+
from cyclonedx.model import HashAlgorithm, HashType
25+
2426
from cyclonedx_py.parser.conda import CondaListExplicitParser, CondaListJsonParser
2527

2628

@@ -44,6 +46,7 @@ def test_conda_list_json(self) -> None:
4446
c_idna.purl.to_string())
4547
self.assertEqual(1, len(c_idna.external_references), f'{c_idna.external_references}')
4648
self.assertEqual(0, len(c_idna.external_references.pop().hashes))
49+
self.assertEqual(0, len(c_idna.hashes), f'{c_idna.hashes}')
4750

4851
def test_conda_list_explicit_md5(self) -> None:
4952
conda_list_output_file = os.path.join(os.path.dirname(__file__),
@@ -63,6 +66,10 @@ def test_conda_list_explicit_md5(self) -> None:
6366
c_idna.purl.to_string())
6467
self.assertEqual(1, len(c_idna.external_references), f'{c_idna.external_references}')
6568
self.assertEqual(0, len(c_idna.external_references.pop().hashes))
69+
self.assertEqual(1, len(c_idna.hashes), f'{c_idna.hashes}')
70+
hash: HashType = c_idna.hashes.pop()
71+
self.assertEqual(HashAlgorithm.MD5, hash.alg)
72+
self.assertEqual('153ff132f593ea80aae2eea61a629c92', hash.content)
6673

6774
def test_conda_list_build_number_text(self) -> None:
6875
conda_list_output_file = os.path.join(os.path.dirname(__file__), 'fixtures/conda-list-build-number-text.txt')
@@ -79,18 +86,23 @@ def test_conda_list_build_number_text(self) -> None:
7986
self.assertEqual('0.1', c_libgcc_mutex.version)
8087
self.assertEqual('pkg:conda/_libgcc_mutex@0.1?build=main&channel=pkgs/main&subdir=linux-64&type=conda',
8188
c_libgcc_mutex.purl.to_string())
89+
self.assertEqual(0, len(c_libgcc_mutex.hashes), f'{c_libgcc_mutex.hashes}')
90+
8291
c_pycparser = next(filter(lambda c: c.name == 'pycparser', components), None)
8392
self.assertIsNotNone(c_pycparser)
8493
self.assertEqual('pycparser', c_pycparser.name)
8594
self.assertEqual('2.21', c_pycparser.version)
8695
self.assertEqual('pkg:conda/pycparser@2.21?build=pyhd3eb1b0_0&channel=pkgs/main&subdir=noarch&type=conda',
8796
c_pycparser.purl.to_string())
97+
self.assertEqual(0, len(c_pycparser.hashes), f'{c_pycparser.hashes}')
98+
8899
c_openmp_mutex = next(filter(lambda c: c.name == '_openmp_mutex', components), None)
89100
self.assertIsNotNone(c_openmp_mutex)
90101
self.assertEqual('_openmp_mutex', c_openmp_mutex.name)
91102
self.assertEqual('4.5', c_openmp_mutex.version)
92103
self.assertEqual('pkg:conda/_openmp_mutex@4.5?build=1_gnu&channel=pkgs/main&subdir=linux-64&type=tar.bz2',
93104
c_openmp_mutex.purl.to_string())
105+
self.assertEqual(0, len(c_openmp_mutex.hashes), f'{c_openmp_mutex.hashes}')
94106

95107
def test_conda_list_malformed(self) -> None:
96108
conda_list_output_file = os.path.join(os.path.dirname(__file__), 'fixtures/conda-list-broken.txt')

0 commit comments

Comments
 (0)