Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion embed/scaffold/init/$.posh/go.mod.gotext
Original file line number Diff line number Diff line change
@@ -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
Expand Down
6 changes: 3 additions & 3 deletions embed/scaffold/init/$.posh/internal/plugin.go.gotext
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
3 changes: 2 additions & 1 deletion pkg/log/pterm.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"log/slog"

ptermx "github.com/foomo/posh/pkg/pterm"
"github.com/pterm/pterm"
)

Expand Down Expand Up @@ -167,7 +168,7 @@ func (l *PTerm) Must(err error) {
}

func (l *PTerm) SlogHandler() slog.Handler {
return pterm.NewSlogHandler(&pterm.DefaultLogger)
return ptermx.NewSlogHandler()
}

// ------------------------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion pkg/prompt/check/checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
56 changes: 31 additions & 25 deletions pkg/prompt/check/defaultcheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package check

import (
"context"
"slices"
"strings"
"sync"
"time"

"github.com/foomo/posh/pkg/log"
Expand All @@ -10,40 +13,43 @@ 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
})
}
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()
}
2 changes: 1 addition & 1 deletion pkg/prompt/prompt.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions pkg/pterm/ptermwriter.go
Original file line number Diff line number Diff line change
@@ -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 changes: 85 additions & 0 deletions pkg/pterm/sloghandler.go
Original file line number Diff line number Diff line change
@@ -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
}
20 changes: 0 additions & 20 deletions pkg/shell/ptermwriter.go

This file was deleted.