Return a Package from a ``package_data`` PackageData object or mapping. Or None.
(cls, package_data, datafile_path=None, package_only=False)
| 1642 | |
| 1643 | @classmethod |
| 1644 | def from_package_data(cls, package_data, datafile_path=None, package_only=False): |
| 1645 | """ |
| 1646 | Return a Package from a ``package_data`` PackageData object |
| 1647 | or mapping. Or None. |
| 1648 | """ |
| 1649 | if isinstance(package_data, PackageData): |
| 1650 | package_data_mapping = package_data.to_dict() |
| 1651 | dsid = package_data.datasource_id |
| 1652 | elif isinstance(package_data, dict): |
| 1653 | # make a copy |
| 1654 | package_data_mapping = dict(package_data.items()) |
| 1655 | dsid = package_data['datasource_id'] |
| 1656 | elif package_data: |
| 1657 | raise Exception(f'Invalid type: {package_data!r}', package_data) |
| 1658 | |
| 1659 | package_data_mapping['datasource_ids'] = [dsid] |
| 1660 | |
| 1661 | if datafile_path: |
| 1662 | package_data_mapping['datafile_paths'] = [datafile_path] |
| 1663 | license_detections = package_data_mapping.get('license_detections', []) |
| 1664 | for detection in license_detections: |
| 1665 | for license_match in detection['matches']: |
| 1666 | if not license_match['from_file']: |
| 1667 | license_match['from_file'] = datafile_path |
| 1668 | |
| 1669 | package = cls.from_dict(package_data_mapping) |
| 1670 | |
| 1671 | if not package.package_uid: |
| 1672 | package.package_uid = build_package_uid(package.purl) |
| 1673 | |
| 1674 | if not package_only: |
| 1675 | package.populate_license_fields() |
| 1676 | package.populate_holder_field() |
| 1677 | |
| 1678 | return package |
| 1679 | |
| 1680 | @classmethod |
| 1681 | def from_dict(cls, mapping): |
no test coverage detected