Skip to content

Add rule for 3rd party library.properties maintainer using "Arduino" #180

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤣

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