Skip to content

Commit 8f33dc6

Browse files
committed
Sort and deduplicate licenses when collecting from Kitfile
Since we're turning all licenses in a Kitfile into a flat list, it makes sense to deduplicate them, as repeated licenses do not provide any additional information.
1 parent e05c943 commit 8f33dc6

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

pkg/artifact/kitfile.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"bytes"
2121
"encoding/json"
2222
"io"
23+
"slices"
2324
"time"
2425

2526
modelspecv1 "github.com/modelpack/model-spec/specs-go/v1"
@@ -191,5 +192,8 @@ func (kf *KitFile) collectLicenses() []string {
191192
for _, code := range kf.Code {
192193
licenses = appendNotEmpty(licenses, code.License)
193194
}
195+
slices.Sort(licenses)
196+
licenses = slices.Compact(licenses)
197+
194198
return licenses
195199
}

pkg/artifact/kitfile_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,109 @@ func loadAllTestCasesOrPanic[T interface{ withName(string) T }](t *testing.T, te
9191
}
9292
return tests
9393
}
94+
95+
func TestCollectLicenses(t *testing.T) {
96+
testcases := []struct {
97+
desc string
98+
kitfile string
99+
licenses []string
100+
}{
101+
{
102+
desc: "Empty kitfile",
103+
kitfile: `
104+
manifestVersion: 1.0.0
105+
`,
106+
licenses: nil,
107+
},
108+
{
109+
desc: "Kitfile with no licenses",
110+
kitfile: `
111+
manifestVersion: 1.0.0
112+
package:
113+
name: "test-package"
114+
model:
115+
path: model-files
116+
`,
117+
licenses: nil,
118+
},
119+
{
120+
desc: "Kitfile with package license",
121+
kitfile: `
122+
manifestVersion: 1.0.0
123+
package:
124+
name: "test-package"
125+
license: "Apache-2.0"
126+
model:
127+
path: model-files
128+
`,
129+
licenses: []string{"Apache-2.0"},
130+
},
131+
{
132+
desc: "Kitfile with multiple licenses, to be sorted",
133+
kitfile: `
134+
manifestVersion: 1.0.0
135+
package:
136+
name: "test-package"
137+
license: "license-g"
138+
model:
139+
path: model-files
140+
license: "license-h"
141+
parts:
142+
- path: part-files
143+
license: "license-f"
144+
- path: part-files
145+
license: "license-e"
146+
datasets:
147+
- path: dataset
148+
license: "license-c"
149+
- path: dataset-extra
150+
license: "license-d"
151+
code:
152+
- path: code
153+
license: "license-b"
154+
- path: code-extra
155+
license: "license-a"
156+
`,
157+
licenses: []string{"license-a", "license-b", "license-c", "license-d", "license-e", "license-f", "license-g", "license-h"},
158+
},
159+
{
160+
desc: "Kitfile with multiple licenses, to be deduplicated",
161+
kitfile: `
162+
manifestVersion: 1.0.0
163+
package:
164+
name: "test-package"
165+
license: Apache-2.0
166+
model:
167+
path: model-files
168+
license: MIT
169+
parts:
170+
- path: part-files
171+
license: Apache-2.0
172+
- path: part-files
173+
license: MIT
174+
datasets:
175+
- path: dataset
176+
license: Apache-2.0
177+
- path: dataset-extra
178+
license: MIT
179+
code:
180+
- path: code
181+
license: MIT
182+
- path: code-extra
183+
license: MIT
184+
`,
185+
licenses: []string{"Apache-2.0", "MIT"},
186+
},
187+
}
188+
for _, tt := range testcases {
189+
t.Run(tt.desc, func(t *testing.T) {
190+
kf := &KitFile{}
191+
err := kf.LoadModel(io.NopCloser(strings.NewReader(tt.kitfile)))
192+
if !assert.NoError(t, err, "Unexpected error loading testcase Kitfile") {
193+
return
194+
}
195+
actualLicenses := kf.collectLicenses()
196+
assert.Equal(t, actualLicenses, tt.licenses, "Licenses should match, including order")
197+
})
198+
}
199+
}

0 commit comments

Comments
 (0)