diff --git a/etc/schemas/arduino-boards-txt-definitions-schema.json b/etc/schemas/arduino-boards-txt-definitions-schema.json index 86c0567d..0468b254 100644 --- a/etc/schemas/arduino-boards-txt-definitions-schema.json +++ b/etc/schemas/arduino-boards-txt-definitions-schema.json @@ -855,7 +855,7 @@ "type": "string" }, { - "pattern": "^[0-9]+$" + "pattern": "^([0-9]+)|({.+})$" } ] } @@ -896,7 +896,7 @@ "type": "string" }, { - "pattern": "^[0-9]+$" + "pattern": "^([0-9]+)|({.+})$" } ] } @@ -1098,7 +1098,7 @@ "type": "string" }, { - "pattern": "^0[xX][0-9a-fA-F]{4}$" + "pattern": "^(0[xX][0-9a-fA-F]{4})|({.+})$" } ] } diff --git a/etc/schemas/arduino-platform-txt-definitions-schema.json b/etc/schemas/arduino-platform-txt-definitions-schema.json index 177fd2f4..1bc8bdd2 100644 --- a/etc/schemas/arduino-platform-txt-definitions-schema.json +++ b/etc/schemas/arduino-platform-txt-definitions-schema.json @@ -62,7 +62,14 @@ "$ref": "#/definitions/propertiesObjects/version/base/object" }, { - "$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver" + "anyOf": [ + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver" + }, + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference" + } + ] } ] } @@ -74,7 +81,14 @@ "$ref": "#/definitions/propertiesObjects/version/base/object" }, { - "$ref": "general-definitions-schema.json#/definitions/patternObjects/semver" + "anyOf": [ + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/semver" + }, + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference" + } + ] } ] } diff --git a/etc/schemas/general-definitions-schema.json b/etc/schemas/general-definitions-schema.json index 513aff82..983972ab 100644 --- a/etc/schemas/general-definitions-schema.json +++ b/etc/schemas/general-definitions-schema.json @@ -13,6 +13,10 @@ "relaxedSemver": { "$comment": "https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string adjusted to also allow MAJOR.MINOR, MAJOR, and with unused non-capturing group syntax removed. For details, see https://go.bug.st/relaxed-semver", "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))?(\\.(0|[1-9]\\d*))?(-((0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\\+([0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*))?$" + }, + "containsPropertyReference": { + "$comment": "https://arduino.github.io/arduino-cli/dev/platform-specification/#configuration-files-format", + "pattern": "{.+}" } } } diff --git a/internal/project/platform/boardstxt/boardstxtschema_test.go b/internal/project/platform/boardstxt/boardstxtschema_test.go index 860e3d50..f92bd5cc 100644 --- a/internal/project/platform/boardstxt/boardstxtschema_test.go +++ b/internal/project/platform/boardstxt/boardstxtschema_test.go @@ -281,6 +281,9 @@ func TestPattern(t *testing.T) { {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Permissive, assert.False}, {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Specification, assert.False}, {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Strict, assert.False}, + {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Strict, assert.False}, {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Permissive, assert.True}, {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Specification, assert.True}, {"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Strict, assert.True}, @@ -288,6 +291,9 @@ func TestPattern(t *testing.T) { {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Permissive, assert.False}, {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Specification, assert.False}, {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Strict, assert.False}, + {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Strict, assert.False}, {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Permissive, assert.True}, {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Specification, assert.True}, {"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Strict, assert.True}, @@ -295,6 +301,9 @@ func TestPattern(t *testing.T) { {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Permissive, assert.False}, {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Specification, assert.False}, {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Strict, assert.False}, + {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Strict, assert.False}, {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Permissive, assert.True}, {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Specification, assert.True}, {"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Strict, assert.True}, @@ -302,6 +311,9 @@ func TestPattern(t *testing.T) { {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Permissive, assert.False}, {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Specification, assert.False}, {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Strict, assert.False}, + {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Strict, assert.False}, {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Permissive, assert.True}, {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Specification, assert.True}, {"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Strict, assert.True}, @@ -309,6 +321,9 @@ func TestPattern(t *testing.T) { {"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Permissive, assert.False}, {"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Specification, assert.False}, {"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Strict, assert.False}, + {"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Strict, assert.False}, {"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Permissive, assert.True}, {"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Specification, assert.True}, {"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Strict, assert.True}, @@ -316,6 +331,9 @@ func TestPattern(t *testing.T) { {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Permissive, assert.False}, {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Specification, assert.False}, {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Strict, assert.False}, + {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Strict, assert.False}, {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Permissive, assert.True}, {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Specification, assert.True}, {"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Strict, assert.True}, @@ -323,6 +341,9 @@ func TestPattern(t *testing.T) { {"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Permissive, assert.False}, {"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Specification, assert.False}, {"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Strict, assert.False}, + {"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Strict, assert.False}, {"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Permissive, assert.True}, {"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Specification, assert.True}, {"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Strict, assert.True}, @@ -330,6 +351,9 @@ func TestPattern(t *testing.T) { {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Permissive, assert.False}, {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Specification, assert.False}, {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Strict, assert.False}, + {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Permissive, assert.False}, + {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Specification, assert.False}, + {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Strict, assert.False}, {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Permissive, assert.True}, {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Specification, assert.True}, {"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Strict, assert.True}, diff --git a/internal/project/platform/platformtxt/platformtxtschema_test.go b/internal/project/platform/platformtxt/platformtxtschema_test.go index c04ca6f1..03c8c96f 100644 --- a/internal/project/platform/platformtxt/platformtxtschema_test.go +++ b/internal/project/platform/platformtxt/platformtxtschema_test.go @@ -329,6 +329,19 @@ func TestPattern(t *testing.T) { complianceLevel compliancelevel.Type assertion assert.BoolAssertionFunc }{ + {"version", "version", "1.0.0", compliancelevel.Permissive, assert.False}, + {"version", "version", "1.0.0", compliancelevel.Specification, assert.False}, + {"version", "version", "1.0.0", compliancelevel.Strict, assert.False}, + {"version", "version", "1.0", compliancelevel.Permissive, assert.False}, + {"version", "version", "1.0", compliancelevel.Specification, assert.True}, + {"version", "version", "1.0", compliancelevel.Strict, assert.True}, + {"version", "version", "{foo}", compliancelevel.Permissive, assert.False}, + {"version", "version", "{foo}", compliancelevel.Specification, assert.False}, + {"version", "version", "{foo}", compliancelevel.Strict, assert.False}, + {"version", "version", "foo", compliancelevel.Permissive, assert.True}, + {"version", "version", "foo", compliancelevel.Specification, assert.True}, + {"version", "version", "foo", compliancelevel.Strict, assert.True}, + {"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Permissive, assert.False}, {"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Specification, assert.False}, {"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Strict, assert.False}, diff --git a/internal/rule/schema/schemadata/bindata.go b/internal/rule/schema/schemadata/bindata.go index 9ae12045..b80e766a 100644 --- a/internal/rule/schema/schemadata/bindata.go +++ b/internal/rule/schema/schemadata/bindata.go @@ -927,7 +927,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{ "type": "string" }, { - "pattern": "^[0-9]+$" + "pattern": "^([0-9]+)|({.+})$" } ] } @@ -968,7 +968,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{ "type": "string" }, { - "pattern": "^[0-9]+$" + "pattern": "^([0-9]+)|({.+})$" } ] } @@ -1170,7 +1170,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{ "type": "string" }, { - "pattern": "^0[xX][0-9a-fA-F]{4}$" + "pattern": "^(0[xX][0-9a-fA-F]{4})|({.+})$" } ] } @@ -2603,7 +2603,14 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{ "$ref": "#/definitions/propertiesObjects/version/base/object" }, { - "$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver" + "anyOf": [ + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver" + }, + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference" + } + ] } ] } @@ -2615,7 +2622,14 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{ "$ref": "#/definitions/propertiesObjects/version/base/object" }, { - "$ref": "general-definitions-schema.json#/definitions/patternObjects/semver" + "anyOf": [ + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/semver" + }, + { + "$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference" + } + ] } ] } @@ -4356,6 +4370,10 @@ var _generalDefinitionsSchemaJson = []byte(`{ "relaxedSemver": { "$comment": "https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string adjusted to also allow MAJOR.MINOR, MAJOR, and with unused non-capturing group syntax removed. For details, see https://go.bug.st/relaxed-semver", "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))?(\\.(0|[1-9]\\d*))?(-((0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\\+([0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*))?$" + }, + "containsPropertyReference": { + "$comment": "https://arduino.github.io/arduino-cli/dev/platform-specification/#configuration-files-format", + "pattern": "{.+}" } } }