summaryrefslogtreecommitdiff
path: root/spec/fixtures
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-11-17 11:33:21 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-11-17 11:33:21 +0000
commit7021455bd1ed7b125c55eb1b33c5a01f2bc55ee0 (patch)
tree5bdc2229f5198d516781f8d24eace62fc7e589e9 /spec/fixtures
parent185b095e93520f96e9cfc31d9c3e69b498cdab7c (diff)
downloadgitlab-ce-7021455bd1ed7b125c55eb1b33c5a01f2bc55ee0.tar.gz
Add latest changes from gitlab-org/gitlab@15-6-stable-eev15.6.0-rc42
Diffstat (limited to 'spec/fixtures')
-rw-r--r--spec/fixtures/api/schemas/entities/codequality_degradation.json5
-rw-r--r--spec/fixtures/api/schemas/entities/codequality_reports_comparer.json16
-rw-r--r--spec/fixtures/api/schemas/entities/protected_ref_access.json25
-rw-r--r--spec/fixtures/api/schemas/graphql/packages/package_details.json12
-rw-r--r--spec/fixtures/api/schemas/ml/run.json46
-rw-r--r--spec/fixtures/api/schemas/pipeline_schedule_variable.json17
-rw-r--r--spec/fixtures/api/schemas/project_mirror.json48
-rw-r--r--spec/fixtures/api/schemas/protected_branch.json33
-rw-r--r--spec/fixtures/api/schemas/protected_branches.json6
-rw-r--r--spec/fixtures/api/schemas/protected_tag.json19
-rw-r--r--spec/fixtures/api/schemas/protected_tags.json6
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/metadata.json34
-rw-r--r--spec/fixtures/gitlab/import_export/project.tar.gzbin0 -> 1113 bytes
-rw-r--r--spec/fixtures/gitlab/import_export/uploads.tar.gzbin0 -> 1843 bytes
-rw-r--r--spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric.yml2
-rw-r--r--spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml2
-rw-r--r--spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml2
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json2
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson2
-rw-r--r--spec/fixtures/lib/sbom/package-url-test-cases.json502
-rw-r--r--spec/fixtures/markdown/markdown_golden_master_examples.yml14
-rw-r--r--spec/fixtures/packages/rpm/payload.json18
-rw-r--r--spec/fixtures/packages/rpm/repodata/364c77dd49e8f814d56e621d0b3306c4fd0696dcad506f527329b818eb0f5db3-repomd.xml (renamed from spec/fixtures/packages/rpm/repodata/repomd.xml)5
23 files changed, 776 insertions, 40 deletions
diff --git a/spec/fixtures/api/schemas/entities/codequality_degradation.json b/spec/fixtures/api/schemas/entities/codequality_degradation.json
index 6cf20ee8b9e..863b9f0c77e 100644
--- a/spec/fixtures/api/schemas/entities/codequality_degradation.json
+++ b/spec/fixtures/api/schemas/entities/codequality_degradation.json
@@ -18,7 +18,10 @@
},
"line": {
"type": "integer"
+ },
+ "web_url": {
+ "type": "string"
}
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/entities/codequality_reports_comparer.json b/spec/fixtures/api/schemas/entities/codequality_reports_comparer.json
index afe82f5e632..05ae036d986 100644
--- a/spec/fixtures/api/schemas/entities/codequality_reports_comparer.json
+++ b/spec/fixtures/api/schemas/entities/codequality_reports_comparer.json
@@ -1,6 +1,12 @@
{
"type": "object",
- "required": ["status", "summary", "new_errors", "resolved_errors", "existing_errors"],
+ "required": [
+ "status",
+ "summary",
+ "new_errors",
+ "resolved_errors",
+ "existing_errors"
+ ],
"properties": {
"status": {
"type": "string"
@@ -18,7 +24,11 @@
"type": "integer"
}
},
- "required": ["total", "resolved", "errored"]
+ "required": [
+ "total",
+ "resolved",
+ "errored"
+ ]
},
"new_errors": {
"type": "array",
@@ -40,4 +50,4 @@
}
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/entities/protected_ref_access.json b/spec/fixtures/api/schemas/entities/protected_ref_access.json
new file mode 100644
index 00000000000..144852e1558
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/protected_ref_access.json
@@ -0,0 +1,25 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "access_level",
+ "access_level_description"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "access_level": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "access_level_description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/graphql/packages/package_details.json b/spec/fixtures/api/schemas/graphql/packages/package_details.json
index 33eb67a0280..1f3de0e0ff5 100644
--- a/spec/fixtures/api/schemas/graphql/packages/package_details.json
+++ b/spec/fixtures/api/schemas/graphql/packages/package_details.json
@@ -14,7 +14,8 @@
"versions",
"status",
"canDestroy",
- "lastDownloadedAt"
+ "lastDownloadedAt",
+ "_links"
],
"properties": {
"id": {
@@ -177,6 +178,15 @@
},
"lastDownloadedAt": {
"type": ["string", "null"]
+ },
+ "_links": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "webPath": {
+ "type": ["string", "null"]
+ }
+ }
}
}
}
diff --git a/spec/fixtures/api/schemas/ml/run.json b/spec/fixtures/api/schemas/ml/run.json
index 2418f44b21f..48d0ed25ce4 100644
--- a/spec/fixtures/api/schemas/ml/run.json
+++ b/spec/fixtures/api/schemas/ml/run.json
@@ -27,15 +27,43 @@
"end_time"
],
"properties": {
- "run_id": { "type": "string" },
- "run_uuid": { "type": "string" },
- "experiment_id": { "type": "string" },
- "artifact_location": { "type": "string" },
- "start_time": { "type": "integer" },
- "end_time": { "type": "integer" },
+ "run_id": {
+ "type": "string"
+ },
+ "run_uuid": {
+ "type": "string"
+ },
+ "experiment_id": {
+ "type": "string"
+ },
+ "artifact_uri": {
+ "type": "string"
+ },
+ "start_time": {
+ "type": "integer"
+ },
+ "end_time": {
+ "type": "integer"
+ },
"user_id": "",
- "status": { "type": { "enum" : ["RUNNING", "SCHEDULED", "FINISHED", "FAILED", "KILLED"] } },
- "lifecycle_stage": { "type": { "enum" : ["active"] } }
+ "status": {
+ "type": {
+ "enum": [
+ "RUNNING",
+ "SCHEDULED",
+ "FINISHED",
+ "FAILED",
+ "KILLED"
+ ]
+ }
+ },
+ "lifecycle_stage": {
+ "type": {
+ "enum": [
+ "active"
+ ]
+ }
+ }
}
},
"data": {
@@ -44,4 +72,4 @@
}
}
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/pipeline_schedule_variable.json b/spec/fixtures/api/schemas/pipeline_schedule_variable.json
index 022d36cb88c..83eed11f458 100644
--- a/spec/fixtures/api/schemas/pipeline_schedule_variable.json
+++ b/spec/fixtures/api/schemas/pipeline_schedule_variable.json
@@ -6,9 +6,18 @@
"variable_type"
],
"properties": {
- "key": { "type": "string" },
- "value": { "type": "string" },
- "variable_type": { "type": "string" }
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "variable_type": {
+ "type": "string"
+ },
+ "raw": {
+ "type": "boolean"
+ }
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/project_mirror.json b/spec/fixtures/api/schemas/project_mirror.json
new file mode 100644
index 00000000000..0f626c04f24
--- /dev/null
+++ b/spec/fixtures/api/schemas/project_mirror.json
@@ -0,0 +1,48 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "url",
+ "update_status",
+ "last_update_at",
+ "last_update_started_at",
+ "last_successful_update_at",
+ "last_error"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string"
+ },
+ "update_status": {
+ "type": "string"
+ },
+ "last_update_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_update_started_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_successful_update_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_error": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "additionalProperties": false
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/protected_branch.json b/spec/fixtures/api/schemas/protected_branch.json
new file mode 100644
index 00000000000..4ad5dbe2313
--- /dev/null
+++ b/spec/fixtures/api/schemas/protected_branch.json
@@ -0,0 +1,33 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "push_access_levels",
+ "merge_access_levels",
+ "allow_force_push"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "push_access_levels": {
+ "type": "array",
+ "items": {
+ "$ref": "entities/protected_ref_access.json"
+ }
+ },
+ "merge_access_levels": {
+ "type": "array",
+ "items": {
+ "$ref": "entities/protected_ref_access.json"
+ }
+ },
+ "allow_force_push": {
+ "type": "boolean"
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/protected_branches.json b/spec/fixtures/api/schemas/protected_branches.json
new file mode 100644
index 00000000000..c87b3b153a9
--- /dev/null
+++ b/spec/fixtures/api/schemas/protected_branches.json
@@ -0,0 +1,6 @@
+{
+ "type": "array",
+ "items": {
+ "$ref": "protected_branch.json"
+ }
+}
diff --git a/spec/fixtures/api/schemas/protected_tag.json b/spec/fixtures/api/schemas/protected_tag.json
new file mode 100644
index 00000000000..c5aaf0f0cba
--- /dev/null
+++ b/spec/fixtures/api/schemas/protected_tag.json
@@ -0,0 +1,19 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "create_access_levels"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "create_access_levels": {
+ "type": "array",
+ "items": {
+ "$ref": "entities/protected_ref_access.json"
+ }
+ },
+ "additionalProperties": false
+ }
+}
diff --git a/spec/fixtures/api/schemas/protected_tags.json b/spec/fixtures/api/schemas/protected_tags.json
new file mode 100644
index 00000000000..731d0368a09
--- /dev/null
+++ b/spec/fixtures/api/schemas/protected_tags.json
@@ -0,0 +1,6 @@
+{
+ "type": "array",
+ "items": {
+ "$ref": "protected_tag.json"
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/metadata.json b/spec/fixtures/api/schemas/public_api/v4/metadata.json
index fd219b95df8..f5a6aa86890 100644
--- a/spec/fixtures/api/schemas/public_api/v4/metadata.json
+++ b/spec/fixtures/api/schemas/public_api/v4/metadata.json
@@ -3,11 +3,16 @@
"required": [
"version",
"revision",
- "kas"
+ "kas",
+ "enterprise"
],
"properties": {
- "version": { "type": "string" },
- "revision": { "type": "string" },
+ "version": {
+ "type": "string"
+ },
+ "revision": {
+ "type": "string"
+ },
"kas": {
"type": "object",
"required": [
@@ -16,11 +21,26 @@
"version"
],
"properties": {
- "enabled": { "type": "boolean" },
- "externalUrl": { "type": ["string", "null"] },
- "version": { "type": ["string", "null"] }
+ "enabled": {
+ "type": "boolean"
+ },
+ "externalUrl": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "version": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
}
+ },
+ "enterprise": {
+ "type": "boolean"
}
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/gitlab/import_export/project.tar.gz b/spec/fixtures/gitlab/import_export/project.tar.gz
new file mode 100644
index 00000000000..eec5d6f66ce
--- /dev/null
+++ b/spec/fixtures/gitlab/import_export/project.tar.gz
Binary files differ
diff --git a/spec/fixtures/gitlab/import_export/uploads.tar.gz b/spec/fixtures/gitlab/import_export/uploads.tar.gz
new file mode 100644
index 00000000000..3f1aa18c113
--- /dev/null
+++ b/spec/fixtures/gitlab/import_export/uploads.tar.gz
Binary files differ
diff --git a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric.yml b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric.yml
index a5bdd378f53..520328f1041 100644
--- a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric.yml
+++ b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric.yml
@@ -14,7 +14,7 @@ time_frame: 7d
data_source:
data_category: operational
instrumentation_class: Count
-performance_indicator_type:
+performance_indicator_type: []
distribution:
- ce
# Add here corresponding tiers
diff --git a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
index 4931285f6cf..1942f33e043 100644
--- a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
+++ b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
@@ -14,7 +14,7 @@ time_frame: 7d
data_source:
data_category: optional
instrumentation_class: Count
-performance_indicator_type:
+performance_indicator_type: []
distribution:
- ee
tier:
diff --git a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
index 39472af686d..a72ba5109cc 100644
--- a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
+++ b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
@@ -15,7 +15,7 @@ time_frame: 7d
data_source:
data_category: optional
instrumentation_class: Count
-performance_indicator_type:
+performance_indicator_type: []
distribution:
- ce
- ee
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index a03177ba85e..8e7cb487444 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -6961,7 +6961,7 @@
"id": 2,
"pipeline_id": 36,
"project_id": 5,
- "title": "Build pipeline"
+ "name": "Build pipeline"
},
"notes": [
{
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson
index 0c19f23cc24..cadaa5abfcd 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson
@@ -1,7 +1,7 @@
{"id":19,"project_id":5,"ref":"master","sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":24,"project_id":5,"pipeline_id":40,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":79,"project_id":5,"status":"failed","finished_at":"2016-03-29T06:28:12.695Z","trace":"Sed culpa est et facere saepe vel id ab. Quas temporibus aut similique dolorem consequatur corporis aut praesentium. Cum officia molestiae sit earum excepturi.\n\nSint possimus aut ratione quia. Quis nesciunt ratione itaque illo. Tenetur est dolor assumenda possimus voluptatem quia minima. Accusamus reprehenderit ut et itaque non reiciendis incidunt.\n\nRerum suscipit quibusdam dolore nam omnis. Consequatur ipsa nihil ut enim blanditiis delectus. Nulla quis hic occaecati mollitia qui placeat. Quo rerum sed perferendis a accusantium consequatur commodi ut. Sit quae et cumque vel eius tempora nostrum.\n\nUllam dolorem et itaque sint est. Ea molestias quia provident dolorem vitae error et et. Ea expedita officiis iste non. Qui vitae odit saepe illum. Dolores enim ratione deserunt tempore expedita amet non neque.\n\nEligendi asperiores voluptatibus omnis repudiandae expedita distinctio qui aliquid. Autem aut doloremque distinctio ab. Nostrum sapiente repudiandae aspernatur ea et quae voluptas. Officiis perspiciatis nisi laudantium asperiores error eligendi ab. Eius quia amet magni omnis exercitationem voluptatum et.\n\nVoluptatem ullam labore quas dicta est ex voluptas. Pariatur ea modi voluptas consequatur dolores perspiciatis similique. Numquam in distinctio perspiciatis ut qui earum. Quidem omnis mollitia facere aut beatae. Ea est iure et voluptatem.","created_at":"2016-03-22T15:20:35.950Z","updated_at":"2016-03-29T06:28:12.696Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":80,"project_id":5,"status":"success","finished_at":null,"trace":"Impedit et optio nemo ipsa. Non ad non quis ut sequi laudantium omnis velit. Corporis a enim illo eos. Quia totam tempore inventore ad est.\n\nNihil recusandae cupiditate eaque voluptatem molestias sint. Consequatur id voluptatem cupiditate harum. Consequuntur iusto quaerat reiciendis aut autem libero est. Quisquam dolores veritatis rerum et sint maxime ullam libero. Id quas porro ut perspiciatis rem amet vitae.\n\nNemo inventore minus blanditiis magnam. Modi consequuntur nostrum aut voluptatem ex. Sunt rerum rem optio mollitia qui aliquam officiis officia. Aliquid eos et id aut minus beatae reiciendis.\n\nDolores non in temporibus dicta. Fugiat voluptatem est aspernatur expedita voluptatum nam qui. Quia et eligendi sit quae sint tempore exercitationem eos. Est sapiente corrupti quidem at. Qui magni odio repudiandae saepe tenetur optio dolore.\n\nEos placeat soluta at dolorem adipisci provident. Quo commodi id reprehenderit possimus quo tenetur. Ipsum et quae eligendi laborum. Et qui nesciunt at quasi quidem voluptatem cum rerum. Excepturi non facilis aut sunt vero sed.\n\nQui explicabo ratione ut eligendi recusandae. Quis quasi quas molestiae consequatur voluptatem et voluptatem. Ex repellat saepe occaecati aperiam ea eveniet dignissimos facilis.","created_at":"2016-03-22T15:20:35.966Z","updated_at":"2016-03-22T15:20:35.966Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]}
{"id":20,"project_id":5,"ref":"master","sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[],"source":"external_pull_request_event","external_pull_request":{"id":3,"pull_request_iid":4,"source_branch":"feature","target_branch":"master","source_repository":"the-repository","target_repository":"the-repository","source_sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","target_sha":"a09386439ca39abe575675ffd4b89ae824fec22f","status":"open","created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z"}}
{"id":26,"project_id":5,"ref":"master","sha":"048721d90c449b244b7b4c53a9186b04330174ec","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.757Z","updated_at":"2016-03-22T15:20:35.757Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"source":"merge_request_event","merge_request_id":27,"stages":[{"id":21,"project_id":5,"pipeline_id":37,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":74,"project_id":5,"status":"success","finished_at":null,"trace":"Ad ut quod repudiandae iste dolor doloribus. Adipisci consequuntur deserunt omnis quasi eveniet et sed fugit. Aut nemo omnis molestiae impedit ex consequatur ducimus. Voluptatum exercitationem quia aut est et hic dolorem.\n\nQuasi repellendus et eaque magni eum facilis. Dolorem aperiam nam nihil pariatur praesentium ad aliquam. Commodi enim et eos tenetur. Odio voluptatibus laboriosam mollitia rerum exercitationem magnam consequuntur. Tenetur ea vel eum corporis.\n\nVoluptatibus optio in aliquid est voluptates. Ad a ut ab placeat vero blanditiis. Earum aspernatur quia beatae expedita voluptatem dignissimos provident. Quis minima id nemo ut aut est veritatis provident.\n\nRerum voluptatem quidem eius maiores magnam veniam. Voluptatem aperiam aut voluptate et nulla deserunt voluptas. Quaerat aut accusantium laborum est dolorem architecto reiciendis. Aliquam asperiores doloribus omnis maxime enim nesciunt. Eum aut rerum repellendus debitis et ut eius.\n\nQuaerat assumenda ea sit consequatur autem in. Cum eligendi voluptatem quo sed. Ut fuga iusto cupiditate autem sint.\n\nOfficia totam officiis architecto corporis molestiae amet ut. Tempora sed dolorum rerum omnis voluptatem accusantium sit eum. Quia debitis ipsum quidem aliquam inventore sunt consequatur qui.","created_at":"2016-03-22T15:20:35.846Z","updated_at":"2016-03-22T15:20:35.846Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":73,"project_id":5,"status":"canceled","finished_at":null,"trace":null,"created_at":"2016-03-22T15:20:35.842Z","updated_at":"2016-03-22T15:20:35.842Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}],"merge_request":{"id":27,"target_branch":"feature","source_branch":"feature_conflict","source_project_id":2147483547,"author_id":1,"assignee_id":null,"title":"MR1","created_at":"2016-06-14T15:02:36.568Z","updated_at":"2016-06-14T15:02:56.815Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":9,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"diff_head_sha":"HEAD","source_branch_sha":"ABCD","target_branch_sha":"DCBA","merge_params":{"force_remove_source_branch":null}}}
-{"id":36,"project_id":5,"ref":null,"sha":"sha-notes","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.755Z","updated_at":"2016-03-22T15:20:35.755Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"user_id":2147483547,"duration":null,"source":"push","merge_request_id":null,"pipeline_metadata": {"id": 2, "project_id": 5, "pipeline_id": 36, "title": "Build pipeline"},"notes":[{"id":2147483547,"note":"Natus rerum qui dolorem dolorum voluptas.","noteable_type":"Commit","author_id":1,"created_at":"2016-03-22T15:19:59.469Z","updated_at":"2016-03-22T15:19:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":"be93687618e4b132087f430a4d8fc3a609c9b77c","noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"}}],"stages":[{"id":11,"project_id":5,"pipeline_id":36,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":71,"project_id":5,"status":"failed","finished_at":"2016-03-29T06:28:12.630Z","trace":null,"created_at":"2016-03-22T15:20:35.772Z","updated_at":"2016-03-29T06:28:12.634Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":{"image":"busybox:latest"},"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"stage_id":11,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null,"type":"Ci::Build","token":"abcd","artifacts_file_store":1,"artifacts_metadata_store":1,"artifacts_size":10},{"id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]},{"id":12,"project_id":5,"pipeline_id":36,"name":"deploy","status":2,"created_at":"2016-03-22T15:45:45.772Z","updated_at":"2016-03-29T06:45:45.634Z"}]}
+{"id":36,"project_id":5,"ref":null,"sha":"sha-notes","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.755Z","updated_at":"2016-03-22T15:20:35.755Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"user_id":2147483547,"duration":null,"source":"push","merge_request_id":null,"pipeline_metadata": {"id": 2, "project_id": 5, "pipeline_id": 36, "name": "Build pipeline"},"notes":[{"id":2147483547,"note":"Natus rerum qui dolorem dolorum voluptas.","noteable_type":"Commit","author_id":1,"created_at":"2016-03-22T15:19:59.469Z","updated_at":"2016-03-22T15:19:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":"be93687618e4b132087f430a4d8fc3a609c9b77c","noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"}}],"stages":[{"id":11,"project_id":5,"pipeline_id":36,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":71,"project_id":5,"status":"failed","finished_at":"2016-03-29T06:28:12.630Z","trace":null,"created_at":"2016-03-22T15:20:35.772Z","updated_at":"2016-03-29T06:28:12.634Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":{"image":"busybox:latest"},"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"stage_id":11,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null,"type":"Ci::Build","token":"abcd","artifacts_file_store":1,"artifacts_metadata_store":1,"artifacts_size":10},{"id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]},{"id":12,"project_id":5,"pipeline_id":36,"name":"deploy","status":2,"created_at":"2016-03-22T15:45:45.772Z","updated_at":"2016-03-29T06:45:45.634Z"}]}
{"id":38,"iid":1,"project_id":5,"ref":"master","sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.759Z","updated_at":"2016-03-22T15:20:35.759Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":22,"project_id":5,"pipeline_id":38,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":76,"project_id":5,"status":"success","finished_at":null,"trace":"Et rerum quia ea cumque ut modi non. Libero eaque ipsam architecto maiores expedita deleniti. Ratione quia qui est id.\n\nQuod sit officiis sed unde inventore veniam quisquam velit. Ea harum cum quibusdam quisquam minima quo possimus non. Temporibus itaque aliquam aut rerum veritatis at.\n\nMagnam ipsum eius recusandae qui quis sit maiores eum. Et animi iusto aut itaque. Doloribus harum deleniti nobis accusantium et libero.\n\nRerum fuga perferendis magni commodi officiis id repudiandae. Consequatur ratione consequatur suscipit facilis sunt iure est dicta. Qui unde quasi facilis et quae nesciunt. Magnam iste et nobis officiis tenetur. Aspernatur quo et temporibus non in.\n\nNisi rerum velit est ad enim sint molestiae consequuntur. Quaerat nisi nesciunt quasi officiis. Possimus non blanditiis laborum quos.\n\nRerum laudantium facere animi qui. Ipsa est iusto magnam nihil. Enim omnis occaecati non dignissimos ut recusandae eum quasi. Qui maxime dolor et nemo voluptates incidunt quia.","created_at":"2016-03-22T15:20:35.882Z","updated_at":"2016-03-22T15:20:35.882Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":75,"project_id":5,"status":"failed","finished_at":null,"trace":"Sed et iste recusandae dicta corporis. Sunt alias porro fugit sunt. Fugiat omnis nihil dignissimos aperiam explicabo doloremque sit aut. Harum fugit expedita quia rerum ut consequatur laboriosam aliquam.\n\nNatus libero ut ut tenetur earum. Tempora omnis autem omnis et libero dolores illum autem. Deleniti eos sunt mollitia ipsam. Cum dolor repellendus dolorum sequi officia. Ullam sunt in aut pariatur excepturi.\n\nDolor nihil debitis et est eos. Cumque eos eum saepe ducimus autem. Alias architecto consequatur aut pariatur possimus. Aut quos aut incidunt quam velit et. Quas voluptatum ad dolorum dignissimos.\n\nUt voluptates consectetur illo et. Est commodi accusantium vel quo. Eos qui fugiat soluta porro.\n\nRatione possimus alias vel maxime sint totam est repellat. Ipsum corporis eos sint voluptatem eos odit. Temporibus libero nulla harum eligendi labore similique ratione magnam. Suscipit sequi in omnis neque.\n\nLaudantium dolor amet omnis placeat mollitia aut molestiae. Aut rerum similique ipsum quod illo quas unde. Sunt aut veritatis eos omnis porro. Rem veritatis mollitia praesentium dolorem. Consequatur sequi ad cumque earum omnis quia necessitatibus.","created_at":"2016-03-22T15:20:35.864Z","updated_at":"2016-03-22T15:20:35.864Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]}
{"id":39,"project_id":5,"ref":"master","sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.761Z","updated_at":"2016-03-22T15:20:35.761Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":23,"project_id":5,"pipeline_id":39,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":78,"project_id":5,"status":"success","finished_at":null,"trace":"Dolorem deserunt quas quia error hic quo cum vel. Natus voluptatem cumque expedita numquam odit. Eos expedita nostrum corporis consequatur est recusandae.\n\nCulpa blanditiis rerum repudiandae alias voluptatem. Velit iusto est ullam consequatur doloribus porro. Corporis voluptas consectetur est veniam et quia quae.\n\nEt aut magni fuga nesciunt officiis molestias. Quaerat et nam necessitatibus qui rerum. Architecto quia officiis voluptatem laborum est recusandae. Quasi ducimus soluta odit necessitatibus labore numquam dignissimos. Quia facere sint temporibus inventore sunt nihil saepe dolorum.\n\nFacere dolores quis dolores a. Est minus nostrum nihil harum. Earum laborum et ipsum unde neque sit nemo. Corrupti est consequatur minima fugit. Illum voluptatem illo error ducimus officia qui debitis.\n\nDignissimos porro a autem harum aut. Aut id reprehenderit et exercitationem. Est et quisquam ipsa temporibus molestiae. Architecto natus dolore qui fugiat incidunt. Autem odit veniam excepturi et voluptatibus culpa ipsum eos.\n\nAmet quo quisquam dignissimos soluta modi dolores. Sint omnis eius optio corporis dolor. Eligendi animi porro quia placeat ut.","created_at":"2016-03-22T15:20:35.927Z","updated_at":"2016-03-22T15:20:35.927Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":77,"project_id":5,"status":"failed","finished_at":null,"trace":"Rerum ut et suscipit est perspiciatis. Inventore debitis cum eius vitae. Ex incidunt id velit aut quo nisi. Laboriosam repellat deserunt eius reiciendis architecto et. Est harum quos nesciunt nisi consectetur.\n\nAlias esse omnis sint officia est consequatur in nobis. Dignissimos dolorum vel eligendi nesciunt dolores sit. Veniam mollitia ducimus et exercitationem molestiae libero sed. Atque omnis debitis laudantium voluptatibus qui. Repellendus tempore est commodi pariatur.\n\nExpedita voluptate illum est alias non. Modi nesciunt ab assumenda laborum nulla consequatur molestias doloremque. Magnam quod officia vel explicabo accusamus ut voluptatem incidunt. Rerum ut aliquid ullam saepe. Est eligendi debitis beatae blanditiis reiciendis.\n\nQui fuga sit dolores libero maiores et suscipit. Consectetur asperiores omnis minima impedit eos fugiat. Similique omnis nisi sed vero inventore ipsum aliquam exercitationem.\n\nBlanditiis magni iure dolorum omnis ratione delectus molestiae. Atque officia dolor voluptatem culpa quod. Incidunt suscipit quidem possimus veritatis non vel. Iusto aliquid et id quia quasi.\n\nVel facere velit blanditiis incidunt cupiditate sed maiores consequuntur. Quasi quia dicta consequuntur et quia voluptatem iste id. Incidunt et rerum fuga esse sint.","created_at":"2016-03-22T15:20:35.905Z","updated_at":"2016-03-22T15:20:35.905Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]}
{"id":41,"project_id":5,"ref":"master","sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[]}
diff --git a/spec/fixtures/lib/sbom/package-url-test-cases.json b/spec/fixtures/lib/sbom/package-url-test-cases.json
new file mode 100644
index 00000000000..448387397f6
--- /dev/null
+++ b/spec/fixtures/lib/sbom/package-url-test-cases.json
@@ -0,0 +1,502 @@
+[
+ {
+ "description": "valid maven purl",
+ "purl": "pkg:maven/org.apache.commons/io@1.3.4",
+ "canonical_purl": "pkg:maven/org.apache.commons/io@1.3.4",
+ "type": "maven",
+ "namespace": "org.apache.commons",
+ "name": "io",
+ "version": "1.3.4",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "basic valid maven purl without version",
+ "purl": "pkg:maven/org.apache.commons/io",
+ "canonical_purl": "pkg:maven/org.apache.commons/io",
+ "type": "maven",
+ "namespace": "org.apache.commons",
+ "name": "io",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "valid go purl without version and with subpath",
+ "purl": "pkg:GOLANG/google.golang.org/genproto#/googleapis/api/annotations/",
+ "canonical_purl": "pkg:golang/google.golang.org/genproto#googleapis/api/annotations",
+ "type": "golang",
+ "namespace": "google.golang.org",
+ "name": "genproto",
+ "version": null,
+ "qualifiers": null,
+ "subpath": "googleapis/api/annotations",
+ "is_invalid": false
+ },
+ {
+ "description": "valid go purl with version and subpath",
+ "purl": "pkg:GOLANG/google.golang.org/genproto@abcdedf#/googleapis/api/annotations/",
+ "canonical_purl": "pkg:golang/google.golang.org/genproto@abcdedf#googleapis/api/annotations",
+ "type": "golang",
+ "namespace": "google.golang.org",
+ "name": "genproto",
+ "version": "abcdedf",
+ "qualifiers": null,
+ "subpath": "googleapis/api/annotations",
+ "is_invalid": false
+ },
+ {
+ "description": "bitbucket namespace and name should be lowercased",
+ "purl": "pkg:bitbucket/birKenfeld/pyGments-main@244fd47e07d1014f0aed9c",
+ "canonical_purl": "pkg:bitbucket/birkenfeld/pygments-main@244fd47e07d1014f0aed9c",
+ "type": "bitbucket",
+ "namespace": "birkenfeld",
+ "name": "pygments-main",
+ "version": "244fd47e07d1014f0aed9c",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "github namespace and name should be lowercased",
+ "purl": "pkg:github/Package-url/purl-Spec@244fd47e07d1004f0aed9c",
+ "canonical_purl": "pkg:github/package-url/purl-spec@244fd47e07d1004f0aed9c",
+ "type": "github",
+ "namespace": "package-url",
+ "name": "purl-spec",
+ "version": "244fd47e07d1004f0aed9c",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "debian can use qualifiers",
+ "purl": "pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie",
+ "canonical_purl": "pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie",
+ "type": "deb",
+ "namespace": "debian",
+ "name": "curl",
+ "version": "7.50.3-1",
+ "qualifiers": {
+ "arch": "i386",
+ "distro": "jessie"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "docker uses qualifiers and hash image id as versions",
+ "purl": "pkg:docker/customer/dockerimage@sha256:244fd47e07d1004f0aed9c?repository_url=gcr.io",
+ "canonical_purl": "pkg:docker/customer/dockerimage@sha256%3A244fd47e07d1004f0aed9c?repository_url=gcr.io",
+ "type": "docker",
+ "namespace": "customer",
+ "name": "dockerimage",
+ "version": "sha256:244fd47e07d1004f0aed9c",
+ "qualifiers": {
+ "repository_url": "gcr.io"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "Java gem can use a qualifier",
+ "purl": "pkg:gem/jruby-launcher@1.1.2?Platform=java",
+ "canonical_purl": "pkg:gem/jruby-launcher@1.1.2?platform=java",
+ "type": "gem",
+ "namespace": null,
+ "name": "jruby-launcher",
+ "version": "1.1.2",
+ "qualifiers": {
+ "platform": "java"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "maven often uses qualifiers",
+ "purl": "pkg:Maven/org.apache.xmlgraphics/batik-anim@1.9.1?classifier=sources&repositorY_url=repo.spring.io/release",
+ "canonical_purl": "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?classifier=sources&repository_url=repo.spring.io%2Frelease",
+ "type": "maven",
+ "namespace": "org.apache.xmlgraphics",
+ "name": "batik-anim",
+ "version": "1.9.1",
+ "qualifiers": {
+ "classifier": "sources",
+ "repository_url": "repo.spring.io/release"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "maven pom reference",
+ "purl": "pkg:Maven/org.apache.xmlgraphics/batik-anim@1.9.1?extension=pom&repositorY_url=repo.spring.io/release",
+ "canonical_purl": "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?extension=pom&repository_url=repo.spring.io%2Frelease",
+ "type": "maven",
+ "namespace": "org.apache.xmlgraphics",
+ "name": "batik-anim",
+ "version": "1.9.1",
+ "qualifiers": {
+ "extension": "pom",
+ "repository_url": "repo.spring.io/release"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "maven can come with a type qualifier",
+ "purl": "pkg:Maven/net.sf.jacob-project/jacob@1.14.3?classifier=x86&type=dll",
+ "canonical_purl": "pkg:maven/net.sf.jacob-project/jacob@1.14.3?classifier=x86&type=dll",
+ "type": "maven",
+ "namespace": "net.sf.jacob-project",
+ "name": "jacob",
+ "version": "1.14.3",
+ "qualifiers": {
+ "classifier": "x86",
+ "type": "dll"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "npm can be scoped",
+ "purl": "pkg:npm/%40angular/animation@12.3.1",
+ "canonical_purl": "pkg:npm/%40angular/animation@12.3.1",
+ "type": "npm",
+ "namespace": "@angular",
+ "name": "animation",
+ "version": "12.3.1",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "nuget names are case sensitive",
+ "purl": "pkg:Nuget/EnterpriseLibrary.Common@6.0.1304",
+ "canonical_purl": "pkg:nuget/EnterpriseLibrary.Common@6.0.1304",
+ "type": "nuget",
+ "namespace": null,
+ "name": "EnterpriseLibrary.Common",
+ "version": "6.0.1304",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "pypi names have special rules and not case sensitive",
+ "purl": "pkg:PYPI/Django_package@1.11.1.dev1",
+ "canonical_purl": "pkg:pypi/django-package@1.11.1.dev1",
+ "type": "pypi",
+ "namespace": null,
+ "name": "django-package",
+ "version": "1.11.1.dev1",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "rpm often use qualifiers",
+ "purl": "pkg:Rpm/fedora/curl@7.50.3-1.fc25?Arch=i386&Distro=fedora-25",
+ "canonical_purl": "pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25",
+ "type": "rpm",
+ "namespace": "fedora",
+ "name": "curl",
+ "version": "7.50.3-1.fc25",
+ "qualifiers": {
+ "arch": "i386",
+ "distro": "fedora-25"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "a scheme is always required",
+ "purl": "EnterpriseLibrary.Common@6.0.1304",
+ "canonical_purl": "EnterpriseLibrary.Common@6.0.1304",
+ "type": null,
+ "namespace": null,
+ "name": "EnterpriseLibrary.Common",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "a type is always required",
+ "purl": "pkg:EnterpriseLibrary.Common@6.0.1304",
+ "canonical_purl": "pkg:EnterpriseLibrary.Common@6.0.1304",
+ "type": null,
+ "namespace": null,
+ "name": "EnterpriseLibrary.Common",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "a name is required",
+ "purl": "pkg:maven/@1.3.4",
+ "canonical_purl": "pkg:maven/@1.3.4",
+ "type": "maven",
+ "namespace": null,
+ "name": null,
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "slash / after scheme is not significant",
+ "purl": "pkg:/maven/org.apache.commons/io",
+ "canonical_purl": "pkg:maven/org.apache.commons/io",
+ "type": "maven",
+ "namespace": "org.apache.commons",
+ "name": "io",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "double slash // after scheme is not significant",
+ "purl": "pkg://maven/org.apache.commons/io",
+ "canonical_purl": "pkg:maven/org.apache.commons/io",
+ "type": "maven",
+ "namespace": "org.apache.commons",
+ "name": "io",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "slash /// after type is not significant",
+ "purl": "pkg:///maven/org.apache.commons/io",
+ "canonical_purl": "pkg:maven/org.apache.commons/io",
+ "type": "maven",
+ "namespace": "org.apache.commons",
+ "name": "io",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "valid maven purl with case sensitive namespace and name",
+ "purl": "pkg:maven/HTTPClient/HTTPClient@0.3-3",
+ "canonical_purl": "pkg:maven/HTTPClient/HTTPClient@0.3-3",
+ "type": "maven",
+ "namespace": "HTTPClient",
+ "name": "HTTPClient",
+ "version": "0.3-3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "valid maven purl containing a space in the version and qualifier",
+ "purl": "pkg:maven/mygroup/myartifact@1.0.0%20Final?mykey=my%20value",
+ "canonical_purl": "pkg:maven/mygroup/myartifact@1.0.0+Final?mykey=my+value",
+ "type": "maven",
+ "namespace": "mygroup",
+ "name": "myartifact",
+ "version": "1.0.0 Final",
+ "qualifiers": {
+ "mykey": "my value"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "checks for invalid qualifier keys",
+ "purl": "pkg:npm/myartifact@1.0.0?in%20production=true",
+ "canonical_purl": null,
+ "type": "npm",
+ "namespace": null,
+ "name": "myartifact",
+ "version": "1.0.0",
+ "qualifiers": {
+ "in production": "true"
+ },
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "valid conan purl",
+ "purl": "pkg:conan/cctz@2.3",
+ "canonical_purl": "pkg:conan/cctz@2.3",
+ "type": "conan",
+ "namespace": null,
+ "name": "cctz",
+ "version": "2.3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "valid conan purl with namespace and qualifier channel",
+ "purl": "pkg:conan/bincrafters/cctz@2.3?channel=stable",
+ "canonical_purl": "pkg:conan/bincrafters/cctz@2.3?channel=stable",
+ "type": "conan",
+ "namespace": "bincrafters",
+ "name": "cctz",
+ "version": "2.3",
+ "qualifiers": {
+ "channel": "stable"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "invalid conan purl only namespace",
+ "purl": "pkg:conan/bincrafters/cctz@2.3",
+ "canonical_purl": "pkg:conan/bincrafters/cctz@2.3",
+ "type": "conan",
+ "namespace": "bincrafters",
+ "name": "cctz",
+ "version": "2.3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "invalid conan purl only channel qualifier",
+ "purl": "pkg:conan/cctz@2.3?channel=stable",
+ "canonical_purl": "pkg:conan/cctz@2.3?channel=stable",
+ "type": "conan",
+ "namespace": null,
+ "name": "cctz",
+ "version": "2.3",
+ "qualifiers": {
+ "channel": "stable"
+ },
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "valid conda purl with qualifiers",
+ "purl": "pkg:conda/absl-py@0.4.1?build=py36h06a4308_0&channel=main&subdir=linux-64&type=tar.bz2",
+ "canonical_purl": "pkg:conda/absl-py@0.4.1?build=py36h06a4308_0&channel=main&subdir=linux-64&type=tar.bz2",
+ "type": "conda",
+ "namespace": null,
+ "name": "absl-py",
+ "version": "0.4.1",
+ "qualifiers": {
+ "build": "py36h06a4308_0",
+ "channel": "main",
+ "subdir": "linux-64",
+ "type": "tar.bz2"
+ },
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "valid cran purl",
+ "purl": "pkg:cran/A3@0.9.1",
+ "canonical_purl": "pkg:cran/A3@0.9.1",
+ "type": "cran",
+ "namespace": null,
+ "name": "A3",
+ "version": "0.9.1",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "invalid cran purl without name",
+ "purl": "pkg:cran/@0.9.1",
+ "canonical_purl": "pkg:cran/@0.9.1",
+ "type": "cran",
+ "namespace": null,
+ "name": null,
+ "version": "0.9.1",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "invalid cran purl without version",
+ "purl": "pkg:cran/A3",
+ "canonical_purl": "pkg:cran/A3",
+ "type": "cran",
+ "namespace": null,
+ "name": "A3",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "valid swift purl",
+ "purl": "pkg:swift/github.com/Alamofire/Alamofire@5.4.3",
+ "canonical_purl": "pkg:swift/github.com/Alamofire/Alamofire@5.4.3",
+ "type": "swift",
+ "namespace": "github.com/Alamofire",
+ "name": "Alamofire",
+ "version": "5.4.3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "invalid swift purl without namespace",
+ "purl": "pkg:swift/Alamofire@5.4.3",
+ "canonical_purl": "pkg:swift/Alamofire@5.4.3",
+ "type": "swift",
+ "namespace": null,
+ "name": "Alamofire",
+ "version": "5.4.3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "invalid swift purl without name",
+ "purl": "pkg:swift/github.com/Alamofire/@5.4.3",
+ "canonical_purl": "pkg:swift/github.com/Alamofire/@5.4.3",
+ "type": "swift",
+ "namespace": "github.com/Alamofire",
+ "name": null,
+ "version": "5.4.3",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "invalid swift purl without version",
+ "purl": "pkg:swift/github.com/Alamofire/Alamofire",
+ "canonical_purl": "pkg:swift/github.com/Alamofire/Alamofire",
+ "type": "swift",
+ "namespace": "github.com/Alamofire",
+ "name": "Alamofire",
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ },
+ {
+ "description": "valid hackage purl",
+ "purl": "pkg:hackage/AC-HalfInteger@1.2.1",
+ "canonical_purl": "pkg:hackage/AC-HalfInteger@1.2.1",
+ "type": "hackage",
+ "namespace": null,
+ "name": "AC-HalfInteger",
+ "version": "1.2.1",
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": false
+ },
+ {
+ "description": "name and version are always required",
+ "purl": "pkg:hackage",
+ "canonical_purl": "pkg:hackage",
+ "type": "hackage",
+ "namespace": null,
+ "name": null,
+ "version": null,
+ "qualifiers": null,
+ "subpath": null,
+ "is_invalid": true
+ }
+] \ No newline at end of file
diff --git a/spec/fixtures/markdown/markdown_golden_master_examples.yml b/spec/fixtures/markdown/markdown_golden_master_examples.yml
index 6a1e75348cf..0c7e6ab5cd2 100644
--- a/spec/fixtures/markdown/markdown_golden_master_examples.yml
+++ b/spec/fixtures/markdown/markdown_golden_master_examples.yml
@@ -297,7 +297,7 @@
```
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-javascript" lang="javascript" v-pre="true"><code><span id="LC1" class="line" lang="javascript"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">hello world</span><span class="dl">'</span><span class="p">)</span></span></code></pre>
+ <pre data-sourcepos="1:1-3:3" lang="javascript" class="code highlight js-syntax-highlight language-javascript" v-pre="true"><code><span id="LC1" class="line" lang="javascript"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">hello world</span><span class="dl">'</span><span class="p">)</span></span></code></pre>
<copy-code></copy-code>
</div>
@@ -308,7 +308,7 @@
```
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> plaintext</span></code></pre>
+ <pre data-sourcepos="1:1-3:3" lang="plaintext" class="code highlight js-syntax-highlight language-plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> plaintext</span></code></pre>
<copy-code></copy-code>
</div>
@@ -319,7 +319,7 @@
```
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="foobar" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> custom_language = &gt;&gt; this &lt;&lt;</span></code></pre>
+ <pre data-sourcepos="1:1-3:3" lang="plaintext" class="code highlight js-syntax-highlight language-plaintext" data-canonical-lang="foobar" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> custom_language = &gt;&gt; this &lt;&lt;</span></code></pre>
<copy-code></copy-code>
</div>
@@ -531,7 +531,7 @@
;;;
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-5:3" class="code highlight js-syntax-highlight language-json" lang="json" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="json"><span class="p">{</span></span>
+ <pre data-sourcepos="1:1-5:3" lang="json" class="code highlight js-syntax-highlight language-json" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="json"><span class="p">{</span></span>
<span id="LC2" class="line" lang="json"><span class="w"> </span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Page title"</span></span>
<span id="LC3" class="line" lang="json"><span class="p">}</span></span></code></pre>
<copy-code></copy-code>
@@ -544,7 +544,7 @@
+++
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-toml" lang="toml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="toml"><span class="py">title</span> <span class="p">=</span> <span class="s">"Page title"</span></span></code></pre>
+ <pre data-sourcepos="1:1-3:3" lang="toml" class="code highlight js-syntax-highlight language-toml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="toml"><span class="py">title</span> <span class="p">=</span> <span class="s">"Page title"</span></span></code></pre>
<copy-code></copy-code>
</div>
@@ -555,7 +555,7 @@
---
html: |-
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="na">title</span><span class="pi">:</span> <span class="s">Page title</span></span></code></pre>
+ <pre data-sourcepos="1:1-3:3" lang="yaml" class="code highlight js-syntax-highlight language-yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="na">title</span><span class="pi">:</span> <span class="s">Page title</span></span></code></pre>
<copy-code></copy-code>
</div>
@@ -690,7 +690,7 @@
<p data-sourcepos="1:1-1:36" dir="auto">This math is inline <code class="code math js-render-math" data-math-style="inline">a^2+b^2=c^2</code>.</p>
<p data-sourcepos="3:1-3:27" dir="auto">This is on a separate line:</p>
<div class="gl-relative markdown-code-block js-markdown-code">
- <pre data-sourcepos="5:1-7:3" class="code highlight js-syntax-highlight language-math js-render-math" lang="math" v-pre="true" data-math-style="display"><code><span id="LC1" class="line" lang="math">a^2+b^2=c^2</span></code></pre>
+ <pre data-sourcepos="5:1-7:3" lang="math" data-math-style="display" class="js-render-math code highlight js-syntax-highlight language-math" v-pre="true"><code><span id="LC1" class="line" lang="math">a^2+b^2=c^2</span></code></pre>
<copy-code></copy-code>
</div>
diff --git a/spec/fixtures/packages/rpm/payload.json b/spec/fixtures/packages/rpm/payload.json
index 0240dbaca21..ef948c0bb6f 100644
--- a/spec/fixtures/packages/rpm/payload.json
+++ b/spec/fixtures/packages/rpm/payload.json
@@ -1,11 +1,23 @@
{
"files": [
- "/usr/bin/hello.sh"
+ "/usr/bin/test",
+ "/usr/bin/test/hello.sh"
+ ],
+ "directories": [
+ "/usr/bin/test/"
],
"changelogs": [
{
"changelogtext": "First build",
"changelogtime": 1662552000
+ },
+ {
+ "changelogtext": "Next build",
+ "changelogtime": 1662552123
+ },
+ {
+ "changelogtext": "Last build",
+ "changelogtime": 1662552321
}
],
"requirements": [
@@ -43,5 +55,7 @@
"group": "Unspecified",
"buildhost": "localhost",
"packager": null,
- "vendor": null
+ "vendor": null,
+ "pkgid": "qwe123wer234ert345",
+ "epoch": "1"
} \ No newline at end of file
diff --git a/spec/fixtures/packages/rpm/repodata/repomd.xml b/spec/fixtures/packages/rpm/repodata/364c77dd49e8f814d56e621d0b3306c4fd0696dcad506f527329b818eb0f5db3-repomd.xml
index 4554ee9a6d0..177a9be4723 100644
--- a/spec/fixtures/packages/rpm/repodata/repomd.xml
+++ b/spec/fixtures/packages/rpm/repodata/364c77dd49e8f814d56e621d0b3306c4fd0696dcad506f527329b818eb0f5db3-repomd.xml
@@ -1,4 +1,7 @@
-<repomd xmlns="http://gitlab.com/api/v4/projects/1/packages/rpm/repodata/repomd.xml" xmlns:rpm="http://gitlab.com/api/v4/projects/1/packages/rpm/repodata/repomd.xml">
+<repomd
+ xmlns="http://gitlab.com/api/v4/projects/1/packages/rpm/repodata/364c77dd49e8f814d56e621d0b3306c4fd0696dcad506f527329b818eb0f5db3-repomd.xml"
+ xmlns:rpm="http://gitlab.com/api/v4/projects/1/packages/rpm/repodata/364c77dd49e8f814d56e621d0b3306c4fd0696dcad506f527329b818eb0f5db3-repomd.xml"
+>
<revision>1644602779</revision>
<data type="filelists">
<checksum type="sha256">6503673de76312406ff8ecb06d9733c32b546a65abae4d4170d9b51fb75bf253</checksum>