diff --git a/internal/rule/ruleconfiguration/ruleconfiguration.go b/internal/rule/ruleconfiguration/ruleconfiguration.go index c8a95daf..d453d004 100644 --- a/internal/rule/ruleconfiguration/ruleconfiguration.go +++ b/internal/rule/ruleconfiguration/ruleconfiguration.go @@ -2921,4 +2921,84 @@ var configurations = []Type{ ErrorModes: []rulemode.Type{rulemode.Default}, RuleFunction: rulefunction.PackageIndexFormat, }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "package", + ID: "ID003", + Brief: "dead packages[].websiteURL", + Description: "", + MessageTemplate: "Unable to load the packages[].websiteURL URL for package(s): {{.}}", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: []rulemode.Type{rulemode.Permissive}, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesWebsiteURLDeadLink, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "package", + ID: "ID004", + Brief: "dead packages[].help.online", + Description: "", + MessageTemplate: "Unable to load the packages[].help.online URL for package(s): {{.}}", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: []rulemode.Type{rulemode.Permissive}, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesHelpOnlineDeadLink, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "ID005", + Brief: "dead packages[].platforms[].help.online", + Description: "", + MessageTemplate: "Unable to load the packages[].platforms[].help.online URL for platforms(s): {{.}}", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: []rulemode.Type{rulemode.Permissive}, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsHelpOnlineDeadLink, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "platform", + ID: "ID006", + Brief: "dead packages[].platforms[].url", + Description: "", + MessageTemplate: "Unable to load the packages[].platforms[].url URL for platforms(s): {{.}}", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: []rulemode.Type{rulemode.Permissive}, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesPlatformsURLDeadLink, + }, + { + ProjectType: projecttype.PackageIndex, + SuperprojectType: projecttype.All, + Category: "data", + Subcategory: "tool", + ID: "ID007", + Brief: "dead packages[].tools[].systems[].url", + Description: "", + MessageTemplate: "Unable to load the packages[].tools[].systems[].url URL for tools(s): {{.}}", + DisableModes: nil, + EnableModes: []rulemode.Type{rulemode.Default}, + InfoModes: nil, + WarningModes: []rulemode.Type{rulemode.Permissive}, + ErrorModes: []rulemode.Type{rulemode.Default}, + RuleFunction: rulefunction.PackageIndexPackagesToolsSystemsURLDeadLink, + }, } diff --git a/internal/rule/rulefunction/library.go b/internal/rule/rulefunction/library.go index b80fd762..c80ed7db 100644 --- a/internal/rule/rulefunction/library.go +++ b/internal/rule/rulefunction/library.go @@ -19,7 +19,6 @@ package rulefunction import ( "fmt" - "net/http" "os" "path/filepath" "regexp" @@ -1010,17 +1009,12 @@ func LibraryPropertiesUrlFieldDeadLink() (result ruleresult.Type, output string) return ruleresult.NotRun, "Field not present" } - logrus.Tracef("Checking URL: %s", url) - httpResponse, err := http.Head(url) + err := checkURL(url) if err != nil { return ruleresult.Fail, err.Error() } - if httpResponse.StatusCode == http.StatusOK { - return ruleresult.Pass, "" - } - - return ruleresult.Fail, httpResponse.Status + return ruleresult.Pass, "" } // LibraryPropertiesArchitecturesFieldMissing checks for missing library.properties "architectures" field. diff --git a/internal/rule/rulefunction/packageindex.go b/internal/rule/rulefunction/packageindex.go index 7a82eb74..00b2ac21 100644 --- a/internal/rule/rulefunction/packageindex.go +++ b/internal/rule/rulefunction/packageindex.go @@ -16,6 +16,8 @@ package rulefunction import ( + "strings" + "github.com/arduino/arduino-lint/internal/project/packageindex" "github.com/arduino/arduino-lint/internal/project/projectdata" "github.com/arduino/arduino-lint/internal/rule/ruleresult" @@ -83,3 +85,168 @@ func PackageIndexFormat() (result ruleresult.Type, output string) { return ruleresult.Pass, "" } + +// PackageIndexPackagesWebsiteURLDeadLink checks for dead links in packages[].websiteURL. +func PackageIndexPackagesWebsiteURLDeadLink() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, data := range projectdata.PackageIndexPackages() { + url, ok := data.Object["websiteURL"].(string) + if !ok { + continue + } + + if url == "" { + continue + } + + if checkURL(url) == nil { + continue + } + + nonCompliantIDs = append(nonCompliantIDs, data.ID) + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, strings.Join(nonCompliantIDs, ", ") + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesHelpOnlineDeadLink checks for dead links in packages[].help.online. +func PackageIndexPackagesHelpOnlineDeadLink() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, data := range projectdata.PackageIndexPackages() { + help, ok := data.Object["help"].(map[string]interface{}) + if !ok { + continue + } + + url, ok := help["online"].(string) + if !ok { + continue + } + + if url == "" { + continue + } + + if checkURL(url) == nil { + continue + } + + nonCompliantIDs = append(nonCompliantIDs, data.ID) + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, strings.Join(nonCompliantIDs, ", ") + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsHelpOnlineDeadLink checks for dead links in packages[].platforms[].help.online. +func PackageIndexPackagesPlatformsHelpOnlineDeadLink() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, data := range projectdata.PackageIndexPlatforms() { + help, ok := data.Object["help"].(map[string]interface{}) + if !ok { + continue + } + + url, ok := help["online"].(string) + if !ok { + continue + } + + if url == "" { + continue + } + + if checkURL(url) == nil { + continue + } + + nonCompliantIDs = append(nonCompliantIDs, data.ID) + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, strings.Join(nonCompliantIDs, ", ") + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesPlatformsURLDeadLink checks for dead links in packages[].platforms[].url. +func PackageIndexPackagesPlatformsURLDeadLink() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, data := range projectdata.PackageIndexPlatforms() { + url, ok := data.Object["url"].(string) + if !ok { + continue + } + + if url == "" { + continue + } + + if checkURL(url) == nil { + continue + } + + nonCompliantIDs = append(nonCompliantIDs, data.ID) + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, strings.Join(nonCompliantIDs, ", ") + } + + return ruleresult.Pass, "" +} + +// PackageIndexPackagesToolsSystemsURLDeadLink checks for dead links in packages[].tools[].systems[].url. +func PackageIndexPackagesToolsSystemsURLDeadLink() (result ruleresult.Type, output string) { + if projectdata.PackageIndexLoadError() != nil { + return ruleresult.NotRun, "Error loading package index" + } + + nonCompliantIDs := []string{} + for _, data := range projectdata.PackageIndexSystems() { + url, ok := data.Object["url"].(string) + if !ok { + continue + } + + if url == "" { + continue + } + + if checkURL(url) == nil { + continue + } + + nonCompliantIDs = append(nonCompliantIDs, data.ID) + } + + if len(nonCompliantIDs) > 0 { + return ruleresult.Fail, strings.Join(nonCompliantIDs, ", ") + } + + return ruleresult.Pass, "" +} diff --git a/internal/rule/rulefunction/packageindex_test.go b/internal/rule/rulefunction/packageindex_test.go index e2f17022..cfe03e79 100644 --- a/internal/rule/rulefunction/packageindex_test.go +++ b/internal/rule/rulefunction/packageindex_test.go @@ -110,3 +110,54 @@ func TestPackageIndexFormat(t *testing.T) { checkPackageIndexRuleFunction(PackageIndexFormat, testTables, t) } + +func TestPackageIndexPackagesWebsiteURLDeadLink(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Dead URLs", "packages-websiteurl-dead", ruleresult.Fail, "^myboard1, myboard2$"}, + {"Invalid URL", "packages-websiteurl-invalid", ruleresult.Fail, "^myboard$"}, + {"Valid URL", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesWebsiteURLDeadLink, testTables, t) +} + +func TestPackageIndexPackagesHelpOnlineDeadLink(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Dead URLs", "packages-help-online-dead", ruleresult.Fail, "^myboard1, myboard2$"}, + {"Valid URL", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesHelpOnlineDeadLink, testTables, t) +} + +func TestPackageIndexPackagesPlatformsHelpOnlineDeadLink(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Dead URLs", "packages-platforms-help-online-dead", ruleresult.Fail, "^myboard:avr@1\\.0\\.0, myboard:samd@1\\.0\\.0$"}, + {"Valid URL", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsHelpOnlineDeadLink, testTables, t) +} + +func TestPackageIndexPackagesPlatformsURLDeadLink(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Dead URLs", "packages-platforms-url-dead", ruleresult.Fail, "^myboard:avr@1\\.0\\.0, myboard:samd@1\\.0\\.0$"}, + {"Valid URL", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsURLDeadLink, testTables, t) +} + +func TestPackageIndexPackagesToolsSystemsURLDeadLink(t *testing.T) { + testTables := []packageIndexRuleFunctionTestTable{ + {"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""}, + {"Dead URLs", "packages-tools-systems-url-dead", ruleresult.Fail, "^myboard:CMSIS@4\\.0\\.0-atmel - arm-linux-gnueabihf, myboard:CMSIS@4\\.0\\.0-atmel - i686-mingw32$"}, + {"Valid URL", "valid-package-index", ruleresult.Pass, ""}, + } + + checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsURLDeadLink, testTables, t) +} diff --git a/internal/rule/rulefunction/rulefunction.go b/internal/rule/rulefunction/rulefunction.go index 5c338581..24edc32a 100644 --- a/internal/rule/rulefunction/rulefunction.go +++ b/internal/rule/rulefunction/rulefunction.go @@ -19,6 +19,7 @@ package rulefunction import ( "encoding/json" "fmt" + "net/http" "regexp" "strings" @@ -26,6 +27,7 @@ import ( "github.com/arduino/arduino-lint/internal/project/sketch" "github.com/arduino/arduino-lint/internal/rule/ruleresult" "github.com/arduino/go-paths-helper" + "github.com/sirupsen/logrus" ) // Type is the function signature for the rule functions. @@ -156,3 +158,17 @@ func isValidJSON(path *paths.Path) bool { } return json.Valid(data) } + +func checkURL(url string) error { + logrus.Tracef("Checking URL: %s", url) + response, err := http.Head(url) + if err != nil { + return err + } + + if response.StatusCode != http.StatusOK { + return fmt.Errorf("%s", response.Status) + } + + return nil +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-help-online-dead/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-help-online-dead/package_foo_index.json new file mode 100644 index 00000000..9dcc0e7c --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-help-online-dead/package_foo_index.json @@ -0,0 +1,26 @@ +{ + "packages": [ + { + "name": "myboard1", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://httpstat.us/403" + }, + "platforms": [], + "tools": [] + }, + { + "name": "myboard2", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://httpstat.us/404" + }, + "platforms": [], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-help-online-dead/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-help-online-dead/package_foo_index.json new file mode 100644 index 00000000..faa859e3 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-help-online-dead/package_foo_index.json @@ -0,0 +1,46 @@ +{ + "packages": [ + { + "name": "myboard", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My AVR Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://httpstat.us/403" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [], + "toolsDependencies": [] + }, + { + "name": "My SAMD Board", + "architecture": "samd", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://httpstat.us/404" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [], + "toolsDependencies": [] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-url-dead/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-url-dead/package_foo_index.json new file mode 100644 index 00000000..bbd58f29 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-platforms-url-dead/package_foo_index.json @@ -0,0 +1,46 @@ +{ + "packages": [ + { + "name": "myboard", + "maintainer": "Jane Developer", + "websiteURL": "http://example.com", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [ + { + "name": "My AVR Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://httpstat.us/403", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [], + "toolsDependencies": [] + }, + { + "name": "My SAMD Board", + "architecture": "samd", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com" + }, + "url": "http://httpstat.us/404", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [], + "toolsDependencies": [] + } + ], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-tools-systems-url-dead/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-tools-systems-url-dead/package_foo_index.json new file mode 100644 index 00000000..c943f170 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-tools-systems-url-dead/package_foo_index.json @@ -0,0 +1,36 @@ +{ + "packages": [ + { + "name": "myboard", + "maintainer": "Jane Developer", + "websiteURL": "http://httpstat.us/404", + "email": "jane@example.com", + "help": { + "online": "http://example.com" + }, + "platforms": [], + "tools": [ + { + "name": "CMSIS", + "version": "4.0.0-atmel", + "systems": [ + { + "host": "arm-linux-gnueabihf", + "url": "http://httpstat.us/403", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + }, + { + "host": "i686-mingw32", + "url": "http://httpstat.us/404", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + } + ] + } + ] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-dead/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-dead/package_foo_index.json new file mode 100644 index 00000000..c82cff53 --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-dead/package_foo_index.json @@ -0,0 +1,26 @@ +{ + "packages": [ + { + "name": "myboard1", + "maintainer": "Jane Developer", + "websiteURL": "http://httpstat.us/403", + "email": "jane@example.com", + "help": { + "online": "http://example.com/forum/myboard" + }, + "platforms": [], + "tools": [] + }, + { + "name": "myboard2", + "maintainer": "Jane Developer", + "websiteURL": "http://httpstat.us/404", + "email": "jane@example.com", + "help": { + "online": "http://example.com/forum/myboard" + }, + "platforms": [], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-invalid/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-invalid/package_foo_index.json new file mode 100644 index 00000000..b0106cdc --- /dev/null +++ b/internal/rule/rulefunction/testdata/packageindexes/packages-websiteurl-invalid/package_foo_index.json @@ -0,0 +1,15 @@ +{ + "packages": [ + { + "name": "myboard", + "maintainer": "Jane Developer", + "websiteURL": "invalid", + "email": "jane@example.com", + "help": { + "online": "http://example.com/forum/myboard" + }, + "platforms": [], + "tools": [] + } + ] +} diff --git a/internal/rule/rulefunction/testdata/packageindexes/valid-package-index/package_foo_index.json b/internal/rule/rulefunction/testdata/packageindexes/valid-package-index/package_foo_index.json index 22e5b452..e6cd588a 100644 --- a/internal/rule/rulefunction/testdata/packageindexes/valid-package-index/package_foo_index.json +++ b/internal/rule/rulefunction/testdata/packageindexes/valid-package-index/package_foo_index.json @@ -3,10 +3,10 @@ { "name": "myboard", "maintainer": "Jane Developer", - "websiteURL": "https://github.com/janedeveloper/myboard", + "websiteURL": "http://example.com", "email": "jane@example.com", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, "platforms": [ { @@ -15,9 +15,9 @@ "version": "1.0.0", "category": "Contributed", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, - "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "url": "http://example.com", "archiveFileName": "myboard-1.0.0.zip", "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", "size": "15005", @@ -41,9 +41,9 @@ "version": "1.0.1", "category": "Contributed", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, - "url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip", + "url": "http://example.com", "archiveFileName": "myboard-1.0.1.zip", "checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9", "size": "15125", @@ -62,7 +62,48 @@ ] } ], - "tools": [] + "tools": [ + { + "name": "openocd", + "version": "0.11.0-arduino2", + "systems": [ + { + "size": "1902818", + "checksum": "SHA-256:a1aa7f1435a61eafb72ee90722f2496d6a34a7a0f085d0315c2613e4a548b824", + "host": "aarch64-linux-gnu", + "archiveFileName": "openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2", + "url": "http://example.com" + }, + { + "size": "1986716", + "checksum": "SHA-256:57041130160be086e69387cceb4616eefc9819a0ef75de1f7c11aea57fb92699", + "host": "arm-linux-gnueabihf", + "archiveFileName": "openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2", + "url": "http://example.com" + } + ] + }, + { + "name": "CMSIS", + "version": "4.0.0-atmel", + "systems": [ + { + "host": "arm-linux-gnueabihf", + "url": "http://example.com", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + }, + { + "host": "i686-mingw32", + "url": "http://example.com", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + } + ] + } + ] } ] } diff --git a/test/testdata/project-type/PackageIndex/package_valid_index.json b/test/testdata/project-type/PackageIndex/package_valid_index.json index 22e5b452..433b784e 100644 --- a/test/testdata/project-type/PackageIndex/package_valid_index.json +++ b/test/testdata/project-type/PackageIndex/package_valid_index.json @@ -3,10 +3,10 @@ { "name": "myboard", "maintainer": "Jane Developer", - "websiteURL": "https://github.com/janedeveloper/myboard", + "websiteURL": "http://example.com", "email": "jane@example.com", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, "platforms": [ { @@ -15,9 +15,9 @@ "version": "1.0.0", "category": "Contributed", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, - "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "url": "http://example.com", "archiveFileName": "myboard-1.0.0.zip", "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", "size": "15005", @@ -41,9 +41,9 @@ "version": "1.0.1", "category": "Contributed", "help": { - "online": "http://example.com/forum/myboard" + "online": "http://example.com" }, - "url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip", + "url": "http://example.com", "archiveFileName": "myboard-1.0.1.zip", "checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9", "size": "15125",