Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 4e6b50f

Browse files
committedMay 30, 2021
Add rule for 3rd party library.properties maintainer using "Arduino"
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.
1 parent 182dbba commit 4e6b50f

File tree

8 files changed

+64
-0
lines changed

8 files changed

+64
-0
lines changed
 

‎etc/schemas/arduino-library-properties-definitions-schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@
244244
"allOf": [
245245
{
246246
"$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
247+
},
248+
{
249+
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
247250
}
248251
]
249252
}

‎internal/project/library/libraryproperties/librarypropertiesschemas_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,11 @@ func TestPropertiesVersionPattern(t *testing.T) {
291291
func TestPropertiesMaintainerPattern(t *testing.T) {
292292
testTables := []propertyValueTestTable{
293293
{"Starts with arduino", "arduinofoo", compliancelevel.Permissive, assert.False},
294+
{"Contains arduino", "fooarduinobar", compliancelevel.Permissive, assert.False},
294295
{"Starts with arduino", "arduinofoo", compliancelevel.Specification, assert.True},
296+
{"Contains arduino", "fooarduinobar", compliancelevel.Specification, assert.False},
295297
{"Starts with arduino", "arduinofoo", compliancelevel.Strict, assert.True},
298+
{"Contains arduino", "fooarduinobar", compliancelevel.Strict, assert.True},
296299
}
297300

298301
checkPropertyPatternMismatch("maintainer", testTables, t)

‎internal/rule/ruleconfiguration/ruleconfiguration.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,22 @@ var configurations = []Type{
681681
ErrorModes: []rulemode.Type{rulemode.Strict},
682682
RuleFunction: rulefunction.LibraryPropertiesMaintainerFieldStartsWithArduino,
683683
},
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+
},
684700
{
685701
ProjectType: projecttype.Library,
686702
SuperprojectType: projecttype.All,

‎internal/rule/rulefunction/library.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,24 @@ func LibraryPropertiesMaintainerFieldStartsWithArduino() (result ruleresult.Type
742742
return ruleresult.Pass, ""
743743
}
744744

745+
// LibraryPropertiesMaintainerFieldContainsArduino checks if the library.properties "maintainer" value contains "Arduino".
746+
func LibraryPropertiesMaintainerFieldContainsArduino() (result ruleresult.Type, output string) {
747+
if projectdata.LibraryPropertiesLoadError() != nil {
748+
return ruleresult.NotRun, "Couldn't load library.properties"
749+
}
750+
751+
maintainer, ok := projectdata.LibraryProperties().GetOk("maintainer")
752+
if !ok {
753+
return ruleresult.NotRun, "Field not present"
754+
}
755+
756+
if schema.ValidationErrorMatch("^#/maintainer$", "/patternObjects/notContainsArduino", "", "", projectdata.LibraryPropertiesSchemaValidationResult()[compliancelevel.Strict]) {
757+
return ruleresult.Fail, maintainer
758+
}
759+
760+
return ruleresult.Pass, ""
761+
}
762+
745763
// LibraryPropertiesEmailFieldAsMaintainerAlias checks whether the library.properties "email" field is being used as an alias for the "maintainer" field.
746764
func LibraryPropertiesEmailFieldAsMaintainerAlias() (result ruleresult.Type, output string) {
747765
if projectdata.LibraryPropertiesLoadError() != nil {

‎internal/rule/rulefunction/library_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,17 @@ func TestLibraryPropertiesMaintainerFieldStartsWithArduino(t *testing.T) {
568568
checkLibraryRuleFunction(LibraryPropertiesMaintainerFieldStartsWithArduino, testTables, t)
569569
}
570570

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+
571582
func TestLibraryPropertiesEmailFieldAsMaintainerAlias(t *testing.T) {
572583
testTables := []libraryRuleFunctionTestTable{
573584
{"Unable to load", "InvalidLibraryProperties", ruleresult.NotRun, ""},
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff 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

‎internal/rule/rulefunction/testdata/libraries/MaintainerContainsArduino/src/MaintainerContainsArduino.h

Whitespace-only changes.

‎internal/rule/schema/schemadata/bindata.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,6 +1663,9 @@ var _arduinoLibraryPropertiesDefinitionsSchemaJson = []byte(`{
16631663
"allOf": [
16641664
{
16651665
"$ref": "#/definitions/propertiesObjects/maintainer/specification/object"
1666+
},
1667+
{
1668+
"$ref": "#/definitions/propertiesObjects/name/strict/definitions/patternObjects/notContainsArduino"
16661669
}
16671670
]
16681671
}

0 commit comments

Comments
 (0)
Please sign in to comment.