Skip to content

Commit 6a1cdc4

Browse files
Fix alpine cocoapods go maven rpm win tests
Only top-level packages tests remaining to fix, other than a few quirks. Signed-off-by: Ayan Sinha Mahapatra <ayansmahapatra@gmail.com>
1 parent 33f4a2c commit 6a1cdc4

594 files changed

Lines changed: 4998 additions & 2545 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/packagedcode/alpine.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ def m_maintainer_handler(value, **kwargs):
899899
name=name,
900900
email=email,
901901
)
902-
parties.append(maintainer)
902+
parties.append(maintainer.to_dict())
903903
return {'parties': parties}
904904

905905

@@ -995,7 +995,7 @@ def D_dependencies_handler(value, dependencies=None, **kwargs):
995995
is_resolved=is_resolved,
996996
)
997997
if dependency not in dependencies:
998-
dependencies.append(dependency)
998+
dependencies.append(dependency.to_dict())
999999

10001000
return {'dependencies': dependencies}
10011001

@@ -1047,7 +1047,7 @@ def R_filename_handler(value, current_dir, file_references=None, **kwargs):
10471047
file_references = file_references[:] if file_references else []
10481048

10491049
current_file = models.FileReference(path=posixpath.join(current_dir, value))
1050-
file_references.append(current_file)
1050+
file_references.append(current_file.to_dict())
10511051
return {'current_file': current_file, 'file_references': file_references}
10521052

10531053

src/packagedcode/cocoapods.py

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

112112
name = podspec.get('name')
113113
version = podspec.get('version')
114-
homepage_url = podspec.get('homepage_url')
114+
homepage_url = podspec.get('homepage')
115115
declared_license = podspec.get('license')
116116
description = utils.build_description(
117117
summary=podspec.get('summary'),
@@ -380,7 +380,7 @@ def party_mapper(author, email):
380380

381381
person_parser = re.compile(
382382
r'^(?P<name>[\w\s(),-_.,]+)'
383-
r'=>'
383+
r'[\s]=[>\s]?'
384384
r'(?P<email>[\S+]+$)'
385385
).match
386386

src/packagedcode/go_mod.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def parse_gosum(location):
236236
gosums = []
237237

238238
for line in lines:
239-
line = line.replace('*/go.mod', '')
239+
line = line.replace('/go.mod', '')
240240
parsed_dep = get_dependency(line)
241241

242242
ns_name = parsed_dep.group('ns_name')

src/packagedcode/godeps.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
modules.
2626
"""
2727
# FIXME: update to use the latest vendor conventions.
28-
# TODO: Use attrs
2928
# consider other legacy format?
3029
# https://github.com/golang/dep/blob/master/Gopkg.lock
3130
# https://github.com/golang/dep/blob/master/Gopkg.toml
@@ -81,7 +80,7 @@ def assign_package_to_resources(cls, package, resource, codebase):
8180

8281

8382
@attr.s
84-
class Dep(namedtuple('Dep', 'import_path revision comment')):
83+
class Dep:
8584
import_path = datautils.String()
8685
revision = datautils.String()
8786
comment = datautils.String()

src/packagedcode/maven.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def is_datafile(cls, location, filetypes=tuple()):
7272
Return True if the file at location is highly likely to be a POM.
7373
"""
7474
if super().is_datafile(location, filetypes=filetypes):
75-
return
75+
return True
7676

7777
T = contenttype.get_type(location)
7878
if not T.is_text:
@@ -95,7 +95,7 @@ def is_datafile(cls, location, filetypes=tuple()):
9595
return True
9696

9797
@classmethod
98-
def parse(cls, location, base_url='http://repo1.maven.org/maven2'):
98+
def parse(cls, location, base_url='https://repo1.maven.org/maven2'):
9999
return parse(
100100
location=location,
101101
datasource_id=cls.datasource_id,
@@ -242,7 +242,7 @@ def build_url(
242242
artifact_id,
243243
version,
244244
filename=None,
245-
base_url='http://repo1.maven.org/maven2',
245+
base_url='https://repo1.maven.org/maven2',
246246
):
247247
"""
248248
Return a download URL for a Maven artifact built from its POM "coordinates".
@@ -302,11 +302,11 @@ def to_dict(self):
302302
Return a mapping representing this POM
303303
"""
304304
return {
305-
'group_id', self.group_id,
306-
'artifact_id', self.artifact_id,
307-
'version', str(self.version) if self.version else None,
308-
'classifier', self.classifier,
309-
'type', self.type,
305+
'group_id': self.group_id,
306+
'artifact_id': self.artifact_id,
307+
'version': str(self.version) if self.version else None,
308+
'classifier': self.classifier,
309+
'type': self.type,
310310
}
311311

312312

@@ -908,7 +908,7 @@ def get_maven_pom(location=None):
908908
if not hbpa:
909909
if TRACE:
910910
logger.debug(f'get_maven_pom: has_basic_pom_attributes: {hbpa}')
911-
return {}
911+
return
912912
return pom
913913

914914

@@ -1033,7 +1033,7 @@ def get_parties(pom):
10331033
return parties
10341034

10351035

1036-
def get_urls(namespace, name, version, qualifiers, base_url='http://repo1.maven.org/maven2'):
1036+
def get_urls(namespace, name, version, qualifiers, base_url='https://repo1.maven.org/maven2'):
10371037
"""
10381038
Return a mapping of URLs.
10391039
"""
@@ -1089,7 +1089,7 @@ def parse(
10891089
datasource_id,
10901090
package_type,
10911091
primary_language,
1092-
base_url='http://repo1.maven.org/maven2',
1092+
base_url='https://repo1.maven.org/maven2',
10931093
):
10941094
"""
10951095
Yield Packagedata objects from parsing a Maven pom file at `location` or
@@ -1153,7 +1153,6 @@ def parse(
11531153

11541154
scm = pom.scm or {}
11551155
urls = build_vcs_and_code_view_urls(scm)
1156-
print(urls)
11571156
urls.update(get_urls(
11581157
namespace=group_id,
11591158
name=artifact_id, version=version,
@@ -1206,7 +1205,7 @@ def build_vcs_and_code_view_urls(scm):
12061205
if code_view_url:
12071206
# we can craft a vcs_url in some cases
12081207
vcs_url = code_view_url
1209-
return vcs_url, code_view_url
1208+
return dict(vcs_url=vcs_url, code_view_url=code_view_url,)
12101209

12111210
vcs_url = parse_scm_connection(vcs_url)
12121211

src/packagedcode/rpm.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,11 @@ class BaseRpmInstalledDatabaseHandler(models.DatafileHandler):
126126
def parse(cls, location):
127127
# dump and parse the rpmdb to XMLish
128128
xmlish_loc = rpm_installed.collect_installed_rpmdb_xmlish_from_rpmdb_loc(location)
129-
package_data = rpm_installed.parse_rpm_xmlish(xmlish_loc)
130-
package_data.datasource_id = cls.datasource_id
131-
package_data.type = cls.default_package_type
129+
package_data = rpm_installed.parse_rpm_xmlish(
130+
location=xmlish_loc,
131+
datasource_id=cls.datasource_id,
132+
package_type=cls.default_package_type,
133+
)
132134
# TODO: package_data.namespace = cls.default_package_namespace
133135
return package_data
134136

src/packagedcode/rpm_installed.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def logger_debug(*args):
3535
return logger.debug(' '.join(isinstance(a, str) and a or repr(a) for a in args))
3636

3737

38-
def parse_rpm_xmlish(location):
38+
def parse_rpm_xmlish(location, datasource_id, package_type):
3939
"""
4040
Yield RpmPackage(s) from a RPM XML'ish file at `location`. This is a file
4141
created with the rpm CLI with the xml query option.
@@ -53,7 +53,7 @@ def parse_rpm_xmlish(location):
5353

5454
for rpm_raw_tags in collect_rpms(rpms):
5555
tags = collect_tags(rpm_raw_tags)
56-
yield build_package(tags)
56+
yield build_package(tags, datasource_id, package_type)
5757

5858

5959
def collect_rpms(text):
@@ -128,14 +128,19 @@ def collect_tags(raw_tags):
128128
yield name, value_type, value
129129

130130

131-
def build_package(rpm_tags, datasource_id, package_type, package_namespace):
131+
def build_package(rpm_tags, datasource_id, package_type, package_namespace=None):
132132
"""
133133
Return a PackageData object from an ``rpm_tags`` iterable of (name,
134134
value_type, value) tuples.
135135
"""
136136

137137
# mapping of real Package field name -> value converted to expected format
138-
converted = {}
138+
converted = {
139+
'datasource_id': datasource_id,
140+
'type': package_type,
141+
'namespace': package_namespace
142+
}
143+
139144
for name, value_type, value in rpm_tags:
140145
handler = RPM_TAG_HANDLER_BY_NAME.get(name)
141146
# FIXME: we need to handle EVRA correctly

src/packagedcode/rubygems.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ def parse(cls, location):
143143

144144
name = gemspec.get('name')
145145
version = gemspec.get('version')
146-
homepage_url = gemspec.get('homepage_url')
146+
homepage_url = gemspec.get('homepage')
147+
147148
description = build_description(
148149
summary=gemspec.get('summary'),
149150
description=gemspec.get('description'),
@@ -158,6 +159,8 @@ def parse(cls, location):
158159
parties = get_parties(gemspec)
159160
dependencies = gemspec.get('dependencies') or []
160161

162+
urls = get_urls(name=name, version=version)
163+
161164
package_data = models.PackageData(
162165
datasource_id=cls.datasource_id,
163166
type=cls.default_package_type,
@@ -168,7 +171,8 @@ def parse(cls, location):
168171
description=description,
169172
declared_license=declared_license,
170173
primary_language=cls.default_primary_language,
171-
dependencies=dependencies
174+
dependencies=dependencies,
175+
**urls
172176
)
173177

174178
yield package_data
@@ -285,14 +289,16 @@ def parse(cls, location):
285289
is_resolved=True,
286290
)
287291
)
292+
urls = get_urls(gem.name, gem.version)
288293

289294
yield models.PackageData(
290295
datasource_id=cls.datasource_id,
291296
primary_language=cls.default_primary_language,
292297
type=cls.default_package_type,
293298
name=gem.name,
294299
version=gem.version,
295-
dependencies=deps
300+
dependencies=deps,
301+
**urls
296302
)
297303

298304

@@ -487,7 +493,7 @@ def build_rubygem_package_data(gem_data, datasource_id):
487493
package_data = models.PackageData(
488494
datasource_id=datasource_id,
489495
type=GemArchiveHandler.default_package_type,
490-
primary_languages=GemArchiveHandler.default_primary_language,
496+
primary_language=GemArchiveHandler.default_primary_language,
491497
name=name,
492498
version=version,
493499
qualifiers=qualifiers,
@@ -529,7 +535,7 @@ def build_rubygem_package_data(gem_data, datasource_id):
529535
# "documentation_uri" => "https://www.example.info/gems/bestgemever/0.0.1",
530536

531537
if not package_data.homepage_url:
532-
package_data.homepage_url = package_data.repository_homepage_url()
538+
package_data.homepage_url = rubygems_homepage_url(name, version)
533539

534540
return package_data
535541

@@ -709,14 +715,20 @@ def get_dependencies(dependencies):
709715
}
710716

711717

712-
def party_mapper(names, role):
718+
def party_mapper(role, names=[], emails=[]):
713719
"""
714720
Yields Party with ``role`` objects from a ``names`` list of string.
715721
"""
716-
return (
717-
models.Party(type=models.party_person, name=name, role=role)
718-
for name in names
719-
)
722+
if names:
723+
return (
724+
models.Party(type=models.party_person, name=name, role=role)
725+
for name in names
726+
)
727+
elif emails:
728+
return (
729+
models.Party(type=models.party_person, email=email, role=role)
730+
for email in emails
731+
)
720732

721733

722734
def get_parties(gem_data):
@@ -725,10 +737,10 @@ def get_parties(gem_data):
725737
"""
726738
parties = []
727739
authors = gem_data.get('author') or []
728-
parties.extend(party_mapper(authors, role='author'))
740+
parties.extend(party_mapper(names=authors, role='author'))
729741
# FIXME: emails is NOT a party
730742
emails = gem_data.get('email') or []
731-
parties.extend(party_mapper(emails, role='email'))
743+
parties.extend(party_mapper(emails=emails, role='author'))
732744
return parties
733745

734746

src/packagedcode/spec.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,12 @@ def get_source(line):
6969

7070
# mapping of parser callable by its field name
7171
PARSER_BY_NAME = {
72-
'name': partial(get_value, name='name', match=parse_name),
73-
'version': partial(get_value, name='version', match=parse_version),
74-
'license': partial(get_value, name='license', match=parse_license),
75-
'summary': partial(get_value, name='summary', match=parse_summary),
76-
'description': partial(get_value, name='description', match=parse_description),
77-
'homepage': partial(get_value, name='homepage', match=parse_homepage),
72+
'name': partial(get_value, name='name', matcher=parse_name),
73+
'version': partial(get_value, name='version', matcher=parse_version),
74+
'license': partial(get_value, name='license', matcher=parse_license),
75+
'summary': partial(get_value, name='summary', matcher=parse_summary),
76+
'description': partial(get_value, name='description', matcher=parse_description),
77+
'homepage': partial(get_value, name='homepage', matcher=parse_homepage),
7878
'source': get_source,
7979
}
8080

@@ -92,11 +92,11 @@ def parse_spec(location, package_type):
9292
line = pre_process(line)
9393

9494
for attribute_name, parser in PARSER_BY_NAME.items():
95-
parsed = parser(line)
95+
parsed = parser(line=line)
9696
if parsed:
9797
spec_data[attribute_name] = parsed
9898

99-
match = parse_description(line)
99+
match = parse_description.match(line)
100100
if match:
101101
if location.endswith('.gemspec'):
102102
# FIXME: description can be in single or multi-lines
@@ -146,14 +146,15 @@ def get_dependent_packages(location, package_type):
146146
}
147147

148148
dependencies = GemfileParser(location).parse()
149-
for deps in dependencies.values():
150-
for dep in deps:
151-
scope = dep['scope']
152-
flags = flags_by_scope.get(scope, 'runtime')
149+
150+
for key in dependencies:
151+
depends = dependencies.get(key, []) or []
152+
for dep in depends:
153+
flags = flags_by_scope.get(key, 'runtime')
153154
yield models.DependentPackage(
154-
purl=PackageURL(type=package_type, name=dep['name']),
155-
extracted_requirement=', '.join(dep['requirement']),
156-
scope=scope,
155+
purl=PackageURL(type=package_type, name=dep.name).to_string(),
156+
extracted_requirement=', '.join(dep.requirement),
157+
scope=key,
157158
is_resolved=False,
158159
**flags,
159160
)

0 commit comments

Comments
 (0)