Skip to content

Commit 4c7bb33

Browse files
committed
Track primary gem in GemfileLock parser #3072
Signed-off-by: Jono Yang <jyang@nexb.com>
1 parent a43660f commit 4c7bb33

File tree

2 files changed

+66
-26
lines changed

2 files changed

+66
-26
lines changed

src/packagedcode/gemfile_lock.py

Lines changed: 16 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,16 @@ 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 gem.type == PATH:
421+
self.primary_gem = Gem(
422+
gem.name,
423+
gem.version,
424+
gem.platform,
425+
)
426+
break
427+
412428
def get_or_create(self, name, version=None, platform=None):
413429
"""
414430
Return an existing gem if it exists or creates a new one.

src/packagedcode/rubygems.py

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -256,32 +256,56 @@ def parse(cls, location):
256256
if not all_gems:
257257
return
258258

259-
main_gem = all_gems[0]
260-
deps = [
261-
models.DependentPackage(
262-
purl=PackageURL(
263-
type='gem',
264-
name=dep.name,
265-
version=dep.version
266-
).to_string(),
267-
extracted_requirement=', '.join(dep.requirements),
268-
scope='dependencies',
269-
is_runtime=True,
270-
is_optional=False,
271-
is_resolved=True,
272-
) for dep in all_gems[1:]
273-
]
274-
urls = get_urls(main_gem.name, main_gem.version)
275-
276-
yield models.PackageData(
277-
datasource_id=cls.datasource_id,
278-
primary_language=cls.default_primary_language,
279-
type=cls.default_package_type,
280-
name=main_gem.name,
281-
version=main_gem.version,
282-
dependencies=deps,
283-
**urls
284-
)
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[1:]
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 = [
288+
models.DependentPackage(
289+
purl=PackageURL(
290+
type='gem',
291+
name=gem.name,
292+
version=gem.version
293+
).to_string(),
294+
extracted_requirement=', '.join(gem.requirements),
295+
# FIXME: get proper scope... This does not seem right
296+
scope='dependencies',
297+
is_runtime=True,
298+
is_optional=False,
299+
is_resolved=True,
300+
) for gem in all_gems
301+
]
302+
303+
yield models.PackageData(
304+
datasource_id=cls.datasource_id,
305+
type=cls.default_package_type,
306+
dependencies=deps,
307+
primary_language=cls.default_primary_language,
308+
)
285309

286310

287311
class GemfileLockInExtractedGemHandler(GemfileLockHandler):

0 commit comments

Comments
 (0)