Skip to content

Commit

Permalink
Merge pull request #204 from spdx/addJsonEnums
Browse files Browse the repository at this point in the history
JSON reading sets appropriate PACKAGE-MANAGER enum based on ver
  • Loading branch information
lumjjb committed Mar 24, 2023
2 parents 3ccd09f + abba8e6 commit a411a72
Show file tree
Hide file tree
Showing 6 changed files with 336 additions and 3 deletions.
2 changes: 1 addition & 1 deletion spdx/v2/v2_2/example/example.go
Expand Up @@ -203,7 +203,7 @@ var example = spdx.Document{
PackageDownloadLocation: "https://search.maven.org/remotecontent?filepath=org/apache/jena/apache-jena/3.12.0/apache-jena-3.12.0.tar.gz",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: "PACKAGE_MANAGER",
Category: "PACKAGE-MANAGER",
RefType: "purl",
Locator: "pkg:maven/org.apache.jena/apache-jena@3.12.0",
},
Expand Down
139 changes: 138 additions & 1 deletion spdx/v2/v2_2/json/json_test.go
Expand Up @@ -94,7 +94,7 @@ func Test_Write(t *testing.T) {

func Test_ShorthandFields(t *testing.T) {
contents := `{
"spdxVersion": "SPDX-2.3",
"spdxVersion": "SPDX-2.2",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "SPDX-Tools-v2.0",
Expand Down Expand Up @@ -194,3 +194,140 @@ func Test_ShorthandFields(t *testing.T) {
},
}, doc)
}

func Test_JsonEnums(t *testing.T) {
contents := `{
"spdxVersion": "SPDX-2.2",
"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)

require.NoError(t, err)

id := func(s string) common.DocElementID {
return common.DocElementID{
ElementRefID: common.ElementID(s),
}
}

require.Equal(t, spdx.Document{
SPDXVersion: spdx.Version,
DataLicense: spdx.DataLicense,
SPDXIdentifier: "DOCUMENT",
DocumentName: "SPDX-Tools-v2.0",
Packages: []*spdx.Package{
{
PackageName: "Container",
PackageSPDXIdentifier: "Container",
},
{
PackageName: "Package-1",
PackageSPDXIdentifier: "Package-1",
PackageVersion: "1.1.1",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: common.CategoryPackageManager,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name1",
},
},
},
{
PackageName: "Package-2",
PackageSPDXIdentifier: "Package-2",
PackageVersion: "2.2.2",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: common.CategoryPackageManager,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name2",
},
},
},
{
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{
{
RefA: id("DOCUMENT"),
RefB: id("Container"),
Relationship: common.TypeRelationshipDescribe,
},
},
}, doc)
}
30 changes: 30 additions & 0 deletions spdx/v2/v2_2/package.go
Expand Up @@ -4,6 +4,7 @@ package v2_2

import (
"encoding/json"
"strings"

"github.com/spdx/tools-golang/spdx/v2/common"
)
Expand Down Expand Up @@ -164,3 +165,32 @@ type PackageExternalReference struct {
// Cardinality: conditional (optional, one) for each External Reference
ExternalRefComment string `json:"comment,omitempty"`
}

var _ json.Unmarshaler = (*PackageExternalReference)(nil)

func (r *PackageExternalReference) UnmarshalJSON(b []byte) error {
type ref PackageExternalReference
var rr ref
if err := json.Unmarshal(b, &rr); err != nil {
return err
}

*r = PackageExternalReference(rr)
r.Category = strings.ReplaceAll(r.Category, "_", "-")

return nil
}

var _ json.Marshaler = (*PackageExternalReference)(nil)

// We output as the JSON type enums since in v2.2.0 the JSON schema
// spec only had enums with _ (e.g. PACKAGE_MANAGER)
func (r *PackageExternalReference) MarshalJSON() ([]byte, error) {
type ref PackageExternalReference
var rr ref

rr = ref(*r)
rr.Category = strings.ReplaceAll(rr.Category, "-", "_")

return json.Marshal(&rr)
}
2 changes: 1 addition & 1 deletion spdx/v2/v2_3/document.go
Expand Up @@ -6,7 +6,7 @@ package v2_3
import (
"encoding/json"

"github.com/anchore/go-struct-converter"
converter "github.com/anchore/go-struct-converter"

"github.com/spdx/tools-golang/spdx/v2/common"
)
Expand Down
137 changes: 137 additions & 0 deletions spdx/v2/v2_3/json/json_test.go
Expand Up @@ -184,3 +184,140 @@ func Test_ShorthandFields(t *testing.T) {
},
}, doc)
}

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"
}]
},
{
"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)

require.NoError(t, err)

id := func(s string) common.DocElementID {
return common.DocElementID{
ElementRefID: common.ElementID(s),
}
}

require.Equal(t, spdx.Document{
SPDXVersion: spdx.Version,
DataLicense: spdx.DataLicense,
SPDXIdentifier: "DOCUMENT",
DocumentName: "SPDX-Tools-v2.0",
Packages: []*spdx.Package{
{
PackageName: "Container",
PackageSPDXIdentifier: "Container",
},
{
PackageName: "Package-1",
PackageSPDXIdentifier: "Package-1",
PackageVersion: "1.1.1",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: common.CategoryPackageManager,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name1",
},
},
},
{
PackageName: "Package-2",
PackageSPDXIdentifier: "Package-2",
PackageVersion: "2.2.2",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: common.CategoryPackageManager,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name2",
},
},
},
{
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{
{
RefA: id("DOCUMENT"),
RefB: id("Container"),
Relationship: common.TypeRelationshipDescribe,
},
},
}, doc)
}
29 changes: 29 additions & 0 deletions spdx/v2/v2_3/package.go
Expand Up @@ -4,6 +4,7 @@ package v2_3

import (
"encoding/json"
"strings"

"github.com/spdx/tools-golang/spdx/v2/common"
)
Expand Down Expand Up @@ -182,3 +183,31 @@ type PackageExternalReference struct {
// Cardinality: conditional (optional, one) for each External Reference
ExternalRefComment string `json:"comment,omitempty"`
}

var _ json.Unmarshaler = (*PackageExternalReference)(nil)

func (r *PackageExternalReference) UnmarshalJSON(b []byte) error {
type ref PackageExternalReference
var rr ref
if err := json.Unmarshal(b, &rr); err != nil {
return err
}

rr.Category = strings.ReplaceAll(rr.Category, "_", "-")

*r = PackageExternalReference(rr)
return nil
}

var _ json.Marshaler = (*PackageExternalReference)(nil)

func (r *PackageExternalReference) MarshalJSON() ([]byte, error) {
type ref PackageExternalReference
var rr ref

rr = ref(*r)

rr.Category = strings.ReplaceAll(rr.Category, "_", "-")

return json.Marshal(&rr)
}

0 comments on commit a411a72

Please sign in to comment.