From 3b1b9bc0e0273b620fae91deb0630461593f8a49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Jochum?= Date: Sun, 25 Sep 2022 08:15:38 +0200 Subject: [PATCH] Rework components --- .gitignore | 10 +++ interface.go => component.go | 4 +- components/logrus/logrus.go | 114 ----------------------------------- flags.go | 29 +++++++++ go.mod | 8 ++- go.sum | 18 +++--- components.go => registry.go | 41 ++++++------- 7 files changed, 74 insertions(+), 150 deletions(-) create mode 100644 .gitignore rename interface.go => component.go (78%) delete mode 100644 components/logrus/logrus.go create mode 100644 flags.go rename components.go => registry.go (77%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec44a3a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.env + +.DS_STORE + +.task/ + +!.gitkeep + +go.work +go.work.sum \ No newline at end of file diff --git a/interface.go b/component.go similarity index 78% rename from interface.go rename to component.go index 67b1a88..1164761 100644 --- a/interface.go +++ b/component.go @@ -11,9 +11,9 @@ type Component interface { Name() string Priority() int Initialized() bool - Init(components *Components, cli *cli.Context) error + Init(components *Registry, cli *cli.Context) error Stop() error - Flags(r *Components) []cli.Flag + Flags(r *Registry) []cli.Flag Health(context context.Context) error WrapHandlerFunc(ctx context.Context, req server.Request, rsp interface{}) error diff --git a/components/logrus/logrus.go b/components/logrus/logrus.go deleted file mode 100644 index 2670ac5..0000000 --- a/components/logrus/logrus.go +++ /dev/null @@ -1,114 +0,0 @@ -package logrus - -import ( - "context" - "fmt" - "os" - "runtime" - "strings" - - microLogrus "github.com/go-micro/plugins/v4/logger/logrus" - microLogger "go-micro.dev/v4/logger" - "go-micro.dev/v4/server" - "jochum.dev/jo-micro/components" - - "github.com/sirupsen/logrus" - "github.com/urfave/cli/v2" -) - -// caller returns string presentation of log caller which is formatted as -// `/path/to/file.go:line_number`. e.g. `/internal/app/api.go:25` -func caller() func(*runtime.Frame) (function string, file string) { - return func(f *runtime.Frame) (function string, file string) { - return "", fmt.Sprintf("%s:%d", f.File, f.Line) - } -} - -const Name = "logrus" - -type LogrusComponet struct { - initialized bool - logger *logrus.Logger -} - -func New() *LogrusComponet { - return &LogrusComponet{initialized: false} -} - -func Must(ctx context.Context) *LogrusComponet { - return components.Must(ctx).Must(Name).(*LogrusComponet) -} - -func MustReg(cReg *components.Components) *LogrusComponet { - return cReg.Must(Name).(*LogrusComponet) -} - -func (c *LogrusComponet) Name() string { - return Name -} - -func (c *LogrusComponet) Priority() int { - return 0 -} - -func (c *LogrusComponet) Initialized() bool { - return c.initialized -} - -func (c *LogrusComponet) Init(components *components.Components, cli *cli.Context) error { - if c.initialized { - return nil - } - - lvl, err := logrus.ParseLevel(cli.String(fmt.Sprintf("%s_loglevel", strings.ToLower(components.FlagPrefix())))) - if err != nil { - return err - } - - c.logger = logrus.New() - c.logger.Out = os.Stdout - c.logger.Level = lvl - - c.logger.SetReportCaller(true) - - c.logger.SetFormatter(&logrus.JSONFormatter{ - CallerPrettyfier: caller(), - FieldMap: logrus.FieldMap{ - logrus.FieldKeyFile: "caller", - }, - }) - - microLogger.DefaultLogger = microLogrus.NewLogger(microLogrus.WithLogger(c.logger)) - - c.initialized = true - return nil -} - -func (c *LogrusComponet) Stop() error { - c.initialized = false - c.logger = nil - return nil -} - -func (c *LogrusComponet) Flags(r *components.Components, flags []cli.Flag) []cli.Flag { - return []cli.Flag{ - &cli.StringFlag{ - Name: fmt.Sprintf("%s_loglevel", strings.ToLower(r.FlagPrefix())), - Value: "info", - Usage: "Logrus log level default 'info', {panic,fatal,error,warn,info,debug,trace} available", - EnvVars: []string{fmt.Sprintf("%s_LOG_LEVEL", strings.ToUpper(r.FlagPrefix()))}, - }, - } -} - -func (c *LogrusComponet) Health(context context.Context) error { - return nil -} - -func (c *LogrusComponet) WrapHandlerFunc(ctx context.Context, req server.Request, rsp interface{}) error { - return nil -} - -func (c *LogrusComponet) Logger() *logrus.Logger { - return c.logger -} diff --git a/flags.go b/flags.go new file mode 100644 index 0000000..9710779 --- /dev/null +++ b/flags.go @@ -0,0 +1,29 @@ +package components + +import ( + "fmt" + + "github.com/urfave/cli/v2" + "go-micro.dev/v4/logger" +) + +func FilterDuplicateFlags(flags []cli.Flag) []cli.Flag { + flagMap := make(map[string]cli.Flag, 0) + + for _, f := range flags { + if _, ok := flagMap[f.Names()[0]]; !ok { + flagMap[f.Names()[0]] = f + } else { + logger.Warn(fmt.Sprintf("Duplicated flag '%s' found", f.Names()[0])) + } + } + + result := make([]cli.Flag, len(flagMap)) + i := 0 + for _, f := range flagMap { + result[i] = f + i += 1 + } + + return result +} diff --git a/go.mod b/go.mod index bdd9f07..6f00964 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,6 @@ module jochum.dev/jo-micro/components go 1.19 require ( - github.com/go-micro/plugins/v4/logger/logrus v1.1.0 - github.com/sirupsen/logrus v1.8.1 github.com/urfave/cli/v2 v2.16.3 go-micro.dev/v4 v4.8.1 ) @@ -17,11 +15,16 @@ require ( github.com/cloudflare/circl v1.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-acme/lego/v4 v4.8.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/go-git/go-git/v5 v5.4.2 // indirect + github.com/gobwas/ws v1.1.0 // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.8 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect @@ -34,6 +37,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect + github.com/stretchr/testify v1.8.0 // indirect github.com/xanzy/ssh-agent v0.3.2 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect diff --git a/go.sum b/go.sum index 434baff..7ca2898 100644 --- a/go.sum +++ b/go.sum @@ -29,15 +29,15 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/evanphx/json-patch/v5 v5.5.0 h1:bAmFiUJ+o0o2B4OiTFeE3MqCOtyo+jjPP9iZ0VRxYUc= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-acme/lego/v4 v4.4.0 h1:uHhU5LpOYQOdp3aDU+XY2bajseu8fuExphTL1Ss6/Fc= +github.com/go-acme/lego/v4 v4.8.0 h1:XienkuT6ZKHe0DE/LXeGP4ZY+ft+7ZMlqtiJ7XJs2pI= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= @@ -47,17 +47,16 @@ github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2Su github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= -github.com/go-micro/plugins/v4/logger/logrus v1.1.0 h1:qCWt1eW2GiQnwivrBBcPRZbCwQ51A5SGUXptpxmGcuQ= -github.com/go-micro/plugins/v4/logger/logrus v1.1.0/go.mod h1:aNJaayU7YKqlxwM91B3NixYpGgtCk1HiSgwuvCb7co0= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -103,15 +102,13 @@ github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/urfave/cli/v2 v2.16.3 h1:gHoFIwpPjoyIMbJp/VFd+/vuD0dAgFK4B6DpEMFJfQk= github.com/urfave/cli/v2 v2.16.3/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= @@ -187,7 +184,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/components.go b/registry.go similarity index 77% rename from components.go rename to registry.go index 37a8eac..6d24203 100644 --- a/components.go +++ b/registry.go @@ -4,11 +4,10 @@ import ( "context" "sort" + "github.com/urfave/cli/v2" "go-micro.dev/v4" "go-micro.dev/v4/errors" "go-micro.dev/v4/server" - - "github.com/urfave/cli/v2" ) var ( @@ -23,17 +22,17 @@ type HealthInfo struct { type HealthInfoMap map[string]HealthInfo -type ComponentsKey struct{} +type RegistryKey struct{} -type Components struct { +type Registry struct { components map[string]Component service micro.Service flagPrefix string } -func Context(ctx context.Context) (*Components, error) { - c, ok := ctx.Value(ComponentsKey{}).(*Components) +func Context(ctx context.Context) (*Registry, error) { + c, ok := ctx.Value(RegistryKey{}).(*Registry) if !ok { return nil, errorRetrievingComponents } @@ -45,7 +44,7 @@ func Context(ctx context.Context) (*Components, error) { return c, nil } -func Must(ctx context.Context) *Components { +func Must(ctx context.Context) *Registry { c, err := Context(ctx) if err != nil { panic(err) @@ -54,23 +53,23 @@ func Must(ctx context.Context) *Components { return c } -func New(service micro.Service, flagPrefix string, components ...Component) *Components { - com := &Components{service: service, flagPrefix: flagPrefix, components: make(map[string]Component)} +func New(service micro.Service, flagPrefix string, components ...Component) *Registry { + com := &Registry{service: service, flagPrefix: flagPrefix, components: make(map[string]Component)} com.Add(components...) return com } -func (c *Components) Service() micro.Service { +func (c *Registry) Service() micro.Service { return c.service } -func (c *Components) FlagPrefix() string { +func (c *Registry) FlagPrefix() string { return c.flagPrefix } -func (c *Components) Add(components ...Component) { +func (c *Registry) Add(components ...Component) { for _, component := range components { if component == nil { continue @@ -84,7 +83,7 @@ func (c *Components) Add(components ...Component) { } } -func (c *Components) Get(name string) (Component, error) { +func (c *Registry) Get(name string) (Component, error) { if component, ok := c.components[name]; ok { return component, nil } @@ -92,7 +91,7 @@ func (c *Components) Get(name string) (Component, error) { return nil, errors.InternalServerError("COMPONENT_NOT_FOUND", "component '%s' has not been found", name) } -func (c *Components) Must(name string) Component { +func (c *Registry) Must(name string) Component { component, err := c.Get(name) if err != nil { panic(err) @@ -101,7 +100,7 @@ func (c *Components) Must(name string) Component { return component } -func (c *Components) AppendFlags(flags []cli.Flag) []cli.Flag { +func (c *Registry) AppendFlags(flags []cli.Flag) []cli.Flag { for _, component := range c.components { flags = append(flags, component.Flags(c)...) } @@ -109,7 +108,7 @@ func (c *Components) AppendFlags(flags []cli.Flag) []cli.Flag { return flags } -func (c *Components) Initialized() bool { +func (c *Registry) Initialized() bool { for _, component := range c.components { if !component.Initialized() { return false @@ -119,7 +118,7 @@ func (c *Components) Initialized() bool { return true } -func (c *Components) Init(context *cli.Context) error { +func (c *Registry) Init(context *cli.Context) error { // Sort Components by Priority ASC components := make([]Component, len(c.components)) for _, com := range c.components { @@ -147,7 +146,7 @@ func (c *Components) Init(context *cli.Context) error { return nil } -func (c *Components) Stop() error { +func (c *Registry) Stop() error { // Sort Components by Priority DESC components := make([]Component, len(c.components)) for _, com := range c.components { @@ -175,7 +174,7 @@ func (c *Components) Stop() error { return nil } -func (c *Components) Health(context context.Context) HealthInfoMap { +func (c *Registry) Health(context context.Context) HealthInfoMap { result := make(HealthInfoMap, len(c.components)) for _, component := range c.components { @@ -192,10 +191,10 @@ func (c *Components) Health(context context.Context) HealthInfoMap { return result } -func (c *Components) WrapHandler() server.HandlerWrapper { +func (c *Registry) WrapHandler() server.HandlerWrapper { return func(h server.HandlerFunc) server.HandlerFunc { return func(ctx context.Context, req server.Request, rsp interface{}) error { - ctx = context.WithValue(ctx, ComponentsKey{}, c) + ctx = context.WithValue(ctx, RegistryKey{}, c) for _, component := range c.components { if err := component.WrapHandlerFunc(ctx, req, rsp); err != nil {