Skip to content

Commit bb9e831

Browse files
authored
Merge pull request #202 from per1234/package-index-tools-rules
Add schema-based rules for tools data of package index
2 parents c1fd3df + 2014a85 commit bb9e831

File tree

33 files changed

+3406
-1
lines changed

33 files changed

+3406
-1
lines changed

Diff for: internal/rule/ruleconfiguration/ruleconfiguration.go

+481-1
Large diffs are not rendered by default.

Diff for: internal/rule/rulefunction/packageindex.go

+600
Large diffs are not rendered by default.

Diff for: internal/rule/rulefunction/packageindex_test.go

+300
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,196 @@ func TestPackageIndexPackagesPlatformsToolsDependenciesVersionNonSemver(t *testi
922922
checkPackageIndexRuleFunction(PackageIndexPackagesPlatformsToolsDependenciesVersionNonSemver, testTables, t)
923923
}
924924

925+
func TestPackageIndexPackagesToolsMissing(t *testing.T) {
926+
testTables := []packageIndexRuleFunctionTestTable{
927+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
928+
{"packages[].tools missing", "packages-tools-missing", ruleresult.Fail, "^foopackager$"},
929+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
930+
}
931+
932+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsMissing, testTables, t)
933+
}
934+
935+
func TestPackageIndexPackagesToolsIncorrectType(t *testing.T) {
936+
testTables := []packageIndexRuleFunctionTestTable{
937+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
938+
{"Incorrect packages[].tools type", "packages-tools-incorrect-type", ruleresult.Fail, "^foopackager$"},
939+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
940+
}
941+
942+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsIncorrectType, testTables, t)
943+
}
944+
945+
func TestPackageIndexPackagesToolsAdditionalProperties(t *testing.T) {
946+
testTables := []packageIndexRuleFunctionTestTable{
947+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
948+
{"Additional packages[].tools[] properties", "packages-tools-additional-properties", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2$"},
949+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
950+
}
951+
952+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsAdditionalProperties, testTables, t)
953+
}
954+
955+
func TestPackageIndexPackagesToolsNameMissing(t *testing.T) {
956+
testTables := []packageIndexRuleFunctionTestTable{
957+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
958+
{"packages[].tools[].name missing", "packages-tools-name-missing", ruleresult.Fail, "^/packages/0/tools/0$"},
959+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
960+
}
961+
962+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsNameMissing, testTables, t)
963+
}
964+
965+
func TestPackageIndexPackagesToolsNameIncorrectType(t *testing.T) {
966+
testTables := []packageIndexRuleFunctionTestTable{
967+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
968+
{"Incorrect packages[].tools.name type", "packages-tools-name-incorrect-type", ruleresult.Fail, "^/packages/0/tools/0$"},
969+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
970+
}
971+
972+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsNameIncorrectType, testTables, t)
973+
}
974+
975+
func TestPackageIndexPackagesToolsNameLTMinLength(t *testing.T) {
976+
testTables := []packageIndexRuleFunctionTestTable{
977+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
978+
{"packages[].tools[].name < min length", "packages-tools-name-length-lt", ruleresult.Fail, "^/packages/0/tools/0$"},
979+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
980+
}
981+
982+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsNameLTMinLength, testTables, t)
983+
}
984+
985+
func TestPackageIndexPackagesToolsVersionMissing(t *testing.T) {
986+
testTables := []packageIndexRuleFunctionTestTable{
987+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
988+
{"packages[].tools[].version missing", "packages-tools-version-missing", ruleresult.Fail, "^/packages/0/tools/0$"},
989+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
990+
}
991+
992+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsVersionMissing, testTables, t)
993+
}
994+
995+
func TestPackageIndexPackagesToolsVersionIncorrectType(t *testing.T) {
996+
testTables := []packageIndexRuleFunctionTestTable{
997+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
998+
{"Incorrect packages[].tools[].version type", "packages-tools-version-incorrect-type", ruleresult.Fail, "^/packages/0/tools/0$"},
999+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1000+
}
1001+
1002+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsVersionIncorrectType, testTables, t)
1003+
}
1004+
1005+
func TestPackageIndexPackagesToolsVersionNonRelaxedSemver(t *testing.T) {
1006+
testTables := []packageIndexRuleFunctionTestTable{
1007+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1008+
{"packages[].tools[].version not relaxed semver", "packages-tools-version-non-relaxed-semver", ruleresult.Fail, "^foopackager:openocd@foo$"},
1009+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1010+
}
1011+
1012+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsVersionNonRelaxedSemver, testTables, t)
1013+
}
1014+
1015+
func TestPackageIndexPackagesToolsVersionNonSemver(t *testing.T) {
1016+
testTables := []packageIndexRuleFunctionTestTable{
1017+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1018+
{"packages[].tools[].version not semver", "packages-tools-version-not-semver", ruleresult.Fail, "^foopackager:[email protected]$"},
1019+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1020+
}
1021+
1022+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsVersionNonSemver, testTables, t)
1023+
}
1024+
1025+
func TestPackageIndexPackagesToolsSystemsMissing(t *testing.T) {
1026+
testTables := []packageIndexRuleFunctionTestTable{
1027+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1028+
{"packages[].tools[].systems[] missing", "packages-tools-systems-missing", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2$"},
1029+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1030+
}
1031+
1032+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsMissing, testTables, t)
1033+
}
1034+
1035+
func TestPackageIndexPackagesToolsSystemsIncorrectType(t *testing.T) {
1036+
testTables := []packageIndexRuleFunctionTestTable{
1037+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1038+
{"Incorrect packages[].tools[].systems type", "packages-tools-systems-incorrect-type", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2$"},
1039+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1040+
}
1041+
1042+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsIncorrectType, testTables, t)
1043+
}
1044+
1045+
func TestPackageIndexPackagesToolsSystemsAdditionalProperties(t *testing.T) {
1046+
testTables := []packageIndexRuleFunctionTestTable{
1047+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1048+
{"Additional packages[].tools[].systems[] properties", "packages-tools-systems-additional-properties", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1049+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1050+
}
1051+
1052+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsAdditionalProperties, testTables, t)
1053+
}
1054+
1055+
func TestPackageIndexPackagesToolsSystemsHostMissing(t *testing.T) {
1056+
testTables := []packageIndexRuleFunctionTestTable{
1057+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1058+
{"packages[].tools[].systems[].host missing", "packages-tools-systems-host-missing", ruleresult.Fail, "^/packages/0/tools/0/systems/0$"},
1059+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1060+
}
1061+
1062+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsHostMissing, testTables, t)
1063+
}
1064+
1065+
func TestPackageIndexPackagesToolsSystemsHostIncorrectType(t *testing.T) {
1066+
testTables := []packageIndexRuleFunctionTestTable{
1067+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1068+
{"Incorrect packages[].tools[].systems[].host type", "packages-tools-systems-host-incorrect-type", ruleresult.Fail, "^/packages/0/tools/0/systems/0$"},
1069+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1070+
}
1071+
1072+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsHostIncorrectType, testTables, t)
1073+
}
1074+
1075+
func TestPackageIndexPackagesToolsSystemsHostInvalid(t *testing.T) {
1076+
testTables := []packageIndexRuleFunctionTestTable{
1077+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1078+
{"Invalid packages[].tools[].systems[].host format", "packages-tools-systems-host-invalid", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - foo$"},
1079+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1080+
}
1081+
1082+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsHostInvalid, testTables, t)
1083+
}
1084+
1085+
func TestPackageIndexPackagesToolsSystemsUrlMissing(t *testing.T) {
1086+
testTables := []packageIndexRuleFunctionTestTable{
1087+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1088+
{"packages[].tools[].systems[].url missing", "packages-tools-systems-url-missing", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1089+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1090+
}
1091+
1092+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsUrlMissing, testTables, t)
1093+
}
1094+
1095+
func TestPackageIndexPackagesToolsSystemsUrlIncorrectType(t *testing.T) {
1096+
testTables := []packageIndexRuleFunctionTestTable{
1097+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1098+
{"Incorrect packages[].tools[].systems[].url type", "packages-tools-systems-url-incorrect-type", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1099+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1100+
}
1101+
1102+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsUrlIncorrectType, testTables, t)
1103+
}
1104+
1105+
func TestPackageIndexPackagesToolsSystemsUrlInvalidFormat(t *testing.T) {
1106+
testTables := []packageIndexRuleFunctionTestTable{
1107+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1108+
{"Incorrect packages[].tools[].systems[].url format", "packages-tools-systems-url-invalid-format", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1109+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1110+
}
1111+
1112+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsUrlInvalidFormat, testTables, t)
1113+
}
1114+
9251115
func TestPackageIndexPackagesToolsSystemsURLDeadLink(t *testing.T) {
9261116
testTables := []packageIndexRuleFunctionTestTable{
9271117
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
@@ -931,3 +1121,113 @@ func TestPackageIndexPackagesToolsSystemsURLDeadLink(t *testing.T) {
9311121

9321122
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsURLDeadLink, testTables, t)
9331123
}
1124+
1125+
func TestPackageIndexPackagesToolsSystemsArchiveFileNameMissing(t *testing.T) {
1126+
testTables := []packageIndexRuleFunctionTestTable{
1127+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1128+
{"packages[].tools[].systems[].archiveFileName missing", "packages-tools-systems-archivefilename-missing", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1129+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1130+
}
1131+
1132+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsArchiveFileNameMissing, testTables, t)
1133+
}
1134+
1135+
func TestPackageIndexPackagesToolsSystemsArchiveFileNameIncorrectType(t *testing.T) {
1136+
testTables := []packageIndexRuleFunctionTestTable{
1137+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1138+
{"Incorrect packages[].tools[].systems[].archiveFileName type", "packages-tools-systems-archivefilename-incorrect-type", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1139+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1140+
}
1141+
1142+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsArchiveFileNameIncorrectType, testTables, t)
1143+
}
1144+
1145+
func TestPackageIndexPackagesToolsSystemsArchiveFileNameLTMinLength(t *testing.T) {
1146+
testTables := []packageIndexRuleFunctionTestTable{
1147+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1148+
{"packages[].tools[].systems[].archiveFileName < min length", "packages-tools-systems-archivefilename-length-lt", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1149+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1150+
}
1151+
1152+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsArchiveFileNameLTMinLength, testTables, t)
1153+
}
1154+
1155+
func TestPackageIndexPackagesToolsSystemsArchiveFileNameInvalid(t *testing.T) {
1156+
testTables := []packageIndexRuleFunctionTestTable{
1157+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1158+
{"Invalid packages[].tools[].systems[].archiveFileName format", "packages-tools-systems-archivefilename-invalid", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1159+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1160+
}
1161+
1162+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsArchiveFileNameInvalid, testTables, t)
1163+
}
1164+
1165+
func TestPackageIndexPackagesToolsSystemsChecksumMissing(t *testing.T) {
1166+
testTables := []packageIndexRuleFunctionTestTable{
1167+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1168+
{"packages[].tools[].systems[].checksum missing", "packages-tools-systems-checksum-missing", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1169+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1170+
}
1171+
1172+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsChecksumMissing, testTables, t)
1173+
}
1174+
1175+
func TestPackageIndexPackagesToolsSystemsChecksumIncorrectType(t *testing.T) {
1176+
testTables := []packageIndexRuleFunctionTestTable{
1177+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1178+
{"Incorrect packages[].tools[].systems[].checksum type", "packages-tools-systems-checksum-incorrect-type", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1179+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1180+
}
1181+
1182+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsChecksumIncorrectType, testTables, t)
1183+
}
1184+
1185+
func TestPackageIndexPackagesToolsSystemsChecksumInvalid(t *testing.T) {
1186+
testTables := []packageIndexRuleFunctionTestTable{
1187+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1188+
{"Invalid packages[].tools[].systems[].checksum format", "packages-tools-systems-checksum-invalid", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1189+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1190+
}
1191+
1192+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsChecksumInvalid, testTables, t)
1193+
}
1194+
1195+
func TestPackageIndexPackagesToolsSystemsChecksumDiscouragedAlgorithm(t *testing.T) {
1196+
testTables := []packageIndexRuleFunctionTestTable{
1197+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1198+
{"packages[].tools[].systems[].checksum uses discouraged algorithm", "packages-tools-systems-checksum-discouraged", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1199+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1200+
}
1201+
1202+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsChecksumDiscouragedAlgorithm, testTables, t)
1203+
}
1204+
1205+
func TestPackageIndexPackagesToolsSystemsSizeMissing(t *testing.T) {
1206+
testTables := []packageIndexRuleFunctionTestTable{
1207+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1208+
{"packages[].tools[].systems[].size missing", "packages-tools-systems-size-missing", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1209+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1210+
}
1211+
1212+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsSizeMissing, testTables, t)
1213+
}
1214+
1215+
func TestPackageIndexPackagesToolsSystemsSizeIncorrectType(t *testing.T) {
1216+
testTables := []packageIndexRuleFunctionTestTable{
1217+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1218+
{"Incorrect packages[].tools[].systems[].size type", "packages-tools-systems-size-incorrect-type", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1219+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1220+
}
1221+
1222+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsSizeIncorrectType, testTables, t)
1223+
}
1224+
1225+
func TestPackageIndexPackagesToolsSystemsSizeInvalid(t *testing.T) {
1226+
testTables := []packageIndexRuleFunctionTestTable{
1227+
{"Invalid JSON", "invalid-JSON", ruleresult.NotRun, ""},
1228+
{"Invalid packages[].tools[].systems[].size format", "packages-tools-systems-size-invalid", ruleresult.Fail, "^foopackager:openocd@0\\.11\\.0-arduino2 - aarch64-linux-gnu$"},
1229+
{"Valid", "valid-package-index", ruleresult.Pass, ""},
1230+
}
1231+
1232+
checkPackageIndexRuleFunction(PackageIndexPackagesToolsSystemsSizeInvalid, testTables, t)
1233+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
{
2+
"packages": [
3+
{
4+
"name": "foopackager",
5+
"maintainer": "Jane Developer",
6+
"websiteURL": "http://example.com",
7+
"email": "[email protected]",
8+
"help": {
9+
"online": "http://example.com"
10+
},
11+
"platforms": [
12+
{
13+
"name": "My Board",
14+
"architecture": "avr",
15+
"version": "1.0.0",
16+
"category": "Contributed",
17+
"help": {
18+
"online": "http://example.com"
19+
},
20+
"url": "http://example.com",
21+
"archiveFileName": "myboard-1.0.0.zip",
22+
"checksum": "MD5:6c0f556759894aa1a45e8af423a08ce8",
23+
"size": "15005",
24+
"boards": [],
25+
"toolsDependencies": []
26+
}
27+
],
28+
"tools": [
29+
{
30+
"foo": "bar",
31+
"name": "openocd",
32+
"version": "0.11.0-arduino2",
33+
"systems": [
34+
{
35+
"size": "1902818",
36+
"checksum": "SHA-256:a1aa7f1435a61eafb72ee90722f2496d6a34a7a0f085d0315c2613e4a548b824",
37+
"host": "aarch64-linux-gnu",
38+
"archiveFileName": "openocd-0.11.0-arduino2-static-aarch64-linux-gnu.tar.bz2",
39+
"url": "http://example.com"
40+
},
41+
{
42+
"size": "1986716",
43+
"checksum": "SHA-256:57041130160be086e69387cceb4616eefc9819a0ef75de1f7c11aea57fb92699",
44+
"host": "arm-linux-gnueabihf",
45+
"archiveFileName": "openocd-0.11.0-arduino2-static-arm-linux-gnueabihf.tar.bz2",
46+
"url": "http://example.com"
47+
}
48+
]
49+
},
50+
{
51+
"name": "CMSIS",
52+
"version": "4.0.0-atmel",
53+
"systems": [
54+
{
55+
"host": "arm-linux-gnueabihf",
56+
"url": "http://example.com",
57+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
58+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
59+
"size": "17642623"
60+
},
61+
{
62+
"host": "i686-mingw32",
63+
"url": "http://example.com",
64+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
65+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
66+
"size": "17642623"
67+
}
68+
]
69+
}
70+
]
71+
}
72+
]
73+
}

0 commit comments

Comments
 (0)