Skip to content

Commit 772c517

Browse files
authored
feat: Add Conda MD5 hash to Component.hashes, if available - thanks @RodneyRichardson
2 parents e2be444 + 95c6893 commit 772c517

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

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

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

7580
self._components.append(c)
7681

tests/test_parser_conda.py

Lines changed: 10 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

@@ -42,6 +44,7 @@ def test_conda_list_json(self) -> None:
4244
self.assertEqual('2.10', c_idna.version)
4345
self.assertEqual(1, len(c_idna.external_references), f'{c_idna.external_references}')
4446
self.assertEqual(0, len(c_idna.external_references.pop().hashes))
47+
self.assertEqual(0, len(c_idna.hashes), f'{c_idna.hashes}')
4548

4649
def test_conda_list_explicit_md5(self) -> None:
4750
conda_list_ouptut_file = os.path.join(os.path.dirname(__file__),
@@ -59,6 +62,10 @@ def test_conda_list_explicit_md5(self) -> None:
5962
self.assertEqual('2.10', c_idna.version)
6063
self.assertEqual(1, len(c_idna.external_references), f'{c_idna.external_references}')
6164
self.assertEqual(0, len(c_idna.external_references.pop().hashes))
65+
self.assertEqual(1, len(c_idna.hashes), f'{c_idna.hashes}')
66+
hash: HashType = c_idna.hashes.pop()
67+
self.assertEqual(HashAlgorithm.MD5, hash.alg)
68+
self.assertEqual('153ff132f593ea80aae2eea61a629c92', hash.content)
6269

6370
def test_conda_list_build_number_text(self) -> None:
6471
conda_list_output_file = os.path.join(os.path.dirname(__file__), 'fixtures/conda-list-build-number-text.txt')
@@ -73,14 +80,17 @@ def test_conda_list_build_number_text(self) -> None:
7380
self.assertIsNotNone(c_libgcc_mutex)
7481
self.assertEqual('_libgcc_mutex', c_libgcc_mutex.name)
7582
self.assertEqual('0.1', c_libgcc_mutex.version)
83+
self.assertEqual(0, len(c_libgcc_mutex.hashes), f'{c_libgcc_mutex.hashes}')
7684
c_pycparser = next(filter(lambda c: c.name == 'pycparser', components), None)
7785
self.assertIsNotNone(c_pycparser)
7886
self.assertEqual('pycparser', c_pycparser.name)
7987
self.assertEqual('2.21', c_pycparser.version)
88+
self.assertEqual(0, len(c_pycparser.hashes), f'{c_pycparser.hashes}')
8089
c_openmp_mutex = next(filter(lambda c: c.name == '_openmp_mutex', components), None)
8190
self.assertIsNotNone(c_openmp_mutex)
8291
self.assertEqual('_openmp_mutex', c_openmp_mutex.name)
8392
self.assertEqual('4.5', c_openmp_mutex.version)
93+
self.assertEqual(0, len(c_openmp_mutex.hashes), f'{c_openmp_mutex.hashes}')
8494

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

0 commit comments

Comments
 (0)