Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions internal/app/azldev/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ func (a *App) Execute(args []string) int {
//
stdioLogger := a.initStdioLogging()

if err := setEventListener(stdioLogger, envOptions); err != nil {
if err := setEventListener(stdioLogger, a.quiet, envOptions); err != nil {
slog.Error("Error setting event listener.", "err", err)
Comment thread
Fnuworsu marked this conversation as resolved.

return 1
Expand Down Expand Up @@ -357,7 +357,7 @@ func (a *App) reInitLoggingWithLogFile(envOptions *EnvOptions) error {
return fmt.Errorf("error re-initializing file logging:\n%w", err)
}

err = setEventListener(logger, envOptions)
err = setEventListener(logger, a.quiet, envOptions)
if err != nil {
return fmt.Errorf("error re-setting event listener:\n%w", err)
}
Expand Down Expand Up @@ -421,8 +421,8 @@ func (a *App) handlePostInitCallbacks(env *Env) error {
return nil
}

func setEventListener(stdioLogger *slog.Logger, envOptions *EnvOptions) error {
eventListener, err := NewEventListener(stdioLogger)
func setEventListener(stdioLogger *slog.Logger, quiet bool, envOptions *EnvOptions) error {
eventListener, err := NewEventListener(stdioLogger, quiet)
if err != nil {
return fmt.Errorf("error initializing event listener:\n%w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion internal/app/azldev/core/testutils/testenv.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func setUpEventListener(t *testing.T, testEnv *TestEnv) {

testLogHandler := slogassert.New(t, slog.LevelDebug, nil)
testEventLogger := slog.New(testLogHandler)
testEventListener, err := azldev.NewEventListener(testEventLogger)
testEventListener, err := azldev.NewEventListener(testEventLogger, false)
require.NoError(t, err)

testEnv.EventListener = testEventListener
Expand Down
9 changes: 9 additions & 0 deletions internal/app/azldev/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type event struct {
parentEventListener *appEventListener
name string
spinner *spinner.Spinner
quiet bool

lastReportedCompletionRatio float64

Expand Down Expand Up @@ -49,6 +50,10 @@ func (e *event) End() {
}

func (e *event) SetLongRunning(longRunningText string) {
if e.quiet {
return
}

const percent = 100

// Start an indeterminate spinner to indicate to the user that *something* is happening.
Expand All @@ -60,6 +65,10 @@ func (e *event) SetLongRunning(longRunningText string) {
}

func (e *event) SetProgress(unitsComplete int64, totalUnits int64) {
if e.quiet {
return
}
Comment thread
Fnuworsu marked this conversation as resolved.

// For now, only update progress visually when the completion ratio has increased by at least 1%
// since progress was last rendered.
const minRatioIncreaseForUpdate = 0.01
Expand Down
57 changes: 57 additions & 0 deletions internal/app/azldev/event_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//nolint:testpackage // testing unexported internal types
package azldev

import (
"io"
"os"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func captureStderr(t *testing.T, action func()) string {
t.Helper()

originalStderr := os.Stderr
reader, writer, err := os.Pipe()
require.NoError(t, err)

t.Cleanup(func() {
os.Stderr = originalStderr
_ = writer.Close()
_ = reader.Close()
})

os.Stderr = writer

action()

require.NoError(t, writer.Close())

os.Stderr = originalStderr

Comment thread
Fnuworsu marked this conversation as resolved.
output, err := io.ReadAll(reader)
require.NoError(t, err)

return string(output)
}

func TestEvent_QuietModeSkipsLongRunningAndProgressRendering(t *testing.T) {
testEvent := &event{
quiet: true,
}
Comment thread
Fnuworsu marked this conversation as resolved.

stderrOutput := captureStderr(t, func() {
testEvent.SetLongRunning("working")
testEvent.SetProgress(1, 10)
})

assert.Empty(t, stderrOutput)
assert.Nil(t, testEvent.spinner)
assert.False(t, testEvent.initializedProgressBar)
assert.Zero(t, testEvent.lastReportedCompletionRatio)
}
10 changes: 8 additions & 2 deletions internal/app/azldev/eventlistener.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,22 @@ import (
type appEventListener struct {
eventLevel int
eventLogger *slog.Logger
quiet bool
}

// Ensure [appEventListener] implements [opctx.EventListener].
var _ opctx.EventListener = &appEventListener{}

// NewEventListener creates a new event listener for the environment.
Comment thread
Fnuworsu marked this conversation as resolved.
func NewEventListener(eventLogger *slog.Logger) (*appEventListener, error) {
func NewEventListener(eventLogger *slog.Logger, quiet bool) (*appEventListener, error) {
if eventLogger == nil {
return nil, errors.New("event logger cannot be nil")
}

return &appEventListener{
eventLevel: 0,
eventLogger: eventLogger,
quiet: quiet,
}, nil
}

Expand All @@ -42,7 +44,10 @@ func (el *appEventListener) StartEvent(name string, args ...any) opctx.Event {

prefix := strings.Repeat(" ", el.eventLevel*spacesPerLevel)

fmt.Fprintf(os.Stderr, "\r")
if !el.quiet {
fmt.Fprintf(os.Stderr, "\r")
}

el.eventLogger.Info(prefix+name, args...)
}

Expand All @@ -51,6 +56,7 @@ func (el *appEventListener) StartEvent(name string, args ...any) opctx.Event {
return &event{
parentEventListener: el,
name: name,
quiet: el.quiet,
}
Comment thread
Fnuworsu marked this conversation as resolved.
}

Expand Down