Skip to content

Commit c9ea049

Browse files
authored
Merge pull request #155 from arduino/per1234/property-references-patterns
Make platform JSON schema regexes support property references
2 parents bd037b0 + 043c0bc commit c9ea049

File tree

6 files changed

+83
-10
lines changed

6 files changed

+83
-10
lines changed

Diff for: etc/schemas/arduino-boards-txt-definitions-schema.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@
855855
"type": "string"
856856
},
857857
{
858-
"pattern": "^[0-9]+$"
858+
"pattern": "^([0-9]+)|({.+})$"
859859
}
860860
]
861861
}
@@ -896,7 +896,7 @@
896896
"type": "string"
897897
},
898898
{
899-
"pattern": "^[0-9]+$"
899+
"pattern": "^([0-9]+)|({.+})$"
900900
}
901901
]
902902
}
@@ -1098,7 +1098,7 @@
10981098
"type": "string"
10991099
},
11001100
{
1101-
"pattern": "^0[xX][0-9a-fA-F]{4}$"
1101+
"pattern": "^(0[xX][0-9a-fA-F]{4})|({.+})$"
11021102
}
11031103
]
11041104
}

Diff for: etc/schemas/arduino-platform-txt-definitions-schema.json

+16-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,14 @@
6262
"$ref": "#/definitions/propertiesObjects/version/base/object"
6363
},
6464
{
65-
"$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver"
65+
"anyOf": [
66+
{
67+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver"
68+
},
69+
{
70+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference"
71+
}
72+
]
6673
}
6774
]
6875
}
@@ -74,7 +81,14 @@
7481
"$ref": "#/definitions/propertiesObjects/version/base/object"
7582
},
7683
{
77-
"$ref": "general-definitions-schema.json#/definitions/patternObjects/semver"
84+
"anyOf": [
85+
{
86+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/semver"
87+
},
88+
{
89+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference"
90+
}
91+
]
7892
}
7993
]
8094
}

Diff for: etc/schemas/general-definitions-schema.json

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
"relaxedSemver": {
1414
"$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",
1515
"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-]+)*))?$"
16+
},
17+
"containsPropertyReference": {
18+
"$comment": "https://arduino.github.io/arduino-cli/dev/platform-specification/#configuration-files-format",
19+
"pattern": "{.+}"
1620
}
1721
}
1822
}

Diff for: internal/project/platform/boardstxt/boardstxtschema_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -281,55 +281,79 @@ func TestPattern(t *testing.T) {
281281
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Permissive, assert.False},
282282
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Specification, assert.False},
283283
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "123", compliancelevel.Strict, assert.False},
284+
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Permissive, assert.False},
285+
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Specification, assert.False},
286+
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "{foo}", compliancelevel.Strict, assert.False},
284287
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Permissive, assert.True},
285288
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Specification, assert.True},
286289
{"nano.upload.maximum_size", "nano/upload\\.maximum_size", "foo", compliancelevel.Strict, assert.True},
287290

288291
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Permissive, assert.False},
289292
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Specification, assert.False},
290293
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "123", compliancelevel.Strict, assert.False},
294+
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Permissive, assert.False},
295+
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Specification, assert.False},
296+
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "{foo}", compliancelevel.Strict, assert.False},
291297
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Permissive, assert.True},
292298
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Specification, assert.True},
293299
{"nano.menu.bar.baz.upload.maximum_size", "nano/menu/bar/baz/upload\\.maximum_size", "foo", compliancelevel.Strict, assert.True},
294300

295301
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Permissive, assert.False},
296302
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Specification, assert.False},
297303
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "123", compliancelevel.Strict, assert.False},
304+
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Permissive, assert.False},
305+
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Specification, assert.False},
306+
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "{foo}", compliancelevel.Strict, assert.False},
298307
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Permissive, assert.True},
299308
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Specification, assert.True},
300309
{"nano.upload.maximum_data_size", "nano/upload\\.maximum_data_size", "foo", compliancelevel.Strict, assert.True},
301310

302311
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Permissive, assert.False},
303312
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Specification, assert.False},
304313
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "123", compliancelevel.Strict, assert.False},
314+
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Permissive, assert.False},
315+
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Specification, assert.False},
316+
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "{foo}", compliancelevel.Strict, assert.False},
305317
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Permissive, assert.True},
306318
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Specification, assert.True},
307319
{"nano.menu.bar.baz.upload.maximum_data_size", "nano/menu/bar/baz/upload\\.maximum_data_size", "foo", compliancelevel.Strict, assert.True},
308320

309321
{"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Permissive, assert.False},
310322
{"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Specification, assert.False},
311323
{"nano.vid.0", "nano/vid\\.0", "0xABCD", compliancelevel.Strict, assert.False},
324+
{"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Permissive, assert.False},
325+
{"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Specification, assert.False},
326+
{"nano.vid.0", "nano/vid\\.0", "{foo}", compliancelevel.Strict, assert.False},
312327
{"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Permissive, assert.True},
313328
{"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Specification, assert.True},
314329
{"nano.vid.0", "nano/vid\\.0", "foo", compliancelevel.Strict, assert.True},
315330

316331
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Permissive, assert.False},
317332
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Specification, assert.False},
318333
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "0xABCD", compliancelevel.Strict, assert.False},
334+
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Permissive, assert.False},
335+
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Specification, assert.False},
336+
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "{foo}", compliancelevel.Strict, assert.False},
319337
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Permissive, assert.True},
320338
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Specification, assert.True},
321339
{"nano.menu.bar.baz.vid.0", "nano/menu/bar/baz/vid\\.0", "foo", compliancelevel.Strict, assert.True},
322340

323341
{"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Permissive, assert.False},
324342
{"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Specification, assert.False},
325343
{"nano.pid.0", "nano/pid\\.0", "0xABCD", compliancelevel.Strict, assert.False},
344+
{"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Permissive, assert.False},
345+
{"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Specification, assert.False},
346+
{"nano.pid.0", "nano/pid\\.0", "{foo}", compliancelevel.Strict, assert.False},
326347
{"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Permissive, assert.True},
327348
{"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Specification, assert.True},
328349
{"nano.pid.0", "nano/pid\\.0", "foo", compliancelevel.Strict, assert.True},
329350

330351
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Permissive, assert.False},
331352
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Specification, assert.False},
332353
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "0xABCD", compliancelevel.Strict, assert.False},
354+
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Permissive, assert.False},
355+
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Specification, assert.False},
356+
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "{foo}", compliancelevel.Strict, assert.False},
333357
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Permissive, assert.True},
334358
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Specification, assert.True},
335359
{"nano.menu.bar.baz.pid.0", "nano/menu/bar/baz/pid\\.0", "foo", compliancelevel.Strict, assert.True},

Diff for: internal/project/platform/platformtxt/platformtxtschema_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,19 @@ func TestPattern(t *testing.T) {
329329
complianceLevel compliancelevel.Type
330330
assertion assert.BoolAssertionFunc
331331
}{
332+
{"version", "version", "1.0.0", compliancelevel.Permissive, assert.False},
333+
{"version", "version", "1.0.0", compliancelevel.Specification, assert.False},
334+
{"version", "version", "1.0.0", compliancelevel.Strict, assert.False},
335+
{"version", "version", "1.0", compliancelevel.Permissive, assert.False},
336+
{"version", "version", "1.0", compliancelevel.Specification, assert.True},
337+
{"version", "version", "1.0", compliancelevel.Strict, assert.True},
338+
{"version", "version", "{foo}", compliancelevel.Permissive, assert.False},
339+
{"version", "version", "{foo}", compliancelevel.Specification, assert.False},
340+
{"version", "version", "{foo}", compliancelevel.Strict, assert.False},
341+
{"version", "version", "foo", compliancelevel.Permissive, assert.True},
342+
{"version", "version", "foo", compliancelevel.Specification, assert.True},
343+
{"version", "version", "foo", compliancelevel.Strict, assert.True},
344+
332345
{"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Permissive, assert.False},
333346
{"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Specification, assert.False},
334347
{"recipe.c.o.pattern", "recipe\\.c\\.o\\.pattern", "foo {compiler.c.extra_flags} bar", compliancelevel.Strict, assert.False},

Diff for: internal/rule/schema/schemadata/bindata.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{
927927
"type": "string"
928928
},
929929
{
930-
"pattern": "^[0-9]+$"
930+
"pattern": "^([0-9]+)|({.+})$"
931931
}
932932
]
933933
}
@@ -968,7 +968,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{
968968
"type": "string"
969969
},
970970
{
971-
"pattern": "^[0-9]+$"
971+
"pattern": "^([0-9]+)|({.+})$"
972972
}
973973
]
974974
}
@@ -1170,7 +1170,7 @@ var _arduinoBoardsTxtDefinitionsSchemaJson = []byte(`{
11701170
"type": "string"
11711171
},
11721172
{
1173-
"pattern": "^0[xX][0-9a-fA-F]{4}$"
1173+
"pattern": "^(0[xX][0-9a-fA-F]{4})|({.+})$"
11741174
}
11751175
]
11761176
}
@@ -2603,7 +2603,14 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
26032603
"$ref": "#/definitions/propertiesObjects/version/base/object"
26042604
},
26052605
{
2606-
"$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver"
2606+
"anyOf": [
2607+
{
2608+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/relaxedSemver"
2609+
},
2610+
{
2611+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference"
2612+
}
2613+
]
26072614
}
26082615
]
26092616
}
@@ -2615,7 +2622,14 @@ var _arduinoPlatformTxtDefinitionsSchemaJson = []byte(`{
26152622
"$ref": "#/definitions/propertiesObjects/version/base/object"
26162623
},
26172624
{
2618-
"$ref": "general-definitions-schema.json#/definitions/patternObjects/semver"
2625+
"anyOf": [
2626+
{
2627+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/semver"
2628+
},
2629+
{
2630+
"$ref": "general-definitions-schema.json#/definitions/patternObjects/containsPropertyReference"
2631+
}
2632+
]
26192633
}
26202634
]
26212635
}
@@ -4356,6 +4370,10 @@ var _generalDefinitionsSchemaJson = []byte(`{
43564370
"relaxedSemver": {
43574371
"$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",
43584372
"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-]+)*))?$"
4373+
},
4374+
"containsPropertyReference": {
4375+
"$comment": "https://arduino.github.io/arduino-cli/dev/platform-specification/#configuration-files-format",
4376+
"pattern": "{.+}"
43594377
}
43604378
}
43614379
}

0 commit comments

Comments
 (0)