Skip to content

Commit e462881

Browse files
authored
Merge pull request #188 from per1234/package-index-projectdata
Provide object-level project index data to rules
2 parents 7dc9eae + 4921733 commit e462881

File tree

3 files changed

+338
-9
lines changed

3 files changed

+338
-9
lines changed

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

+98
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,45 @@
1616
package projectdata
1717

1818
import (
19+
"fmt"
20+
1921
clipackageindex "github.com/arduino/arduino-cli/arduino/cores/packageindex"
2022
"github.com/arduino/arduino-lint/internal/project/packageindex"
2123
)
2224

25+
// PackageIndexData is the type for package index data.
26+
type PackageIndexData struct {
27+
ID string // Identifier for display to humans
28+
JSONPointer string // Path to the data in the JSON document
29+
Object map[string]interface{} // The data of the object
30+
}
31+
2332
// InitializeForPackageIndex gathers the package index rule data for the specified project.
2433
func InitializeForPackageIndex() {
2534
packageIndex, packageIndexLoadError = packageindex.Properties(ProjectPath())
2635
if ProjectPath() != nil {
2736
_, packageIndexCLILoadError = clipackageindex.LoadIndex(ProjectPath())
2837
}
38+
39+
packageIndexPackages = nil
40+
packageIndexPlatforms = nil
41+
packageIndexTools = nil
42+
packageIndexSystems = nil
43+
if packageIndexLoadError == nil {
44+
packageIndexPackages = getPackageIndexData(PackageIndex(), "", "packages", "", "name", "")
45+
46+
for _, packageData := range PackageIndexPackages() {
47+
packageIndexPlatforms = append(packageIndexPlatforms, getPackageIndexData(packageData.Object, packageData.JSONPointer, "platforms", packageData.ID+":", "architecture", "version")...)
48+
}
49+
50+
for _, packageData := range PackageIndexPackages() {
51+
packageIndexTools = append(packageIndexTools, getPackageIndexData(packageData.Object, packageData.JSONPointer, "tools", packageData.ID+":", "name", "version")...)
52+
}
53+
54+
for _, toolData := range PackageIndexTools() {
55+
packageIndexSystems = append(packageIndexSystems, getPackageIndexData(toolData.Object, toolData.JSONPointer, "systems", toolData.ID+" - ", "host", "")...)
56+
}
57+
}
2958
}
3059

3160
var packageIndex map[string]interface{}
@@ -48,3 +77,72 @@ var packageIndexCLILoadError error
4877
func PackageIndexCLILoadError() error {
4978
return packageIndexCLILoadError
5079
}
80+
81+
var packageIndexPackages []PackageIndexData
82+
83+
// PackageIndexPackages returns the slice of package data for the package index.
84+
func PackageIndexPackages() []PackageIndexData {
85+
return packageIndexPackages
86+
}
87+
88+
var packageIndexPlatforms []PackageIndexData
89+
90+
// PackageIndexPlatforms returns the slice of platform data for the package index.
91+
func PackageIndexPlatforms() []PackageIndexData {
92+
return packageIndexPlatforms
93+
}
94+
95+
var packageIndexTools []PackageIndexData
96+
97+
// PackageIndexTools returns the slice of tool data for the package index.
98+
func PackageIndexTools() []PackageIndexData {
99+
return packageIndexTools
100+
}
101+
102+
var packageIndexSystems []PackageIndexData
103+
104+
// PackageIndexSystems returns the slice of system data for the package index.
105+
func PackageIndexSystems() []PackageIndexData {
106+
return packageIndexSystems
107+
}
108+
109+
func getPackageIndexData(interfaceObject map[string]interface{}, pointerPrefix string, dataKey string, iDPrefix string, iDKey string, versionKey string) []PackageIndexData {
110+
var data []PackageIndexData
111+
112+
interfaceSlice, ok := interfaceObject[dataKey].([]interface{})
113+
if !ok {
114+
return data
115+
}
116+
117+
for index, interfaceElement := range interfaceSlice {
118+
object, ok := interfaceElement.(map[string]interface{})
119+
if !ok {
120+
continue
121+
}
122+
123+
var iD string
124+
iDSuffix, ok := object[iDKey].(string)
125+
if !ok {
126+
continue
127+
}
128+
iD = iDPrefix + iDSuffix
129+
if versionKey != "" {
130+
iDVersion, ok := object[versionKey].(string)
131+
if !ok {
132+
continue
133+
}
134+
iD = iD + "@" + iDVersion
135+
}
136+
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+
)
145+
}
146+
147+
return data
148+
}

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

+134-8
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,109 @@ func init() {
3636

3737
func TestInitializeForPackageIndex(t *testing.T) {
3838
testTables := []struct {
39-
testName string
40-
path *paths.Path
41-
packageIndexAssertion assert.ValueAssertionFunc
42-
packageIndexLoadErrorAssertion assert.ValueAssertionFunc
43-
packageIndexCLILoadErrorAssertion assert.ValueAssertionFunc
39+
testName string
40+
path *paths.Path
41+
packageIndexAssertion assert.ValueAssertionFunc
42+
packageIndexLoadErrorAssertion assert.ValueAssertionFunc
43+
packageIndexCLILoadErrorAssertion assert.ValueAssertionFunc
44+
packageIndexPackagesAssertion assert.ValueAssertionFunc
45+
packageIndexPackagesDataAssertion []PackageIndexData
46+
packageIndexPlatformsAssertion assert.ValueAssertionFunc
47+
packageIndexPlatformsDataAssertion []PackageIndexData
48+
packageIndexToolsAssertion assert.ValueAssertionFunc
49+
packageIndexToolsDataAssertion []PackageIndexData
50+
packageIndexSystemsAssertion assert.ValueAssertionFunc
51+
packageIndexSystemsDataAssertion []PackageIndexData
4452
}{
45-
{"Valid", packageIndexTestDataPath.Join("valid-package-index", "package_foo_index.json"), assert.NotNil, assert.Nil, assert.Nil},
46-
{"Invalid package index", packageIndexTestDataPath.Join("invalid-package-index", "package_foo_index.json"), assert.Nil, assert.NotNil, assert.NotNil},
47-
{"Invalid JSON", packageIndexTestDataPath.Join("invalid-JSON", "package_foo_index.json"), assert.Nil, assert.NotNil, assert.NotNil},
53+
{
54+
testName: "Valid",
55+
path: packageIndexTestDataPath.Join("valid-package-index", "package_foo_index.json"),
56+
packageIndexAssertion: assert.NotNil,
57+
packageIndexLoadErrorAssertion: assert.Nil,
58+
packageIndexCLILoadErrorAssertion: assert.Nil,
59+
packageIndexPackagesAssertion: assert.NotNil,
60+
packageIndexPackagesDataAssertion: []PackageIndexData{
61+
{
62+
ID: "myboard1",
63+
JSONPointer: "/packages/0",
64+
},
65+
{
66+
ID: "myboard2",
67+
JSONPointer: "/packages/1",
68+
},
69+
},
70+
packageIndexPlatformsAssertion: assert.NotNil,
71+
packageIndexPlatformsDataAssertion: []PackageIndexData{
72+
{
73+
ID: "myboard1:[email protected]",
74+
JSONPointer: "/packages/0/platforms/0",
75+
},
76+
{
77+
ID: "myboard1:[email protected]",
78+
JSONPointer: "/packages/0/platforms/1",
79+
},
80+
{
81+
ID: "myboard2:[email protected]",
82+
JSONPointer: "/packages/1/platforms/0",
83+
},
84+
{
85+
ID: "myboard2:[email protected]",
86+
JSONPointer: "/packages/1/platforms/1",
87+
},
88+
},
89+
packageIndexToolsAssertion: assert.NotNil,
90+
packageIndexToolsDataAssertion: []PackageIndexData{
91+
{
92+
ID: "myboard2:[email protected]",
93+
JSONPointer: "/packages/1/tools/0",
94+
},
95+
{
96+
ID: "myboard2:[email protected]",
97+
JSONPointer: "/packages/1/tools/1",
98+
},
99+
},
100+
packageIndexSystemsAssertion: assert.NotNil,
101+
packageIndexSystemsDataAssertion: []PackageIndexData{
102+
{
103+
ID: "myboard2:[email protected] - i386-apple-darwin11",
104+
JSONPointer: "/packages/1/tools/0/systems/0",
105+
},
106+
{
107+
ID: "myboard2:[email protected] - x86_64-linux-gnu",
108+
JSONPointer: "/packages/1/tools/0/systems/1",
109+
},
110+
{
111+
ID: "myboard2:[email protected] - arm-linux-gnueabihf",
112+
JSONPointer: "/packages/1/tools/1/systems/0",
113+
},
114+
{
115+
ID: "myboard2:[email protected] - i686-mingw32",
116+
JSONPointer: "/packages/1/tools/1/systems/1",
117+
},
118+
},
119+
},
120+
{
121+
testName: "Invalid package index",
122+
path: packageIndexTestDataPath.Join("invalid-package-index", "package_foo_index.json"),
123+
packageIndexAssertion: assert.Nil,
124+
packageIndexLoadErrorAssertion: assert.NotNil,
125+
packageIndexCLILoadErrorAssertion: assert.NotNil,
126+
packageIndexPackagesAssertion: assert.Nil,
127+
packageIndexPlatformsAssertion: assert.Nil,
128+
packageIndexToolsAssertion: assert.Nil,
129+
packageIndexSystemsAssertion: assert.Nil,
130+
},
131+
{
132+
testName: "Invalid JSON",
133+
path: packageIndexTestDataPath.Join("invalid-JSON", "package_foo_index.json"),
134+
packageIndexAssertion: assert.Nil,
135+
packageIndexLoadErrorAssertion: assert.NotNil,
136+
packageIndexCLILoadErrorAssertion: assert.NotNil,
137+
packageIndexPackagesAssertion: assert.Nil,
138+
packageIndexPlatformsAssertion: assert.Nil,
139+
packageIndexToolsAssertion: assert.Nil,
140+
packageIndexSystemsAssertion: assert.Nil,
141+
},
48142
}
49143

50144
for _, testTable := range testTables {
@@ -61,5 +155,37 @@ func TestInitializeForPackageIndex(t *testing.T) {
61155
if PackageIndexLoadError() == nil {
62156
testTable.packageIndexAssertion(t, PackageIndex(), testTable.testName)
63157
}
158+
159+
testTable.packageIndexPackagesAssertion(t, PackageIndexPackages(), testTable.testName)
160+
if PackageIndexPackages() != nil {
161+
for index, packageIndexPackage := range PackageIndexPackages() {
162+
assert.Equal(t, packageIndexPackage.ID, testTable.packageIndexPackagesDataAssertion[index].ID)
163+
assert.Equal(t, packageIndexPackage.JSONPointer, testTable.packageIndexPackagesDataAssertion[index].JSONPointer)
164+
}
165+
}
166+
167+
testTable.packageIndexPlatformsAssertion(t, PackageIndexPlatforms(), testTable.testName)
168+
if PackageIndexPlatforms() != nil {
169+
for index, packageIndexPlatform := range PackageIndexPlatforms() {
170+
assert.Equal(t, packageIndexPlatform.ID, testTable.packageIndexPlatformsDataAssertion[index].ID)
171+
assert.Equal(t, packageIndexPlatform.JSONPointer, testTable.packageIndexPlatformsDataAssertion[index].JSONPointer)
172+
}
173+
}
174+
175+
testTable.packageIndexToolsAssertion(t, PackageIndexTools(), testTable.testName)
176+
if PackageIndexTools() != nil {
177+
for index, packageIndexTool := range PackageIndexTools() {
178+
assert.Equal(t, packageIndexTool.ID, testTable.packageIndexToolsDataAssertion[index].ID)
179+
assert.Equal(t, packageIndexTool.JSONPointer, testTable.packageIndexToolsDataAssertion[index].JSONPointer)
180+
}
181+
}
182+
183+
testTable.packageIndexSystemsAssertion(t, PackageIndexSystems(), testTable.testName)
184+
if PackageIndexSystems() != nil {
185+
for index, packageIndexSystem := range PackageIndexSystems() {
186+
assert.Equal(t, packageIndexSystem.ID, testTable.packageIndexSystemsDataAssertion[index].ID)
187+
assert.Equal(t, packageIndexSystem.JSONPointer, testTable.packageIndexSystemsDataAssertion[index].JSONPointer)
188+
}
189+
}
64190
}
65191
}

Diff for: internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json

+106-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"packages": [
33
{
4-
"name": "myboard",
4+
"name": "myboard1",
55
"maintainer": "Jane Developer",
66
"websiteURL": "https://github.com/janedeveloper/myboard",
77
"email": "[email protected]",
@@ -63,6 +63,111 @@
6363
}
6464
],
6565
"tools": []
66+
},
67+
{
68+
"name": "myboard2",
69+
"maintainer": "Jane Developer",
70+
"websiteURL": "https://github.com/janedeveloper/myboard",
71+
"email": "[email protected]",
72+
"help": {
73+
"online": "http://example.com/forum/myboard"
74+
},
75+
"platforms": [
76+
{
77+
"name": "My Board",
78+
"architecture": "samd",
79+
"version": "2.0.0",
80+
"category": "Contributed",
81+
"help": {
82+
"online": "http://example.com/forum/myboard"
83+
},
84+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
85+
"archiveFileName": "myboard-1.0.0.zip",
86+
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
87+
"size": "15005",
88+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
89+
"toolsDependencies": [
90+
{
91+
"packager": "arduino",
92+
"name": "avr-gcc",
93+
"version": "4.8.1-arduino5"
94+
},
95+
{
96+
"packager": "arduino",
97+
"name": "avrdude",
98+
"version": "6.0.1-arduino5"
99+
}
100+
]
101+
},
102+
{
103+
"name": "My Board",
104+
"architecture": "mbed",
105+
"version": "1.1.1",
106+
"category": "Contributed",
107+
"help": {
108+
"online": "http://example.com/forum/myboard"
109+
},
110+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip",
111+
"archiveFileName": "myboard-1.0.1.zip",
112+
"checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9",
113+
"size": "15125",
114+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
115+
"toolsDependencies": [
116+
{
117+
"packager": "arduino",
118+
"name": "avr-gcc",
119+
"version": "4.8.1-arduino5"
120+
},
121+
{
122+
"packager": "arduino",
123+
"name": "avrdude",
124+
"version": "6.0.1-arduino5"
125+
}
126+
]
127+
}
128+
],
129+
"tools": [
130+
{
131+
"name": "openocd",
132+
"version": "0.10.0-arduino1-static",
133+
"systems": [
134+
{
135+
"host": "i386-apple-darwin11",
136+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
137+
"archiveFileName": "OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
138+
"size": "1529841",
139+
"checksum": "SHA-256:46bd02c1d42c5d94c4936e4d4a0ff29697b621840be9a6f882e316203122049d"
140+
},
141+
{
142+
"host": "x86_64-linux-gnu",
143+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
144+
"archiveFileName": "OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
145+
"size": "1777984",
146+
"checksum": "SHA-256:1c9ae77930dd7377d8c13f84abe7307b67fdcd6da74cc1ce269a79e138e7a00a"
147+
}
148+
]
149+
},
150+
{
151+
"name": "CMSIS",
152+
"version": "4.0.0-atmel",
153+
"systems": [
154+
{
155+
"host": "arm-linux-gnueabihf",
156+
"url": "http://example.com",
157+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
158+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
159+
"size": "17642623"
160+
},
161+
{
162+
"host": "i686-mingw32",
163+
"url": "http://example.com",
164+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
165+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
166+
"size": "17642623"
167+
}
168+
]
169+
}
170+
]
66171
}
67172
]
68173
}

0 commit comments

Comments
 (0)