@@ -1532,13 +1532,14 @@ def get_extension(packaging):
15321532 return packaging
15331533 else :
15341534 return 'jar'
1535-
1535+
15361536class GradleModuleMetadataHandler (MavenBasePackageHandler ):
15371537 """
15381538 Handler for Gradle Module Metadata files (.module).
1539- Specification: https://github.com/gradle/gradle/blob/master/platforms/documentation/docs/src/docs/design/gradle-module-metadata-latest-specification.md
1539+ Specification: https://github.com/gradle/gradle/blob/master/platforms/documentation/docs/src/docs/design/gradle-module-metadata-latest-specification.md
15401540 Example: https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.module
15411541 """
1542+
15421543 datasource_id = 'gradle_module_metadata'
15431544 path_patterns = ('*.module' ,)
15441545 default_package_type = 'maven'
@@ -1553,50 +1554,50 @@ def parse(cls, location, package_only=False, base_url='https://repo1.maven.org/m
15531554 """
15541555 with io .open (location , encoding = 'utf-8' ) as f :
15551556 module_data = json .load (f )
1556-
1557+
15571558 if TRACE :
15581559 logger .debug (f'GradleModuleMetadataHandler.parse: module_data: { module_data !r} ' )
1559-
1560+
15601561 component = module_data .get ('component' , {})
15611562 namespace = component .get ('group' )
15621563 name = component .get ('module' )
15631564 version = component .get ('version' )
1564-
1565+
15651566 if not (namespace and name and version ):
15661567 if TRACE :
15671568 logger .debug (
15681569 f'GradleModuleMetadataHandler.parse: Incomplete GAV: '
15691570 f'"{ namespace } ":"{ name } ":"{ version } "'
15701571 )
15711572 return
1572-
1573+
15731574 format_version = module_data .get ('formatVersion' )
1574-
1575+
15751576 created_by = module_data .get ('createdBy' , {})
15761577 gradle_info = created_by .get ('gradle' , {})
15771578 gradle_version = gradle_info .get ('version' )
1578-
1579+
15791580 component_attributes = component .get ('attributes' , {})
15801581 gradle_status = component_attributes .get ('org.gradle.status' )
1581-
1582+
15821583 variants = module_data .get ('variants' , [])
15831584 primary_file_data = cls ._extract_primary_file_data (variants , name , version )
15841585 variants_data = cls ._extract_variants_metadata (variants )
1585-
1586+
15861587 extra_data = {
15871588 'format_version' : format_version ,
15881589 'gradle_version' : gradle_version ,
15891590 'gradle_status' : gradle_status ,
15901591 'component_attributes' : component_attributes ,
15911592 'variants' : variants_data ,
15921593 }
1593-
1594+
15941595 # Remove empty values
15951596 extra_data = {k : v for k , v in extra_data .items () if v }
1596-
1597+
15971598 urls = cls ._build_urls (namespace , name , version , base_url )
15981599 description = cls ._build_description (name , version , gradle_status )
1599-
1600+
16001601 package_data = dict (
16011602 datasource_id = cls .datasource_id ,
16021603 type = cls .default_package_type ,
@@ -1609,9 +1610,9 @@ def parse(cls, location, package_only=False, base_url='https://repo1.maven.org/m
16091610 ** urls ,
16101611 ** primary_file_data ,
16111612 )
1612-
1613+
16131614 yield models .PackageData .from_data (package_data , package_only )
1614-
1615+
16151616 @classmethod
16161617 def _extract_primary_file_data (cls , variants , name , version ):
16171618 """
@@ -1622,64 +1623,63 @@ def _extract_primary_file_data(cls, variants, name, version):
16221623 3. any variant containing the primary JAR
16231624 """
16241625 primary_jar_name = f'{ name } -{ version } .jar'
1625-
1626+
16261627 def iter_files (variants ):
16271628 for variant in variants :
16281629 for file_info in variant .get ('files' , []) or []:
16291630 yield variant .get ('name' ), file_info
1630-
1631+
16311632 # Index files by variant name
16321633 files_by_variant = {}
16331634 for variant_name , file_info in iter_files (variants ):
16341635 if file_info .get ('name' ) == primary_jar_name :
16351636 files_by_variant .setdefault (variant_name , []).append (file_info )
1636-
1637+
16371638 # Try preferred variants first
16381639 for preferred in ('apiElements' , 'runtimeElements' ):
16391640 for file_info in files_by_variant .get (preferred , []):
16401641 data = cls ._extract_file_checksums (file_info )
16411642 if data :
16421643 return data
1643-
1644+
16441645 # Fallback to any variant
16451646 for files in files_by_variant .values ():
16461647 for file_info in files :
16471648 data = cls ._extract_file_checksums (file_info )
16481649 if data :
16491650 return data
1650-
1651+
16511652 return {}
1652-
1653+
16531654 @classmethod
16541655 def _extract_file_checksums (cls , file_info ):
16551656 """
16561657 Extract checksum and size information from a file info dictionary.
16571658 """
16581659 checksums = {}
16591660 checksum_fields = ['sha1' , 'sha256' , 'sha512' , 'md5' , 'size' ]
1660-
1661+
16611662 for field in checksum_fields :
16621663 if file_info .get (field ):
16631664 checksums [field ] = file_info [field ]
1664-
1665+
16651666 return checksums
1666-
1667+
16671668 @classmethod
16681669 def _extract_variants_metadata (cls , variants ):
16691670 """
16701671 Extract non-semantic metadata about each variant.
16711672 """
16721673 variants_metadata = []
1673-
16741674 for variant in variants :
16751675 variant_info = {
16761676 'name' : variant .get ('name' ),
16771677 }
1678-
1678+
16791679 attributes = variant .get ('attributes' )
16801680 if attributes :
16811681 variant_info ['attributes' ] = attributes
1682-
1682+
16831683 files = variant .get ('files' ) or []
16841684 if files :
16851685 variant_info ['files' ] = [
@@ -1690,11 +1690,11 @@ def _extract_variants_metadata(cls, variants):
16901690 }
16911691 for f in files
16921692 ]
1693-
1693+
16941694 variants_metadata .append (variant_info )
1695-
1695+
16961696 return variants_metadata
1697-
1697+
16981698 @classmethod
16991699 def _build_urls (cls , namespace , name , version , base_url ):
17001700 """
@@ -1703,13 +1703,13 @@ def _build_urls(cls, namespace, name, version, base_url):
17031703 # Build repository path
17041704 namespace_path = namespace .replace ('.' , '/' )
17051705 repo_path = f'{ namespace_path } /{ name } /{ version } '
1706-
1706+
17071707 return {
17081708 'repository_homepage_url' : f'{ base_url } /{ repo_path } /' ,
17091709 'repository_download_url' : f'{ base_url } /{ repo_path } /{ name } -{ version } .jar' ,
17101710 'api_data_url' : f'{ base_url } /{ repo_path } /{ name } -{ version } .module' ,
17111711 }
1712-
1712+
17131713 @classmethod
17141714 def _build_description (cls , name , version , gradle_status ):
17151715 """
@@ -1720,9 +1720,9 @@ def _build_description(cls, name, version, gradle_status):
17201720 desc_parts .append (f'version { version } ' )
17211721 if gradle_status :
17221722 desc_parts .append (f'(status: { gradle_status } )' )
1723-
1723+
17241724 return ' ' .join (desc_parts )
1725-
1725+
17261726 @classmethod
17271727 def assign_package_to_resources (cls , package , resource , codebase , package_adder ):
17281728 """
@@ -1735,7 +1735,7 @@ def assign_package_to_resources(cls, package, resource, codebase, package_adder)
17351735 codebase ,
17361736 package_adder
17371737 )
1738-
1738+
17391739 return models .DatafileHandler .assign_package_to_resources (
17401740 package ,
17411741 resource = resource ,
0 commit comments