From 49d65ead725a02e513b3bca2b57563b29564c97a Mon Sep 17 00:00:00 2001 From: favonia Date: Sun, 7 Jul 2024 09:53:42 +0300 Subject: [PATCH] refactor(pp): various tweaks to logging --- internal/config/config_print.go | 4 +- internal/config/config_print_test.go | 8 ++-- internal/config/env_base.go | 4 +- internal/config/env_base_test.go | 4 +- internal/mocks/mock_pp.go | 30 +++++++------- internal/pp/base.go | 6 +-- internal/pp/fmt.go | 59 +++++++++++++--------------- internal/pp/fmt_test.go | 14 +++---- internal/pp/level.go | 15 ------- internal/pp/verbosity.go | 15 +++++++ 10 files changed, 78 insertions(+), 81 deletions(-) delete mode 100644 internal/pp/level.go create mode 100644 internal/pp/verbosity.go diff --git a/internal/config/config_print.go b/internal/config/config_print.go index 7a8012d1..0b662228 100644 --- a/internal/config/config_print.go +++ b/internal/config/config_print.go @@ -85,7 +85,7 @@ func (c *Config) Print(ppfmt pp.PP) { item("Delete on stop?", "%t", c.DeleteOnStop) item("Cache expiration:", "%v", c.CacheExpiration) - section("New DNS records:") + section("Parameters of new DNS records:") item("TTL:", "%s", c.TTL.Describe()) { _, inverseMap := getInverseMap(c.Proxied) @@ -106,7 +106,7 @@ func (c *Config) Print(ppfmt pp.PP) { } if len(c.Notifiers) > 0 { - section("Notifiers (via shoutrrr):") + section("Notification services (via shoutrrr):") notifier.DescribeAll(func(service, params string) { item(service+":", "%s", params) }, c.Notifiers) diff --git a/internal/config/config_print_test.go b/internal/config/config_print_test.go index 4aac2876..ad156079 100644 --- a/internal/config/config_print_test.go +++ b/internal/config/config_print_test.go @@ -42,7 +42,7 @@ func TestPrintDefault(t *testing.T) { printItem(innerMockPP, "Update on start?", "true"), printItem(innerMockPP, "Delete on stop?", "false"), printItem(innerMockPP, "Cache expiration:", "6h0m0s"), - mockPP.EXPECT().Infof(pp.EmojiConfig, "New DNS records:"), + mockPP.EXPECT().Infof(pp.EmojiConfig, "Parameters of new DNS records:"), printItem(innerMockPP, "TTL:", "1 (auto)"), printItem(innerMockPP, "Proxied domains:", "(none)"), printItem(innerMockPP, "Unproxied domains:", "(none)"), @@ -78,7 +78,7 @@ func TestPrintValues(t *testing.T) { printItem(innerMockPP, "Update on start?", "true"), printItem(innerMockPP, "Delete on stop?", "false"), printItem(innerMockPP, "Cache expiration:", "6h0m0s"), - mockPP.EXPECT().Infof(pp.EmojiConfig, "New DNS records:"), + mockPP.EXPECT().Infof(pp.EmojiConfig, "Parameters of new DNS records:"), printItem(innerMockPP, "TTL:", "30000"), printItem(innerMockPP, "Proxied domains:", "a, b"), printItem(innerMockPP, "Unproxied domains:", "c, d"), @@ -88,7 +88,7 @@ func TestPrintValues(t *testing.T) { printItem(innerMockPP, "Record updating:", "30s"), mockPP.EXPECT().Infof(pp.EmojiConfig, "Monitors:"), printItem(innerMockPP, "Meow:", "purrrr"), - mockPP.EXPECT().Infof(pp.EmojiConfig, "Notifiers (via shoutrrr):"), + mockPP.EXPECT().Infof(pp.EmojiConfig, "Notification services (via shoutrrr):"), printItem(innerMockPP, "Snake:", "hissss"), ) @@ -144,7 +144,7 @@ func TestPrintEmpty(t *testing.T) { printItem(innerMockPP, "Update on start?", "false"), printItem(innerMockPP, "Delete on stop?", "false"), printItem(innerMockPP, "Cache expiration:", "0s"), - mockPP.EXPECT().Infof(pp.EmojiConfig, "New DNS records:"), + mockPP.EXPECT().Infof(pp.EmojiConfig, "Parameters of new DNS records:"), printItem(innerMockPP, "TTL:", "0"), printItem(innerMockPP, "Proxied domains:", "(none)"), printItem(innerMockPP, "Unproxied domains:", "(none)"), diff --git a/internal/config/env_base.go b/internal/config/env_base.go index 1a576140..970ee609 100644 --- a/internal/config/env_base.go +++ b/internal/config/env_base.go @@ -73,9 +73,9 @@ func ReadQuiet(key string, ppfmt *pp.PP) bool { } if quiet { - *ppfmt = (*ppfmt).SetLevel(pp.Quiet) + *ppfmt = (*ppfmt).SetVerbosity(pp.Quiet) } else { - *ppfmt = (*ppfmt).SetLevel(pp.Verbose) + *ppfmt = (*ppfmt).SetVerbosity(pp.Verbose) } return true diff --git a/internal/config/env_base_test.go b/internal/config/env_base_test.go index 57317326..637e5ce5 100644 --- a/internal/config/env_base_test.go +++ b/internal/config/env_base_test.go @@ -186,13 +186,13 @@ func TestReadQuiet(t *testing.T) { "true": { true, " true", true, func(m *mocks.MockPP) { - m.EXPECT().SetLevel(pp.Notice) + m.EXPECT().SetVerbosity(pp.Notice) }, }, "false": { true, " false ", true, func(m *mocks.MockPP) { - m.EXPECT().SetLevel(pp.Info) + m.EXPECT().SetVerbosity(pp.Info) }, }, "illform": { diff --git a/internal/mocks/mock_pp.go b/internal/mocks/mock_pp.go index 51695a2e..14e8e199 100644 --- a/internal/mocks/mock_pp.go +++ b/internal/mocks/mock_pp.go @@ -159,7 +159,7 @@ func (c *PPInfofCall) DoAndReturn(f func(pp.Emoji, string, ...any)) *PPInfofCall } // IsEnabledFor mocks base method. -func (m *MockPP) IsEnabledFor(arg0 pp.Level) bool { +func (m *MockPP) IsEnabledFor(arg0 pp.Verbosity) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsEnabledFor", arg0) ret0, _ := ret[0].(bool) @@ -185,13 +185,13 @@ func (c *PPIsEnabledForCall) Return(arg0 bool) *PPIsEnabledForCall { } // Do rewrite *gomock.Call.Do -func (c *PPIsEnabledForCall) Do(f func(pp.Level) bool) *PPIsEnabledForCall { +func (c *PPIsEnabledForCall) Do(f func(pp.Verbosity) bool) *PPIsEnabledForCall { c.Call = c.Call.Do(f) return c } // DoAndReturn rewrite *gomock.Call.DoAndReturn -func (c *PPIsEnabledForCall) DoAndReturn(f func(pp.Level) bool) *PPIsEnabledForCall { +func (c *PPIsEnabledForCall) DoAndReturn(f func(pp.Verbosity) bool) *PPIsEnabledForCall { c.Call = c.Call.DoAndReturn(f) return c } @@ -275,40 +275,40 @@ func (c *PPSetEmojiCall) DoAndReturn(f func(bool) pp.PP) *PPSetEmojiCall { return c } -// SetLevel mocks base method. -func (m *MockPP) SetLevel(arg0 pp.Level) pp.PP { +// SetVerbosity mocks base method. +func (m *MockPP) SetVerbosity(arg0 pp.Verbosity) pp.PP { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetLevel", arg0) + ret := m.ctrl.Call(m, "SetVerbosity", arg0) ret0, _ := ret[0].(pp.PP) return ret0 } -// SetLevel indicates an expected call of SetLevel. -func (mr *MockPPMockRecorder) SetLevel(arg0 any) *PPSetLevelCall { +// SetVerbosity indicates an expected call of SetVerbosity. +func (mr *MockPPMockRecorder) SetVerbosity(arg0 any) *PPSetVerbosityCall { mr.mock.ctrl.T.Helper() - call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLevel", reflect.TypeOf((*MockPP)(nil).SetLevel), arg0) - return &PPSetLevelCall{Call: call} + call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetVerbosity", reflect.TypeOf((*MockPP)(nil).SetVerbosity), arg0) + return &PPSetVerbosityCall{Call: call} } -// PPSetLevelCall wrap *gomock.Call -type PPSetLevelCall struct { +// PPSetVerbosityCall wrap *gomock.Call +type PPSetVerbosityCall struct { *gomock.Call } // Return rewrite *gomock.Call.Return -func (c *PPSetLevelCall) Return(arg0 pp.PP) *PPSetLevelCall { +func (c *PPSetVerbosityCall) Return(arg0 pp.PP) *PPSetVerbosityCall { c.Call = c.Call.Return(arg0) return c } // Do rewrite *gomock.Call.Do -func (c *PPSetLevelCall) Do(f func(pp.Level) pp.PP) *PPSetLevelCall { +func (c *PPSetVerbosityCall) Do(f func(pp.Verbosity) pp.PP) *PPSetVerbosityCall { c.Call = c.Call.Do(f) return c } // DoAndReturn rewrite *gomock.Call.DoAndReturn -func (c *PPSetLevelCall) DoAndReturn(f func(pp.Level) pp.PP) *PPSetLevelCall { +func (c *PPSetVerbosityCall) DoAndReturn(f func(pp.Verbosity) pp.PP) *PPSetVerbosityCall { c.Call = c.Call.DoAndReturn(f) return c } diff --git a/internal/pp/base.go b/internal/pp/base.go index 84b160b3..d74873fb 100644 --- a/internal/pp/base.go +++ b/internal/pp/base.go @@ -8,11 +8,11 @@ type PP interface { // SetEmoji sets whether emojis should be used. SetEmoji(emoji bool) PP - // SetLevel sets the level under which messages will be hidden. - SetLevel(level Level) PP + // SetVerbosity sets the level under which messages will be hidden. + SetVerbosity(v Verbosity) PP // IsEnabledFor checks whether a message of a certain level will be displayed. - IsEnabledFor(level Level) bool + IsEnabledFor(v Verbosity) bool // IncIndent returns a new pretty-printer with more indentation. IncIndent() PP diff --git a/internal/pp/fmt.go b/internal/pp/fmt.go index 153297ff..4b957091 100644 --- a/internal/pp/fmt.go +++ b/internal/pp/fmt.go @@ -7,46 +7,43 @@ import ( ) type formatter struct { - writer io.Writer - emoji bool - indent int - level Level + writer io.Writer + emoji bool + indent int + verbosity Verbosity } // New creates a new pretty printer. func New(writer io.Writer) PP { - return &formatter{ - writer: writer, - emoji: true, - indent: 0, - level: DefaultLevel, + return formatter{ + writer: writer, + emoji: true, + indent: 0, + verbosity: DefaultVerbosity, } } -func (f *formatter) SetEmoji(emoji bool) PP { - fmt := *f - fmt.emoji = emoji - return &fmt +func (f formatter) SetEmoji(emoji bool) PP { + f.emoji = emoji + return f } -func (f *formatter) SetLevel(lvl Level) PP { - fmt := *f - fmt.level = lvl - return &fmt +func (f formatter) SetVerbosity(v Verbosity) PP { + f.verbosity = v + return f } -func (f *formatter) IsEnabledFor(lvl Level) bool { - return lvl >= f.level +func (f formatter) IsEnabledFor(v Verbosity) bool { + return v >= f.verbosity } -func (f *formatter) IncIndent() PP { - fmt := *f - fmt.indent++ - return &fmt +func (f formatter) IncIndent() PP { + f.indent++ + return f } -func (f *formatter) output(lvl Level, emoji Emoji, msg string) { - if lvl < f.level { +func (f formatter) output(v Verbosity, emoji Emoji, msg string) { + if v < f.verbosity { return } @@ -65,22 +62,22 @@ func (f *formatter) output(lvl Level, emoji Emoji, msg string) { fmt.Fprintln(f.writer, line) } -func (f *formatter) printf(lvl Level, emoji Emoji, format string, args ...any) { - f.output(lvl, emoji, fmt.Sprintf(format, args...)) +func (f formatter) printf(v Verbosity, emoji Emoji, format string, args ...any) { + f.output(v, emoji, fmt.Sprintf(format, args...)) } -func (f *formatter) Infof(emoji Emoji, format string, args ...any) { +func (f formatter) Infof(emoji Emoji, format string, args ...any) { f.printf(Info, emoji, format, args...) } -func (f *formatter) Noticef(emoji Emoji, format string, args ...any) { +func (f formatter) Noticef(emoji Emoji, format string, args ...any) { f.printf(Notice, emoji, format, args...) } -func (f *formatter) Warningf(emoji Emoji, format string, args ...any) { +func (f formatter) Warningf(emoji Emoji, format string, args ...any) { f.printf(Warning, emoji, format, args...) } -func (f *formatter) Errorf(emoji Emoji, format string, args ...any) { +func (f formatter) Errorf(emoji Emoji, format string, args ...any) { f.printf(Error, emoji, format, args...) } diff --git a/internal/pp/fmt_test.go b/internal/pp/fmt_test.go index cbbc932e..d52ff977 100644 --- a/internal/pp/fmt_test.go +++ b/internal/pp/fmt_test.go @@ -13,8 +13,8 @@ func TestIsEnabledFor(t *testing.T) { t.Parallel() for name, tc := range map[string]struct { - set pp.Level - test pp.Level + set pp.Verbosity + test pp.Verbosity expected bool }{ "info-notice": {pp.Info, pp.Notice, true}, @@ -24,7 +24,7 @@ func TestIsEnabledFor(t *testing.T) { t.Parallel() var buf strings.Builder - fmt := pp.New(&buf).SetLevel(tc.set) + fmt := pp.New(&buf).SetVerbosity(tc.set) require.Equal(t, tc.expected, fmt.IsEnabledFor(tc.test)) }) @@ -59,9 +59,9 @@ func TestPrint(t *testing.T) { t.Parallel() for name, tc := range map[string]struct { - emoji bool - level pp.Level - expected string + emoji bool + verbosity pp.Verbosity + expected string }{ "info": {true, pp.Info, "šŸŒŸ info\nšŸŒŸ notice\nšŸŒŸ warning\nšŸŒŸ error\n"}, "notice": {true, pp.Notice, "šŸŒŸ notice\nšŸŒŸ warning\nšŸŒŸ error\n"}, @@ -76,7 +76,7 @@ func TestPrint(t *testing.T) { t.Parallel() var buf strings.Builder - fmt := pp.New(&buf).SetEmoji(tc.emoji).SetLevel(tc.level) + fmt := pp.New(&buf).SetEmoji(tc.emoji).SetVerbosity(tc.verbosity) fmt.Infof(pp.EmojiStar, "info") fmt.Noticef(pp.EmojiStar, "notice") diff --git a/internal/pp/level.go b/internal/pp/level.go deleted file mode 100644 index c9baa6d5..00000000 --- a/internal/pp/level.go +++ /dev/null @@ -1,15 +0,0 @@ -package pp - -// Level is the type of message levels. -type Level int - -const ( - Debug Level = iota // debugging info, currently not used - Info // additional information that is not an action, a warning, or an error - Notice // an action (e.g., changing the IP) has happened and it is not an error - Warning // non-fatal errors where the updater should continue updating IP addresses - Error // fatal errors where the updater should stop - DefaultLevel = Info - Verbose = Info - Quiet = Notice -) diff --git a/internal/pp/verbosity.go b/internal/pp/verbosity.go new file mode 100644 index 00000000..d8a997b3 --- /dev/null +++ b/internal/pp/verbosity.go @@ -0,0 +1,15 @@ +package pp + +// Level is the type of message levels. +type Verbosity int + +const ( + Debug Verbosity = iota // debugging info, currently not used + Info // additional information that is not an action, a warning, or an error + Notice // an action (e.g., changing the IP) has happened and it is not an error + Warning // non-fatal errors where the updater should continue updating IP addresses + Error // fatal errors where the updater should stop + DefaultVerbosity Verbosity = Info + Verbose Verbosity = Info + Quiet Verbosity = Notice +)