@@ -718,10 +718,38 @@ class PackageData(IdentifiablePackageData):
718718 repr = True ,
719719 )
720720
721+ @classmethod
722+ def from_data (cls , package_data , package_only = False ):
723+ """
724+ Return PackageData object created out of the package metadata
725+ present in `package_data` mapping. Also populate license and
726+ copyright holder fields by computing them from extracted license
727+ statement and extracted copyright.
721728
722- def __attrs_post_init__ (self , * args , ** kwargs ):
723- self .populate_license_fields ()
724- self .populate_holder_field ()
729+ Skip the license/copyright detection step if `package_only` is True.
730+ """
731+ package_data = cls (** package_data )
732+
733+ if not package_only :
734+ package_data .populate_license_fields ()
735+ package_data .populate_holder_field ()
736+ else :
737+ package_data .normalize_extracted_license_statement ()
738+
739+ return package_data
740+
741+ def normalize_extracted_license_statement (self ):
742+ """
743+ Normalizes the extracted license statement to a readable
744+ YAML string if it was a pythonic object.
745+ """
746+ if (
747+ self .extracted_license_statement and
748+ not isinstance (self .extracted_license_statement , str )
749+ ):
750+ self .extracted_license_statement = saneyaml .dump (
751+ self .extracted_license_statement
752+ )
725753
726754 def populate_holder_field (self ):
727755 if not self .copyright :
@@ -781,8 +809,7 @@ def populate_license_fields(self):
781809 f"license_detections: { self .license_detections } "
782810 )
783811
784- if self .extracted_license_statement and not isinstance (self .extracted_license_statement , str ):
785- self .extracted_license_statement = saneyaml .dump (self .extracted_license_statement )
812+ self .normalize_extracted_license_statement ()
786813
787814 def update_purl_fields (self , package_data , replace = False ):
788815
@@ -905,17 +932,6 @@ def get_license_detections_and_expression(self):
905932 )
906933
907934
908- class PackageDataOnly (PackageData ):
909- """
910- PackageData class which skips the license/copyright detection during instance
911- creation.
912- """
913-
914- def __attrs_post_init__ (self ):
915- if self .extracted_license_statement and not isinstance (self .extracted_license_statement , str ):
916- self .extracted_license_statement = saneyaml .dump (self .extracted_license_statement )
917-
918-
919935def get_default_relation_license (datasource_id ):
920936 from packagedcode import HANDLER_BY_DATASOURCE_ID
921937 handler = HANDLER_BY_DATASOURCE_ID [datasource_id ]
0 commit comments