@@ -252,9 +252,39 @@ class GemfileLockHandler(BaseGemProjectHandler):
252
252
@classmethod
253
253
def parse (cls , location ):
254
254
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 = [
258
288
models .DependentPackage (
259
289
purl = PackageURL (
260
290
type = 'gem' ,
@@ -267,43 +297,14 @@ def parse(cls, location):
267
297
is_runtime = True ,
268
298
is_optional = False ,
269
299
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
+ ]
298
302
299
303
yield models .PackageData (
300
304
datasource_id = cls .datasource_id ,
301
- primary_language = cls .default_primary_language ,
302
305
type = cls .default_package_type ,
303
- name = gem .name ,
304
- version = gem .version ,
305
306
dependencies = deps ,
306
- ** urls
307
+ primary_language = cls . default_primary_language ,
307
308
)
308
309
309
310
0 commit comments