| 238 | |
| 239 | @classmethod |
| 240 | def parse(cls, location, package_only=False): |
| 241 | gemfile_lock = GemfileLockParser(location) |
| 242 | all_gems = list(gemfile_lock.all_gems.values()) |
| 243 | if not all_gems: |
| 244 | return |
| 245 | |
| 246 | primary_gem = gemfile_lock.primary_gem |
| 247 | if primary_gem: |
| 248 | deps = [ |
| 249 | models.DependentPackage( |
| 250 | purl=PackageURL( |
| 251 | type='gem', |
| 252 | name=dep.name, |
| 253 | version=dep.version |
| 254 | ).to_string(), |
| 255 | extracted_requirement=', '.join(dep.requirements), |
| 256 | scope='dependencies', |
| 257 | is_runtime=True, |
| 258 | is_optional=False, |
| 259 | is_pinned=True, |
| 260 | ) for dep in all_gems if dep != primary_gem |
| 261 | ] |
| 262 | urls = get_urls(primary_gem.name, primary_gem.version) |
| 263 | |
| 264 | package_data = dict( |
| 265 | datasource_id=cls.datasource_id, |
| 266 | primary_language=cls.default_primary_language, |
| 267 | type=cls.default_package_type, |
| 268 | name=primary_gem.name, |
| 269 | version=primary_gem.version, |
| 270 | dependencies=deps, |
| 271 | **urls |
| 272 | ) |
| 273 | yield models.PackageData.from_data(package_data, package_only) |
| 274 | else: |
| 275 | deps = [ |
| 276 | models.DependentPackage( |
| 277 | purl=PackageURL( |
| 278 | type='gem', |
| 279 | name=gem.name, |
| 280 | version=gem.version |
| 281 | ).to_string(), |
| 282 | extracted_requirement=', '.join(gem.requirements), |
| 283 | # FIXME: get proper scope... This does not seem right |
| 284 | scope='dependencies', |
| 285 | is_runtime=True, |
| 286 | is_optional=False, |
| 287 | is_pinned=True, |
| 288 | ) for gem in all_gems |
| 289 | ] |
| 290 | |
| 291 | package_data = dict( |
| 292 | datasource_id=cls.datasource_id, |
| 293 | type=cls.default_package_type, |
| 294 | dependencies=deps, |
| 295 | primary_language=cls.default_primary_language, |
| 296 | ) |
| 297 | yield models.PackageData.from_data(package_data, package_only) |