diff --git a/internal/formats/formats.go b/internal/formats/formats.go index 3c3c1676b..bb6e15733 100644 --- a/internal/formats/formats.go +++ b/internal/formats/formats.go @@ -7,6 +7,7 @@ import ( "github.com/anchore/syft/internal/formats/spdx22json" "github.com/anchore/syft/internal/formats/syftjson" "github.com/anchore/syft/internal/formats/table" + "github.com/anchore/syft/internal/formats/text" "github.com/anchore/syft/syft/format" ) @@ -17,6 +18,7 @@ func All() []format.Format { table.Format(), cyclonedx12xml.Format(), spdx22json.Format(), + text.Format(), } } diff --git a/internal/presenter/packages/text_presenter.go b/internal/formats/text/encoder.go similarity index 50% rename from internal/presenter/packages/text_presenter.go rename to internal/formats/text/encoder.go index 22ed80afa..b26d18029 100644 --- a/internal/presenter/packages/text_presenter.go +++ b/internal/formats/text/encoder.go @@ -1,42 +1,27 @@ -package packages +package text import ( "fmt" - "io" "text/tabwriter" + "github.com/anchore/syft/syft/distro" "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/source" ) -// TextPresenter is a human-friendly text presenter to represent package and source data. -type TextPresenter struct { - catalog *pkg.Catalog - srcMetadata source.Metadata -} - -// NewTextPresenter creates a new presenter for the given set of catalog and image data. -func NewTextPresenter(catalog *pkg.Catalog, srcMetadata source.Metadata) *TextPresenter { - return &TextPresenter{ - catalog: catalog, - srcMetadata: srcMetadata, - } -} - -// Present is a method that is in charge of writing to an output buffer -func (pres *TextPresenter) Present(output io.Writer) error { +func encoder(output io.Writer, catalog *pkg.Catalog, srcMetadata *source.Metadata, _ *distro.Distro, _ source.Scope) error { // init the tabular writer w := new(tabwriter.Writer) w.Init(output, 0, 8, 0, '\t', tabwriter.AlignRight) - switch pres.srcMetadata.Scheme { + switch srcMetadata.Scheme { case source.DirectoryScheme: - fmt.Fprintf(w, "[Path: %s]\n", pres.srcMetadata.Path) + fmt.Fprintf(w, "[Path: %s]\n", srcMetadata.Path) case source.ImageScheme: fmt.Fprintln(w, "[Image]") - for idx, l := range pres.srcMetadata.ImageMetadata.Layers { + for idx, l := range srcMetadata.ImageMetadata.Layers { fmt.Fprintln(w, " Layer:\t", idx) fmt.Fprintln(w, " Digest:\t", l.Digest) fmt.Fprintln(w, " Size:\t", l.Size) @@ -45,12 +30,12 @@ func (pres *TextPresenter) Present(output io.Writer) error { w.Flush() } default: - return fmt.Errorf("unsupported source: %T", pres.srcMetadata.Scheme) + return fmt.Errorf("unsupported source: %T", srcMetadata.Scheme) } // populate artifacts... rows := 0 - for _, p := range pres.catalog.Sorted() { + for _, p := range catalog.Sorted() { fmt.Fprintf(w, "[%s]\n", p.Name) fmt.Fprintln(w, " Version:\t", p.Version) fmt.Fprintln(w, " Type:\t", string(p.Type)) diff --git a/internal/presenter/packages/text_presenter_test.go b/internal/formats/text/encoder_test.go similarity index 60% rename from internal/presenter/packages/text_presenter_test.go rename to internal/formats/text/encoder_test.go index d561f3357..1171d2a11 100644 --- a/internal/presenter/packages/text_presenter_test.go +++ b/internal/formats/text/encoder_test.go @@ -1,27 +1,30 @@ -package packages +package text import ( "flag" "testing" + "github.com/anchore/syft/syft/source" + "github.com/anchore/syft/internal/formats/common/testutils" + "github.com/anchore/syft/syft/format" ) var updateTextPresenterGoldenFiles = flag.Bool("update-text", false, "update the *.golden files for text presenters") func TestTextDirectoryPresenter(t *testing.T) { - catalog, metadata, _ := testutils.DirectoryInput(t) + catalog, metadata, d := testutils.DirectoryInput(t) testutils.AssertPresenterAgainstGoldenSnapshot(t, - NewTextPresenter(catalog, metadata), + format.NewPresenter(encoder, catalog, &metadata, d, source.UnknownScope), *updateTextPresenterGoldenFiles, ) } func TestTextImagePresenter(t *testing.T) { testImage := "image-simple" - catalog, metadata, _ := testutils.ImageInput(t, testImage, testutils.FromSnapshot()) + catalog, metadata, d := testutils.ImageInput(t, testImage, testutils.FromSnapshot()) testutils.AssertPresenterAgainstGoldenImageSnapshot(t, - NewTextPresenter(catalog, metadata), + format.NewPresenter(encoder, catalog, &metadata, d, source.SquashedScope), testImage, *updateTextPresenterGoldenFiles, ) diff --git a/internal/formats/text/format.go b/internal/formats/text/format.go new file mode 100644 index 000000000..a33dab291 --- /dev/null +++ b/internal/formats/text/format.go @@ -0,0 +1,12 @@ +package text + +import "github.com/anchore/syft/syft/format" + +func Format() format.Format { + return format.NewFormat( + format.TextOption, + encoder, + nil, + nil, + ) +} diff --git a/internal/formats/text/test-fixtures/image-simple/Dockerfile b/internal/formats/text/test-fixtures/image-simple/Dockerfile new file mode 100644 index 000000000..79cfa759e --- /dev/null +++ b/internal/formats/text/test-fixtures/image-simple/Dockerfile @@ -0,0 +1,4 @@ +# Note: changes to this file will result in updating several test values. Consider making a new image fixture instead of editing this one. +FROM scratch +ADD file-1.txt /somefile-1.txt +ADD file-2.txt /somefile-2.txt diff --git a/internal/formats/text/test-fixtures/image-simple/file-1.txt b/internal/formats/text/test-fixtures/image-simple/file-1.txt new file mode 100644 index 000000000..985d3408e --- /dev/null +++ b/internal/formats/text/test-fixtures/image-simple/file-1.txt @@ -0,0 +1 @@ +this file has contents \ No newline at end of file diff --git a/internal/formats/text/test-fixtures/image-simple/file-2.txt b/internal/formats/text/test-fixtures/image-simple/file-2.txt new file mode 100644 index 000000000..396d08bbc --- /dev/null +++ b/internal/formats/text/test-fixtures/image-simple/file-2.txt @@ -0,0 +1 @@ +file-2 contents! \ No newline at end of file diff --git a/internal/presenter/packages/test-fixtures/snapshot/TestTextDirectoryPresenter.golden b/internal/formats/text/test-fixtures/snapshot/TestTextDirectoryPresenter.golden similarity index 100% rename from internal/presenter/packages/test-fixtures/snapshot/TestTextDirectoryPresenter.golden rename to internal/formats/text/test-fixtures/snapshot/TestTextDirectoryPresenter.golden diff --git a/internal/presenter/packages/test-fixtures/snapshot/TestTextImagePresenter.golden b/internal/formats/text/test-fixtures/snapshot/TestTextImagePresenter.golden similarity index 100% rename from internal/presenter/packages/test-fixtures/snapshot/TestTextImagePresenter.golden rename to internal/formats/text/test-fixtures/snapshot/TestTextImagePresenter.golden diff --git a/internal/formats/text/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden b/internal/formats/text/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden new file mode 100644 index 000000000..c1b1d2b79 Binary files /dev/null and b/internal/formats/text/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden differ diff --git a/syft/presenter/packages/presenter.go b/syft/presenter/packages/presenter.go index 70920f364..db30db8a8 100644 --- a/syft/presenter/packages/presenter.go +++ b/syft/presenter/packages/presenter.go @@ -14,8 +14,6 @@ import ( // Presenter returns a presenter for images or directories func Presenter(option format.Option, config PresenterConfig) presenter.Presenter { switch option { - case format.TextOption: - return packages.NewTextPresenter(config.Catalog, config.SourceMetadata) case format.SPDXTagValueOption: return packages.NewSPDXTagValuePresenter(config.Catalog, config.SourceMetadata) default: