Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

‎internal/project/projectdata/packageindex.go‎

Lines changed: 98 additions & 0 deletions
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+
}

‎internal/project/projectdata/packageindex_test.go‎

Lines changed: 134 additions & 8 deletions
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:avr@1.0.0",
74+
JSONPointer: "/packages/0/platforms/0",
75+
},
76+
{
77+
ID: "myboard1:avr@1.0.1",
78+
JSONPointer: "/packages/0/platforms/1",
79+
},
80+
{
81+
ID: "myboard2:samd@2.0.0",
82+
JSONPointer: "/packages/1/platforms/0",
83+
},
84+
{
85+
ID: "myboard2:mbed@1.1.1",
86+
JSONPointer: "/packages/1/platforms/1",
87+
},
88+
},
89+
packageIndexToolsAssertion: assert.NotNil,
90+
packageIndexToolsDataAssertion: []PackageIndexData{
91+
{
92+
ID: "myboard2:openocd@0.10.0-arduino1-static",
93+
JSONPointer: "/packages/1/tools/0",
94+
},
95+
{
96+
ID: "myboard2:CMSIS@4.0.0-atmel",
97+
JSONPointer: "/packages/1/tools/1",
98+
},
99+
},
100+
packageIndexSystemsAssertion: assert.NotNil,
101+
packageIndexSystemsDataAssertion: []PackageIndexData{
102+
{
103+
ID: "myboard2:openocd@0.10.0-arduino1-static - i386-apple-darwin11",
104+
JSONPointer: "/packages/1/tools/0/systems/0",
105+
},
106+
{
107+
ID: "myboard2:openocd@0.10.0-arduino1-static - x86_64-linux-gnu",
108+
JSONPointer: "/packages/1/tools/0/systems/1",
109+
},
110+
{
111+
ID: "myboard2:CMSIS@4.0.0-atmel - arm-linux-gnueabihf",
112+
JSONPointer: "/packages/1/tools/1/systems/0",
113+
},
114+
{
115+
ID: "myboard2:CMSIS@4.0.0-atmel - 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
}

‎internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json‎

Lines changed: 106 additions & 1 deletion
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": "jane@example.com",
@@ -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": "jane@example.com",
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)

AltStyle によって変換されたページ (->オリジナル) /