Skip to content

Commit f3c4d55

Browse files
authored
Merge pull request #191 from per1234/resilient-component-data
Add slice entries to projectdata for all package index components
2 parents f271d5f + 901fcd2 commit f3c4d55

File tree

3 files changed

+287
-20
lines changed

3 files changed

+287
-20
lines changed

Diff for: internal/project/projectdata/packageindex.go

+32-20
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package projectdata
1717

1818
import (
1919
"fmt"
20+
"strings"
2021

2122
clipackageindex "github.com/arduino/arduino-cli/arduino/cores/packageindex"
2223
"github.com/arduino/arduino-lint/internal/project/packageindex"
@@ -115,33 +116,44 @@ func getPackageIndexData(interfaceObject map[string]interface{}, pointerPrefix s
115116
}
116117

117118
for index, interfaceElement := range interfaceSlice {
118-
object, ok := interfaceElement.(map[string]interface{})
119-
if !ok {
120-
continue
119+
interfaceElementData := PackageIndexData{
120+
JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index),
121+
Object: nil,
121122
}
122123

123-
var iD string
124-
iDSuffix, ok := object[iDKey].(string)
125-
if !ok {
126-
continue
124+
object, ok := interfaceElement.(map[string]interface{})
125+
if ok {
126+
interfaceElementData.Object = object
127127
}
128-
iD = iDPrefix + iDSuffix
129-
if versionKey != "" {
130-
iDVersion, ok := object[versionKey].(string)
128+
129+
objectID := func() string {
130+
if iDPrefix != "" && strings.HasPrefix(iDPrefix, pointerPrefix) {
131+
// Parent object uses fallback ID, so this one must even if it was possible to generate a true suffix.
132+
return interfaceElementData.JSONPointer
133+
}
134+
iD := iDPrefix
135+
136+
iDSuffix, ok := object[iDKey].(string)
131137
if !ok {
132-
continue
138+
// Use fallback ID.
139+
return interfaceElementData.JSONPointer
140+
}
141+
iD += iDSuffix
142+
143+
if versionKey != "" {
144+
iDVersion, ok := object[versionKey].(string)
145+
if !ok {
146+
// Use fallback ID.
147+
return interfaceElementData.JSONPointer
148+
}
149+
iD += "@" + iDVersion
133150
}
134-
iD = iD + "@" + iDVersion
151+
152+
return iD
135153
}
154+
interfaceElementData.ID = objectID()
136155

137-
data = append(
138-
data,
139-
PackageIndexData{
140-
ID: iD,
141-
JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index),
142-
Object: object,
143-
},
144-
)
156+
data = append(data, interfaceElementData)
145157
}
146158

147159
return data

Diff for: internal/project/projectdata/packageindex_test.go

+75
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,81 @@ func TestInitializeForPackageIndex(t *testing.T) {
117117
},
118118
},
119119
},
120+
{
121+
testName: "Missing IDs",
122+
path: packageIndexTestDataPath.Join("missing-ids", "package_foo_index.json"),
123+
packageIndexAssertion: assert.NotNil,
124+
packageIndexLoadErrorAssertion: assert.Nil,
125+
packageIndexCLILoadErrorAssertion: assert.Nil,
126+
packageIndexPackagesAssertion: assert.NotNil,
127+
packageIndexPackagesDataAssertion: []PackageIndexData{
128+
{
129+
ID: "/packages/0",
130+
JSONPointer: "/packages/0",
131+
},
132+
{
133+
ID: "foopackager2",
134+
JSONPointer: "/packages/1",
135+
},
136+
},
137+
packageIndexPlatformsAssertion: assert.NotNil,
138+
packageIndexPlatformsDataAssertion: []PackageIndexData{
139+
{
140+
ID: "/packages/0/platforms/0",
141+
JSONPointer: "/packages/0/platforms/0",
142+
},
143+
{
144+
ID: "/packages/0/platforms/1",
145+
JSONPointer: "/packages/0/platforms/1",
146+
},
147+
{
148+
ID: "/packages/1/platforms/0",
149+
JSONPointer: "/packages/1/platforms/0",
150+
},
151+
{
152+
ID: "/packages/1/platforms/1",
153+
JSONPointer: "/packages/1/platforms/1",
154+
},
155+
},
156+
packageIndexToolsAssertion: assert.NotNil,
157+
packageIndexToolsDataAssertion: []PackageIndexData{
158+
{
159+
ID: "/packages/1/tools/0",
160+
JSONPointer: "/packages/1/tools/0",
161+
},
162+
{
163+
ID: "/packages/1/tools/1",
164+
JSONPointer: "/packages/1/tools/1",
165+
},
166+
{
167+
ID: "foopackager2:[email protected]",
168+
JSONPointer: "/packages/1/tools/2",
169+
},
170+
},
171+
packageIndexSystemsAssertion: assert.NotNil,
172+
packageIndexSystemsDataAssertion: []PackageIndexData{
173+
{
174+
ID: "/packages/1/tools/0/systems/0",
175+
JSONPointer: "/packages/1/tools/0/systems/0",
176+
},
177+
{
178+
ID: "/packages/1/tools/0/systems/1",
179+
JSONPointer: "/packages/1/tools/0/systems/1",
180+
},
181+
{
182+
ID: "/packages/1/tools/1/systems/0",
183+
JSONPointer: "/packages/1/tools/1/systems/0",
184+
},
185+
{
186+
ID: "/packages/1/tools/1/systems/1",
187+
JSONPointer: "/packages/1/tools/1/systems/1",
188+
},
189+
{
190+
ID: "/packages/1/tools/2/systems/0",
191+
JSONPointer: "/packages/1/tools/2/systems/0",
192+
},
193+
},
194+
},
120195
{
121196
testName: "Invalid package index",
122197
path: packageIndexTestDataPath.Join("invalid-package-index", "package_foo_index.json"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
{
2+
"packages": [
3+
{
4+
"maintainer": "Jane Developer",
5+
"websiteURL": "https://github.com/janedeveloper/myboard",
6+
"email": "[email protected]",
7+
"help": {
8+
"online": "http://example.com/forum/myboard"
9+
},
10+
"platforms": [
11+
{
12+
"name": "My Board",
13+
"architecture": "avr",
14+
"version": "1.0.0",
15+
"category": "Contributed",
16+
"help": {
17+
"online": "http://example.com/forum/myboard"
18+
},
19+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
20+
"archiveFileName": "myboard-1.0.0.zip",
21+
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
22+
"size": "15005",
23+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
24+
"toolsDependencies": [
25+
{
26+
"packager": "arduino",
27+
"name": "avr-gcc",
28+
"version": "4.8.1-arduino5"
29+
},
30+
{
31+
"packager": "arduino",
32+
"name": "avrdude",
33+
"version": "6.0.1-arduino5"
34+
}
35+
]
36+
},
37+
{
38+
"name": "My Board",
39+
"architecture": "avr",
40+
"version": "1.0.1",
41+
"category": "Contributed",
42+
"help": {
43+
"online": "http://example.com/forum/myboard"
44+
},
45+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip",
46+
"archiveFileName": "myboard-1.0.1.zip",
47+
"checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9",
48+
"size": "15125",
49+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
50+
"toolsDependencies": [
51+
{
52+
"packager": "arduino",
53+
"name": "avr-gcc",
54+
"version": "4.8.1-arduino5"
55+
},
56+
{
57+
"packager": "arduino",
58+
"name": "avrdude",
59+
"version": "6.0.1-arduino5"
60+
}
61+
]
62+
}
63+
],
64+
"tools": []
65+
},
66+
{
67+
"name": "foopackager2",
68+
"maintainer": "Jane Developer",
69+
"websiteURL": "https://github.com/janedeveloper/myboard",
70+
"email": "[email protected]",
71+
"help": {
72+
"online": "http://example.com/forum/myboard"
73+
},
74+
"platforms": [
75+
{
76+
"name": "My Board",
77+
"version": "2.0.0",
78+
"category": "Contributed",
79+
"help": {
80+
"online": "http://example.com/forum/myboard"
81+
},
82+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
83+
"archiveFileName": "myboard-1.0.0.zip",
84+
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
85+
"size": "15005",
86+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
87+
"toolsDependencies": [
88+
{
89+
"packager": "arduino",
90+
"name": "avr-gcc",
91+
"version": "4.8.1-arduino5"
92+
},
93+
{
94+
"packager": "arduino",
95+
"name": "avrdude",
96+
"version": "6.0.1-arduino5"
97+
}
98+
]
99+
},
100+
{
101+
"name": "My Board",
102+
"architecture": "mbed",
103+
"category": "Contributed",
104+
"help": {
105+
"online": "http://example.com/forum/myboard"
106+
},
107+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip",
108+
"archiveFileName": "myboard-1.0.1.zip",
109+
"checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9",
110+
"size": "15125",
111+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
112+
"toolsDependencies": [
113+
{
114+
"packager": "arduino",
115+
"name": "avr-gcc",
116+
"version": "4.8.1-arduino5"
117+
},
118+
{
119+
"packager": "arduino",
120+
"name": "avrdude",
121+
"version": "6.0.1-arduino5"
122+
}
123+
]
124+
}
125+
],
126+
"tools": [
127+
{
128+
"version": "0.10.0-arduino1-static",
129+
"systems": [
130+
{
131+
"host": "i386-apple-darwin11",
132+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
133+
"archiveFileName": "OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
134+
"size": "1529841",
135+
"checksum": "SHA-256:46bd02c1d42c5d94c4936e4d4a0ff29697b621840be9a6f882e316203122049d"
136+
},
137+
{
138+
"host": "x86_64-linux-gnu",
139+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
140+
"archiveFileName": "OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
141+
"size": "1777984",
142+
"checksum": "SHA-256:1c9ae77930dd7377d8c13f84abe7307b67fdcd6da74cc1ce269a79e138e7a00a"
143+
}
144+
]
145+
},
146+
{
147+
"name": "CMSIS",
148+
"systems": [
149+
{
150+
"host": "arm-linux-gnueabihf",
151+
"url": "http://example.com",
152+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
153+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
154+
"size": "17642623"
155+
},
156+
{
157+
"host": "i686-mingw32",
158+
"url": "http://example.com",
159+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
160+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
161+
"size": "17642623"
162+
}
163+
]
164+
},
165+
{
166+
"name": "bossac",
167+
"version": "1.9.1-arduino2",
168+
"systems": [
169+
{
170+
"url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxaarch64.tar.gz",
171+
"archiveFileName": "bossac-1.9.1-arduino2-linuxaarch64.tar.gz",
172+
"checksum": "SHA-256:c167fa0ea223966f4d21f5592da3888bcbfbae385be6c5c4e41f8abff35f5cb1",
173+
"size": "442853"
174+
}
175+
]
176+
}
177+
]
178+
}
179+
]
180+
}

0 commit comments

Comments
 (0)