MCPcopy Create free account
hub / github.com/aboutcode-org/scancode-toolkit / build_package_data

Function build_package_data

src/packagedcode/alpine.py:814–873  ·  view source on GitHub ↗

Return a PackageData object from a ``package_fields`` iterable of (name, value) tuples. The ``package_fields`` names are either: - the short form one-letter field names used in an APKINDEX and an installed database file - the long form field names seen in an APKBUILD bu

(package_fields, datasource_id, package_type, package_only=False)

Source from the content-addressed store, hash-verified

812
813
814def build_package_data(package_fields, datasource_id, package_type, package_only=False):
815 """
816 Return a PackageData object from a ``package_fields`` iterable of (name,
817 value) tuples.
818
819 The ``package_fields`` names are either:
820
821 - the short form one-letter field names used in an APKINDEX and an installed
822 database file
823
824 - the long form field names seen in an APKBUILD build manifest/script and an
825 APKINFO data file.
826
827 Note: we do NOT use a dict for ``package_fields`` because some fields names
828 may occur more than once.
829
830 See for details:
831 https://wiki.alpinelinux.org/wiki/Apk_spec#Install_DB
832 https://wiki.alpinelinux.org/wiki/APKBUILD_Reference
833 https://wiki.alpinelinux.org/wiki/Alpine_package_format
834 https://git.alpinelinux.org/apk-tools/tree/src/package.c?id=82de29cf7bad3d9cbb0aeb4dbe756ad2bde73eb3#n774
835 """
836 package_fields = list(package_fields)
837 all_fields = dict(package_fields)
838
839 # mapping of actual Package field name -> value that have been converted to
840 # the expected normalized format
841 converted_fields = {
842 'datasource_id': datasource_id,
843 'type': package_type,
844 }
845 for name, value in package_fields:
846 handler = package_handlers_by_field_name.get(name)
847 if handler:
848 try:
849 converted = handler(value, all_fields=all_fields, **converted_fields)
850 except:
851 raise Exception(*list(package_fields))
852
853 # for extra data we update the existing
854 extra_data = converted.pop('extra_data', {}) or {}
855 if extra_data:
856 existing_extra_data = converted_fields.get('extra_data')
857 if existing_extra_data:
858 existing_extra_data.update(extra_data)
859 else:
860 converted_fields['extra_data'] = dict(extra_data)
861
862 converted_fields.update(converted)
863
864 fields_not_required = ["current_file", "current_dir"]
865 for field in fields_not_required:
866 value = converted_fields.get(field)
867 if value:
868 converted_fields.pop(field)
869
870 return models.PackageData.from_data(
871 package_data=converted_fields,

Callers 2

parse_apkbuild_textFunction · 0.70

Calls 5

from_dataMethod · 0.80
handlerFunction · 0.70
getMethod · 0.65
popMethod · 0.45
updateMethod · 0.45

Tested by

no test coverage detected