Massive UX rewrite

- Ditch multiple libraries for progressbar, spinner, colors and replace
  with pterm
- Detect when running on terminal and disable automatically spinner
- Add support for multiple progress bars
- Huge rewrite of the configuration part. No more crazy stuff with viper
  CLI commands now correctly overrides default config file as expected
- Limit banner to be displayed on relevant parts

Fixes #211
Fixes #105
Fixes #247
Fixes #233
This commit is contained in:
Ettore Di Giacinto
2021-10-19 22:26:23 +02:00
parent d4edaa9de8
commit fe14d56afe
45 changed files with 730 additions and 463 deletions

View File

@@ -9,24 +9,24 @@ import (
"strings"
"sync"
. "github.com/mudler/luet/pkg/config"
"github.com/briandowns/spinner"
"github.com/kyokomi/emoji"
. "github.com/logrusorgru/aurora"
"github.com/pterm/pterm"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var s *spinner.Spinner = nil
var s *pterm.SpinnerPrinter
var z *zap.Logger = nil
var aurora Aurora = nil
var spinnerLock = sync.Mutex{}
func NewSpinner() {
if s == nil {
s = spinner.New(
spinner.CharSets[LuetCfg.GetGeneral().SpinnerCharset],
LuetCfg.GetGeneral().GetSpinnerMs())
s = pterm.DefaultSpinner.WithShowTimer(false).WithRemoveWhenDone(true)
}
}
@@ -40,6 +40,10 @@ func GetAurora() Aurora {
return aurora
}
func NoColor() {
pterm.DisableColor()
}
func Ask() bool {
var input string
@@ -100,24 +104,41 @@ func Spinner(i int) {
i = 43
}
if s != nil && !s.Active() {
if s != nil && !s.IsActive {
// s.UpdateCharSet(spinner.CharSets[i])
s.Start() // Start the spinner
//s.Start() // Start the spinner
// time.Sleep(second)
// for i := 14; i > 0; i-- {
// if i > 1 {
// introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " seconds...")
// } else {
// introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " second...")
// }
// time.Sleep(second)
// }
// s = introSpinner
s, _ = s.Start()
//introSpinner.Stop()
}
}
func Screen(text string) {
pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(2).Println(text)
//pterm.DefaultCenter.Print(pterm.DefaultHeader.WithFullWidth().WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(10).Sprint(text))
}
func SpinnerText(suffix, prefix string) {
if s != nil {
s.Lock()
defer s.Unlock()
spinnerLock.Lock()
defer spinnerLock.Unlock()
if LuetCfg.GetGeneral().Debug {
fmt.Println(fmt.Sprintf("%s %s",
Bold(Cyan(prefix)).String(),
Bold(Magenta(suffix)).BgBlack().String(),
))
} else {
s.Suffix = Bold(Magenta(suffix)).BgBlack().String()
s.Prefix = Bold(Cyan(prefix)).String()
s.UpdateText(suffix + prefix)
}
}
}
@@ -135,7 +156,7 @@ func SpinnerStop() {
return
}
if s != nil {
s.Stop()
s.Success()
}
}
@@ -147,8 +168,10 @@ func level2Number(level string) int {
return 1
case "info":
return 2
default:
case "success":
return 3
default:
return 4
}
}
@@ -158,7 +181,7 @@ func log2File(level, msg string) {
z.Error(msg)
case "warning":
z.Warn(msg)
case "info":
case "info", "success":
z.Info(msg)
default:
z.Debug(msg)
@@ -171,13 +194,17 @@ func level2AtomicLevel(level string) zap.AtomicLevel {
return zap.NewAtomicLevelAt(zap.ErrorLevel)
case "warning":
return zap.NewAtomicLevelAt(zap.WarnLevel)
case "info":
case "info", "success":
return zap.NewAtomicLevelAt(zap.InfoLevel)
default:
return zap.NewAtomicLevelAt(zap.DebugLevel)
}
}
func init() {
InitAurora()
}
func Msg(level string, withoutColor, ln bool, msg ...interface{}) {
var message string
var confLevel, msgLevel int
@@ -206,7 +233,7 @@ func Msg(level string, withoutColor, ln bool, msg ...interface{}) {
levelMsg = Yellow(":construction: warning" + message).BgBlack().String()
case "debug":
levelMsg = White(message).BgBlack().String()
case "info":
case "info", "success":
levelMsg = message
case "error":
levelMsg = Red(message).String()
@@ -225,9 +252,37 @@ func Msg(level string, withoutColor, ln bool, msg ...interface{}) {
}
if ln {
fmt.Println(levelMsg)
switch level {
case "info":
pterm.Info.Println(levelMsg)
case "success":
pterm.Success.Println(levelMsg)
case "warning":
pterm.Warning.Println(levelMsg)
case "error":
pterm.Error.Println(levelMsg)
case "fatal":
pterm.Fatal.Println(levelMsg)
default:
fmt.Println(levelMsg)
}
//
} else {
fmt.Print(levelMsg)
switch level {
case "success":
pterm.Success.Print(levelMsg)
case "info":
pterm.Info.Print(levelMsg)
case "warning":
pterm.Warning.Print(levelMsg)
case "error":
pterm.Error.Print(levelMsg)
case "fatal":
pterm.Fatal.Print(levelMsg)
default:
fmt.Print(levelMsg)
}
}
}
@@ -256,6 +311,10 @@ func Info(mess ...interface{}) {
Msg("info", false, true, mess...)
}
func Success(mess ...interface{}) {
Msg("success", false, true, mess...)
}
func InfoC(mess ...interface{}) {
Msg("info", true, true, mess...)
}