Skip to content

Commit 08bc4ab

Browse files
authored
Merge pull request #42 from jkowalleck/improv-pipenv
slacked pipenv parser
2 parents 931016d + a3572ba commit 08bc4ab

File tree

3 files changed

+17
-17
lines changed

3 files changed

+17
-17
lines changed

cyclonedx/parser/pipenv.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# SPDX-License-Identifier: Apache-2.0
1818
# Copyright (c) OWASP Foundation. All Rights Reserved.
1919
import json
20+
from typing import Any, Dict
2021

2122
from . import BaseParser
2223
from ..model import ExternalReference, ExternalReferenceType, HashType
@@ -27,26 +28,25 @@ class PipEnvParser(BaseParser):
2728

2829
def __init__(self, pipenv_contents: str):
2930
super().__init__()
31+
3032
pipfile_lock_contents = json.loads(pipenv_contents)
33+
pipfile_default: Dict[str, Dict[str, Any]] = pipfile_lock_contents.get('default') or {}
3134

32-
for package_name in pipfile_lock_contents['default'].keys():
33-
package_data = pipfile_lock_contents['default'][package_name]
35+
for (package_name, package_data) in pipfile_default.items():
3436
c = Component(
35-
name=package_name, version=str(package_data['version']).strip('='),
37+
name=package_name,
38+
version=str(package_data.get('version') or 'unknown').lstrip('='),
3639
)
37-
38-
if 'index' in package_data.keys() and package_data['index'] == 'pypi':
40+
if package_data.get('index') == 'pypi' and isinstance(package_data.get('hashes'), list):
3941
# Add download location with hashes stored in Pipfile.lock
40-
if 'hashes' in package_data.keys():
41-
for pip_hash in package_data['hashes']:
42-
43-
ext_ref = ExternalReference(
44-
reference_type=ExternalReferenceType.DISTRIBUTION,
45-
url=c.get_pypi_url(),
46-
comment='Distribution available from pypi.org'
47-
)
48-
ext_ref.add_hash(HashType.from_composite_str(pip_hash))
49-
c.add_external_reference(ext_ref)
42+
for pip_hash in package_data['hashes']:
43+
ext_ref = ExternalReference(
44+
reference_type=ExternalReferenceType.DISTRIBUTION,
45+
url=c.get_pypi_url(),
46+
comment='Distribution available from pypi.org'
47+
)
48+
ext_ref.add_hash(HashType.from_composite_str(pip_hash))
49+
c.add_external_reference(ext_ref)
5050

5151
self._components.append(c)
5252

@@ -56,4 +56,3 @@ class PipEnvFileParser(PipEnvParser):
5656
def __init__(self, pipenv_lock_filename: str):
5757
with open(pipenv_lock_filename) as r:
5858
super(PipEnvFileParser, self).__init__(pipenv_contents=r.read())
59-
r.close()

tests/fixtures/pipfile-lock-simple.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@
2626
}
2727
},
2828
"develop": {}
29-
}
29+
}

tests/test_parser_pipenv.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def test_simple(self):
3131
parser = PipEnvFileParser(pipenv_lock_filename=tests_pipfile_lock)
3232
self.assertEqual(1, parser.component_count())
3333
components = parser.get_components()
34+
3435
self.assertEqual('toml', components[0].get_name())
3536
self.assertEqual('0.10.2', components[0].get_version())
3637
self.assertEqual(len(components[0].get_external_references()), 2)

0 commit comments

Comments
 (0)