Skip to content

Commit

Permalink
Merge pull request #84 from specter25/jsonparser1
Browse files Browse the repository at this point in the history
[GSoC'21] Pr:4 . Complete the JSON parser
  • Loading branch information
swinslow committed Jun 28, 2021
2 parents 95b9024 + 675bfcd commit 85902a1
Show file tree
Hide file tree
Showing 6 changed files with 171 additions and 17 deletions.
12 changes: 8 additions & 4 deletions jsonloader/parser2v2/parse_package.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package parser2v2
import (
"fmt"
"reflect"
"strings"

"github.com/spdx/tools-golang/spdx"
)
Expand Down Expand Up @@ -143,11 +144,14 @@ func (spec JSONSpdxDocument) parseJsonPackages2_2(key string, value interface{},
case "packageVerificationCodeExcludedFiles":
if reflect.TypeOf(codeval).Kind() == reflect.Slice {
efiles := reflect.ValueOf(codeval)
_, filename, err := extractSubs(efiles.Index(0).Interface().(string))
if err != nil {
return fmt.Errorf("%s", err)
filename := efiles.Index(0).Interface().(string)
if strings.HasPrefix(filename, "excludes:") {
_, filename, err = extractSubs(efiles.Index(0).Interface().(string))
if err != nil {
return fmt.Errorf("%s", err)
}
}
pkg.PackageVerificationCodeExcludedFile = filename
pkg.PackageVerificationCodeExcludedFile = strings.Trim(filename, " ")
}
case "packageVerificationCodeValue":
pkg.PackageVerificationCode = code["packageVerificationCodeValue"].(string)
Expand Down
45 changes: 45 additions & 0 deletions jsonloader/parser2v2/parse_reviews.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later

package parser2v2

import (
"fmt"
"reflect"

"github.com/spdx/tools-golang/spdx"
)

func (spec JSONSpdxDocument) parseJsonReviews2_2(key string, value interface{}, doc *spdxDocument2_2) error {
//FIXME: Reviewer type property of review not specified in the spec
if reflect.TypeOf(value).Kind() == reflect.Slice {
reviews := reflect.ValueOf(value)
for i := 0; i < reviews.Len(); i++ {
reviewmap := reviews.Index(i).Interface().(map[string]interface{})
review := spdx.Review2_2{}
// Remove loop all properties are mandatory in annotations
for k, v := range reviewmap {
switch k {
case "reviewer":
subkey, subvalue, err := extractSubs(v.(string))
if err != nil {
return err
}
if subkey != "Person" && subkey != "Organization" && subkey != "Tool" {
return fmt.Errorf("unrecognized Reviewer type %v", subkey)
}
review.ReviewerType = subkey
review.Reviewer = subvalue
case "comment":
review.ReviewComment = v.(string)
case "reviewDate":
review.ReviewDate = v.(string)
default:
return fmt.Errorf("received unknown tag %v in Review Section section", k)
}
}
doc.Reviews = append(doc.Reviews, &review)
}

}
return nil
}
86 changes: 86 additions & 0 deletions jsonloader/parser2v2/parse_reviews_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later

package parser2v2

import (
"encoding/json"
"reflect"
"testing"

"github.com/spdx/tools-golang/spdx"
)

func TestJSONSpdxDocument_parseJsonReviews2_2(t *testing.T) {

data := []byte(`{
"revieweds" : [ {
"reviewDate" : "2010-02-10T00:00:00Z",
"reviewer" : "Person: Joe Reviewer",
"comment" : "This is just an example. Some of the non-standard licenses look like they are actually BSD 3 clause licenses"
}, {
"reviewDate" : "2011-03-13T00:00:00Z",
"reviewer" : "Person: Suzanne Reviewer",
"comment" : "Another example reviewer."
}]
}
`)

reviewstest1 := []*spdx.Review2_2{
{
ReviewDate: "2010-02-10T00:00:00Z",
ReviewerType: "Person",
Reviewer: "Joe Reviewer",
ReviewComment: "This is just an example. Some of the non-standard licenses look like they are actually BSD 3 clause licenses",
},
{
ReviewDate: "2011-03-13T00:00:00Z",
ReviewerType: "Person",
Reviewer: "Suzanne Reviewer",
ReviewComment: "Another example reviewer.",
},
}

var specs JSONSpdxDocument
json.Unmarshal(data, &specs)

type args struct {
key string
value interface{}
doc *spdxDocument2_2
SPDXElementID spdx.DocElementID
}
tests := []struct {
name string
spec JSONSpdxDocument
args args
want []*spdx.Review2_2
wantErr bool
}{
// TODO: Add test cases.
{
name: "successTest",
spec: specs,
args: args{
key: "revieweds",
value: specs["revieweds"],
doc: &spdxDocument2_2{},
},
want: reviewstest1,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := tt.spec.parseJsonReviews2_2(tt.args.key, tt.args.value, tt.args.doc); (err != nil) != tt.wantErr {
t.Errorf("JSONSpdxDocument.parseJsonAnnotations2_2() error = %v, wantErr %v", err, tt.wantErr)
}

for i := 0; i < len(tt.want); i++ {
if !reflect.DeepEqual(tt.args.doc.Reviews[i], tt.want[i]) {
t.Errorf("Load2_2() = %v, want %v", tt.args.doc.Reviews[i], tt.want[i])
}
}

})
}
}
23 changes: 12 additions & 11 deletions jsonloader/parser2v2/parse_snippets.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,18 @@ func (spec JSONSpdxDocument) parseJsonSnippets2_2(key string, value interface{},
//TODO: optimise this logic
if reflect.TypeOf(v).Kind() == reflect.Slice {
info := reflect.ValueOf(v)
lineRanges := info.Index(0).Interface().(map[string]interface{})
lineRangeStart := lineRanges["startPointer"].(map[string]interface{})
lineRangeEnd := lineRanges["endPointer"].(map[string]interface{})
snippet.SnippetLineRangeStart = int(lineRangeStart["lineNumber"].(float64))
snippet.SnippetLineRangeEnd = int(lineRangeEnd["lineNumber"].(float64))

byteRanges := info.Index(1).Interface().(map[string]interface{})
byteRangeStart := byteRanges["startPointer"].(map[string]interface{})
byteRangeEnd := byteRanges["endPointer"].(map[string]interface{})
snippet.SnippetByteRangeStart = int(byteRangeStart["offset"].(float64))
snippet.SnippetByteRangeEnd = int(byteRangeEnd["offset"].(float64))
for i := 0; i < info.Len(); i++ {
ranges := info.Index(i).Interface().(map[string]interface{})
rangeStart := ranges["startPointer"].(map[string]interface{})
rangeEnd := ranges["endPointer"].(map[string]interface{})
if rangeStart["lineNumber"] != nil && rangeEnd["lineNumber"] != nil {
snippet.SnippetLineRangeStart = int(rangeStart["lineNumber"].(float64))
snippet.SnippetLineRangeEnd = int(rangeEnd["lineNumber"].(float64))
} else {
snippet.SnippetByteRangeStart = int(rangeStart["offset"].(float64))
snippet.SnippetByteRangeEnd = int(rangeEnd["offset"].(float64))
}
}
}
default:
return fmt.Errorf("received unknown tag %v in files section", k)
Expand Down
9 changes: 8 additions & 1 deletion jsonloader/parser2v2/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func (spec JSONSpdxDocument) newDocument(doc *spdxDocument2_2) error {
return err
}
case "annotations":
// if the json spec doenn't has any files then only this case will be executed
if spec["files"] == nil {

id, err := extractDocElementID(spec["SPDXID"].(string))
Expand Down Expand Up @@ -90,6 +91,7 @@ func (spec JSONSpdxDocument) newDocument(doc *spdxDocument2_2) error {
return err
}
}
// then parse the annotations
if spec["annotations"] != nil {
id, err := extractDocElementID(spec["SPDXID"].(string))
if err != nil {
Expand All @@ -102,7 +104,7 @@ func (spec JSONSpdxDocument) newDocument(doc *spdxDocument2_2) error {
}

case "packages":
// if the json spec doesn't has any files to parse
// if the json spec doesn't has any files to parse then this switch case will be executed
if spec["files"] == nil {
err := spec.parseJsonPackages2_2("packages", spec["packages"], doc)
if err != nil {
Expand All @@ -114,6 +116,11 @@ func (spec JSONSpdxDocument) newDocument(doc *spdxDocument2_2) error {
if err != nil {
return err
}
case "revieweds":
err := spec.parseJsonReviews2_2(key, val, doc)
if err != nil {
return err
}
case "snippets", "documentDescribes":
//redundant case
default:
Expand Down
13 changes: 12 additions & 1 deletion jsonloader/parser2v2/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,35 +373,46 @@ func TestLoad2_2(t *testing.T) {
t.Errorf("Load2_2() error = %v, wantErr %v", err, tt.wantErr)
return
}
// check creation info
if !reflect.DeepEqual(got.CreationInfo, tt.want.CreationInfo) {
t.Errorf("Load2_2() = %v, want %v", got.CreationInfo, tt.want.CreationInfo)
}
// check annotations
for i := 0; i < len(tt.want.Annotations); i++ {
if !reflect.DeepEqual(got.Annotations[i], tt.want.Annotations[i]) {
t.Errorf("Load2_2() = %v, want %v", got.Annotations[i], tt.want.Annotations[i])
}
}
// check relationships
for i := 0; i < len(got.Relationships); i++ {
if !reflect.DeepEqual(got.Relationships[i], tt.want.Relationships[i]) {
t.Errorf("Load2_2() = %v, want %v", got.Relationships[i], tt.want.Relationships[i])
}
}
//check unpackaged files
for k, v := range tt.want.UnpackagedFiles {
if !reflect.DeepEqual(got.UnpackagedFiles[k], v) {
t.Errorf("Load2_2() = %v, want %v", got.UnpackagedFiles[k], v)
}
}
// check packages
for k, v := range tt.want.Packages {
if !reflect.DeepEqual(got.Packages[k], v) {
t.Errorf("Load2_2() = %v, want %v", got.Packages[k], v)
}
}

// check other licenses
for i := 0; i < len(got.OtherLicenses); i++ {
if !reflect.DeepEqual(got.OtherLicenses[i], tt.want.OtherLicenses[i]) {
t.Errorf("Load2_2() = %v, want %v", got.OtherLicenses[i], tt.want.OtherLicenses[i])
}
}
// check reviews
for i := 0; i < len(got.Reviews); i++ {
if !reflect.DeepEqual(got.Reviews[i], tt.want.Reviews[i]) {
t.Errorf("Load2_2() = %v, want %v", got.Reviews[i], tt.want.Reviews[i])
}
}

})
}
Expand Down

0 comments on commit 85902a1

Please sign in to comment.