Skip to content

Commit 91755d4

Browse files
committed
use valid dependency operator
Signed-off-by: rpotter12 <rohitpotter12@gmail.com>
1 parent 2fa0bcf commit 91755d4

7 files changed

Lines changed: 49 additions & 37 deletions

File tree

src/packagedcode/pypi.py

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,9 @@ def parse_with_dparse(location):
209209
return
210210
file_name = fileutils.file_name(location)
211211

212-
file_name = get_dependency_type(file_name)
212+
dependency_type = get_dependency_type(file_name)
213213

214-
if file_name not in (filetypes.requirements_txt,
214+
if dependency_type not in (filetypes.requirements_txt,
215215
filetypes.conda_yml,
216216
filetypes.tox_ini,
217217
filetypes.pipfile,
@@ -223,31 +223,43 @@ def parse_with_dparse(location):
223223
mode = 'r'
224224
with open(location, mode) as f:
225225
content = f.read()
226-
df = dparse.parse(content, file_type=file_name)
227-
df_dependencies = df.dependencies
228-
if not df_dependencies:
229-
return
230-
package_dependencies = []
231-
for df_dependency in df_dependencies:
232-
specs = df_dependency.specs
233-
is_resolved = False
234-
requirement = None
235-
if specs:
236-
requirement = str(specs)
237-
if '==' in requirement:
238-
is_resolved = True
239-
package_dependencies.append(
240-
models.DependentPackage(
241-
purl=PackageURL(
242-
type='pypi', name=df_dependency.name).to_string(),
243-
scope='dependencies',
244-
is_runtime=True,
245-
is_optional=False,
246-
is_resolved=is_resolved,
247-
requirement=requirement
248-
)
226+
227+
df = dparse.parse(content, file_type=dependency_type)
228+
df_dependencies = df.dependencies
229+
230+
if not df_dependencies:
231+
return
232+
233+
package_dependencies = []
234+
for df_dependency in df_dependencies:
235+
specs = list(df_dependency.specs._specs)
236+
is_resolved = False
237+
requirement = None
238+
purl = PackageURL(
239+
type='pypi',
240+
name=df_dependency.name
241+
).to_string()
242+
if specs:
243+
requirement = specs[0]
244+
if specs[0].operator == '==':
245+
is_resolved = True
246+
purl = PackageURL(
247+
type='pypi',
248+
name=df_dependency.name,
249+
version=specs[0].version
250+
).to_string()
251+
package_dependencies.append(
252+
models.DependentPackage(
253+
purl=purl,
254+
scope='dependencies',
255+
is_runtime=True,
256+
is_optional=False,
257+
is_resolved=is_resolved,
258+
requirement=requirement
249259
)
250-
return package_dependencies
260+
)
261+
262+
return package_dependencies
251263

252264

253265
def parse_requirements_txt(location):

tests/packagedcode/data/pypi/requirements_txt/sample2/output.expected.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@
2727
"root_path": null,
2828
"dependencies": [
2929
{
30-
"purl": "pkg:pypi/aiohttp",
30+
"purl": "pkg:pypi/aiohttp@3.6.2",
3131
"requirement": "==3.6.2",
3232
"scope": "dependencies",
3333
"is_runtime": true,
3434
"is_optional": false,
3535
"is_resolved": true
3636
},
3737
{
38-
"purl": "pkg:pypi/async-timeout",
38+
"purl": "pkg:pypi/async-timeout@3.0.1",
3939
"requirement": "==3.0.1",
4040
"scope": "dependencies",
4141
"is_runtime": true,
4242
"is_optional": false,
4343
"is_resolved": true
4444
},
4545
{
46-
"purl": "pkg:pypi/attrs",
46+
"purl": "pkg:pypi/attrs@19.3.0",
4747
"requirement": "==19.3.0",
4848
"scope": "dependencies",
4949
"is_runtime": true,

tests/packagedcode/data/pypi/requirements_txt/sample3/output.expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"is_resolved": false
3636
},
3737
{
38-
"purl": "pkg:pypi/pygments",
38+
"purl": "pkg:pypi/pygments@2.2.0",
3939
"requirement": "==2.2.0",
4040
"scope": "dependencies",
4141
"is_runtime": true,

tests/packagedcode/data/pypi/requirements_txt/sample5/output.expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"is_resolved": false
3636
},
3737
{
38-
"purl": "pkg:pypi/pygments",
38+
"purl": "pkg:pypi/pygments@2.2.0",
3939
"requirement": "==2.2.0",
4040
"scope": "dependencies",
4141
"is_runtime": true,

tests/packagedcode/data/pypi/requirements_txt/sample6/output.expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"is_resolved": false
3636
},
3737
{
38-
"purl": "pkg:pypi/pygments",
38+
"purl": "pkg:pypi/pygments@2.2.0",
3939
"requirement": "==2.2.0",
4040
"scope": "dependencies",
4141
"is_runtime": true,

tests/packagedcode/data/pypi/requirements_txt/sample7/output.expected.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@
2727
"root_path": null,
2828
"dependencies": [
2929
{
30-
"purl": "pkg:pypi/aiohttp",
30+
"purl": "pkg:pypi/aiohttp@3.6.2",
3131
"requirement": "==3.6.2",
3232
"scope": "dependencies",
3333
"is_runtime": true,
3434
"is_optional": false,
3535
"is_resolved": true
3636
},
3737
{
38-
"purl": "pkg:pypi/async-timeout",
38+
"purl": "pkg:pypi/async-timeout@3.0.1",
3939
"requirement": "==3.0.1",
4040
"scope": "dependencies",
4141
"is_runtime": true,
4242
"is_optional": false,
4343
"is_resolved": true
4444
},
4545
{
46-
"purl": "pkg:pypi/attrs",
46+
"purl": "pkg:pypi/attrs@19.3.0",
4747
"requirement": "==19.3.0",
4848
"scope": "dependencies",
4949
"is_runtime": true,

tests/packagedcode/test_pypi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,8 @@ def test_requirements_txt_sample7(self):
314314
def test_parse_with_dparse(self):
315315
test_file = self.get_test_loc('pypi/dparse/requirements.txt')
316316
dependencies = pypi.parse_with_dparse(test_file)
317-
assert [DependentPackage(purl='pkg:pypi/lxml', requirement='==3.4.4', scope='dependencies', is_resolved=True),
318-
DependentPackage(purl='pkg:pypi/requests', requirement='==2.7.0', scope='dependencies', is_resolved=True)] == dependencies
317+
assert [DependentPackage(purl='pkg:pypi/lxml@3.4.4', requirement='==3.4.4', scope='dependencies', is_resolved=True),
318+
DependentPackage(purl='pkg:pypi/requests@2.7.0', requirement='==2.7.0', scope='dependencies', is_resolved=True)] == dependencies
319319

320320

321321
FILENAME_LIST = [

0 commit comments

Comments
 (0)