diff --git a/etc/schemas/arduino-package-index-definitions-schema.json b/etc/schemas/arduino-package-index-definitions-schema.json index cd618b45..d5205a61 100644 --- a/etc/schemas/arduino-package-index-definitions-schema.json +++ b/etc/schemas/arduino-package-index-definitions-schema.json @@ -455,6 +455,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/permissive/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/permissive/object" } }, "additionalProperties": false @@ -510,6 +513,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/specification/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/specification/object" } }, "additionalProperties": false @@ -565,6 +571,9 @@ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/strict/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/strict/object" } }, "additionalProperties": false @@ -1084,6 +1093,83 @@ } } }, + "monitorDependencies": { + "base": { + "object": { + "type": "array", + "items": { + "type": "object", + "required": ["packager", "name"] + } + } + }, + "permissive": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/permissive/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/permissive/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "specification": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/specification/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/specification/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "strict": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/strict/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/strict/object" + } + }, + "additionalProperties": false + } + } + ] + } + } + }, "packager": { "base": { "object": { diff --git a/internal/project/packageindex/packageindexschemas_test.go b/internal/project/packageindex/packageindexschemas_test.go index 44422da8..c069e287 100644 --- a/internal/project/packageindex/packageindexschemas_test.go +++ b/internal/project/packageindex/packageindexschemas_test.go @@ -71,6 +71,12 @@ var validIndexRaw = []byte(` "packager": "arduino", "name": "ble-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + } ] } ], @@ -152,6 +158,14 @@ func TestMinLength(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0/name", 1, compliancelevel.Specification}, {"/packages/0/platforms/0/discoveryDependencies/0/name", 1, compliancelevel.Strict}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Permissive}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Specification}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 1, compliancelevel.Strict}, + + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Permissive}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Specification}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 1, compliancelevel.Strict}, + {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Permissive}, {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Specification}, {"/packages/0/tools/0/systems/0/archiveFileName", 1, compliancelevel.Strict}, @@ -303,6 +317,18 @@ func TestRequired(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0/name", compliancelevel.Specification, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/name", compliancelevel.Strict, assert.True}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Permissive, assert.False}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Specification, assert.False}, + {"/packages/0/platforms/0/monitorDependencies", compliancelevel.Strict, assert.False}, + + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", compliancelevel.Strict, assert.True}, + + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", compliancelevel.Strict, assert.True}, + {"/packages/0/tools/0/name", compliancelevel.Permissive, assert.True}, {"/packages/0/tools/0/name", compliancelevel.Specification, assert.True}, {"/packages/0/tools/0/name", compliancelevel.Strict, assert.True}, @@ -586,6 +612,9 @@ func TestType(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies", 42, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/packager", 42, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0/name", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/packager", 42, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0/name", 42, assert.True}, {"/packages/0/tools", 42, assert.True}, {"/packages/0/tools/0/name", 42, assert.True}, {"/packages/0/tools/0/version", 42, assert.True}, @@ -717,6 +746,10 @@ func TestAdditionalProperties(t *testing.T) { {"/packages/0/platforms/0/discoveryDependencies/0", compliancelevel.Specification, assert.True}, {"/packages/0/platforms/0/discoveryDependencies/0", compliancelevel.Strict, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Permissive, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Specification, assert.True}, + {"/packages/0/platforms/0/monitorDependencies/0", compliancelevel.Strict, assert.True}, + {"/packages/0/tools/0", compliancelevel.Permissive, assert.True}, {"/packages/0/tools/0", compliancelevel.Specification, assert.True}, {"/packages/0/tools/0", compliancelevel.Strict, assert.True}, diff --git a/internal/project/projectdata/packageindex.go b/internal/project/projectdata/packageindex.go index 9a77ba28..c9d514f8 100644 --- a/internal/project/projectdata/packageindex.go +++ b/internal/project/projectdata/packageindex.go @@ -46,6 +46,7 @@ func InitializeForPackageIndex() { packageIndexBoards = nil packageIndexToolsDependencies = nil packageIndexDiscoveryDependencies = nil + packageIndexMonitorDependencies = nil packageIndexTools = nil packageIndexSystems = nil packageIndexSchemaValidationResult = nil @@ -54,22 +55,14 @@ func InitializeForPackageIndex() { for _, packageData := range PackageIndexPackages() { packageIndexPlatforms = append(packageIndexPlatforms, getPackageIndexData(packageData.Object, packageData.JSONPointer, "platforms", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"architecture", "version"})...) + packageIndexTools = append(packageIndexTools, getPackageIndexData(packageData.Object, packageData.JSONPointer, "tools", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"name", "version"})...) } for _, platformData := range PackageIndexPlatforms() { packageIndexBoards = append(packageIndexBoards, getPackageIndexData(platformData.Object, platformData.JSONPointer, "boards", platformData.ID, " >> {{index . 0}}", []string{"name"})...) - } - - for _, platformData := range PackageIndexPlatforms() { packageIndexToolsDependencies = append(packageIndexToolsDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "toolsDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}@{{index . 2}}", []string{"packager", "name", "version"})...) - } - - for _, platformData := range PackageIndexPlatforms() { packageIndexDiscoveryDependencies = append(packageIndexDiscoveryDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "discoveryDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}", []string{"packager", "name"})...) - } - - for _, packageData := range PackageIndexPackages() { - packageIndexTools = append(packageIndexTools, getPackageIndexData(packageData.Object, packageData.JSONPointer, "tools", packageData.ID, ":{{index . 0}}@{{index . 1}}", []string{"name", "version"})...) + packageIndexMonitorDependencies = append(packageIndexMonitorDependencies, getPackageIndexData(platformData.Object, platformData.JSONPointer, "monitorDependencies", platformData.ID, " >> {{index . 0}}:{{index . 1}}", []string{"packager", "name"})...) } for _, toolData := range PackageIndexTools() { @@ -136,6 +129,13 @@ func PackageIndexDiscoveryDependencies() []PackageIndexData { return packageIndexDiscoveryDependencies } +var packageIndexMonitorDependencies []PackageIndexData + +// PackageIndexMonitorDependencies returns the slice of pluggable monitor tool dependency data for the package index. +func PackageIndexMonitorDependencies() []PackageIndexData { + return packageIndexMonitorDependencies +} + var packageIndexTools []PackageIndexData // PackageIndexTools returns the slice of tool data for the package index. diff --git a/internal/project/projectdata/packageindex_test.go b/internal/project/projectdata/packageindex_test.go index e7f9424e..cb037f88 100644 --- a/internal/project/projectdata/packageindex_test.go +++ b/internal/project/projectdata/packageindex_test.go @@ -52,6 +52,8 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexToolsDependenciesDataAssertion []PackageIndexData packageIndexDiscoveryDependenciesAssertion assert.ValueAssertionFunc packageIndexDiscoveryDependenciesDataAssertion []PackageIndexData + packageIndexMonitorDependenciesAssertion assert.ValueAssertionFunc + packageIndexMonitorDependenciesDataAssertion []PackageIndexData packageIndexToolsAssertion assert.ValueAssertionFunc packageIndexToolsDataAssertion []PackageIndexData packageIndexSystemsAssertion assert.ValueAssertionFunc @@ -187,6 +189,29 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/1/discoveryDependencies/0", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "foopackager1:avr@1.0.1 >> arduino:network-monitor", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "foopackager1:avr@1.0.1 >> barpackager:coop-monitor", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "foopackager2:samd@2.0.0 >> arduino:network-monitor", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "foopackager2:samd@2.0.0 >> bazpackager:flag-monitor", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "foopackager2:mbed@1.1.1 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -400,6 +425,53 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/2/discoveryDependencies/2", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "/packages/0/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/1", + }, + { + ID: "foopackager2:megaavr@1.0.0 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/2", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -621,6 +693,53 @@ func TestInitializeForPackageIndex(t *testing.T) { JSONPointer: "/packages/1/platforms/2/discoveryDependencies/2", }, }, + packageIndexMonitorDependenciesAssertion: assert.NotNil, + packageIndexMonitorDependenciesDataAssertion: []PackageIndexData{ + { + ID: "/packages/0/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/0/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/0/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/0/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/0/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/1/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/1/monitorDependencies/1", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/0", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/0", + }, + { + ID: "/packages/1/platforms/2/monitorDependencies/1", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/1", + }, + { + ID: "foopackager2:megaavr@1.0.0 >> quxpackager:shoe-monitor", + JSONPointer: "/packages/1/platforms/2/monitorDependencies/2", + }, + }, packageIndexToolsAssertion: assert.NotNil, packageIndexToolsDataAssertion: []PackageIndexData{ { @@ -672,6 +791,7 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexBoardsAssertion: assert.Nil, packageIndexToolsDependenciesAssertion: assert.Nil, packageIndexDiscoveryDependenciesAssertion: assert.Nil, + packageIndexMonitorDependenciesAssertion: assert.Nil, packageIndexToolsAssertion: assert.Nil, packageIndexSystemsAssertion: assert.Nil, packageIndexSchemaValidationResultAssertion: assert.Nil, @@ -687,6 +807,7 @@ func TestInitializeForPackageIndex(t *testing.T) { packageIndexBoardsAssertion: assert.Nil, packageIndexToolsDependenciesAssertion: assert.Nil, packageIndexDiscoveryDependenciesAssertion: assert.Nil, + packageIndexMonitorDependenciesAssertion: assert.Nil, packageIndexToolsAssertion: assert.Nil, packageIndexSystemsAssertion: assert.Nil, packageIndexSchemaValidationResultAssertion: assert.Nil, @@ -748,6 +869,14 @@ func TestInitializeForPackageIndex(t *testing.T) { } } + testTable.packageIndexMonitorDependenciesAssertion(t, PackageIndexMonitorDependencies(), testTable.testName) + if PackageIndexMonitorDependencies() != nil { + for index, packageIndexMonitorDependency := range PackageIndexMonitorDependencies() { + assert.Equal(t, testTable.packageIndexMonitorDependenciesDataAssertion[index].ID, packageIndexMonitorDependency.ID, testTable.testName) + assert.Equal(t, testTable.packageIndexMonitorDependenciesDataAssertion[index].JSONPointer, packageIndexMonitorDependency.JSONPointer, testTable.testName) + } + } + testTable.packageIndexToolsAssertion(t, PackageIndexTools(), testTable.testName) if PackageIndexTools() != nil { for index, packageIndexTool := range PackageIndexTools() { diff --git a/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json index 076738e3..01280d55 100644 --- a/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/empty-ids/package_foo_index.json @@ -43,6 +43,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] }, { @@ -79,6 +89,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -127,6 +147,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -163,6 +193,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -211,6 +251,18 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "name": "network-monitor" + }, + { + "packager": "bazpackager" + }, + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json index ea1b5622..a4b9acf4 100644 --- a/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json @@ -42,6 +42,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] }, { @@ -78,6 +88,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -125,6 +145,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -160,6 +190,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -205,6 +245,18 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "name": "network-monitor" + }, + { + "packager": "bazpackager" + }, + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json index 67181764..49e667f3 100644 --- a/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json +++ b/internal/project/projectdata/testdata/packageindexes/valid-package-index/package_foo_index.json @@ -69,6 +69,16 @@ "packager": "barpackager", "name": "carrier-pigeon-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "barpackager", + "name": "coop-monitor" + } ] } ], @@ -117,6 +127,16 @@ "packager": "bazpackager", "name": "signal-flag-discovery" } + ], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "network-monitor" + }, + { + "packager": "bazpackager", + "name": "flag-monitor" + } ] }, { @@ -149,6 +169,12 @@ "packager": "quxpackager", "name": "sneakernet-discovery" } + ], + "monitorDependencies": [ + { + "packager": "quxpackager", + "name": "shoe-monitor" + } ] } ], diff --git a/internal/rule/ruleconfiguration/ruleconfiguration.go b/internal/rule/ruleconfiguration/ruleconfiguration.go index 5c861f77..e162284e 100644 --- a/internal/rule/ruleconfiguration/ruleconfiguration.go +++ b/internal/rule/ruleconfiguration/ruleconfiguration.go @@ -4700,6 +4700,142 @@ var configurations = []Type{ ErrorModes: []rulemode.Type{rulemode.Default}, RuleFunction: rulefunction.PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength, }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL067", + Brief: "incorrect packages[*].platforms[*].monitorDependencies type", + Description: "The package index has a platform with a `monitorDependencies` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL068", + Brief: "unrecognized properties in packages[*].platforms[*].monitorDependencies[*]", + Description: "A `monitorDependencies` object for one of the package index's platforms contains unknown data properties.", + MessageTemplate: "Unknown properties under packages[*].platforms[*].monitorDependencies[*] found in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL069", + Brief: "packages[*].platforms[*].monitorDependencies[*].packager missing", + Description: "A `monitorDependencies` object for one of the package index's platforms is missing a `packager` property.", + MessageTemplate: "Missing packages[*].platforms[*].monitorDependencies[*].packager property in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL070", + Brief: "incorrect packages[*].platforms[*].monitorDependencies[*].packager type", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `packager` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].packager property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL071", + Brief: "packages[*].platforms[*].monitorDependencies[*].packager < min length", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `packager` property shorter than the minimum length.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].packager value less than the minimum length in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL072", + Brief: "packages[*].platforms[*].monitorDependencies[*].name missing", + Description: "A `monitorDependencies` object for one of the package index's platforms is missing a `name` property.", + MessageTemplate: "Missing packages[*].platforms[*].monitorDependencies[*].name property in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameMissing, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL073", + Brief: "incorrect packages[*].platforms[*].monitorDependencies[*].name type", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `name` property of incorrect type.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].name property has incorrect type in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "IL074", + Brief: "packages[*].platforms[*].monitorDependencies[*].name < min length", + Description: "A `monitorDependencies` object for one of the package index's platforms has a `name` property shorter than the minimum length.", + MessageTemplate: "packages[*].platforms[*].monitorDependencies[*].name value less than the minimum length in platform(s):\n{{.}}", + Reference: "https://arduino.github.io/arduino-cli/latest/package_index_json-specification/#platforms-definitions", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: nil, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength, + }, { ProjectType: projecttype.PackageIndex, SuperprojectType: projecttype.All, diff --git a/internal/rule/rulefunction/packageindex.go b/internal/rule/rulefunction/packageindex.go index f3f24c5b..601e6019 100644 --- a/internal/rule/rulefunction/packageindex.go +++ b/internal/rule/rulefunction/packageindex.go @@ -1936,6 +1936,166 @@ func PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength() (result return ruleresult.Pass, "" } +// PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies property. +func PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, platformData := range projectdata.PackageIndexPlatforms() { + if schema.PropertyTypeMismatch(platformData.JSONPointer+"/monitorDependencies", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, platformData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties checks for additional properties in packages[].platforms[].monitorDependencies[]. +func PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.ProhibitedAdditionalProperties(dependencyData.JSONPointer, projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing checks for missing packages[].platforms[].monitorDependencies[].packager property. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.RequiredPropertyMissing(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies[].packager property. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyTypeMismatch(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength checks for packages[].platforms[].monitorDependencies[].packager property less than the minimum length. +func PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyLessThanMinLength(dependencyData.JSONPointer+"/packager", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameMissing checks for missing packages[].platforms[].monitorDependencies[].name property. +func PackageIndexPackagesPlatformsMonitorDependenciesNameMissing() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.RequiredPropertyMissing(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType checks for incorrect type of the packages[].platforms[].monitorDependencies[].name property. +func PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyTypeMismatch(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength checks for packages[].platforms[].monitorDependencies[].name property less than the minimum length. +func PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, dependencyData := range projectdata.PackageIndexMonitorDependencies() { + if schema.PropertyLessThanMinLength(dependencyData.JSONPointer+"/name", projectdata.PackageIndexSchemaValidationResult()[compliancelevel.Specification]) { + nonCompliantIDs = append(nonCompliantIDs, dependencyData.ID) + } + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, brokenOutputList(nonCompliantIDs) + } + + return ruleresult.Pass, "" +} + // PackageIndexPackagesToolsMissing checks for missing packages[].tools property. func PackageIndexPackagesToolsMissing() (result ruleresult.Type, output string) { if projectdata.PackageIndexLoadError() != nil { diff --git a/internal/rule/rulefunction/packageindex_test.go b/internal/rule/rulefunction/packageindex_test.go index f396516a..4cd1c7ea 100644 --- a/internal/rule/rulefunction/packageindex_test.go +++ b/internal/rule/rulefunction/packageindex_test.go @@ -1013,6 +1013,86 @@ func TestPackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength(t *te checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsDiscoveryDependenciesNameLTMinLength, testTables, t) } +func TestPackageIndexPackagesPlatformsMonitorDependenciesIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies type", "packages-platforms-monitordependencies-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "foopackager:avr@1\\.0\\.0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Additional packages[].platforms[].monitorDependencies[] properties", "packages-platforms-monitordependencies-additional-properties", ruleresult.Fail, "^" + brokenOutputListIndent + "foopackager:avr@1\\.0\\.0 >> arduino:network-monitor$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesAdditionalProperties, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].packager missing", "packages-platforms-monitordependencies-packager-missing", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerMissing, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies[].packager type", "packages-platforms-monitordependencies-packager-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].packager < min length", "packages-platforms-monitordependencies-packager-length-lt", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesPackagerLTMinLength, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameMissing(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].name missing", "packages-platforms-monitordependencies-name-missing", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameMissing, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Incorrect packages[].platforms[].monitorDependencies[].name type", "packages-platforms-monitordependencies-name-incorrect-type", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameIncorrectType, testTables, t) +} + +func TestPackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"packages[].platforms[].monitorDependencies[].name < min length", "packages-platforms-monitordependencies-name-length-lt", ruleresult.Fail, "^" + brokenOutputListIndent + "/packages/0/platforms/0/monitorDependencies/0$"}, + {"Valid", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsMonitorDependenciesNameLTMinLength, testTables, t) +} + func TestPackageIndexPackagesToolsMissing(t *testing.T) { testTables := []packageIndexRuleFunctionTestTable{ {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json new file mode 100644 index 00000000..81bc5671 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-additional-properties/package_foo_index.json @@ -0,0 +1,38 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "foo": "bar", + "packager": "arduino", + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json new file mode 100644 index 00000000..03867989 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-incorrect-type/package_foo_index.json @@ -0,0 +1,32 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": 42 + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json new file mode 100644 index 00000000..85ddd387 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-incorrect-type/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino", + "name": 42 + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json new file mode 100644 index 00000000..8b4403cd --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-length-lt/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino", + "name": "" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json new file mode 100644 index 00000000..ec72e5e7 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-name-missing/package_foo_index.json @@ -0,0 +1,36 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "arduino" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json new file mode 100644 index 00000000..398da7d3 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-incorrect-type/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": 42, + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json new file mode 100644 index 00000000..c7a71f05 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-length-lt/package_foo_index.json @@ -0,0 +1,37 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "packager": "", + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json new file mode 100644 index 00000000..20197e7f --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-monitordependencies-packager-missing/package_foo_index.json @@ -0,0 +1,36 @@ +{ + "packages": [ + { + "name": "foopackager", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://example.com", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8", + "size": "15005", + "boards": [], + "toolsDependencies": [], + "monitorDependencies": [ + { + "name": "network-monitor" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/schema/schemadata/bindata.go b/internal/rule/schema/schemadata/bindata.go index 9172a85f..2307c8d9 100644 --- a/internal/rule/schema/schemadata/bindata.go +++ b/internal/rule/schema/schemadata/bindata.go @@ -2987,6 +2987,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/permissive/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/permissive/object" } }, "additionalProperties": false @@ -3042,6 +3045,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/specification/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/specification/object" } }, "additionalProperties": false @@ -3097,6 +3103,9 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ }, "discoveryDependencies": { "$ref": "#/definitions/propertiesObjects/discoveryDependencies/strict/object" + }, + "monitorDependencies": { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/strict/object" } }, "additionalProperties": false @@ -3616,6 +3625,83 @@ var _arduinoPackageIndexDefinitionsSchemaJson = []byte(`{ } } }, + "monitorDependencies": { + "base": { + "object": { + "type": "array", + "items": { + "type": "object", + "required": ["packager", "name"] + } + } + }, + "permissive": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/permissive/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/permissive/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "specification": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/specification/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/specification/object" + } + }, + "additionalProperties": false + } + } + ] + } + }, + "strict": { + "object": { + "allOf": [ + { + "$ref": "#/definitions/propertiesObjects/monitorDependencies/base/object" + }, + { + "items": { + "properties": { + "packager": { + "$ref": "#/definitions/propertiesObjects/packager/strict/object" + }, + "name": { + "$ref": "#/definitions/propertiesObjects/toolName/strict/object" + } + }, + "additionalProperties": false + } + } + ] + } + } + }, "packager": { "base": { "object": {