Add rule for 3rd party library.properties maintainer using "Arduino" · arduino/arduino-lint@e98b7d3 (original) (raw)

File tree

8 files changed

lines changed

8 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -10,6 +10,11 @@
10 10 "not": {
11 11 "pattern": "^[aA][rR][dD][uU][iI][nN][oO].*$"
12 12 }
13 + },
14 +"notContainsArduino": {
15 +"not": {
16 +"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
17 + }
13 18 }
14 19 }
15 20 },
@@ -77,11 +82,6 @@
77 82 "pattern": "^.* .*$"
78 83 }
79 84 },
80 -"notContainsArduino": {
81 -"not": {
82 -"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
83 - }
84 - },
85 85 "notContainsSuperfluousTerms": {
86 86 "not": {
87 87 "pattern": "^.*[lL][iI][bB][rR][aA][rR][yY].*$"
@@ -101,7 +101,7 @@
101 101 "$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSpaces"
102 102 },
103 103 {
104 -"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
104 +"$ref": "#/definitions/general/patternObjects/notContainsArduino"
105 105 },
106 106 {
107 107 "$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSuperfluousTerms"
@@ -238,6 +238,9 @@
238 238 "allOf": [
239 239 {
240 240 "$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
241 + },
242 + {
243 +"$ref": "#/definitions/general/patternObjects/notContainsArduino"
241 244 }
242 245 ]
243 246 }
Original file line number Diff line number Diff line change
@@ -291,8 +291,11 @@ func TestPropertiesVersionPattern(t *testing.T) {
291 291 func TestPropertiesMaintainerPattern(t *testing.T) {
292 292 testTables := []propertyValueTestTable{
293 293 {"Starts with arduino", "arduinofoo", compliancelevel.Permissive, assert.False},
294 + {"Contains arduino", "fooarduinobar", compliancelevel.Permissive, assert.False},
294 295 {"Starts with arduino", "arduinofoo", compliancelevel.Specification, assert.True},
296 + {"Contains arduino", "fooarduinobar", compliancelevel.Specification, assert.False},
295 297 {"Starts with arduino", "arduinofoo", compliancelevel.Strict, assert.True},
298 + {"Contains arduino", "fooarduinobar", compliancelevel.Strict, assert.True},
296 299 }
297 300
298 301 checkPropertyPatternMismatch("maintainer", testTables, t)
Original file line number Diff line number Diff line change
@@ -681,6 +681,22 @@ var configurations = []Type{
681 681 ErrorModes: []rulemode.Type{rulemode.Strict},
682 682 RuleFunction: rulefunction.LibraryPropertiesMaintainerFieldStartsWithArduino,
683 683 },
684 + {
685 +ProjectType: projecttype.Library,
686 +SuperprojectType: projecttype.All,
687 +Category: "library.properties",
688 +Subcategory: "maintainer field",
689 +ID: "LP057",
690 +Brief: `maintainer contains "Arduino"`,
691 +Description: "Case insensitive.",
692 +MessageTemplate: `library.properties maintainer value {{.}} contains "Arduino". 3rd party libraries are not maintained by Arduino.`,
693 +DisableModes: []rulemode.Type{rulemode.Official},
694 +EnableModes: []rulemode.Type{rulemode.Default},
695 +InfoModes: nil,
696 +WarningModes: []rulemode.Type{rulemode.Default},
697 +ErrorModes: []rulemode.Type{rulemode.Strict},
698 +RuleFunction: rulefunction.LibraryPropertiesMaintainerFieldContainsArduino,
699 + },
684 700 {
685 701 ProjectType: projecttype.Library,
686 702 SuperprojectType: projecttype.All,
Original file line number Diff line number Diff line change
@@ -744,6 +744,24 @@ func LibraryPropertiesMaintainerFieldStartsWithArduino() (result ruleresult.Type
744 744 return ruleresult.Pass, ""
745 745 }
746 746
747 +// LibraryPropertiesMaintainerFieldContainsArduino checks if the library.properties "maintainer" value contains "Arduino".
748 +func LibraryPropertiesMaintainerFieldContainsArduino() (result ruleresult.Type, output string) {
749 +if projectdata.LibraryPropertiesLoadError() != nil {
750 +return ruleresult.NotRun, "Couldn't load library.properties"
751 + }
752 +
753 +maintainer, ok := projectdata.LibraryProperties().GetOk("maintainer")
754 +if !ok {
755 +return ruleresult.NotRun, "Field not present"
756 + }
757 +
758 +if schema.ValidationErrorMatch("^#/maintainer$", "/patternObjects/notContainsArduino", "", "", projectdata.LibraryPropertiesSchemaValidationResult()[compliancelevel.Strict]) {
759 +return ruleresult.Fail, maintainer
760 + }
761 +
762 +return ruleresult.Pass, ""
763 +}
764 +
747 765 // LibraryPropertiesEmailFieldAsMaintainerAlias checks whether the library.properties "email" field is being used as an alias for the "maintainer" field.
748 766 func LibraryPropertiesEmailFieldAsMaintainerAlias() (result ruleresult.Type, output string) {
749 767 if projectdata.LibraryPropertiesLoadError() != nil {
Original file line number Diff line number Diff line change
@@ -568,6 +568,17 @@ func TestLibraryPropertiesMaintainerFieldStartsWithArduino(t *testing.T) {
568 568 checkLibraryRuleFunction(LibraryPropertiesMaintainerFieldStartsWithArduino, testTables, t)
569 569 }
570 570
571 +func TestLibraryPropertiesMaintainerFieldContainsArduino(t *testing.T) {
572 +testTables := []libraryRuleFunctionTestTable{
573 + {"Invalid", "InvalidLibraryProperties", ruleresult.NotRun, ""},
574 + {"Legacy", "Legacy", ruleresult.NotRun, ""},
575 + {"Maintainer field contains Arduino", "MaintainerContainsArduino", ruleresult.Fail, ""},
576 + {"Valid", "Recursive", ruleresult.Pass, ""},
577 + }
578 +
579 +checkLibraryRuleFunction(LibraryPropertiesMaintainerFieldContainsArduino, testTables, t)
580 +}
581 +
571 582 func TestLibraryPropertiesEmailFieldAsMaintainerAlias(t *testing.T) {
572 583 testTables := []libraryRuleFunctionTestTable{
573 584 {"Unable to load", "InvalidLibraryProperties", ruleresult.NotRun, ""},
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
1 +name=MaintainerContainsArduino
2 +version=1.0.0
3 +author=Cristian Maglie c.maglie@example.com, Pippo Pluto pippo@example.com
4 +maintainer=Cristian "Arduino Wizard" Maglie c.maglie@example.com
5 +sentence=A library that makes coding a web server a breeze.
6 +paragraph=Supports HTTP1.1 and you can do GET and POST.
7 +category=Communication
8 +url=http://example.com/
9 +architectures=avr
10 +includes=Recursive.h
Original file line number Diff line number Diff line change
@@ -1429,6 +1429,11 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
1429 1429 "not": {
1430 1430 "pattern": "^[aA][rR][dD][uU][iI][nN][oO].*$"
1431 1431 }
1432 + },
1433 + "notContainsArduino": {
1434 + "not": {
1435 + "pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
1436 + }
1432 1437 }
1433 1438 }
1434 1439 },
@@ -1496,11 +1501,6 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
1496 1501 "pattern": "^.* .*$"
1497 1502 }
1498 1503 },
1499 - "notContainsArduino": {
1500 - "not": {
1501 - "pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
1502 - }
1503 - },
1504 1504 "notContainsSuperfluousTerms": {
1505 1505 "not": {
1506 1506 "pattern": "^.*[lL][iI][bB][rR][aA][rR][yY].*$"
@@ -1520,7 +1520,7 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
1520 1520 "$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSpaces"
1521 1521 },
1522 1522 {
1523 - "$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
1523 + "$ref": "#/definitions/general/patternObjects/notContainsArduino"
1524 1524 },
1525 1525 {
1526 1526 "$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSuperfluousTerms"
@@ -1657,6 +1657,9 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
1657 1657 "allOf": [
1658 1658 {
1659 1659 "$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
1660 + },
1661 + {
1662 + "$ref": "#/definitions/general/patternObjects/notContainsArduino"
1660 1663 }
1661 1664 ]
1662 1665 }