@@ -59,36 +59,54 @@ class Pod
59
59
CHECKSUM_ALGORITHM = 'SHA-1'
60
60
HOMEPAGE_REFERENCE_TYPE = 'website'
61
61
62
+ def source_qualifier
63
+ return '' if source . nil? || source . source_qualifier . empty?
64
+
65
+ "?#{ source . source_qualifier . map do |key , value |
66
+ "#{ key } =#{ CGI . escape ( value ) } "
67
+ end . join ( '&' ) } "
68
+ end
69
+
70
+ def purl_subpath
71
+ return '' unless name . split ( '/' ) . length > 1
72
+
73
+ "##{ name . split ( '/' ) . drop ( 1 ) . map do |component |
74
+ CGI . escape ( component )
75
+ end . join ( '/' ) } "
76
+ end
77
+
62
78
def purl
63
79
purl_name = CGI . escape ( name . split ( '/' ) . first )
64
- source_qualifier = if source . nil? || source . source_qualifier . empty?
65
- ''
66
- else
67
- "?#{ source . source_qualifier . map do |key , value |
68
- "#{ key } =#{ CGI . escape ( value ) } "
69
- end . join ( '&' ) } "
70
- end
71
- purl_subpath = if name . split ( '/' ) . length > 1
72
- "##{ name . split ( '/' ) . drop ( 1 ) . map do |component |
73
- CGI . escape ( component )
74
- end . join ( '/' ) } "
75
- else
76
- ''
77
- end
78
- "pkg:cocoapods/#{ purl_name } @#{ CGI . escape ( version . to_s ) } #{ source_qualifier } #{ purl_subpath } "
80
+ src_qualifier = source_qualifier
81
+ subpath = purl_subpath
82
+ "pkg:cocoapods/#{ purl_name } @#{ CGI . escape ( version . to_s ) } #{ src_qualifier } #{ subpath } "
83
+ end
84
+
85
+ def xml_add_author ( xml , trim_strings_length )
86
+ return if author . nil?
87
+
88
+ if trim_strings_length . zero?
89
+ xml . author author
90
+ xml . publisher author
91
+ else
92
+ xml . author author . slice ( 0 , trim_strings_length )
93
+ xml . publisher author . slice ( 0 , trim_strings_length )
94
+ end
95
+ end
96
+
97
+ def xml_add_homepage ( xml )
98
+ return if homepage . nil?
99
+
100
+ xml . externalReferences do
101
+ xml . reference ( type : HOMEPAGE_REFERENCE_TYPE ) do
102
+ xml . url homepage
103
+ end
104
+ end
79
105
end
80
106
81
107
def add_to_bom ( xml , trim_strings_length = 0 )
82
108
xml . component ( type : 'library' ) do
83
- unless author . nil?
84
- if trim_strings_length . zero?
85
- xml . author author
86
- xml . publisher author
87
- else
88
- xml . author author . slice ( 0 , trim_strings_length )
89
- xml . publisher author . slice ( 0 , trim_strings_length )
90
- end
91
- end
109
+ xml_add_author ( xml , trim_strings_length )
92
110
xml . name name
93
111
xml . version version . to_s
94
112
xml . description { xml . cdata description } unless description . nil?
@@ -108,13 +126,7 @@ def add_to_bom(xml, trim_strings_length = 0)
108
126
xml . purl purl . slice ( 0 , trim_strings_length )
109
127
end
110
128
xml . bomRef purl
111
- unless homepage . nil?
112
- xml . externalReferences do
113
- xml . reference ( type : HOMEPAGE_REFERENCE_TYPE ) do
114
- xml . url homepage
115
- end
116
- end
117
- end
129
+ xml_add_homepage ( xml )
118
130
end
119
131
end
120
132
@@ -162,29 +174,39 @@ def bom(version: 1, trim_strings_length: 0)
162
174
"Incorrect string length: #{ trim_strings_length } should be an integer greater than 0"
163
175
end
164
176
177
+ unchecked_bom ( version : version , trim_strings_length : trim_strings_length )
178
+ end
179
+
180
+ private
181
+
182
+ # does not verify parameters because the public method does that.
183
+ def unchecked_bom ( version : 1 , trim_strings_length : 0 )
165
184
Nokogiri ::XML ::Builder . new ( encoding : 'UTF-8' ) do |xml |
166
185
xml . bom ( xmlns : NAMESPACE , version : version . to_i . to_s , serialNumber : "urn:uuid:#{ SecureRandom . uuid } " ) do
167
186
bom_metadata ( xml )
168
- xml . components do
169
- pods . each do |pod |
170
- pod . add_to_bom ( xml , trim_strings_length )
171
- end
172
- end
173
187
174
- xml . dependencies do
175
- bom_dependencies ( xml , dependencies )
176
- end
188
+ bom_components ( xml , pods , trim_strings_length )
189
+
190
+ bom_dependencies ( xml , dependencies )
177
191
end
178
192
end . to_xml
179
193
end
180
194
181
- private
195
+ def bom_components ( xml , pods , trim_strings_length )
196
+ xml . components do
197
+ pods . each do |pod |
198
+ pod . add_to_bom ( xml , trim_strings_length )
199
+ end
200
+ end
201
+ end
182
202
183
203
def bom_dependencies ( xml , dependencies )
184
- dependencies &.each do |key , array |
185
- xml . dependency ( ref : key ) do
186
- array . sort . each do |value |
187
- xml . dependency ( ref : value )
204
+ xml . dependencies do
205
+ dependencies &.each do |key , array |
206
+ xml . dependency ( ref : key ) do
207
+ array . sort . each do |value |
208
+ xml . dependency ( ref : value )
209
+ end
188
210
end
189
211
end
190
212
end
@@ -193,16 +215,20 @@ def bom_dependencies(xml, dependencies)
193
215
def bom_metadata ( xml )
194
216
xml . metadata do
195
217
xml . timestamp Time . now . getutc . strftime ( '%Y-%m-%dT%H:%M:%SZ' )
196
- xml . tools do
197
- xml . tool do
198
- xml . vendor 'CycloneDX'
199
- xml . name 'cyclonedx-cocoapods'
200
- xml . version VERSION
201
- end
202
- end
218
+ bom_tools ( xml )
203
219
component &.add_to_bom ( xml )
204
220
end
205
221
end
222
+
223
+ def bom_tools ( xml )
224
+ xml . tools do
225
+ xml . tool do
226
+ xml . vendor 'CycloneDX'
227
+ xml . name 'cyclonedx-cocoapods'
228
+ xml . version VERSION
229
+ end
230
+ end
231
+ end
206
232
end
207
233
end
208
234
end
0 commit comments