Skip to content

Commit 64522a6

Browse files
authored
Merge pull request #3090 from nexB/3072-rubygem-parse-fix
Process Gemfile.lock processing #3072
2 parents c15414b + 023c452 commit 64522a6

File tree

6 files changed

+332
-3275
lines changed

6 files changed

+332
-3275
lines changed

src/packagedcode/gemfile_lock.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ def __init__(self, lockfile):
368368
# the final tree of dependencies, keyed by name
369369
self.dependency_tree = {}
370370

371+
# the package that the gemfile.lock is for
372+
self.primary_gem = None
373+
371374
# a flat dict of all gems, keyed by name
372375
self.all_gems = {}
373376

@@ -399,6 +402,9 @@ def __init__(self, lockfile):
399402
# finally refine the collected data
400403
self.refine()
401404

405+
# set primary gem
406+
self.set_primary_gem()
407+
402408
def reset_state (self):
403409
self.state = None
404410
self.current_options = {}
@@ -409,6 +415,13 @@ def refine(self):
409415
for gem in self.all_gems.values():
410416
gem.refine()
411417

418+
def set_primary_gem(self):
419+
for gem in self.all_gems.values():
420+
if not gem.type == PATH:
421+
continue
422+
self.primary_gem = gem
423+
break
424+
412425
def get_or_create(self, name, version=None, platform=None):
413426
"""
414427
Return an existing gem if it exists or creates a new one.

src/packagedcode/rubygems.py

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,39 @@ class GemfileLockHandler(BaseGemProjectHandler):
252252
@classmethod
253253
def parse(cls, location):
254254
gemfile_lock = GemfileLockParser(location)
255-
dependencies = []
256-
for _, gem in gemfile_lock.all_gems.items():
257-
dependencies.append(
255+
all_gems = list(gemfile_lock.all_gems.values())
256+
if not all_gems:
257+
return
258+
259+
primary_gem = gemfile_lock.primary_gem
260+
if primary_gem:
261+
deps = [
262+
models.DependentPackage(
263+
purl=PackageURL(
264+
type='gem',
265+
name=dep.name,
266+
version=dep.version
267+
).to_string(),
268+
extracted_requirement=', '.join(dep.requirements),
269+
scope='dependencies',
270+
is_runtime=True,
271+
is_optional=False,
272+
is_resolved=True,
273+
) for dep in all_gems if dep != primary_gem
274+
]
275+
urls = get_urls(primary_gem.name, primary_gem.version)
276+
277+
yield models.PackageData(
278+
datasource_id=cls.datasource_id,
279+
primary_language=cls.default_primary_language,
280+
type=cls.default_package_type,
281+
name=primary_gem.name,
282+
version=primary_gem.version,
283+
dependencies=deps,
284+
**urls
285+
)
286+
else:
287+
deps = [
258288
models.DependentPackage(
259289
purl=PackageURL(
260290
type='gem',
@@ -267,43 +297,14 @@ def parse(cls, location):
267297
is_runtime=True,
268298
is_optional=False,
269299
is_resolved=True,
270-
)
271-
)
272-
273-
yield models.PackageData(
274-
datasource_id=cls.datasource_id,
275-
type=cls.default_package_type,
276-
dependencies=dependencies,
277-
primary_language=cls.default_primary_language,
278-
)
279-
280-
for _, gem in gemfile_lock.all_gems.items():
281-
deps = []
282-
for _dep_name, dep in gem.dependencies.items():
283-
deps.append(
284-
models.DependentPackage(
285-
purl=PackageURL(
286-
type='gem',
287-
name=dep.name,
288-
version=dep.version
289-
).to_string(),
290-
extracted_requirement=', '.join(dep.requirements),
291-
scope='dependencies',
292-
is_runtime=True,
293-
is_optional=False,
294-
is_resolved=True,
295-
)
296-
)
297-
urls = get_urls(gem.name, gem.version)
300+
) for gem in all_gems
301+
]
298302

299303
yield models.PackageData(
300304
datasource_id=cls.datasource_id,
301-
primary_language=cls.default_primary_language,
302305
type=cls.default_package_type,
303-
name=gem.name,
304-
version=gem.version,
305306
dependencies=deps,
306-
**urls
307+
primary_language=cls.default_primary_language,
307308
)
308309

309310

0 commit comments

Comments
 (0)