Skip to content

Commit

Permalink
Add rule for 3rd party library.properties maintainer using "Arduino"
Browse files Browse the repository at this point in the history
3rd party libraries are not maintained by Arduino. Even when 3rd party libraries are based on official libraries, it is
best practice for the library.properties `maintainer` field to be updated to reflect the true maintainer of the project.

There is already rule LP027 to promote accuracy in documenting maintainership by prohibiting maintainer values that start
with "Arduino". However, this might not cover all inaccurate maintainer declarations. For this reason, a new rule (LP057)
is added here to prohibit maintainer values in 3rd party libraries from containing the term "Arduino" anywhere
(case insensitive). Violations of this rule only result in an error when in "strict" compliance mode.
  • Loading branch information
per1234 committed Jun 4, 2021
1 parent cb7776a commit e98b7d3
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 12 deletions.
15 changes: 9 additions & 6 deletions etc/schemas/arduino-library-properties-definitions-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
"not": {
"pattern": "^[aA][rR][dD][uU][iI][nN][oO].*$"
}
},
"notContainsArduino": {
"not": {
"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
}
}
}
},
Expand Down Expand Up @@ -77,11 +82,6 @@
"pattern": "^.* .*$"
}
},
"notContainsArduino": {
"not": {
"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
}
},
"notContainsSuperfluousTerms": {
"not": {
"pattern": "^.*[lL][iI][bB][rR][aA][rR][yY].*$"
Expand All @@ -101,7 +101,7 @@
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSpaces"
},
{
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
"$ref": "#/definitions/general/patternObjects/notContainsArduino"
},
{
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSuperfluousTerms"
Expand Down Expand Up @@ -238,6 +238,9 @@
"allOf": [
{
"$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
},
{
"$ref": "#/definitions/general/patternObjects/notContainsArduino"
}
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,8 +291,11 @@ func TestPropertiesVersionPattern(t *testing.T) {
func TestPropertiesMaintainerPattern(t *testing.T) {
testTables := []propertyValueTestTable{
{"Starts with arduino", "arduinofoo", compliancelevel.Permissive, assert.False},
{"Contains arduino", "fooarduinobar", compliancelevel.Permissive, assert.False},
{"Starts with arduino", "arduinofoo", compliancelevel.Specification, assert.True},
{"Contains arduino", "fooarduinobar", compliancelevel.Specification, assert.False},
{"Starts with arduino", "arduinofoo", compliancelevel.Strict, assert.True},
{"Contains arduino", "fooarduinobar", compliancelevel.Strict, assert.True},
}

checkPropertyPatternMismatch("maintainer", testTables, t)
Expand Down
16 changes: 16 additions & 0 deletions internal/rule/ruleconfiguration/ruleconfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,22 @@ var configurations = []Type{
ErrorModes: []rulemode.Type{rulemode.Strict},
RuleFunction: rulefunction.LibraryPropertiesMaintainerFieldStartsWithArduino,
},
{
ProjectType: projecttype.Library,
SuperprojectType: projecttype.All,
Category: "library.properties",
Subcategory: "maintainer field",
ID: "LP057",
Brief: `maintainer contains "Arduino"`,
Description: "Case insensitive.",
MessageTemplate: `library.properties maintainer value {{.}} contains "Arduino". 3rd party libraries are not maintained by Arduino.`,
DisableModes: []rulemode.Type{rulemode.Official},
EnableModes: []rulemode.Type{rulemode.Default},
InfoModes: nil,
WarningModes: []rulemode.Type{rulemode.Default},
ErrorModes: []rulemode.Type{rulemode.Strict},
RuleFunction: rulefunction.LibraryPropertiesMaintainerFieldContainsArduino,
},
{
ProjectType: projecttype.Library,
SuperprojectType: projecttype.All,
Expand Down
18 changes: 18 additions & 0 deletions internal/rule/rulefunction/library.go
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,24 @@ func LibraryPropertiesMaintainerFieldStartsWithArduino() (result ruleresult.Type
return ruleresult.Pass, ""
}

// LibraryPropertiesMaintainerFieldContainsArduino checks if the library.properties "maintainer" value contains "Arduino".
func LibraryPropertiesMaintainerFieldContainsArduino() (result ruleresult.Type, output string) {
if projectdata.LibraryPropertiesLoadError() != nil {
return ruleresult.NotRun, "Couldn't load library.properties"
}

maintainer, ok := projectdata.LibraryProperties().GetOk("maintainer")
if !ok {
return ruleresult.NotRun, "Field not present"
}

if schema.ValidationErrorMatch("^#/maintainer$", "/patternObjects/notContainsArduino", "", "", projectdata.LibraryPropertiesSchemaValidationResult()[compliancelevel.Strict]) {
return ruleresult.Fail, maintainer
}

return ruleresult.Pass, ""
}

// LibraryPropertiesEmailFieldAsMaintainerAlias checks whether the library.properties "email" field is being used as an alias for the "maintainer" field.
func LibraryPropertiesEmailFieldAsMaintainerAlias() (result ruleresult.Type, output string) {
if projectdata.LibraryPropertiesLoadError() != nil {
Expand Down
11 changes: 11 additions & 0 deletions internal/rule/rulefunction/library_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,17 @@ func TestLibraryPropertiesMaintainerFieldStartsWithArduino(t *testing.T) {
checkLibraryRuleFunction(LibraryPropertiesMaintainerFieldStartsWithArduino, testTables, t)
}

func TestLibraryPropertiesMaintainerFieldContainsArduino(t *testing.T) {
testTables := []libraryRuleFunctionTestTable{
{"Invalid", "InvalidLibraryProperties", ruleresult.NotRun, ""},
{"Legacy", "Legacy", ruleresult.NotRun, ""},
{"Maintainer field contains Arduino", "MaintainerContainsArduino", ruleresult.Fail, ""},
{"Valid", "Recursive", ruleresult.Pass, ""},
}

checkLibraryRuleFunction(LibraryPropertiesMaintainerFieldContainsArduino, testTables, t)
}

func TestLibraryPropertiesEmailFieldAsMaintainerAlias(t *testing.T) {
testTables := []libraryRuleFunctionTestTable{
{"Unable to load", "InvalidLibraryProperties", ruleresult.NotRun, ""},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name=MaintainerContainsArduino
version=1.0.0
author=Cristian Maglie <c.maglie@example.com>, Pippo Pluto <pippo@example.com>
maintainer=Cristian "Arduino Wizard" Maglie <c.maglie@example.com>
sentence=A library that makes coding a web server a breeze.
paragraph=Supports HTTP1.1 and you can do GET and POST.
category=Communication
url=http://example.com/
architectures=avr
includes=Recursive.h
15 changes: 9 additions & 6 deletions internal/rule/schema/schemadata/bindata.go
Original file line number Diff line number Diff line change
Expand Up @@ -1429,6 +1429,11 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
"not": {
"pattern": "^[aA][rR][dD][uU][iI][nN][oO].*$"
}
},
"notContainsArduino": {
"not": {
"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
}
}
}
},
Expand Down Expand Up @@ -1496,11 +1501,6 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
"pattern": "^.* .*$"
}
},
"notContainsArduino": {
"not": {
"pattern": "^.+[aA][rR][dD][uU][iI][nN][oO].*$"
}
},
"notContainsSuperfluousTerms": {
"not": {
"pattern": "^.*[lL][iI][bB][rR][aA][rR][yY].*$"
Expand All @@ -1520,7 +1520,7 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSpaces"
},
{
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
"$ref": "#/definitions/general/patternObjects/notContainsArduino"
},
{
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsSuperfluousTerms"
Expand Down Expand Up @@ -1657,6 +1657,9 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
"allOf": [
{
"$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
},
{
"$ref": "#/definitions/general/patternObjects/notContainsArduino"
}
]
}
Expand Down

0 comments on commit e98b7d3

Please sign in to comment.