diff --git a/spdx/v2/common/external.go b/spdx/v2/common/external.go index a06ecbc..57105d4 100644 --- a/spdx/v2/common/external.go +++ b/spdx/v2/common/external.go @@ -23,9 +23,10 @@ const ( TypePackageManagerBower string = "bower" TypePackageManagerPURL string = "purl" // F.4 Persistent-Id types - CategoryPersistentId string = "PERSISTENT-ID" - TypePersistentIdSwh string = "swh" - TypePersistentIdGitoid string = "gitoid" + CategoryPersistentId string = "PERSISTENT-ID" + CategoryPersistentIdJson string = "PERSISTENT_ID" + TypePersistentIdSwh string = "swh" + TypePersistentIdGitoid string = "gitoid" // 11.1 Relationship field types TypeRelationshipDescribe string = "DESCRIBES" diff --git a/spdx/v2/v2_2/json/json_test.go b/spdx/v2/v2_2/json/json_test.go index 94334c9..bf1e0fb 100644 --- a/spdx/v2/v2_2/json/json_test.go +++ b/spdx/v2/v2_2/json/json_test.go @@ -228,8 +228,27 @@ func Test_JsonEnums(t *testing.T) { "referenceLocator": "pkg:somepkg/ns/name2", "referenceType": "purl" }] + }, + { + "name": "Package-3", + "SPDXID": "SPDXRef-Package-3", + "versionInfo": "3.3.3", + "externalRefs": [{ + "referenceCategory": "PERSISTENT_ID", + "referenceLocator": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "referenceType": "gitoid" + }] + }, + { + "name": "Package-4", + "SPDXID": "SPDXRef-Package-4", + "versionInfo": "4.4.4", + "externalRefs": [{ + "referenceCategory": "PERSISTENT-ID", + "referenceLocator": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "referenceType": "gitoid" + }] } - ] }` @@ -278,6 +297,30 @@ func Test_JsonEnums(t *testing.T) { }, }, }, + { + PackageName: "Package-3", + PackageSPDXIdentifier: "Package-3", + PackageVersion: "3.3.3", + PackageExternalReferences: []*spdx.PackageExternalReference{ + { + Category: common.CategoryPersistentIdJson, + RefType: common.TypePersistentIdGitoid, + Locator: "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + }, + }, + }, + { + PackageName: "Package-4", + PackageSPDXIdentifier: "Package-4", + PackageVersion: "4.4.4", + PackageExternalReferences: []*spdx.PackageExternalReference{ + { + Category: common.CategoryPersistentIdJson, + RefType: common.TypePersistentIdGitoid, + Locator: "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + }, + }, + }, }, Relationships: []*spdx.Relationship{ { diff --git a/spdx/v2/v2_2/package.go b/spdx/v2/v2_2/package.go index 1f4e600..fdf1bf7 100644 --- a/spdx/v2/v2_2/package.go +++ b/spdx/v2/v2_2/package.go @@ -4,6 +4,7 @@ package v2_2 import ( "encoding/json" + "strings" "github.com/spdx/tools-golang/spdx/v2/common" ) @@ -175,10 +176,7 @@ func (r *PackageExternalReference) UnmarshalJSON(b []byte) error { } *r = PackageExternalReference(rr) - - if r.Category == common.CategoryPackageManager { - r.Category = common.CategoryPackageManagerJson - } + r.Category = strings.ReplaceAll(r.Category, "-", "_") return nil } @@ -190,10 +188,7 @@ func (r *PackageExternalReference) MarshalJSON() ([]byte, error) { var rr ref rr = ref(*r) - - if rr.Category == common.CategoryPackageManager { - r.Category = common.CategoryPackageManagerJson - } + rr.Category = strings.ReplaceAll(rr.Category, "-", "_") return json.Marshal(&rr) } diff --git a/spdx/v2/v2_3/json/json_test.go b/spdx/v2/v2_3/json/json_test.go index cffb918..6bed4ea 100644 --- a/spdx/v2/v2_3/json/json_test.go +++ b/spdx/v2/v2_3/json/json_test.go @@ -187,41 +187,60 @@ func Test_ShorthandFields(t *testing.T) { func Test_JsonEnums(t *testing.T) { contents := `{ - "spdxVersion": "SPDX-2.3", - "dataLicense": "CC0-1.0", - "SPDXID": "SPDXRef-DOCUMENT", - "name": "SPDX-Tools-v2.0", - "documentDescribes": [ - "SPDXRef-Container" - ], - "packages": [ - { - "name": "Container", - "SPDXID": "SPDXRef-Container" - }, - { - "name": "Package-1", - "SPDXID": "SPDXRef-Package-1", - "versionInfo": "1.1.1", - "externalRefs": [{ - "referenceCategory": "PACKAGE_MANAGER", - "referenceLocator": "pkg:somepkg/ns/name1", - "referenceType": "purl" - }] - }, - { - "name": "Package-2", - "SPDXID": "SPDXRef-Package-2", - "versionInfo": "2.2.2", - "externalRefs": [{ - "referenceCategory": "PACKAGE-MANAGER", - "referenceLocator": "pkg:somepkg/ns/name2", - "referenceType": "purl" - }] - } - - ] - }` + "spdxVersion": "SPDX-2.3", + "dataLicense": "CC0-1.0", + "SPDXID": "SPDXRef-DOCUMENT", + "name": "SPDX-Tools-v2.0", + "documentDescribes": [ + "SPDXRef-Container" + ], + "packages": [ + { + "name": "Container", + "SPDXID": "SPDXRef-Container" + }, + { + "name": "Package-1", + "SPDXID": "SPDXRef-Package-1", + "versionInfo": "1.1.1", + "externalRefs": [{ + "referenceCategory": "PACKAGE_MANAGER", + "referenceLocator": "pkg:somepkg/ns/name1", + "referenceType": "purl" + }] + }, + { + "name": "Package-2", + "SPDXID": "SPDXRef-Package-2", + "versionInfo": "2.2.2", + "externalRefs": [{ + "referenceCategory": "PACKAGE-MANAGER", + "referenceLocator": "pkg:somepkg/ns/name2", + "referenceType": "purl" + }] + }, + { + "name": "Package-3", + "SPDXID": "SPDXRef-Package-3", + "versionInfo": "3.3.3", + "externalRefs": [{ + "referenceCategory": "PERSISTENT_ID", + "referenceLocator": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "referenceType": "gitoid" + }] + }, + { + "name": "Package-4", + "SPDXID": "SPDXRef-Package-4", + "versionInfo": "4.4.4", + "externalRefs": [{ + "referenceCategory": "PERSISTENT-ID", + "referenceLocator": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "referenceType": "gitoid" + }] + } + ] + }` doc := spdx.Document{} err := json.ReadInto(strings.NewReader(contents), &doc) @@ -234,9 +253,6 @@ func Test_JsonEnums(t *testing.T) { } } - // We change by default from PACKAGE_MANAGER to PACKAGE-MANAGER - // to make it more consistent in the future, but theoratically both - // work by the schema. require.Equal(t, spdx.Document{ SPDXVersion: spdx.Version, DataLicense: spdx.DataLicense, @@ -271,6 +287,30 @@ func Test_JsonEnums(t *testing.T) { }, }, }, + { + PackageName: "Package-3", + PackageSPDXIdentifier: "Package-3", + PackageVersion: "3.3.3", + PackageExternalReferences: []*spdx.PackageExternalReference{ + { + Category: common.CategoryPersistentId, + RefType: common.TypePersistentIdGitoid, + Locator: "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + }, + }, + }, + { + PackageName: "Package-4", + PackageSPDXIdentifier: "Package-4", + PackageVersion: "4.4.4", + PackageExternalReferences: []*spdx.PackageExternalReference{ + { + Category: common.CategoryPersistentId, + RefType: common.TypePersistentIdGitoid, + Locator: "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + }, + }, + }, }, Relationships: []*spdx.Relationship{ { diff --git a/spdx/v2/v2_3/package.go b/spdx/v2/v2_3/package.go index 0eeb21f..6a010e7 100644 --- a/spdx/v2/v2_3/package.go +++ b/spdx/v2/v2_3/package.go @@ -4,6 +4,7 @@ package v2_3 import ( "encoding/json" + "strings" "github.com/spdx/tools-golang/spdx/v2/common" ) @@ -189,9 +190,8 @@ func (r *PackageExternalReference) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &rr); err != nil { return err } - if rr.Category == common.CategoryPackageManagerJson { - rr.Category = common.CategoryPackageManager - } + + rr.Category = strings.ReplaceAll(rr.Category, "_", "-") *r = PackageExternalReference(rr) return nil @@ -205,9 +205,7 @@ func (r *PackageExternalReference) MarshalJSON() ([]byte, error) { rr = ref(*r) - if rr.Category == common.CategoryPackageManagerJson { - r.Category = common.CategoryPackageManager - } + rr.Category = strings.ReplaceAll(rr.Category, "_", "-") return json.Marshal(&rr) }