Skip to content

Commit 71254cc

Browse files
Sophie Wigmoreryanmoran
Sophie Wigmore
authored andcommitted
Make dependency license an interface
1 parent 9dbcc2e commit 71254cc

File tree

2 files changed

+327
-14
lines changed

2 files changed

+327
-14
lines changed

cargo/config.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,18 @@ type ConfigMetadata struct {
4747
}
4848

4949
type ConfigMetadataDependency struct {
50-
CPE string `toml:"cpe" json:"cpe,omitempty"`
51-
PURL string `toml:"purl" json:"purl,omitempty"`
52-
DeprecationDate *time.Time `toml:"deprecation_date" json:"deprecation_date,omitempty"`
53-
ID string `toml:"id" json:"id,omitempty"`
54-
Licenses []string `toml:"licenses" json:"licenses,omitempty"`
55-
Name string `toml:"name" json:"name,omitempty"`
56-
SHA256 string `toml:"sha256" json:"sha256,omitempty"`
57-
Source string `toml:"source" json:"source,omitempty"`
58-
SourceSHA256 string `toml:"source_sha256" json:"source_sha256,omitempty"`
59-
Stacks []string `toml:"stacks" json:"stacks,omitempty"`
60-
URI string `toml:"uri" json:"uri,omitempty"`
61-
Version string `toml:"version" json:"version,omitempty"`
50+
CPE string `toml:"cpe" json:"cpe,omitempty"`
51+
PURL string `toml:"purl" json:"purl,omitempty"`
52+
DeprecationDate *time.Time `toml:"deprecation_date" json:"deprecation_date,omitempty"`
53+
ID string `toml:"id" json:"id,omitempty"`
54+
Licenses []interface{} `toml:"licenses" json:"licenses,omitempty"`
55+
Name string `toml:"name" json:"name,omitempty"`
56+
SHA256 string `toml:"sha256" json:"sha256,omitempty"`
57+
Source string `toml:"source" json:"source,omitempty"`
58+
SourceSHA256 string `toml:"source_sha256" json:"source_sha256,omitempty"`
59+
Stacks []string `toml:"stacks" json:"stacks,omitempty"`
60+
URI string `toml:"uri" json:"uri,omitempty"`
61+
Version string `toml:"version" json:"version,omitempty"`
6262
}
6363

6464
type ConfigMetadataDependencyConstraint struct {

cargo/config_test.go

+315-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func testConfig(t *testing.T, context spec.G, it spec.S) {
6666
PURL: "some-purl",
6767
DeprecationDate: &deprecationDate,
6868
ID: "some-dependency",
69-
Licenses: []string{"fancy-license", "fancy-license-2"},
69+
Licenses: []interface{}{"fancy-license", "fancy-license-2"},
7070
Name: "Some Dependency",
7171
SHA256: "shasum",
7272
Source: "source",
@@ -164,6 +164,163 @@ api = "0.2"
164164
`))
165165
})
166166

167+
context("when the config dependency licenses are structured like ConfigBuildpackLicenses", func() {
168+
it("encodes the config to TOML", func() {
169+
deprecationDate, err := time.Parse(time.RFC3339, "2020-06-01T00:00:00Z")
170+
Expect(err).NotTo(HaveOccurred())
171+
172+
err = cargo.EncodeConfig(buffer, cargo.Config{
173+
API: "0.2",
174+
Buildpack: cargo.ConfigBuildpack{
175+
ID: "some-buildpack-id",
176+
Name: "some-buildpack-name",
177+
Version: "some-buildpack-version",
178+
Homepage: "some-homepage-link",
179+
Licenses: []cargo.ConfigBuildpackLicense{
180+
{
181+
Type: "some-license-type",
182+
URI: "some-license-uri",
183+
},
184+
},
185+
},
186+
Stacks: []cargo.ConfigStack{
187+
{
188+
ID: "some-stack-id",
189+
Mixins: []string{"some-mixin-id"},
190+
},
191+
{
192+
ID: "other-stack-id",
193+
},
194+
},
195+
Metadata: cargo.ConfigMetadata{
196+
IncludeFiles: []string{
197+
"some-include-file",
198+
"other-include-file",
199+
},
200+
Unstructured: map[string]interface{}{"some-map": []map[string]interface{}{{"key": "value"}}},
201+
PrePackage: "some-pre-package-script.sh",
202+
Dependencies: []cargo.ConfigMetadataDependency{
203+
{
204+
CPE: "some-cpe",
205+
PURL: "some-purl",
206+
DeprecationDate: &deprecationDate,
207+
ID: "some-dependency",
208+
Licenses: []interface{}{
209+
cargo.ConfigBuildpackLicense{
210+
Type: "fancy-license",
211+
URI: "some-license-uri",
212+
},
213+
cargo.ConfigBuildpackLicense{
214+
Type: "fancy-license-2",
215+
URI: "some-license-uri",
216+
},
217+
},
218+
Name: "Some Dependency",
219+
SHA256: "shasum",
220+
Source: "source",
221+
SourceSHA256: "source-shasum",
222+
Stacks: []string{"io.buildpacks.stacks.bionic", "org.cloudfoundry.stacks.tiny"},
223+
URI: "http://some-url",
224+
Version: "1.2.3",
225+
},
226+
},
227+
DependencyConstraints: []cargo.ConfigMetadataDependencyConstraint{
228+
{
229+
ID: "some-dependency",
230+
Constraint: "1.*",
231+
Patches: 1,
232+
},
233+
},
234+
DefaultVersions: map[string]string{
235+
"some-dependency": "1.2.x",
236+
},
237+
},
238+
Order: []cargo.ConfigOrder{
239+
{
240+
Group: []cargo.ConfigOrderGroup{
241+
{
242+
ID: "some-dependency",
243+
Version: "some-version"},
244+
{
245+
ID: "other-dependency",
246+
Version: "other-version",
247+
Optional: true,
248+
},
249+
},
250+
},
251+
},
252+
})
253+
Expect(err).NotTo(HaveOccurred())
254+
Expect(buffer.String()).To(MatchTOML(`
255+
api = "0.2"
256+
257+
[buildpack]
258+
id = "some-buildpack-id"
259+
name = "some-buildpack-name"
260+
version = "some-buildpack-version"
261+
homepage = "some-homepage-link"
262+
263+
[[buildpack.licenses]]
264+
type = "some-license-type"
265+
uri = "some-license-uri"
266+
267+
[metadata]
268+
include-files = ["some-include-file", "other-include-file"]
269+
pre-package = "some-pre-package-script.sh"
270+
271+
[metadata.default-versions]
272+
some-dependency = "1.2.x"
273+
274+
[[metadata.dependencies]]
275+
cpe = "some-cpe"
276+
purl = "some-purl"
277+
deprecation_date = "2020-06-01T00:00:00Z"
278+
id = "some-dependency"
279+
name = "Some Dependency"
280+
sha256 = "shasum"
281+
source = "source"
282+
source_sha256 = "source-shasum"
283+
stacks = ["io.buildpacks.stacks.bionic", "org.cloudfoundry.stacks.tiny"]
284+
uri = "http://some-url"
285+
version = "1.2.3"
286+
287+
[[metadata.dependencies.licenses]]
288+
type = "fancy-license"
289+
uri = "some-license-uri"
290+
291+
[[metadata.dependencies.licenses]]
292+
type = "fancy-license-2"
293+
uri = "some-license-uri"
294+
295+
[[metadata.dependency-constraints]]
296+
id = "some-dependency"
297+
constraint = "1.*"
298+
patches = 1
299+
300+
[[metadata.some-map]]
301+
key = "value"
302+
303+
[[stacks]]
304+
id = "some-stack-id"
305+
mixins = ["some-mixin-id"]
306+
307+
[[stacks]]
308+
id = "other-stack-id"
309+
310+
[[order]]
311+
[[order.group]]
312+
id = "some-dependency"
313+
version = "some-version"
314+
315+
[[order.group]]
316+
id = "other-dependency"
317+
version = "other-version"
318+
optional = true
319+
`))
320+
})
321+
322+
})
323+
167324
context("failure cases", func() {
168325
context("when the Config cannot be marshalled to json", func() {
169326
it("returns an error", func() {
@@ -296,7 +453,7 @@ api = "0.2"
296453
CPE: "some-cpe",
297454
PURL: "some-purl",
298455
ID: "some-dependency",
299-
Licenses: []string{"fancy-license", "fancy-license-2"},
456+
Licenses: []interface{}{"fancy-license", "fancy-license-2"},
300457
Name: "Some Dependency",
301458
SHA256: "shasum",
302459
Source: "source",
@@ -336,6 +493,162 @@ api = "0.2"
336493
}))
337494
})
338495

496+
context("dependency license are not a list of IDs", func() {
497+
it("decodes TOML to config", func() {
498+
tomlBuffer := strings.NewReader(`
499+
api = "0.2"
500+
501+
[buildpack]
502+
id = "some-buildpack-id"
503+
name = "some-buildpack-name"
504+
version = "some-buildpack-version"
505+
homepage = "some-homepage-link"
506+
507+
[[buildpack.licenses]]
508+
type = "some-license-type"
509+
uri = "some-license-uri"
510+
511+
[metadata]
512+
include-files = ["some-include-file", "other-include-file"]
513+
pre-package = "some-pre-package-script.sh"
514+
515+
[metadata.default-versions]
516+
some-dependency = "1.2.x"
517+
518+
[[metadata.some-map]]
519+
key = "value"
520+
521+
[[metadata.dependencies]]
522+
cpe = "some-cpe"
523+
purl = "some-purl"
524+
id = "some-dependency"
525+
name = "Some Dependency"
526+
sha256 = "shasum"
527+
source = "source"
528+
source_sha256 = "source-shasum"
529+
stacks = ["io.buildpacks.stacks.bionic", "org.cloudfoundry.stacks.tiny"]
530+
uri = "http://some-url"
531+
version = "1.2.3"
532+
533+
[[metadata.dependencies.licenses]]
534+
type = "fancy-license"
535+
uri = "some-license-uri"
536+
537+
[[metadata.dependencies.licenses]]
538+
type = "fancy-license-2"
539+
uri = "some-license-uri"
540+
541+
[[metadata.dependency-constraints]]
542+
id = "some-dependency"
543+
constraint = "1.*"
544+
patches = 1
545+
546+
[[stacks]]
547+
id = "some-stack-id"
548+
mixins = ["some-mixin-id"]
549+
550+
[[stacks]]
551+
id = "other-stack-id"
552+
553+
[[order]]
554+
[[order.group]]
555+
id = "some-dependency"
556+
version = "some-version"
557+
558+
[[order.group]]
559+
id = "other-dependency"
560+
version = "other-version"
561+
optional = true
562+
`)
563+
564+
var config cargo.Config
565+
Expect(cargo.DecodeConfig(tomlBuffer, &config)).To(Succeed())
566+
Expect(config).To(Equal(cargo.Config{
567+
API: "0.2",
568+
Buildpack: cargo.ConfigBuildpack{
569+
ID: "some-buildpack-id",
570+
Name: "some-buildpack-name",
571+
Version: "some-buildpack-version",
572+
Homepage: "some-homepage-link",
573+
Licenses: []cargo.ConfigBuildpackLicense{
574+
{
575+
Type: "some-license-type",
576+
URI: "some-license-uri",
577+
},
578+
},
579+
},
580+
Stacks: []cargo.ConfigStack{
581+
{
582+
ID: "some-stack-id",
583+
Mixins: []string{"some-mixin-id"},
584+
},
585+
{
586+
ID: "other-stack-id",
587+
},
588+
},
589+
Metadata: cargo.ConfigMetadata{
590+
Unstructured: map[string]interface{}{"some-map": json.RawMessage(`[{"key":"value"}]`)},
591+
IncludeFiles: []string{
592+
"some-include-file",
593+
"other-include-file",
594+
},
595+
PrePackage: "some-pre-package-script.sh",
596+
Dependencies: []cargo.ConfigMetadataDependency{
597+
{
598+
CPE: "some-cpe",
599+
PURL: "some-purl",
600+
ID: "some-dependency",
601+
Licenses: []interface{}{
602+
map[string]interface{}{
603+
"type": "fancy-license",
604+
"uri": "some-license-uri",
605+
},
606+
map[string]interface{}{
607+
"type": "fancy-license-2",
608+
"uri": "some-license-uri",
609+
},
610+
},
611+
Name: "Some Dependency",
612+
SHA256: "shasum",
613+
Source: "source",
614+
SourceSHA256: "source-shasum",
615+
Stacks: []string{"io.buildpacks.stacks.bionic", "org.cloudfoundry.stacks.tiny"},
616+
URI: "http://some-url",
617+
Version: "1.2.3",
618+
},
619+
},
620+
DependencyConstraints: []cargo.ConfigMetadataDependencyConstraint{
621+
{
622+
ID: "some-dependency",
623+
Constraint: "1.*",
624+
Patches: 1,
625+
},
626+
},
627+
DefaultVersions: map[string]string{
628+
"some-dependency": "1.2.x",
629+
},
630+
},
631+
Order: []cargo.ConfigOrder{
632+
{
633+
Group: []cargo.ConfigOrderGroup{
634+
{
635+
ID: "some-dependency",
636+
Version: "some-version",
637+
Optional: false,
638+
},
639+
{
640+
ID: "other-dependency",
641+
Version: "other-version",
642+
Optional: true,
643+
},
644+
},
645+
},
646+
},
647+
}))
648+
})
649+
650+
})
651+
339652
context("failure cases", func() {
340653
context("when a bad reader is passed in", func() {
341654
it("returns an error", func() {

0 commit comments

Comments
 (0)