From 6ae51b69e52c4d3e6c01c88ba1e20313611baed8 Mon Sep 17 00:00:00 2001 From: Anton Telyshev Date: Thu, 21 Sep 2023 13:30:55 +0300 Subject: [PATCH] No init() for checkers registry --- .golangci.yml | 1 + internal/checkers/checkers_registry.go | 53 +++++---------------- internal/checkers/checkers_registry_test.go | 21 +++++++- internal/testgen/main.go | 2 +- 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 043900d..f1a8376 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -72,6 +72,7 @@ linters: - forbidigo - gci - gocheckcompilerdirectives + - gochecknoinits - goconst - gocritic - godot diff --git a/internal/checkers/checkers_registry.go b/internal/checkers/checkers_registry.go index 12c2589..47eaafb 100644 --- a/internal/checkers/checkers_registry.go +++ b/internal/checkers/checkers_registry.go @@ -1,7 +1,6 @@ package checkers import ( - "fmt" "sort" ) @@ -23,19 +22,11 @@ var registry = checkersRegistry{ {factory: asCheckerFactory(NewSuiteTHelper), enabledByDefault: false}, } -func init() { - if err := registry.init(); err != nil { - panic(err) - } -} - type checkersRegistry []checkerMeta type checkerMeta struct { factory checkerFactory enabledByDefault bool - priority int - name string } type checkerFactory func() Checker @@ -46,38 +37,20 @@ func asCheckerFactory[T Checker](fn func() T) checkerFactory { } } -func (r checkersRegistry) init() error { - for i := range r { - checker := &r[i] - - name := checker.factory().Name() - if name == "" { - return fmt.Errorf("checker with empty name: %T", checker) - } - if _, ok := r.get(name); ok { - return fmt.Errorf("not uniq checker name: %v", name) - } - - checker.name = name - checker.priority = i - } - return nil -} - -func (r checkersRegistry) get(name string) (checkerMeta, bool) { - for _, meta := range r { - if meta.name == name { - return meta, true +func (r checkersRegistry) get(name string) (m checkerMeta, priority int, found bool) { + for i, meta := range r { + if meta.factory().Name() == name { + return meta, i, true } } - return checkerMeta{}, false + return checkerMeta{}, 0, false } // All returns all checkers names sorted by checker's priority. func All() []string { result := make([]string, 0, len(registry)) for _, meta := range registry { - result = append(result, meta.name) + result = append(result, meta.factory().Name()) } return result } @@ -87,7 +60,7 @@ func EnabledByDefault() []string { result := make([]string, 0, len(registry)) for _, meta := range registry { if meta.enabledByDefault { - result = append(result, meta.name) + result = append(result, meta.factory().Name()) } } return result @@ -95,7 +68,7 @@ func EnabledByDefault() []string { // Get returns new checker instance by checker's name. func Get(name string) (Checker, bool) { - meta, ok := registry.get(name) + meta, _, ok := registry.get(name) if ok { return meta.factory(), true } @@ -104,7 +77,7 @@ func Get(name string) (Checker, bool) { // IsKnown checks if there is a checker with that name. func IsKnown(name string) bool { - _, ok := registry.get(name) + _, _, ok := registry.get(name) return ok } @@ -112,7 +85,7 @@ func IsKnown(name string) bool { // Returns false if there is no such checker in the registry. // For pre-validation use Get or IsKnown. func IsEnabledByDefault(name string) bool { - meta, ok := registry.get(name) + meta, _, ok := registry.get(name) return ok && meta.enabledByDefault } @@ -121,8 +94,8 @@ func IsEnabledByDefault(name string) bool { func SortByPriority(checkers []string) { sort.Slice(checkers, func(i, j int) bool { lhs, rhs := checkers[i], checkers[j] - lhsMeta, _ := registry.get(lhs) - rhsMeta, _ := registry.get(rhs) - return lhsMeta.priority < rhsMeta.priority + _, lhsPriority, _ := registry.get(lhs) + _, rhsPriority, _ := registry.get(rhs) + return lhsPriority < rhsPriority }) } diff --git a/internal/checkers/checkers_registry_test.go b/internal/checkers/checkers_registry_test.go index 2e67a83..805744c 100644 --- a/internal/checkers/checkers_registry_test.go +++ b/internal/checkers/checkers_registry_test.go @@ -8,10 +8,29 @@ import ( "github.com/Antonboom/testifylint/internal/checkers" ) +func TestRegistry(t *testing.T) { + checkerList := checkers.All() + if len(checkerList) == 0 { + t.Fatal("no known checkers: empty list") + } + + checkerSet := make(map[string]struct{}, len(checkerList)) + for _, name := range checkerList { + if name == "" { + t.Fatal("empty checker name") + } + + if _, ok := checkerSet[name]; ok { + t.Fatalf("not uniq checker name: %v", name) + } + checkerSet[name] = struct{}{} + } +} + func TestAll(t *testing.T) { checkerList := checkers.All() if len(checkerList) == 0 { - t.Fatalf("no known checkers: empty list") + t.Fatal("no known checkers: empty list") } // NOTE(a.telyshev): I don't use constants or checker's Name() method on purpose. diff --git a/internal/testgen/main.go b/internal/testgen/main.go index 67d1806..cccb040 100644 --- a/internal/testgen/main.go +++ b/internal/testgen/main.go @@ -35,7 +35,7 @@ var checkerTestsGenerators = []CheckerTestsGenerator{ SuiteTHelperTestsGenerator{}, } -func init() { +func init() { //nolint:gochecknoinits // Internal test generation tool. genForChecker := make(map[string]struct{}, len(checkerTestsGenerators)) for _, g := range checkerTestsGenerators { name := g.Checker().Name()