diff --git a/internal/presenter/packages/json_distribution.go b/internal/presenter/packages/json_distribution.go deleted file mode 100644 index 5ba939c03..000000000 --- a/internal/presenter/packages/json_distribution.go +++ /dev/null @@ -1,23 +0,0 @@ -package packages - -import "github.com/anchore/syft/syft/distro" - -// JSONDistribution provides information about a detected Linux JSONDistribution. -type JSONDistribution struct { - Name string `json:"name"` // Name of the Linux distribution - Version string `json:"version"` // Version of the Linux distribution (major or major.minor version) - IDLike string `json:"idLike"` // the ID_LIKE field found within the /etc/os-release file -} - -// NewJSONDistribution creates a struct with the Linux distribution to be represented in JSON. -func NewJSONDistribution(d *distro.Distro) JSONDistribution { - if d == nil { - return JSONDistribution{} - } - - return JSONDistribution{ - Name: d.Name(), - Version: d.FullVersion(), - IDLike: d.IDLike, - } -} diff --git a/internal/presenter/packages/json_document.go b/internal/presenter/packages/json_document.go deleted file mode 100644 index 399d037ae..000000000 --- a/internal/presenter/packages/json_document.go +++ /dev/null @@ -1,62 +0,0 @@ -package packages - -import ( - "fmt" - - "github.com/anchore/syft/internal" - "github.com/anchore/syft/internal/version" - "github.com/anchore/syft/syft/distro" - "github.com/anchore/syft/syft/pkg" - "github.com/anchore/syft/syft/source" -) - -// JSONDocument represents the syft cataloging findings as a JSON document -type JSONDocument struct { - Artifacts []JSONPackage `json:"artifacts"` // Artifacts is the list of packages discovered and placed into the catalog - ArtifactRelationships []JSONRelationship `json:"artifactRelationships"` - Source JSONSource `json:"source"` // Source represents the original object that was cataloged - Distro JSONDistribution `json:"distro"` // Distro represents the Linux distribution that was detected from the source - Descriptor JSONDescriptor `json:"descriptor"` // Descriptor is a block containing self-describing information about syft - Schema JSONSchema `json:"schema"` // Schema is a block reserved for defining the version for the shape of this JSON document and where to find the schema document to validate the shape -} - -// NewJSONDocument creates and populates a new JSON document struct from the given cataloging results. -func NewJSONDocument(catalog *pkg.Catalog, srcMetadata source.Metadata, d *distro.Distro, scope source.Scope, configuration interface{}) (JSONDocument, error) { - src, err := NewJSONSource(srcMetadata, scope) - if err != nil { - return JSONDocument{}, err - } - - artifacts, err := NewJSONPackages(catalog) - if err != nil { - return JSONDocument{}, err - } - - return JSONDocument{ - Artifacts: artifacts, - ArtifactRelationships: newJSONRelationships(pkg.NewRelationships(catalog)), - Source: src, - Distro: NewJSONDistribution(d), - Descriptor: JSONDescriptor{ - Name: internal.ApplicationName, - Version: version.FromBuild().Version, - Configuration: configuration, - }, - Schema: JSONSchema{ - Version: internal.JSONSchemaVersion, - URL: fmt.Sprintf("https://raw.githubusercontent.com/anchore/syft/main/schema/json/schema-%s.json", internal.JSONSchemaVersion), - }, - }, nil -} - -// JSONDescriptor describes what created the document as well as surrounding metadata -type JSONDescriptor struct { - Name string `json:"name"` - Version string `json:"version"` - Configuration interface{} `json:"configuration,omitempty"` -} - -type JSONSchema struct { - Version string `json:"version"` - URL string `json:"url"` -} diff --git a/internal/presenter/packages/json_package.go b/internal/presenter/packages/json_package.go deleted file mode 100644 index a2ea899dd..000000000 --- a/internal/presenter/packages/json_package.go +++ /dev/null @@ -1,71 +0,0 @@ -package packages - -import ( - "github.com/anchore/syft/syft/pkg" - "github.com/anchore/syft/syft/source" -) - -// JSONPackage represents a pkg.Package object specialized for JSON marshaling and unmarshaling. -type JSONPackage struct { - ID string `json:"id"` - Name string `json:"name"` - Version string `json:"version"` - Type string `json:"type"` - FoundBy string `json:"foundBy"` - Locations []source.Location `json:"locations"` - Licenses []string `json:"licenses"` - Language string `json:"language"` - CPEs []string `json:"cpes"` - PURL string `json:"purl"` - MetadataType string `json:"metadataType"` - Metadata interface{} `json:"metadata"` -} - -func NewJSONPackages(catalog *pkg.Catalog) ([]JSONPackage, error) { - artifacts := make([]JSONPackage, 0) - if catalog == nil { - return artifacts, nil - } - for _, p := range catalog.Sorted() { - art, err := NewJSONPackage(p) - if err != nil { - return nil, err - } - artifacts = append(artifacts, art) - } - return artifacts, nil -} - -// NewJSONPackage crates a new JSONPackage from the given pkg.Package. -func NewJSONPackage(p *pkg.Package) (JSONPackage, error) { - var cpes = make([]string, len(p.CPEs)) - for i, c := range p.CPEs { - cpes[i] = c.BindToFmtString() - } - - // ensure collections are never nil for presentation reasons - var locations = make([]source.Location, 0) - if p.Locations != nil { - locations = p.Locations - } - - var licenses = make([]string, 0) - if p.Licenses != nil { - licenses = p.Licenses - } - - return JSONPackage{ - ID: string(p.ID), - Name: p.Name, - Version: p.Version, - Type: string(p.Type), - FoundBy: p.FoundBy, - Locations: locations, - Licenses: licenses, - Language: string(p.Language), - CPEs: cpes, - PURL: p.PURL, - MetadataType: string(p.MetadataType), - Metadata: p.Metadata, - }, nil -} diff --git a/internal/presenter/packages/json_presenter.go b/internal/presenter/packages/json_presenter.go deleted file mode 100644 index cbdc4d107..000000000 --- a/internal/presenter/packages/json_presenter.go +++ /dev/null @@ -1,43 +0,0 @@ -package packages - -import ( - "encoding/json" - "io" - - "github.com/anchore/syft/syft/distro" - "github.com/anchore/syft/syft/pkg" - "github.com/anchore/syft/syft/source" -) - -// JSONPresenter is a JSON presentation object for the syft results -type JSONPresenter struct { - catalog *pkg.Catalog - srcMetadata source.Metadata - distro *distro.Distro - scope source.Scope -} - -// NewJSONPresenter creates a new JSON presenter object for the given cataloging results. -func NewJSONPresenter(catalog *pkg.Catalog, s source.Metadata, d *distro.Distro, scope source.Scope) *JSONPresenter { - return &JSONPresenter{ - catalog: catalog, - srcMetadata: s, - distro: d, - scope: scope, - } -} - -// Present the catalog results to the given writer. -func (pres *JSONPresenter) Present(output io.Writer) error { - // we do not pass in configuration for backwards compatibility - doc, err := NewJSONDocument(pres.catalog, pres.srcMetadata, pres.distro, pres.scope, nil) - if err != nil { - return err - } - - enc := json.NewEncoder(output) - // prevent > and < from being escaped in the payload - enc.SetEscapeHTML(false) - enc.SetIndent("", " ") - return enc.Encode(&doc) -} diff --git a/internal/presenter/packages/json_presenter_test.go b/internal/presenter/packages/json_presenter_test.go deleted file mode 100644 index 9620c2da7..000000000 --- a/internal/presenter/packages/json_presenter_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package packages - -import ( - "flag" - "testing" - - "github.com/anchore/syft/syft/pkg" - "github.com/anchore/syft/syft/source" -) - -var updateJSONGoldenFiles = flag.Bool("update-json", false, "update the *.golden files for json presenters") - -func must(c pkg.CPE, e error) pkg.CPE { - if e != nil { - panic(e) - } - return c -} - -func TestJSONDirectoryPresenter(t *testing.T) { - catalog, metadata, dist := presenterDirectoryInput(t) - assertPresenterAgainstGoldenSnapshot(t, - NewJSONPresenter(catalog, metadata, dist, source.SquashedScope), - *updateJSONGoldenFiles, - ) - -} - -func TestJSONImagePresenter(t *testing.T) { - testImage := "image-simple" - catalog, metadata, dist := presenterImageInput(t, testImage) - assertPresenterAgainstGoldenImageSnapshot(t, - NewJSONPresenter(catalog, metadata, dist, source.SquashedScope), - testImage, - *updateJSONGoldenFiles, - ) -} diff --git a/internal/presenter/packages/json_relationship.go b/internal/presenter/packages/json_relationship.go deleted file mode 100644 index 326e4a4a5..000000000 --- a/internal/presenter/packages/json_relationship.go +++ /dev/null @@ -1,23 +0,0 @@ -package packages - -import "github.com/anchore/syft/syft/pkg" - -type JSONRelationship struct { - Parent string `json:"parent"` - Child string `json:"child"` - Type string `json:"type"` - Metadata interface{} `json:"metadata"` -} - -func newJSONRelationships(relationships []pkg.Relationship) []JSONRelationship { - result := make([]JSONRelationship, len(relationships)) - for i, r := range relationships { - result[i] = JSONRelationship{ - Parent: string(r.Parent), - Child: string(r.Child), - Type: string(r.Type), - Metadata: r.Metadata, - } - } - return result -} diff --git a/internal/presenter/packages/json_source.go b/internal/presenter/packages/json_source.go deleted file mode 100644 index d0c2a477f..000000000 --- a/internal/presenter/packages/json_source.go +++ /dev/null @@ -1,39 +0,0 @@ -package packages - -import ( - "fmt" - - "github.com/anchore/syft/syft/source" -) - -// JSONSource object represents the thing that was cataloged -type JSONSource struct { - Type string `json:"type"` - Target interface{} `json:"target"` -} - -type JSONImageSource struct { - source.ImageMetadata - Scope source.Scope `json:"scope"` -} - -// NewJSONSource creates a new source object to be represented into JSON. -func NewJSONSource(src source.Metadata, scope source.Scope) (JSONSource, error) { - switch src.Scheme { - case source.ImageScheme: - return JSONSource{ - Type: "image", - Target: JSONImageSource{ - Scope: scope, - ImageMetadata: src.ImageMetadata, - }, - }, nil - case source.DirectoryScheme: - return JSONSource{ - Type: "directory", - Target: src.Path, - }, nil - default: - return JSONSource{}, fmt.Errorf("unsupported source: %q", src.Scheme) - } -}