Top-level package instance assembled from parsed package data collected from one or more data files such as manifests or lockfiles.
| 1601 | |
| 1602 | @attr.attributes(slots=True) |
| 1603 | class Package(PackageData): |
| 1604 | """ |
| 1605 | Top-level package instance assembled from parsed package data collected |
| 1606 | from one or more data files such as manifests or lockfiles. |
| 1607 | """ |
| 1608 | |
| 1609 | package_uid = String( |
| 1610 | label='Package unique id', |
| 1611 | help='A unique identifier for this package instance.' |
| 1612 | 'Consists of the package purl with a UUID qualifier.' |
| 1613 | ) |
| 1614 | |
| 1615 | datafile_paths = List( |
| 1616 | item_type=str, |
| 1617 | label='List of datafile paths', |
| 1618 | help='List of datafile paths used to create this package.' |
| 1619 | ) |
| 1620 | |
| 1621 | datasource_ids = List( |
| 1622 | item_type=str, |
| 1623 | label='datasource ids', |
| 1624 | help='List of the datasource ids used to create this package.' |
| 1625 | ) |
| 1626 | |
| 1627 | def __attrs_post_init__(self, *args, **kwargs): |
| 1628 | if not self.purl: |
| 1629 | self.purl = self.set_purl() |
| 1630 | if not self.package_uid: |
| 1631 | self.package_uid = build_package_uid(self.purl) |
| 1632 | |
| 1633 | def to_dict(self): |
| 1634 | return super().to_dict(with_details=False) |
| 1635 | |
| 1636 | def to_package_data(self): |
| 1637 | mapping = super().to_dict(with_details=True) |
| 1638 | mapping.pop('package_uid', None) |
| 1639 | mapping.pop('datafile_paths', None) |
| 1640 | mapping.pop('datasource_ids', None) |
| 1641 | return PackageData.from_dict(mapping) |
| 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 |
no test coverage detected