Skip to content

Commit a2068b1

Browse files
authored
Merge pull request #2924 from nexB/update-metadata.bzl-parser
Update METADATA.bzl parser
2 parents 15ff1ed + f9fc9e9 commit a2068b1

File tree

3 files changed

+97
-21
lines changed

3 files changed

+97
-21
lines changed

src/packagedcode/build.py

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,12 @@ def parse(cls, location):
294294
if not isinstance(e, ast.Str):
295295
continue
296296
value.append(e.s)
297-
if isinstance(statement_v, ast.Str):
297+
if isinstance(statement_v, (ast.Str, ast.Constant)):
298298
value = statement_v.s
299299
metadata_fields[key_name] = value
300300

301301
parties = []
302-
maintainers = metadata_fields.get('maintainers', [])
302+
maintainers = metadata_fields.get('maintainers', []) or []
303303
for maintainer in maintainers:
304304
parties.append(
305305
models.Party(
@@ -309,31 +309,70 @@ def parse(cls, location):
309309
)
310310
)
311311

312-
# TODO: Create function that determines package type from download URL,
313-
# then create a package of that package type from the metadata info
314-
yield models.PackageData(
315-
datasource_id=cls.datasource_id,
316-
type=metadata_fields.get('upstream_type', cls.default_package_type),
317-
name=metadata_fields.get('name'),
318-
version=metadata_fields.get('version'),
319-
declared_license=metadata_fields.get('licenses', []),
320-
parties=parties,
321-
homepage_url=metadata_fields.get('upstream_address', ''),
322-
# TODO: Store 'upstream_hash` somewhere
323-
)
312+
if (
313+
'upstream_type'
314+
and 'name'
315+
and 'version'
316+
and 'licenses'
317+
and 'upstream_address'
318+
in metadata_fields
319+
):
320+
# TODO: Create function that determines package type from download URL,
321+
# then create a package of that package type from the metadata info
322+
yield models.PackageData(
323+
datasource_id=cls.datasource_id,
324+
type=metadata_fields.get('upstream_type', cls.default_package_type),
325+
name=metadata_fields.get('name'),
326+
version=metadata_fields.get('version'),
327+
declared_license=metadata_fields.get('licenses', []),
328+
parties=parties,
329+
homepage_url=metadata_fields.get('upstream_address', ''),
330+
# TODO: Store 'upstream_hash` somewhere
331+
)
332+
333+
if (
334+
'package_type'
335+
and 'name'
336+
and 'version'
337+
and 'license_expression'
338+
and 'homepage_url'
339+
and 'download_url'
340+
and 'vcs_url'
341+
and 'download_archive_sha1'
342+
and 'vcs_commit_hash'
343+
in metadata_fields
344+
):
345+
yield models.PackageData(
346+
datasource_id=cls.datasource_id,
347+
type=metadata_fields.get('package_type', cls.default_package_type),
348+
name=metadata_fields.get('name'),
349+
version=metadata_fields.get('version'),
350+
declared_license=metadata_fields.get('license_expression', ''),
351+
parties=parties,
352+
homepage_url=metadata_fields.get('homepage_url', ''),
353+
download_url=metadata_fields.get('download_url', ''),
354+
vcs_url=metadata_fields.get('vcs_url', ''),
355+
sha1=metadata_fields.get('download_archive_sha1', ''),
356+
extra_data=dict(vcs_commit_hash=metadata_fields.get('vcs_commit_hash', ''))
357+
)
324358

325359
@classmethod
326360
def compute_normalized_license(cls, package):
327-
if not package.declared_license:
361+
declared_license = package.declared_license
362+
if not declared_license:
328363
return
329364

330-
detected_licenses = []
331-
for declared in package.declared_license:
332-
detected_license = models.compute_normalized_license(declared)
333-
detected_licenses.append(detected_license)
365+
if isinstance(declared_license, (list, tuple,)):
366+
detected_licenses = [
367+
models.compute_normalized_license(declared)
368+
for declared in declared_license
369+
]
370+
371+
if detected_licenses:
372+
return combine_expressions(detected_licenses)
334373

335-
if detected_licenses:
336-
return combine_expressions(detected_licenses)
374+
if isinstance(declared_license, str):
375+
return models.compute_normalized_license(declared_license)
337376

338377
@classmethod
339378
def assign_package_to_resources(cls, package, resource, codebase):
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
METADATA = {
2+
"download_archive_sha1": "",
3+
"download_url": "",
4+
"homepage_url": "https://github.com/example/example",
5+
"license_expression": "BSD-3-Clause",
6+
"maintainers": ["example_org"],
7+
"name": "example/example",
8+
"package_type": "github",
9+
"vcs_commit_hash": "deadbeef",
10+
"vcs_url": "https://github.com/example/example.git",
11+
"version": "0.0.1",
12+
}

tests/packagedcode/test_build.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,28 @@ def test_MetadataBzl_parse(self):
103103
]
104104
compare_package_results(expected_packages, result_packages)
105105

106+
def test_MetadataBzl_recognize_new_format(self):
107+
test_file = self.get_test_loc('metadatabzl/new-format/METADATA.bzl')
108+
result_packages = build.BuckMetadataBzlHandler.parse(test_file)
109+
expected_packages = [
110+
models.PackageData(
111+
datasource_id=build.BuckMetadataBzlHandler.datasource_id,
112+
type='github',
113+
name='example/example',
114+
version='0.0.1',
115+
declared_license='BSD-3-Clause',
116+
parties=[
117+
models.Party(
118+
type=models.party_org,
119+
name='example_org',
120+
role='maintainer'
121+
)
122+
],
123+
download_url='',
124+
sha1='',
125+
homepage_url='https://github.com/example/example',
126+
vcs_url='https://github.com/example/example.git',
127+
extra_data=dict(vcs_commit_hash="deadbeef")
128+
)
129+
]
130+
compare_package_results(expected_packages, result_packages)

0 commit comments

Comments
 (0)