Skip to content

Commit

Permalink
refactor: use one buffer for all renderers
Browse files Browse the repository at this point in the history
  • Loading branch information
DmitriyLewen committed Feb 5, 2025
1 parent 71c3c34 commit 4e93197
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 51 deletions.
13 changes: 2 additions & 11 deletions pkg/report/table/licensing.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ type pkgLicenseRenderer struct {
once *sync.Once
}

func NewPkgLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *pkgLicenseRenderer {
buf := bytes.NewBuffer([]byte{})
func NewPkgLicenseRenderer(buf *bytes.Buffer, isTerminal bool, severities []dbTypes.Severity) *pkgLicenseRenderer {
return &pkgLicenseRenderer{
w: buf,
tableWriter: newTableWriter(buf, isTerminal),
Expand All @@ -36,10 +35,6 @@ func NewPkgLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *pkgL
}
}

func (r *pkgLicenseRenderer) Flush() string {
return r.w.String()
}

func (r *pkgLicenseRenderer) Render(result types.Result) {
// Trivy doesn't currently support showing suppressed licenses
// So just skip this result
Expand Down Expand Up @@ -114,8 +109,7 @@ type fileLicenseRenderer struct {
once *sync.Once
}

func NewFileLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *fileLicenseRenderer {
buf := bytes.NewBuffer([]byte{})
func NewFileLicenseRenderer(buf *bytes.Buffer, isTerminal bool, severities []dbTypes.Severity) *fileLicenseRenderer {
return &fileLicenseRenderer{
w: buf,
tableWriter: newTableWriter(buf, isTerminal),
Expand All @@ -125,9 +119,6 @@ func NewFileLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *fil
}
}

func (r *fileLicenseRenderer) Flush() string {
return r.w.String()
}
func (r *fileLicenseRenderer) Render(result types.Result) {
// Trivy doesn't currently support showing suppressed licenses
// So just skip this result
Expand Down
8 changes: 2 additions & 6 deletions pkg/report/table/misconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type misconfigRenderer struct {
ansi bool
}

func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailures, ansi bool) *misconfigRenderer {
func NewMisconfigRenderer(buf *bytes.Buffer, severities []dbTypes.Severity, trace, includeNonFailures, ansi bool) *misconfigRenderer {
width, _, err := term.GetSize(0)
if err != nil || width == 0 {
width = 40
Expand All @@ -39,7 +39,7 @@ func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailur
tml.DisableFormatting()
}
return &misconfigRenderer{
w: bytes.NewBuffer([]byte{}),
w: buf,
severities: severities,
trace: trace,
includeNonFailures: includeNonFailures,
Expand All @@ -48,10 +48,6 @@ func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailur
}
}

func (r *misconfigRenderer) Flush() string {
return r.w.String()
}

func (r *misconfigRenderer) Render(result types.Result) {
// Trivy doesn't currently support showing suppressed misconfigs
// So just skip this result
Expand Down
6 changes: 4 additions & 2 deletions pkg/report/table/misconfig_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package table_test

import (
"bytes"
"strings"
"testing"

Expand Down Expand Up @@ -344,9 +345,10 @@ See https://avd.aquasec.com/misconfig/avd-aws-0107
dbTypes.SeverityLow, dbTypes.SeverityMedium, dbTypes.SeverityHigh,
dbTypes.SeverityCritical,
}
renderer := table.NewMisconfigRenderer(severities, false, tt.includeNonFailures, false)
buf := bytes.NewBuffer([]byte{})
renderer := table.NewMisconfigRenderer(buf, severities, false, tt.includeNonFailures, false)
renderer.Render(tt.input)
assert.Equal(t, tt.want, strings.ReplaceAll(renderer.Flush(), "\r\n", "\n"))
assert.Equal(t, tt.want, strings.ReplaceAll(buf.String(), "\r\n", "\n"))
})
}
}
8 changes: 2 additions & 6 deletions pkg/report/table/secret.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type secretRenderer struct {
ansi bool
}

func NewSecretRenderer(ansi bool, severities []dbTypes.Severity) *secretRenderer {
func NewSecretRenderer(buf *bytes.Buffer, ansi bool, severities []dbTypes.Severity) *secretRenderer {
width, _, err := term.GetSize(0)
if err != nil || width == 0 {
width = 40
Expand All @@ -29,17 +29,13 @@ func NewSecretRenderer(ansi bool, severities []dbTypes.Severity) *secretRenderer
tml.DisableFormatting()
}
return &secretRenderer{
w: bytes.NewBuffer([]byte{}),
w: buf,
severities: severities,
width: width,
ansi: ansi,
}
}

func (r *secretRenderer) Flush() string {
return r.w.String()
}

func (r *secretRenderer) Render(result types.Result) {
// Trivy doesn't currently support showing suppressed secrets
// So just skip this result
Expand Down
6 changes: 4 additions & 2 deletions pkg/report/table/secret_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package table_test

import (
"bytes"
"strings"
"testing"

Expand Down Expand Up @@ -141,12 +142,13 @@ this is a title

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
renderer := table.NewSecretRenderer(false, []dbTypes.Severity{
buf := bytes.NewBuffer([]byte{})
renderer := table.NewSecretRenderer(buf, false, []dbTypes.Severity{
dbTypes.SeverityHigh,
dbTypes.SeverityMedium,
})
renderer.Render(tt.input)
assert.Equal(t, tt.want, strings.ReplaceAll(renderer.Flush(), "\r\n", "\n"))
assert.Equal(t, tt.want, strings.ReplaceAll(buf.String(), "\r\n", "\n"))
})
}
}
33 changes: 17 additions & 16 deletions pkg/report/table/table.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package table

import (
"bytes"
"context"
"fmt"
"io"
Expand Down Expand Up @@ -52,24 +53,28 @@ type Writer struct {

type Renderer interface {
Render(result types.Result)
Flush() string
}

type renderers struct {
vulnerabilityRenderer *vulnerabilityRenderer
misconfigRenderer *misconfigRenderer
secretRenderer *secretRenderer
pkgLicenseRenderer *pkgLicenseRenderer
fileLicenseRenderer *fileLicenseRenderer
// Use one buffer for all renderers
buf *bytes.Buffer

vulnerabilityRenderer Renderer
misconfigRenderer Renderer
secretRenderer Renderer
pkgLicenseRenderer Renderer
fileLicenseRenderer Renderer
}

func (tw *Writer) initRenderers() {
buf := bytes.NewBuffer([]byte{})
tw.renderers = renderers{
vulnerabilityRenderer: NewVulnerabilityRenderer(tw.isOutputToTerminal(), tw.Tree, tw.ShowSuppressed, tw.Severities),
misconfigRenderer: NewMisconfigRenderer(tw.Severities, tw.Trace, tw.IncludeNonFailures, tw.isOutputToTerminal()),
secretRenderer: NewSecretRenderer(tw.isOutputToTerminal(), tw.Severities),
pkgLicenseRenderer: NewPkgLicenseRenderer(tw.isOutputToTerminal(), tw.Severities),
fileLicenseRenderer: NewFileLicenseRenderer(tw.isOutputToTerminal(), tw.Severities),
buf: buf,
vulnerabilityRenderer: NewVulnerabilityRenderer(buf, tw.isOutputToTerminal(), tw.Tree, tw.ShowSuppressed, tw.Severities),
misconfigRenderer: NewMisconfigRenderer(buf, tw.Severities, tw.Trace, tw.IncludeNonFailures, tw.isOutputToTerminal()),
secretRenderer: NewSecretRenderer(buf, tw.isOutputToTerminal(), tw.Severities),
pkgLicenseRenderer: NewPkgLicenseRenderer(buf, tw.isOutputToTerminal(), tw.Severities),
fileLicenseRenderer: NewFileLicenseRenderer(buf, tw.isOutputToTerminal(), tw.Severities),
}
}

Expand All @@ -90,11 +95,7 @@ func (tw *Writer) Write(_ context.Context, report types.Report) error {
}

func (tw *Writer) flush() {
_, _ = fmt.Fprint(tw.Output, tw.vulnerabilityRenderer.Flush())
_, _ = fmt.Fprint(tw.Output, tw.misconfigRenderer.Flush())
_, _ = fmt.Fprint(tw.Output, tw.secretRenderer.Flush())
_, _ = fmt.Fprint(tw.Output, tw.pkgLicenseRenderer.Flush())
_, _ = fmt.Fprint(tw.Output, tw.fileLicenseRenderer.Flush())
_, _ = fmt.Fprint(tw.Output, tw.buf.String())
}

func (tw *Writer) render(result types.Result) {
Expand Down
7 changes: 1 addition & 6 deletions pkg/report/table/vulnerability.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ type vulnerabilityRenderer struct {
once *sync.Once
}

func NewVulnerabilityRenderer(isTerminal, tree, suppressed bool, severities []dbTypes.Severity) *vulnerabilityRenderer {
buf := bytes.NewBuffer([]byte{})
func NewVulnerabilityRenderer(buf *bytes.Buffer, isTerminal, tree, suppressed bool, severities []dbTypes.Severity) *vulnerabilityRenderer {
if !isTerminal {
tml.DisableFormatting()
}
Expand All @@ -69,10 +68,6 @@ func NewVulnerabilityRenderer(isTerminal, tree, suppressed bool, severities []db
}
}

func (r *vulnerabilityRenderer) Flush() string {
return r.w.String()
}

func (r *vulnerabilityRenderer) Render(result types.Result) {
// There are 3 cases when we show the vulnerability table (or only target and `Total: 0...`):
// When Result contains vulnerabilities;
Expand Down
6 changes: 4 additions & 2 deletions pkg/report/table/vulnerability_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package table_test

import (
"bytes"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -507,12 +508,13 @@ Suppressed Vulnerabilities (Total: 1)

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r := table.NewVulnerabilityRenderer(false, true, tt.showSuppressed, []dbTypes.Severity{
buf := bytes.NewBuffer([]byte{})
r := table.NewVulnerabilityRenderer(buf, false, true, tt.showSuppressed, []dbTypes.Severity{
dbTypes.SeverityHigh,
dbTypes.SeverityMedium,
})
r.Render(tt.result)
assert.Equal(t, tt.want, r.Flush(), tt.name)
assert.Equal(t, tt.want, buf.String(), tt.name)
})
}
}

0 comments on commit 4e93197

Please sign in to comment.