@@ -34,30 +34,55 @@ def parse(cls, location, package_only=False):
34
34
api_version = data .get ("api" )
35
35
buildpack = data .get ("buildpack" , {})
36
36
if not buildpack :
37
- return # Skip files missing required fields
37
+ return
38
38
39
+ name = buildpack .get ("name" )
40
+ if not name :
41
+ return
42
+
43
+ # Initialize common package data
44
+ package_data = dict (
45
+ datasource_id = cls .datasource_id ,
46
+ type = cls .default_package_type ,
47
+ name = name ,
48
+ version = "unknown" ,
49
+ description = None ,
50
+ homepage_url = None ,
51
+ keywords = [],
52
+ declared_license_expression = None ,
53
+ dependencies = [],
54
+ )
55
+
56
+ # Handle Paketo-specific fields if present
57
+ if "api" in data :
58
+ cls .handle_paketo_buildpack (data , buildpack , package_data )
59
+
60
+ # Handle Heroku-specific fields if present
61
+ elif "publish" in data and "Ignore" in data ["publish" ]:
62
+ cls .handle_heroku_buildpack (data , buildpack , package_data )
63
+
64
+ yield models .PackageData .from_data (package_data , package_only )
65
+
66
+ @staticmethod
67
+ def handle_paketo_buildpack (data , buildpack , package_data ):
39
68
buildpack_id = buildpack .get ("id" )
40
- buildpack_version = buildpack . get ( "version" , "unknown" )
41
- buildpack_name = buildpack . get ( "name" )
69
+ if buildpack_id :
70
+ package_data [ "extra_data" ] = { "id" : buildpack_id }
42
71
43
- if not (api_version and buildpack_id and buildpack_version and buildpack_name ):
44
- return # Skip incomplete data
72
+ package_data .update ({
73
+ "version" : buildpack .get ("version" , "unknown" ),
74
+ "description" : buildpack .get ("description" ),
75
+ "homepage_url" : buildpack .get ("homepage" ),
76
+ "keywords" : buildpack .get ("keywords" , []),
77
+ })
45
78
46
- # Optional fields
47
- description = buildpack .get ("description" )
48
- homepage_url = buildpack .get ("homepage" )
49
79
licenses = buildpack .get ("licenses" , [])
50
- keywords = buildpack .get ("keywords" , [])
51
-
52
- # Parse licenses
53
- license_expressions = []
54
- for license_entry in licenses :
55
- license_type = license_entry .get ("type" )
56
- license_uri = license_entry .get ("uri" )
57
- if license_type :
58
- license_expressions .append (license_type )
80
+ license_expressions = [
81
+ license_entry .get ("type" ) for license_entry in licenses if license_entry .get ("type" )
82
+ ]
83
+ if license_expressions :
84
+ package_data ["declared_license_expression" ] = " AND " .join (license_expressions )
59
85
60
- # Parse dependencies from "metadata.dependencies"
61
86
dependencies = []
62
87
metadata = data .get ("metadata" , {})
63
88
metadata_dependencies = metadata .get ("dependencies" , [])
@@ -84,7 +109,6 @@ def parse(cls, location, package_only=False):
84
109
)
85
110
)
86
111
87
- # Parse "order" section for additional dependencies
88
112
orders = data .get ("order" , [])
89
113
for order in orders :
90
114
for group in order .get ("group" , []):
@@ -100,17 +124,20 @@ def parse(cls, location, package_only=False):
100
124
)
101
125
)
102
126
103
- package_data = dict (
104
- datasource_id = cls .datasource_id ,
105
- type = cls .default_package_type ,
106
- name = buildpack_name ,
107
- version = buildpack_version ,
108
- description = description ,
109
- homepage_url = homepage_url ,
110
- keywords = keywords ,
111
- declared_license_expression = " AND " .join (license_expressions ) if license_expressions else None ,
112
- dependencies = dependencies ,
113
- extra_data = {"id" : buildpack_id }, # Store the id in extra_data
114
- )
127
+ package_data ["dependencies" ] = dependencies
128
+
129
+ @staticmethod
130
+ def handle_heroku_buildpack (data , buildpack , package_data ):
131
+ publish_section = data .get ("publish" , {})
132
+ if "Ignore" in publish_section :
133
+ ignore_files = publish_section ["Ignore" ].get ("files" , [])
134
+ if ignore_files : # Only add if files are found
135
+ package_data ["extra_data" ] = {"ignore_files" : ignore_files }
136
+ else :
137
+ package_data ["extra_data" ] = {"ignore_files" : []}
138
+ else :
139
+ package_data ["extra_data" ] = {"ignore_files" : []}
115
140
116
- yield models .PackageData .from_data (package_data , package_only )
141
+ # Add description for Heroku buildpack
142
+ package_data ["description" ] = f"Heroku buildpack for { buildpack .get ('name' )} "
143
+
0 commit comments