Skip to content

Commit

Permalink
JSON reading sets appropriate PACKAGE-MANAGER enum based on ver
Browse files Browse the repository at this point in the history
Signed-off-by: Brandon Lum <lumjjb@gmail.com>
  • Loading branch information
lumjjb committed Mar 24, 2023
1 parent 3ccd09f commit a45344d
Show file tree
Hide file tree
Showing 6 changed files with 235 additions and 2 deletions.
1 change: 1 addition & 0 deletions spdx/v2/common/external.go
Expand Up @@ -16,6 +16,7 @@ const (

// F.3 Package-Manager types
CategoryPackageManager string = "PACKAGE-MANAGER"
CategoryPackageManagerJson string = "PACKAGE_MANAGER"
TypePackageManagerMavenCentral string = "maven-central"
TypePackageManagerNpm string = "npm"
TypePackageManagerNuGet string = "nuget"
Expand Down
96 changes: 95 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,97 @@ 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"
}]
}
]
}`

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.CategoryPackageManagerJson,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name1",
},
},
},
{
PackageName: "Package-2",
PackageSPDXIdentifier: "Package-2",
PackageVersion: "2.2.2",
PackageExternalReferences: []*spdx.PackageExternalReference{
{
Category: common.CategoryPackageManagerJson,
RefType: common.TypePackageManagerPURL,
Locator: "pkg:somepkg/ns/name2",
},
},
},
},
Relationships: []*spdx.Relationship{
{
RefA: id("DOCUMENT"),
RefB: id("Container"),
Relationship: common.TypeRelationshipDescribe,
},
},
}, doc)
}
18 changes: 18 additions & 0 deletions spdx/v2/v2_2/package.go
Expand Up @@ -164,3 +164,21 @@ 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)

if r.Category == common.CategoryPackageManager {
r.Category = common.CategoryPackageManagerJson
}

return nil
}
11 changes: 10 additions & 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 Expand Up @@ -121,6 +121,15 @@ func (d *Document) UnmarshalJSON(b []byte) error {
}

p.hasFiles = nil

// // set json enum to PACKAGE_MANAGER for 2.2 (for schema reasons).
// if d.SPDXVersion == v2_2.Version {
// for _, r := range p.PackageExternalReferences {
// if r.Category == common.CategoryPackageManager {
// r.Category = common.CategoryPackageManagerJson
// }
// }
// }
}

return nil
Expand Down
97 changes: 97 additions & 0 deletions spdx/v2/v2_3/json/json_test.go
Expand Up @@ -184,3 +184,100 @@ 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"
}]
}
]
}`

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),
}
}

// 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,
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",
},
},
},
},
Relationships: []*spdx.Relationship{
{
RefA: id("DOCUMENT"),
RefB: id("Container"),
Relationship: common.TypeRelationshipDescribe,
},
},
}, doc)
}
14 changes: 14 additions & 0 deletions spdx/v2/v2_3/package.go
Expand Up @@ -182,3 +182,17 @@ type PackageExternalReference struct {
// Cardinality: conditional (optional, one) for each External Reference
ExternalRefComment string `json:"comment,omitempty"`
}

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

*r = PackageExternalReference(rr)
return nil
}

0 comments on commit a45344d

Please sign in to comment.