Skip to content

Commit 6fd5054

Browse files
Improve package assembly functions
Signed-off-by: Ayan Sinha Mahapatra <asmahapatra@aboutcode.org>
1 parent a16cb5b commit 6fd5054

8 files changed

Lines changed: 74 additions & 76 deletions

File tree

src/packagedcode/cargo.py

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,14 @@ def assemble(cls, package_data, resource, codebase, package_adder):
6666
for attribute in attributes_to_copy:
6767
package_data.extra_data[attribute] = 'workspace'
6868
workspace_package_data[attribute] = getattr(package_data, attribute)
69+
70+
datafile_path_patterns = CargoTomlHandler.path_patterns + CargoLockHandler.path_patterns
6971

7072
workspace_root = resource.parent(codebase)
71-
if not workspace_root:
72-
# If there's no parent (e.g., scanning a single file), use the directory part of the resource path
73-
workspace_root_path = os.path.dirname(resource.path)
74-
else:
75-
workspace_root_path = workspace_root.path
76-
77-
if workspace_package_data and workspace_members:
78-
73+
if workspace_root and workspace_package_data and workspace_members:
7974
# TODO: support glob patterns found in cargo workspaces
8075
for workspace_member_path in workspace_members:
81-
workspace_directory_path = os.path.join(workspace_root_path, workspace_member_path)
76+
workspace_directory_path = os.path.join(workspace_root.path, workspace_member_path)
8277
workspace_directory = codebase.get_resource(path=workspace_directory_path)
8378
if not workspace_directory:
8479
continue
@@ -103,20 +98,18 @@ def assemble(cls, package_data, resource, codebase, package_adder):
10398
resource.save(codebase)
10499

105100
yield from cls.assemble_from_many_datafiles(
106-
datafile_name_patterns=('Cargo.toml', 'cargo.toml', 'Cargo.lock', 'cargo.lock'),
107-
directory=workspace_directory,
101+
datafile_path_patterns=datafile_path_patterns,
102+
resource=workspace_directory,
108103
codebase=codebase,
109104
package_adder=package_adder,
110105
)
111106
else:
112-
parent_resource = resource.parent(codebase)
113-
if parent_resource:
114-
yield from cls.assemble_from_many_datafiles(
115-
datafile_name_patterns=('Cargo.toml', 'cargo.toml', 'Cargo.lock', 'cargo.lock'),
116-
directory=parent_resource,
117-
codebase=codebase,
118-
package_adder=package_adder,
119-
)
107+
yield from cls.assemble_from_many_datafiles(
108+
datafile_path_patterns=datafile_path_patterns,
109+
resource=workspace_root,
110+
codebase=codebase,
111+
package_adder=package_adder,
112+
)
120113

121114
@classmethod
122115
def update_resource_package_data(cls, workspace, workspace_package_data, resource_package_data, mapping=None):

src/packagedcode/chef.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,13 @@ def assemble(cls, package_data, resource, codebase, package_adder):
146146
"""
147147
Assemble Package from Chef metadata.rb, then from metadata.json files.
148148
"""
149+
datafile_path_patterns = (
150+
ChefMetadataRbHandler.path_patterns +
151+
ChefMetadataJsonHandler.path_patterns
152+
)
149153
yield from cls.assemble_from_many_datafiles(
150-
datafile_name_patterns=('metadata.rb', 'metadata.json',),
151-
directory=resource.parent(codebase),
154+
datafile_path_patterns=datafile_path_patterns,
155+
resource=resource.parent(codebase),
152156
codebase=codebase,
153157
package_adder=package_adder,
154158
)

src/packagedcode/cocoapods.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,16 @@ def assemble(cls, package_data, resource, codebase, package_adder):
151151
has_single_podspec = siblings_counts == 1
152152
has_multiple_podspec = siblings_counts > 1
153153

154-
datafile_name_patterns = (
155-
'Podfile.lock',
156-
'Podfile',
154+
datafile_path_patterns = (
155+
PodfileLockHandler.path_patterns +
156+
PodfileHandler.path_patterns
157157
)
158-
159158
if has_single_podspec:
160159
# we can treat all podfile/spec as being for one package
161-
datafile_name_patterns = (sibling_podspecs[0].name,) + datafile_name_patterns
162-
163-
yield from models.DatafileHandler.assemble_from_many_datafiles(
164-
datafile_name_patterns=datafile_name_patterns,
165-
directory=parent,
160+
podspec_path_patterns = (f"*{sibling_podspecs[0].name}",)
161+
yield from cls.assemble_from_many_datafiles(
162+
datafile_path_patterns=podspec_path_patterns + datafile_path_patterns,
163+
resource=parent,
166164
codebase=codebase,
167165
package_adder=package_adder,
168166
)
@@ -172,11 +170,10 @@ def assemble(cls, package_data, resource, codebase, package_adder):
172170
# as we cannot determine easily which podfile is for which
173171
# podspec
174172
podspec = sibling_podspecs.pop()
175-
datafile_name_patterns = (podspec.name,) + datafile_name_patterns
176-
177-
yield from models.DatafileHandler.assemble_from_many_datafiles(
178-
datafile_name_patterns=datafile_name_patterns,
179-
directory=parent,
173+
podspec_path_patterns = (f"*{podspec.name}",)
174+
yield from cls.assemble_from_many_datafiles(
175+
datafile_path_patterns=podspec_path_patterns + datafile_path_patterns,
176+
resource=parent,
180177
codebase=codebase,
181178
package_adder=package_adder,
182179
)
@@ -200,9 +197,9 @@ def assemble(cls, package_data, resource, codebase, package_adder):
200197

201198
else:
202199
# has_no_podspec:
203-
yield from models.DatafileHandler.assemble_from_many_datafiles(
204-
datafile_name_patterns=datafile_name_patterns,
205-
directory=parent,
200+
yield from cls.assemble_from_many_datafiles(
201+
datafile_path_patterns=datafile_path_patterns,
202+
resource=parent,
206203
codebase=codebase,
207204
package_adder=package_adder,
208205
)

src/packagedcode/golang.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ def assemble(cls, package_data, resource, codebase, package_adder):
3232
"""
3333
Always use go.mod first then go.sum
3434
"""
35+
datafile_path_patterns = (
36+
GoModHandler.path_patterns + GoSumHandler.path_patterns
37+
)
3538
yield from cls.assemble_from_many_datafiles(
36-
datafile_name_patterns=('go.mod', 'go.sum',),
37-
directory=resource.parent(codebase),
39+
datafile_path_patterns=datafile_path_patterns,
40+
resource=resource.parent(codebase),
3841
codebase=codebase,
3942
package_adder=package_adder,
4043
)

src/packagedcode/models.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,15 +1360,16 @@ def assemble_from_many(
13601360
@classmethod
13611361
def assemble_from_many_datafiles(
13621362
cls,
1363-
datafile_name_patterns,
1364-
directory,
1363+
datafile_path_patterns,
1364+
resource,
13651365
codebase,
13661366
package_adder=add_to_package,
13671367
):
13681368
"""
13691369
Assemble Package and Dependency from package data of the datafiles found
1370-
in multiple ``datafile_name_patterns`` name patterns (case- sensitive)
1371-
found in the ``directory`` Resource.
1370+
in potentially multiple ``datafile_name_patterns`` name patterns
1371+
(case- sensitive) found in the ``resource``. A ``resource`` can be a single
1372+
file, or a directory in which case we look for manifests in the directory.
13721373
13731374
Create a Package from the first package data item. Update this package
13741375
with other items. Assign to this Package the file tree from the parent
@@ -1383,22 +1384,20 @@ def assemble_from_many_datafiles(
13831384
multiple PackageData for unrelated Packages.
13841385
"""
13851386
if TRACE:
1386-
logger_debug(f'assemble_from_many_datafiles: datafile_name_patterns: {datafile_name_patterns!r}')
1387+
logger_debug(f'assemble_from_many_datafiles: datafile_path_patterns: {datafile_path_patterns!r}')
13871388

1388-
if not codebase.has_single_resource:
1389-
siblings = list(directory.children(codebase))
1390-
else:
1391-
if directory:
1392-
siblings = [directory]
1393-
else:
1394-
siblings = []
1389+
siblings = []
1390+
if resource and resource.is_file:
1391+
siblings = [resource]
1392+
elif resource and resource.is_dir:
1393+
siblings = list(resource.children(codebase))
13951394

13961395
pkgdata_resources = []
13971396

13981397
# we iterate on datafile_name_patterns because their order matters
1399-
for datafile_name_pattern in datafile_name_patterns:
1398+
for path_pattern in datafile_path_patterns:
14001399
for sibling in siblings:
1401-
if fnmatchcase(sibling.name, datafile_name_pattern):
1400+
if fnmatchcase(sibling.path, path_pattern):
14021401
for package_data in sibling.package_data:
14031402
package_data = PackageData.from_dict(package_data)
14041403
pkgdata_resources.append((package_data, sibling,))

src/packagedcode/phpcomposer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class BasePhpComposerHandler(models.DatafileHandler):
2626

2727
@classmethod
2828
def assemble(cls, package_data, resource, codebase, package_adder):
29-
datafile_name_patterns = (
30-
'composer.json',
31-
'composer.lock',
29+
datafile_path_patterns = (
30+
PhpComposerJsonHandler.path_patterns +
31+
PhpComposerLockHandler.path_patterns
3232
)
3333

3434
if resource.has_parent():
@@ -37,8 +37,8 @@ def assemble(cls, package_data, resource, codebase, package_adder):
3737
dir_resource = resource
3838

3939
yield from cls.assemble_from_many_datafiles(
40-
datafile_name_patterns=datafile_name_patterns,
41-
directory=dir_resource,
40+
datafile_path_patterns=datafile_path_patterns,
41+
resource=dir_resource,
4242
codebase=codebase,
4343
package_adder=package_adder,
4444
)

src/packagedcode/pubspec.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,19 @@ class BaseDartPubspecHandler(models.DatafileHandler):
3535

3636
@classmethod
3737
def assemble(cls, package_data, resource, codebase, package_adder):
38-
datafile_name_patterns = \
39-
DartPubspecYamlHandler.path_patterns + DartPubspecLockHandler.path_patterns
38+
datafile_path_patterns = (
39+
DartPubspecYamlHandler.path_patterns +
40+
DartPubspecLockHandler.path_patterns
41+
)
4042

4143
if resource.has_parent():
4244
dir_resource = resource.parent(codebase)
4345
else:
4446
dir_resource = resource
4547

4648
yield from cls.assemble_from_many_datafiles(
47-
datafile_name_patterns=datafile_name_patterns,
48-
directory=dir_resource,
49+
datafile_path_patterns=datafile_path_patterns,
50+
resource=dir_resource,
4951
codebase=codebase,
5052
package_adder=package_adder,
5153
)

src/packagedcode/rubygems.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,18 @@ def assemble_extracted_gem(cls, package_data, resource, codebase, package_adder)
5656
An assemble implementation shared by handlers for manifests found in an
5757
extracted gem using extractcode.
5858
"""
59-
datafile_name_patterns = (
60-
'metadata.gz-extract/metadata.gz-extract',
61-
'data.gz-extract/*.gemspec',
62-
'data.gz-extract/Gemfile',
63-
'data.gz-extract/Gemfile.lock',
59+
datafile_path_patterns = (
60+
GemMetadataArchiveExtractedHandler.path_patterns +
61+
GemspecHandler.path_patterns +
62+
GemfileHandler.path_patterns +
63+
GemfileLockHandler.path_patterns
6464
)
6565

6666
gemroot = get_ancestor(levels_up=2, resource=resource, codebase=codebase)
6767

6868
yield from cls.assemble_from_many_datafiles(
69-
datafile_name_patterns=datafile_name_patterns,
70-
directory=gemroot,
69+
datafile_path_patterns=datafile_path_patterns,
70+
resource=gemroot,
7171
codebase=codebase,
7272
package_adder=package_adder,
7373
)
@@ -104,15 +104,15 @@ class BaseGemProjectHandler(models.DatafileHandler):
104104

105105
@classmethod
106106
def assemble(cls, package_data, resource, codebase, package_adder):
107-
datafile_name_patterns = (
108-
'*.gemspec',
109-
'Gemfile',
110-
'Gemfile.lock',
107+
datafile_path_patterns = (
108+
GemspecHandler.path_patterns +
109+
GemfileHandler.path_patterns +
110+
GemfileLockHandler.path_patterns
111111
)
112112

113113
yield from cls.assemble_from_many_datafiles(
114-
datafile_name_patterns=datafile_name_patterns,
115-
directory=resource.parent(codebase),
114+
datafile_path_patterns=datafile_path_patterns,
115+
resource=resource.parent(codebase),
116116
codebase=codebase,
117117
package_adder=package_adder,
118118
)

0 commit comments

Comments
 (0)