Skip to content

Commit ec9444b

Browse files
authored
Merge pull request #2932 from nexB/fix-2911-purl-less-deps
Fix package/dependency creation bugs
2 parents 477a0f4 + 68bbb14 commit ec9444b

40 files changed

+6188
-2709
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
# virtualenv and other misc bits
1111
/src/*.egg-info
1212
*.egg-info
13+
!tests/packagedcode/data/pypi/source-package/pip-22.0.4/src/pip.egg-info
1314
/dist
1415
/build
1516
/bin

src/packagedcode/alpine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def compute_normalized_license(cls, package):
129129

130130
@classmethod
131131
def assign_package_to_resources(cls, package, resource, codebase):
132-
cls.assign_package_to_parent_tree(
132+
models.DatafileHandler.assign_package_to_parent_tree(
133133
package=package,
134134
resource=resource,
135135
codebase=codebase,

src/packagedcode/build.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def parse(cls, location):
5151

5252
@classmethod
5353
def assign_package_to_resources(cls, package, resource, codebase):
54-
cls.assign_package_to_parent_tree(
54+
models.DatafileHandler.assign_package_to_parent_tree(
5555
package=package,
5656
resource=resource,
5757
codebase=codebase,
@@ -376,7 +376,7 @@ def compute_normalized_license(cls, package):
376376

377377
@classmethod
378378
def assign_package_to_resources(cls, package, resource, codebase):
379-
cls.assign_package_to_parent_tree(
379+
models.DatafileHandler.assign_package_to_parent_tree(
380380
package_=package,
381381
resource=resource,
382382
codebase=codebase,

src/packagedcode/build_gradle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def parse(cls, location):
3535
# TODO: handle complex cases of nested builds with many packages
3636
@classmethod
3737
def assign_package_to_resources(cls, package, resource, codebase):
38-
cls.assign_package_to_parent_tree(
38+
models.DatafileHandler.assign_package_to_parent_tree(
3939
package=package,
4040
resource=resource,
4141
codebase=codebase,

src/packagedcode/conda.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def get_conda_root(cls, resource, codebase):
7171

7272
@classmethod
7373
def assign_package_to_resources(cls, package, resource, codebase):
74-
return super().assign_package_to_resources(
74+
return models.DatafileHandler.assign_package_to_resources(
7575
package=package,
7676
resource=cls.get_conda_root(resource, codebase),
7777
codebase=codebase,

src/packagedcode/debian.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def parse(cls, location):
6767
@classmethod
6868
def assign_package_to_resources(cls, package, resource, codebase):
6969
# only assign this resource
70-
return super().assign_package_to_resources(package, resource, codebase)
70+
return models.DatafileHandler.assign_package_to_resources(package, resource, codebase)
7171

7272

7373
# TODO: introspect archive
@@ -92,7 +92,7 @@ def parse(cls, location):
9292
@classmethod
9393
def assign_package_to_resources(cls, package, resource, codebase):
9494
# only assign this resource
95-
return super().assign_package_to_resources(package, resource, codebase)
95+
return models.DatafileHandler.assign_package_to_resources(package, resource, codebase)
9696

9797

9898
# TODO: introspect archive
@@ -117,7 +117,7 @@ def parse(cls, location):
117117
@classmethod
118118
def assign_package_to_resources(cls, package, resource, codebase):
119119
# only assign this resource
120-
return super().assign_package_to_resources(package, resource, codebase)
120+
return models.DatafileHandler.assign_package_to_resources(package, resource, codebase)
121121

122122

123123
# TODO: also look into neighboring md5sum and data.tarball copyright files!!!
@@ -142,7 +142,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
142142
# two levels up
143143
root = resource.parent(codebase).parent(codebase)
144144
if root:
145-
return cls.assign_package_to_resources(package, root, codebase)
145+
return models.DatafileHandler.assign_package_to_resources(package, root, codebase)
146146

147147

148148
# TODO: also look into neighboring copyright files!!!
@@ -169,7 +169,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
169169
# two levels up
170170
root = resource.parent(codebase).parent(codebase)
171171
if root:
172-
return cls.assign_package_to_resources(package, root, codebase)
172+
return models.DatafileHandler.assign_package_to_resources(package, root, codebase)
173173

174174

175175
class DebianDscFileHandler(models.DatafileHandler):
@@ -198,7 +198,7 @@ def parse(cls, location):
198198
@classmethod
199199
def assign_package_to_resources(cls, package, resource, codebase):
200200
# only assign this resource
201-
return super().assign_package_to_resources(package, resource, codebase)
201+
return models.DatafileHandler.assign_package_to_resources(package, resource, codebase)
202202

203203

204204
class DebianInstalledStatusDatabaseHandler(models.DatafileHandler):
@@ -489,7 +489,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
489489
# two levels up
490490
root = resource.parent(codebase).parent(codebase)
491491
if root:
492-
return cls.assign_package_to_resources(package, root, codebase)
492+
return models.DatafileHandler.assign_package_to_resources(package, root, codebase)
493493

494494

495495
def build_package_data_from_package_filename(filename, datasource_id, package_type,):

src/packagedcode/godeps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def parse(cls, location):
7575

7676
@classmethod
7777
def assign_package_to_resources(cls, package, resource, codebase):
78-
super().assign_package_to_parent_tree(package, resource, codebase)
78+
models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
7979

8080

8181
@attr.s

src/packagedcode/jar_manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
5353
parent = resource.parent(codebase)
5454

5555
if parent:
56-
super().assign_package_to_resources(package, resource=parent, codebase=codebase)
56+
models.DatafileHandler.assign_package_to_resources(package, resource=parent, codebase=codebase)
5757

5858

5959

src/packagedcode/maven.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
115115

116116
if resource.path.endswith('.pom'):
117117
# we only treat the parent as the root
118-
return super().assign_package_to_parent_tree(package, resource, codebase)
118+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
119119

120120
# the root is either the parent or further up for poms stored under
121121
# a META-INF dir
@@ -139,7 +139,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
139139
if not root:
140140
root = resource.parent(codebase)
141141

142-
return super().assign_package_to_resources(package, resource=root, codebase=codebase)
142+
return models.DatafileHandler.assign_package_to_resources(package, resource=root, codebase=codebase)
143143

144144
@classmethod
145145
def compute_normalized_license(cls, package):

src/packagedcode/models.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,12 +438,17 @@ def from_dependent_packages(
438438
"""
439439
dependent_packages = dependent_packages or []
440440
for dependent_package in dependent_packages:
441-
yield Dependency.from_dependent_package(
442-
dependent_package=dependent_package,
443-
datafile_path=datafile_path,
444-
datasource_id=datasource_id,
445-
package_uid=package_uid,
446-
)
441+
if dependent_package.purl:
442+
yield Dependency.from_dependent_package(
443+
dependent_package=dependent_package,
444+
datafile_path=datafile_path,
445+
datasource_id=datasource_id,
446+
package_uid=package_uid,
447+
)
448+
else:
449+
if TRACE:
450+
logger_debug(f' Dependency.from_dependent_packages: dependent_package (does not have purl): {dependent_package}')
451+
pass
447452

448453

449454
@attr.attributes(slots=True)

src/packagedcode/npm.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,18 @@ def assemble(cls, package_data, resource, codebase):
5353
else:
5454
dir_resource=resource
5555

56-
yield from cls.assemble_from_many_datafiles(
56+
for assembled in cls.assemble_from_many_datafiles(
5757
datafile_name_patterns=datafile_name_patterns,
5858
directory=dir_resource,
5959
codebase=codebase,
60-
)
60+
):
61+
if isinstance(assembled, models.Package):
62+
cls.assign_package_to_resources(
63+
package=assembled,
64+
resource=resource,
65+
codebase=codebase,
66+
)
67+
yield assembled
6168

6269
@classmethod
6370
def walk_npm(cls, resource, codebase, depth=0):

src/packagedcode/opam.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def parse(cls, location):
119119

120120
@classmethod
121121
def assign_package_to_resources(cls, package, resource, codebase):
122-
return super().assign_package_to_parent_tree(package, resource, codebase)
122+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
123123

124124

125125
def get_repository_homepage_url(name):

src/packagedcode/phpcomposer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def assemble(cls, package_data, resource, codebase):
4545

4646
@classmethod
4747
def assign_package_to_resources(cls, package, resource, codebase):
48-
return super().assign_package_to_parent_tree(package, resource, codebase)
48+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
4949

5050
@classmethod
5151
def compute_normalized_license(cls, package):

src/packagedcode/plugin_package.py

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -158,47 +158,53 @@ def create_package_and_deps(codebase, **kwargs):
158158
for package_data in resource.package_data:
159159
try:
160160
package_data = PackageData.from_dict(package_data)
161-
except Exception as e:
162-
raise Exception(
163-
'create_package_and_deps: Failed to create PackageData:',
164-
package_data,
165-
) from e
166-
167-
if TRACE:
168-
logger_debug(' create_package_and_deps: package_data:', package_data)
169-
170-
# Find a handler for this package datasource to assemble collect
171-
# packages and deps
172-
handler = get_package_handler(package_data)
173-
if TRACE:
174-
logger_debug(' create_package_and_deps: handler:', handler)
175-
click.echo(f' create_package_and_deps: handler: {handler}')
176-
items = handler.assemble(
177-
package_data=package_data,
178-
resource=resource,
179-
codebase=codebase,
180-
)
181-
182-
for item in items:
161+
183162
if TRACE:
184-
logger_debug(' create_package_and_deps: item:', item)
163+
logger_debug(' create_package_and_deps: package_data:', package_data)
185164

186-
if isinstance(item, Package):
187-
packages_top_level.append(item)
165+
# Find a handler for this package datasource to assemble collect
166+
# packages and deps
167+
handler = get_package_handler(package_data)
168+
if TRACE:
169+
logger_debug(' create_package_and_deps: handler:', handler)
170+
click.echo(f' create_package_and_deps: handler: {handler}')
171+
172+
items = handler.assemble(
173+
package_data=package_data,
174+
resource=resource,
175+
codebase=codebase,
176+
)
177+
178+
for item in items:
179+
if TRACE:
180+
logger_debug(' create_package_and_deps: item:', item)
188181

189-
elif isinstance(item, Dependency):
190-
dependencies_top_level.append(item)
182+
if isinstance(item, Package):
183+
packages_top_level.append(item)
191184

192-
elif isinstance(item, Resource):
193-
seen_resource_ids.add(item.rid)
194-
if TRACE:
195-
logger_debug(
196-
' create_package_and_deps: seen_resource_ids:',
197-
seen_resource_ids,
198-
)
185+
elif isinstance(item, Dependency):
186+
dependencies_top_level.append(item)
199187

200-
else:
201-
raise Exception(f'Unknown package assembly item type: {item!r}')
188+
elif isinstance(item, Resource):
189+
seen_resource_ids.add(item.rid)
190+
if TRACE:
191+
logger_debug(
192+
' create_package_and_deps: seen_resource_ids:',
193+
seen_resource_ids,
194+
)
195+
196+
else:
197+
raise Exception(f'Unknown package assembly item type: {item!r}')
198+
199+
except Exception as e:
200+
msg = f'create_package_and_deps: Failed to assemble PackageData: {package_data}: \n {e}'
201+
resource.scan_errors.append(msg)
202+
resource.save(codebase)
203+
204+
if TRACE:
205+
import traceback
206+
msg += traceback.format_exc()
207+
raise Exception(msg) from e
202208

203209
codebase.attributes.packages.extend(pkg.to_dict() for pkg in packages_top_level)
204210
codebase.attributes.dependencies.extend(dep.to_dict() for dep in dependencies_top_level)

src/packagedcode/pypi.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
9393
# two levels up
9494
root = resource.parent(codebase).parent(codebase)
9595
if root:
96-
return cls.assign_package_to_resources(package, root, codebase)
96+
return models.DatafileHandler.assign_package_to_resources(package, root, codebase)
9797

9898

9999
class PythonEditableInstallationPkgInfoFile(BasePypiHandler):
@@ -115,7 +115,7 @@ def parse(cls, location):
115115
@classmethod
116116
def assign_package_to_resources(cls, package, resource, codebase):
117117
# only the parent for now... though it can be more complex
118-
return cls.assign_package_to_parent_tree(package, resource, codebase)
118+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
119119

120120

121121
class BaseExtractedPythonLayout(BasePypiHandler):
@@ -144,7 +144,7 @@ def assemble(cls, package_data, resource, codebase):
144144

145145
@classmethod
146146
def assign_package_to_resources(cls, package, resource, codebase):
147-
return cls.assign_package_to_parent_tree(package, resource, codebase)
147+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
148148

149149

150150
class PythonSdistPkgInfoFile(BaseExtractedPythonLayout):

src/packagedcode/rubygems.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def assemble(cls, package_data, resource, codebase):
123123

124124
@classmethod
125125
def assign_package_to_resources(cls, package, resource, codebase):
126-
return cls.assign_package_to_parent_tree(package, resource, codebase)
126+
return models.DatafileHandler.assign_package_to_parent_tree(package, resource, codebase)
127127

128128

129129
class GemspecHandler(BaseGemHandler):

0 commit comments

Comments
 (0)