From 358b3a2cf8d4e0426a84d71389673feff7ff3c89 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Fri, 29 Oct 2021 11:31:15 -0400 Subject: [PATCH] port text presenter to a format object (#604) Signed-off-by: Alex Goodman --- internal/formats/formats.go | 2 ++ .../text/encoder.go} | 31 +++++------------- .../text/encoder_test.go} | 13 +++++--- internal/formats/text/format.go | 12 +++++++ .../test-fixtures/image-simple/Dockerfile | 4 +++ .../test-fixtures/image-simple/file-1.txt | 1 + .../test-fixtures/image-simple/file-2.txt | 1 + .../TestTextDirectoryPresenter.golden | 0 .../snapshot/TestTextImagePresenter.golden | 0 .../stereoscope-fixture-image-simple.golden | Bin 0 -> 15360 bytes syft/presenter/packages/presenter.go | 2 -- 11 files changed, 36 insertions(+), 30 deletions(-) rename internal/{presenter/packages/text_presenter.go => formats/text/encoder.go} (50%) rename internal/{presenter/packages/text_presenter_test.go => formats/text/encoder_test.go} (60%) create mode 100644 internal/formats/text/format.go create mode 100644 internal/formats/text/test-fixtures/image-simple/Dockerfile create mode 100644 internal/formats/text/test-fixtures/image-simple/file-1.txt create mode 100644 internal/formats/text/test-fixtures/image-simple/file-2.txt rename internal/{presenter/packages => formats/text}/test-fixtures/snapshot/TestTextDirectoryPresenter.golden (100%) rename internal/{presenter/packages => formats/text}/test-fixtures/snapshot/TestTextImagePresenter.golden (100%) create mode 100644 internal/formats/text/test-fixtures/snapshot/stereoscope-fixture-image-simple.golden 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 0000000000000000000000000000000000000000..c1b1d2b797ecd34a5276a1aa2fb18c5b0a58c732 GIT binary patch literal 15360 zcmeHO+iu%N5Y=ZaKc z4r#BxuDkuJ7{OBcm#%FzyUOYr8lw^9HIDjR+4F_Fg0dOV`$VGKgH38I>Hgnpur)R2 zl)HY_XM^MD!m4A0dKhDcAS?&*f(4T;Kn>ke#l4gzVN` ze(?Rjwf#RFzkC1s- z9>CiEk8VKl|Mzk`OrxxEw%gtY==qIJx$uy+*ED8?qX(EcDL{I387Ngsb4dh?x$wg9 z*h*rg6@ZQ(w@kA*(GHyphO!?TNJz`YJ>fe4rt;(!W2awfa(sRRC68dzXajVE@y-n>o(^op5E2ZJDVs7 z4hRGU0s;YnXN7=m8LaJu|D{?6{&zpONo)J>g#RTf@W1=9f8c-jgY$EprS<=wcn6J zY-{-4@PCvC{%=1g#vT7ROM=?XoSXT-=K0?$|A*;W&6n z=@JS7fq+0jARzERL||m{EQP9mOdkK&{`^hnzm$9>7qof)M_D-kzZUPOjKl2tmy1l1 zh;8Ft5R3%h!MHdz7xT>W8cHZCSB&8>&90l53=Xp<>E*D>M<2Vo8*8l9D*K-ZL#y zZQ=xy1TbwlA*sSvk$`4t>Jlk6(avMSc$^Yo%t_n4Rq$q>(~gPk+Y4v#cWf^=0@K;g zetL>o_SUyVTU8mpNs&Rdt4TMle|Dc6KFbBi^{-S||GP5Biri^bZCIhryCba^=@v2! WZ*QOH3R;0P6aoSPfq=kwgTOxo35itz literal 0 HcmV?d00001 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: