mirror of
https://github.com/foomo/posh.git
synced 2025-10-16 12:45:38 +00:00
Merge pull request #112 from foomo/feature/multi-checkers
feat: allow multiple checkers
This commit is contained in:
commit
1d6bfa9ea2
3
Makefile
3
Makefile
@ -19,7 +19,8 @@ outdated:
|
||||
.PHONY: test
|
||||
## Run tests
|
||||
test:
|
||||
@go test -coverprofile=coverage.out -race -json ./... | gotestfmt
|
||||
@GO_TEST_TAGS=-skip go test -coverprofile=coverage.out -race ./...
|
||||
#@GO_TEST_TAGS=-skip go test -coverprofile=coverage.out -race -json ./... | gotestfmt
|
||||
|
||||
.PHONY: test.demo
|
||||
## Run tests
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
module {{ .module }}/posh
|
||||
|
||||
go 1.23.0
|
||||
go 1.24
|
||||
|
||||
replace (
|
||||
github.com/c-bata/go-prompt v0.2.6 => github.com/franklinkim/go-prompt v0.2.7-0.20210427061716-a8f4995d7aa5
|
||||
|
||||
@ -110,12 +110,12 @@ func (p *Plugin) Prompt(ctx context.Context, cfg config.Prompt) error {
|
||||
prompt.WithAliases(cfg.Aliases),
|
||||
prompt.WithCommands(p.commands),
|
||||
prompt.WithCheckers(
|
||||
func(ctx context.Context, l log.Logger) check.Info {
|
||||
return check.Info{
|
||||
func(ctx context.Context, l log.Logger) []check.Info {
|
||||
return []check.Info{check.Info{
|
||||
Name: "example",
|
||||
Note: "all good",
|
||||
Status: check.StatusSuccess,
|
||||
}
|
||||
}}
|
||||
},
|
||||
),
|
||||
prompt.WithFileHistory(
|
||||
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
ptermx "github.com/foomo/posh/pkg/pterm"
|
||||
"github.com/pterm/pterm"
|
||||
)
|
||||
|
||||
@ -167,7 +168,7 @@ func (l *PTerm) Must(err error) {
|
||||
}
|
||||
|
||||
func (l *PTerm) SlogHandler() slog.Handler {
|
||||
return pterm.NewSlogHandler(&pterm.DefaultLogger)
|
||||
return ptermx.NewSlogHandler()
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
@ -6,4 +6,4 @@ import (
|
||||
"github.com/foomo/posh/pkg/log"
|
||||
)
|
||||
|
||||
type Checker func(ctx context.Context, l log.Logger) Info
|
||||
type Checker func(ctx context.Context, l log.Logger) []Info
|
||||
|
||||
@ -2,6 +2,9 @@ package check
|
||||
|
||||
import (
|
||||
"context"
|
||||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/foomo/posh/pkg/log"
|
||||
@ -10,29 +13,32 @@ import (
|
||||
)
|
||||
|
||||
func DefaultCheck(ctx context.Context, l log.Logger, checkers []Checker) error {
|
||||
var mu sync.Mutex
|
||||
var wg errgroup.Group
|
||||
data := make(pterm.TableData, len(checkers))
|
||||
wg.SetLimit(3)
|
||||
for i, checker := range checkers {
|
||||
i := i
|
||||
checker := checker
|
||||
var data pterm.TableData
|
||||
// wg.SetLimit(3)
|
||||
for _, checker := range checkers {
|
||||
wg.Go(func() error {
|
||||
cancelCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||
defer cancel()
|
||||
info := checker(cancelCtx, l)
|
||||
var color pterm.Color
|
||||
switch info.Status {
|
||||
case StatusFailure:
|
||||
color = pterm.FgRed
|
||||
case StatusSuccess:
|
||||
color = pterm.FgGreen
|
||||
default:
|
||||
color = pterm.FgGray
|
||||
}
|
||||
data[i] = []string{
|
||||
info.Status.String(),
|
||||
info.Name,
|
||||
color.Sprint(info.Note),
|
||||
infos := checker(cancelCtx, l)
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
for _, info := range infos {
|
||||
var color pterm.Color
|
||||
switch info.Status {
|
||||
case StatusFailure:
|
||||
color = pterm.FgRed
|
||||
case StatusSuccess:
|
||||
color = pterm.FgGreen
|
||||
default:
|
||||
color = pterm.FgGray
|
||||
}
|
||||
data = append(data, []string{
|
||||
info.Status.String(),
|
||||
info.Name,
|
||||
color.Sprint(info.Note),
|
||||
})
|
||||
}
|
||||
return nil
|
||||
})
|
||||
@ -40,10 +46,10 @@ func DefaultCheck(ctx context.Context, l log.Logger, checkers []Checker) error {
|
||||
if err := wg.Wait(); err != nil {
|
||||
return err
|
||||
}
|
||||
table := pterm.DefaultTable
|
||||
if err := table.WithData(data).Render(); err != nil {
|
||||
return err
|
||||
}
|
||||
pterm.Println()
|
||||
return nil
|
||||
|
||||
slices.SortFunc(data, func(a, b []string) int {
|
||||
return strings.Compare(a[1], b[1])
|
||||
})
|
||||
|
||||
return pterm.DefaultTable.WithData(data).Render()
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ type (
|
||||
prefix string
|
||||
prefixGit bool
|
||||
check check.Check
|
||||
checkers []check.Checker
|
||||
checkers check.Checkers
|
||||
filter goprompt.Filter
|
||||
readline *readline.Readline
|
||||
history history.History
|
||||
|
||||
20
pkg/pterm/ptermwriter.go
Normal file
20
pkg/pterm/ptermwriter.go
Normal file
@ -0,0 +1,20 @@
|
||||
package pterm
|
||||
|
||||
import (
|
||||
"github.com/pterm/pterm"
|
||||
)
|
||||
|
||||
type Writer struct {
|
||||
printer pterm.PrefixPrinter
|
||||
}
|
||||
|
||||
func NewWriter(printer pterm.PrefixPrinter) *Writer {
|
||||
return &Writer{
|
||||
printer: printer,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Writer) Write(b []byte) (int, error) {
|
||||
p.printer.Println(string(b))
|
||||
return len(b), nil
|
||||
}
|
||||
85
pkg/pterm/sloghandler.go
Normal file
85
pkg/pterm/sloghandler.go
Normal file
@ -0,0 +1,85 @@
|
||||
package pterm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/pterm/pterm"
|
||||
)
|
||||
|
||||
type SlogHandler struct {
|
||||
attrs []slog.Attr
|
||||
}
|
||||
|
||||
// NewSlogHandler returns a new logging handler that can be intrgrated with log/slog.
|
||||
func NewSlogHandler() *SlogHandler {
|
||||
return &SlogHandler{}
|
||||
}
|
||||
|
||||
// Enabled returns true if the given level is enabled.
|
||||
func (s *SlogHandler) Enabled(ctx context.Context, level slog.Level) bool {
|
||||
switch level {
|
||||
case slog.LevelDebug:
|
||||
return pterm.PrintDebugMessages
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// Handle handles the given record.
|
||||
func (s *SlogHandler) Handle(ctx context.Context, record slog.Record) error {
|
||||
level := record.Level
|
||||
message := record.Message
|
||||
|
||||
// Convert slog Attrs to a map.
|
||||
keyValsMap := make(map[string]any)
|
||||
|
||||
record.Attrs(func(attr slog.Attr) bool {
|
||||
keyValsMap[attr.Key] = attr.Value
|
||||
return true
|
||||
})
|
||||
|
||||
for _, attr := range s.attrs {
|
||||
keyValsMap[attr.Key] = attr.Value
|
||||
}
|
||||
|
||||
args := pterm.DefaultLogger.ArgsFromMap(keyValsMap)
|
||||
|
||||
// Wrapping args inside another slice to match [][]LoggerArgument
|
||||
argsWrapped := [][]pterm.LoggerArgument{args}
|
||||
|
||||
for _, arg := range argsWrapped {
|
||||
for _, attr := range arg {
|
||||
message += " " + attr.Key + ": " + fmt.Sprintf("%v", attr.Value)
|
||||
}
|
||||
}
|
||||
|
||||
switch level {
|
||||
case slog.LevelDebug:
|
||||
pterm.Debug.Println(message)
|
||||
case slog.LevelInfo:
|
||||
pterm.Info.Println(message)
|
||||
case slog.LevelWarn:
|
||||
pterm.Warning.Println(message)
|
||||
case slog.LevelError:
|
||||
pterm.Error.Println(message)
|
||||
default:
|
||||
pterm.Info.Println(message)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// WithAttrs returns a new handler with the given attributes.
|
||||
func (s *SlogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
||||
newS := *s
|
||||
newS.attrs = attrs
|
||||
return &newS
|
||||
}
|
||||
|
||||
// WithGroup is not yet supported.
|
||||
func (s *SlogHandler) WithGroup(name string) slog.Handler {
|
||||
// Grouping is not yet supported by pterm.
|
||||
return s
|
||||
}
|
||||
@ -1,20 +0,0 @@
|
||||
package shell
|
||||
|
||||
import (
|
||||
"github.com/pterm/pterm"
|
||||
)
|
||||
|
||||
type PTermWriter struct {
|
||||
printer pterm.PrefixPrinter
|
||||
}
|
||||
|
||||
func NewPTermWriter(printer pterm.PrefixPrinter) *PTermWriter {
|
||||
return &PTermWriter{
|
||||
printer: printer,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PTermWriter) Write(b []byte) (int, error) {
|
||||
p.printer.Println(string(b))
|
||||
return len(b), nil
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user