From c7e4bf7564c3421a7c99abf4245b151f28b21b49 Mon Sep 17 00:00:00 2001 From: ginokent <29125616+ginokent@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:21:51 +0900 Subject: [PATCH] BREAKING CHANGE: refactor to call all commands as a package --- pkg/ddl/cockroachdb/parser.go | 4 +- pkg/ddl/cockroachdb/parser_test.go | 10 +- pkg/ddl/logs/log.go | 23 -- pkg/ddl/mysql/parser.go | 4 +- pkg/ddl/mysql/parser_test.go | 10 +- pkg/ddl/postgres/parser.go | 4 +- pkg/ddl/postgres/parser_test.go | 10 +- pkg/ddl/spanner/parser.go | 4 +- pkg/ddl/spanner/parser_test.go | 10 +- pkg/ddlctl/{ => apply}/ddlctl_apply.go | 22 +- pkg/ddlctl/ddlctl.go | 12 +- pkg/ddlctl/{ => diff}/ddlctl_diff.go | 58 +++-- pkg/ddlctl/{ => generate}/ddlctl_generate.go | 63 +++--- pkg/ddlctl/{ => show}/ddlctl_show.go | 8 +- pkg/internal/config/config.go | 6 +- pkg/internal/config/destination.go | 20 -- pkg/internal/config/source.go | 20 -- .../dialect/mysql/integrationtest_go_test.go | 30 +-- pkg/internal/generator/dialect/mysql/mysql.go | 2 +- .../generator/dialect/mysql/mysql_test.go | 2 +- .../postgres/integrationtest_go_test.go | 32 +-- .../generator/dialect/postgres/postgres.go | 2 +- .../dialect/postgres/postgres_test.go | 2 +- .../spanner/integrationtest_go_test.go | 32 +-- .../generator/dialect/spanner/spanner.go | 2 +- .../generator/dialect/spanner/spanner_test.go | 2 +- .../integrationtest/integrationtest_test.go | 4 +- pkg/internal/lang/go/dump_source.go | 2 +- pkg/internal/lang/go/extract_source.go | 2 +- pkg/internal/lang/go/parse.go | 2 +- pkg/internal/lang/go/parse_test.go | 209 +++++++++--------- pkg/internal/logs/logger.go | 63 ------ pkg/internal/util/abs.go | 2 +- pkg/logs/logger.go | 65 ++++++ pkg/show/spanner/show_create_all_tables.go | 2 +- 35 files changed, 324 insertions(+), 421 deletions(-) delete mode 100644 pkg/ddl/logs/log.go rename pkg/ddlctl/{ => apply}/ddlctl_apply.go (91%) rename pkg/ddlctl/{ => diff}/ddlctl_diff.go (76%) rename pkg/ddlctl/{ => generate}/ddlctl_generate.go (66%) rename pkg/ddlctl/{ => show}/ddlctl_show.go (91%) delete mode 100644 pkg/internal/config/destination.go delete mode 100644 pkg/internal/config/source.go delete mode 100644 pkg/internal/logs/logger.go create mode 100644 pkg/logs/logger.go diff --git a/pkg/ddl/cockroachdb/parser.go b/pkg/ddl/cockroachdb/parser.go index bc46870..8e1cca3 100644 --- a/pkg/ddl/cockroachdb/parser.go +++ b/pkg/ddl/cockroachdb/parser.go @@ -14,7 +14,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:gochecknoglobals @@ -68,7 +68,7 @@ func (p *Parser) nextToken() { p.peekToken = p.l.NextToken() _, file, line, _ := runtime.Caller(1) - logs.TraceLog.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) + logs.Trace.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) } // Parse はSQL文を解析します。 diff --git a/pkg/ddl/cockroachdb/parser_test.go b/pkg/ddl/cockroachdb/parser_test.go index 15aa07c..ade6468 100644 --- a/pkg/ddl/cockroachdb/parser_test.go +++ b/pkg/ddl/cockroachdb/parser_test.go @@ -2,24 +2,22 @@ package cockroachdb import ( - "log" - "os" "testing" "github.com/kunitsucom/util.go/testing/assert" "github.com/kunitsucom/util.go/testing/require" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest,tparallel func TestParser_Parse(t *testing.T) { - backup := logs.TraceLog + backup := logs.Trace t.Cleanup(func() { - logs.TraceLog = backup + logs.Trace = backup }) - logs.TraceLog = log.New(os.Stderr, "TRACE: ", log.LstdFlags|log.Lshortfile) + logs.Trace = logs.NewTrace() t.Run("success,CREATE_TABLE", func(t *testing.T) { l := NewLexer(`CREATE TABLE "groups" ("id" UUID NOT NULL PRIMARY KEY, description TEXT); CREATE TABLE "users" (id UUID NOT NULL, group_id UUID NOT NULL REFERENCES "groups" ("id") ON DELETE NO ACTION, "name" VARCHAR(255) NOT NULL UNIQUE, "age" INT DEFAULT 0 CHECK ("age" >= 0), description TEXT, PRIMARY KEY ("id"));`) diff --git a/pkg/ddl/logs/log.go b/pkg/ddl/logs/log.go deleted file mode 100644 index 0967f46..0000000 --- a/pkg/ddl/logs/log.go +++ /dev/null @@ -1,23 +0,0 @@ -package logs - -import ( - "io" - "log" - "os" -) - -//nolint:gochecknoglobals -var ( - // TraceLog is the logger to be used for trace log. - TraceLog = logger(os.Stderr, "UTIL_GO_DATABASE_SQL_DDL_TRACE", "TRACE: ") - // DebugLog is the logger to be used for debug log. - DebugLog = logger(os.Stderr, "UTIL_GO_DATABASE_SQL_DDL_DEBUG", "DEBUG: ") -) - -func logger(w io.Writer, environ string, prefix string) *log.Logger { - if v := os.Getenv(environ); v == "true" { - return log.New(w, prefix, log.LstdFlags|log.Lshortfile) - } - - return log.New(io.Discard, prefix, log.LstdFlags) -} diff --git a/pkg/ddl/mysql/parser.go b/pkg/ddl/mysql/parser.go index 5a88c7b..54b542a 100644 --- a/pkg/ddl/mysql/parser.go +++ b/pkg/ddl/mysql/parser.go @@ -13,7 +13,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:gochecknoglobals @@ -67,7 +67,7 @@ func (p *Parser) nextToken() { p.peekToken = p.l.NextToken() _, file, line, _ := runtime.Caller(1) - logs.TraceLog.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) + logs.Trace.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) } // Parse はSQL文を解析します。 diff --git a/pkg/ddl/mysql/parser_test.go b/pkg/ddl/mysql/parser_test.go index 367132a..eca6361 100644 --- a/pkg/ddl/mysql/parser_test.go +++ b/pkg/ddl/mysql/parser_test.go @@ -2,24 +2,22 @@ package mysql import ( - "log" - "os" "testing" "github.com/kunitsucom/util.go/testing/assert" "github.com/kunitsucom/util.go/testing/require" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest,tparallel func TestParser_Parse(t *testing.T) { - backup := logs.TraceLog + backup := logs.Trace t.Cleanup(func() { - logs.TraceLog = backup + logs.Trace = backup }) - logs.TraceLog = log.New(os.Stderr, "TRACE: ", log.LstdFlags|log.Lshortfile) + logs.Trace = logs.NewTrace() t.Run("success,CREATE_TABLE", func(t *testing.T) { // t.Parallel() diff --git a/pkg/ddl/postgres/parser.go b/pkg/ddl/postgres/parser.go index 0efd3d5..4cee15e 100644 --- a/pkg/ddl/postgres/parser.go +++ b/pkg/ddl/postgres/parser.go @@ -14,7 +14,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:gochecknoglobals @@ -68,7 +68,7 @@ func (p *Parser) nextToken() { p.peekToken = p.l.NextToken() _, file, line, _ := runtime.Caller(1) - logs.TraceLog.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) + logs.Trace.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) } // Parse はSQL文を解析します。 diff --git a/pkg/ddl/postgres/parser_test.go b/pkg/ddl/postgres/parser_test.go index dfe2208..30b3cef 100644 --- a/pkg/ddl/postgres/parser_test.go +++ b/pkg/ddl/postgres/parser_test.go @@ -2,24 +2,22 @@ package postgres import ( - "log" - "os" "testing" "github.com/kunitsucom/util.go/testing/assert" "github.com/kunitsucom/util.go/testing/require" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest,tparallel func TestParser_Parse(t *testing.T) { - backup := logs.TraceLog + backup := logs.Trace t.Cleanup(func() { - logs.TraceLog = backup + logs.Trace = backup }) - logs.TraceLog = log.New(os.Stderr, "TRACE: ", log.LstdFlags|log.Lshortfile) + logs.Trace = logs.NewTrace() t.Run("success,CREATE_TABLE", func(t *testing.T) { t.Parallel() diff --git a/pkg/ddl/spanner/parser.go b/pkg/ddl/spanner/parser.go index f63a942..8d8cf29 100644 --- a/pkg/ddl/spanner/parser.go +++ b/pkg/ddl/spanner/parser.go @@ -13,7 +13,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:gochecknoglobals @@ -67,7 +67,7 @@ func (p *Parser) nextToken() { p.peekToken = p.l.NextToken() _, file, line, _ := runtime.Caller(1) - logs.TraceLog.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) + logs.Trace.Printf("🪲: nextToken: caller=%s:%d currentToken: %#v, peekToken: %#v", filepathz.Short(file), line, p.currentToken, p.peekToken) } // Parse はSQL文を解析します。 diff --git a/pkg/ddl/spanner/parser_test.go b/pkg/ddl/spanner/parser_test.go index 4eba6d5..d7b1317 100644 --- a/pkg/ddl/spanner/parser_test.go +++ b/pkg/ddl/spanner/parser_test.go @@ -2,24 +2,22 @@ package spanner import ( - "log" - "os" "testing" "github.com/kunitsucom/util.go/testing/assert" "github.com/kunitsucom/util.go/testing/require" "github.com/kunitsucom/ddlctl/pkg/ddl" - "github.com/kunitsucom/ddlctl/pkg/ddl/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest,tparallel func TestParser_Parse(t *testing.T) { - backup := logs.TraceLog + backup := logs.Trace t.Cleanup(func() { - logs.TraceLog = backup + logs.Trace = backup }) - logs.TraceLog = log.New(os.Stderr, "TRACE: ", log.LstdFlags|log.Lshortfile) + logs.Trace = logs.NewTrace() t.Run("success,CREATE_TABLE", func(t *testing.T) { // t.Parallel() diff --git a/pkg/ddlctl/ddlctl_apply.go b/pkg/ddlctl/apply/ddlctl_apply.go similarity index 91% rename from pkg/ddlctl/ddlctl_apply.go rename to pkg/ddlctl/apply/ddlctl_apply.go index b1ef306..27b031c 100644 --- a/pkg/ddlctl/ddlctl_apply.go +++ b/pkg/ddlctl/apply/ddlctl_apply.go @@ -1,4 +1,4 @@ -package ddlctl +package apply import ( "bufio" @@ -19,13 +19,14 @@ import ( crdbddl "github.com/kunitsucom/ddlctl/pkg/ddl/cockroachdb" myddl "github.com/kunitsucom/ddlctl/pkg/ddl/mysql" spanddl "github.com/kunitsucom/ddlctl/pkg/ddl/spanner" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/diff" "github.com/kunitsucom/ddlctl/pkg/internal/config" "github.com/kunitsucom/ddlctl/pkg/internal/consts" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:cyclop,funlen,gocognit,gocyclo -func Apply(ctx context.Context, args []string) (err error) { +func Command(ctx context.Context, args []string) (err error) { if _, err := config.Load(ctx); err != nil { return apperr.Errorf("config.Load: %w", err) } @@ -34,21 +35,12 @@ func Apply(ctx context.Context, args []string) (err error) { return apperr.Errorf("args=%v: %w", args, apperr.ErrTwoArgumentsRequired) } - dsn, ddlSrc := args[0], args[1] + language := config.Language() dialect := config.Dialect() - - left, err := resolve(ctx, dialect, dsn) - if err != nil { - return apperr.Errorf("resolve: %w", err) - } - - right, err := resolve(ctx, dialect, ddlSrc) - if err != nil { - return apperr.Errorf("resolve: %w", err) - } + dsn, ddlSrc := args[0], args[1] buf := new(strings.Builder) - if err := DiffDDL(buf, dialect, left, right); err != nil { + if err := diff.Diff(ctx, buf, dialect, language, dsn, ddlSrc); err != nil { if errors.Is(err, ddl.ErrNoDifference) { _, _ = fmt.Fprintln(os.Stdout, ddl.ErrNoDifference.Error()) return nil diff --git a/pkg/ddlctl/ddlctl.go b/pkg/ddlctl/ddlctl.go index beb2160..4b7d104 100644 --- a/pkg/ddlctl/ddlctl.go +++ b/pkg/ddlctl/ddlctl.go @@ -10,6 +10,10 @@ import ( "github.com/kunitsucom/util.go/version" apperr "github.com/kunitsucom/ddlctl/pkg/apperr" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/apply" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/diff" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/generate" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/show" "github.com/kunitsucom/ddlctl/pkg/internal/consts" ) @@ -90,21 +94,21 @@ func DDLCtl(ctx context.Context) error { Default: cliz.Default("/dev/stdout"), }, ), - RunFunc: Generate, + RunFunc: generate.Command, }, { Name: "show", Usage: "ddlctl show --dialect ", Description: "show DDL from DSN like `SHOW CREATE TABLE`.", Options: []cliz.Option{optDialect}, - RunFunc: Show, + RunFunc: show.Command, }, { Name: "diff", Usage: "ddlctl diff [options] --dialect ", Description: "diff DDL from to .", Options: opts, - RunFunc: Diff, + RunFunc: diff.Command, }, { Name: "apply", @@ -118,7 +122,7 @@ func DDLCtl(ctx context.Context) error { Default: cliz.Default(false), }, ), - RunFunc: Apply, + RunFunc: apply.Command, }, }, Options: []cliz.Option{ diff --git a/pkg/ddlctl/ddlctl_diff.go b/pkg/ddlctl/diff/ddlctl_diff.go similarity index 76% rename from pkg/ddlctl/ddlctl_diff.go rename to pkg/ddlctl/diff/ddlctl_diff.go index 6f30623..905a9fa 100644 --- a/pkg/ddlctl/ddlctl_diff.go +++ b/pkg/ddlctl/diff/ddlctl_diff.go @@ -1,4 +1,4 @@ -package ddlctl +package diff import ( "context" @@ -15,11 +15,13 @@ import ( myddl "github.com/kunitsucom/ddlctl/pkg/ddl/mysql" pgddl "github.com/kunitsucom/ddlctl/pkg/ddl/postgres" spanddl "github.com/kunitsucom/ddlctl/pkg/ddl/spanner" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/generate" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/show" "github.com/kunitsucom/ddlctl/pkg/internal/config" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) -func Diff(ctx context.Context, args []string) error { +func Command(ctx context.Context, args []string) error { if _, err := config.Load(ctx); err != nil { return apperr.Errorf("config.Load: %w", err) } @@ -28,17 +30,11 @@ func Diff(ctx context.Context, args []string) error { return apperr.Errorf("args=%v: %w", args, apperr.ErrTwoArgumentsRequired) } - left, err := resolve(ctx, config.Dialect(), args[0]) - if err != nil { - return apperr.Errorf("resolve: %w", err) - } - - right, err := resolve(ctx, config.Dialect(), args[1]) - if err != nil { - return apperr.Errorf("resolve: %w", err) - } + dialect := config.Dialect() + language := config.Language() + leftArg, rightArg := args[0], args[1] - if err := DiffDDL(os.Stdout, config.Dialect(), left, right); err != nil { + if err := Diff(ctx, os.Stdout, dialect, language, leftArg, rightArg); err != nil { if errors.Is(err, ddl.ErrNoDifference) { logs.Debug.Print(ddl.ErrNoDifference.Error()) return nil @@ -50,7 +46,7 @@ func Diff(ctx context.Context, args []string) error { } //nolint:cyclop -func resolve(ctx context.Context, dialect, arg string) (ddl string, err error) { +func resolve(ctx context.Context, language, dialect, arg string) (ddl string, err error) { switch { case osz.IsFile(arg): // NOTE: expect SQL file ddlBytes, err := os.ReadFile(arg) @@ -59,15 +55,15 @@ func resolve(ctx context.Context, dialect, arg string) (ddl string, err error) { } ddl = string(ddlBytes) case osz.Exists(arg): // NOTE: expect ddlctl generate format - genDDL, err := generateDDLForDiff(ctx, arg) - if err != nil { - return "", apperr.Errorf("generateDDL: %w", err) // TODO: ddlgen 形式じゃないから無理というエラーに修正する + b := new(strings.Builder) + if err := generate.Generate(ctx, b, arg, dialect, language); err != nil { + return "", apperr.Errorf("Generate: %w", err) } - ddl = genDDL + ddl = b.String() default: // NOTE: expect DSN - genDDL, err := ShowDDL(ctx, dialect, arg) + genDDL, err := show.Show(ctx, dialect, arg) if err != nil { - return "", apperr.Errorf("ShowDDL: %w", err) + return "", apperr.Errorf("Show: %w", err) } ddl = genDDL } @@ -75,24 +71,20 @@ func resolve(ctx context.Context, dialect, arg string) (ddl string, err error) { return ddl, nil } -func generateDDLForDiff(ctx context.Context, src string) (string, error) { - ddl, err := Parse(ctx, config.Language(), src) +//nolint:cyclop,funlen,gocognit +func Diff(ctx context.Context, out io.Writer, dialect, language, src string, dst string) error { + srcDDL, err := resolve(ctx, language, dialect, src) if err != nil { - return "", apperr.Errorf("parse: %w", err) + return apperr.Errorf("resolve: %w", err) } - b := new(strings.Builder) - if err := Fprint(b, config.Dialect(), ddl); err != nil { - return "", apperr.Errorf("fprint: %w", err) + dstDDL, err := resolve(ctx, language, dialect, dst) + if err != nil { + return apperr.Errorf("resolve: %w", err) } - return b.String(), nil -} - -//nolint:cyclop,funlen,gocognit -func DiffDDL(out io.Writer, dialect string, srcDDL string, dstDDL string) error { - logs.Trace.Printf("src: %q", srcDDL) - logs.Trace.Printf("dst: %q", dstDDL) + logs.Trace.Printf("srcDDL: %q", srcDDL) + logs.Trace.Printf("dstDDL: %q", dstDDL) switch dialect { case myddl.Dialect: diff --git a/pkg/ddlctl/ddlctl_generate.go b/pkg/ddlctl/generate/ddlctl_generate.go similarity index 66% rename from pkg/ddlctl/ddlctl_generate.go rename to pkg/ddlctl/generate/ddlctl_generate.go index cae7c53..0c33d68 100644 --- a/pkg/ddlctl/ddlctl_generate.go +++ b/pkg/ddlctl/generate/ddlctl_generate.go @@ -1,4 +1,4 @@ -package ddlctl +package generate import ( "context" @@ -14,59 +14,46 @@ import ( "github.com/kunitsucom/ddlctl/pkg/internal/generator/dialect/postgres" "github.com/kunitsucom/ddlctl/pkg/internal/generator/dialect/spanner" ddlctlgo "github.com/kunitsucom/ddlctl/pkg/internal/lang/go" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) -func Generate(ctx context.Context, _ []string) error { +func Command(ctx context.Context, args []string) error { if _, err := config.Load(ctx); err != nil { return apperr.Errorf("config.Load: %w", err) } - src := config.Source() - logs.Info.Printf("source: %s", src) - + dialect := config.Dialect() language := config.Language() + src := args[0] + dst := args[1] + + logs.Info.Printf("dialect: %s", dialect) logs.Info.Printf("language: %s", language) + logs.Info.Printf("source: %s", src) + logs.Info.Printf("destination: %s", dst) - ddl, err := Parse(ctx, language, src) - if err != nil { - return apperr.Errorf("parse: %w", err) + if info, err := os.Stat(dst); err == nil && info.IsDir() { + dst = filepath.Join(dst, "ddlctl.gen.sql") } - if info, err := os.Stat(config.Destination()); err == nil && info.IsDir() { - for _, stmt := range ddl.Stmts { - dst := filepath.Join(config.Destination(), filepath.Base(stmt.GetSourceFile())) + ".gen.sql" - logs.Info.Printf("destination: %s", dst) - - f, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644) - if err != nil { - return apperr.Errorf("os.OpenFile: %w", err) - } - - if err := Fprint( - f, - config.Dialect(), - &generator.DDL{ - Header: ddl.Header, - Indent: ddl.Indent, - Stmts: []generator.Stmt{stmt}, - }, - ); err != nil { - return apperr.Errorf("fprint: %w", err) - } - } - return nil + dstFile, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644) + if err != nil { + return apperr.Errorf("os.OpenFile: %w", err) } - dst := config.Destination() - logs.Info.Printf("destination: %s", dst) + if err := Generate(ctx, dstFile, src, dialect, language); err != nil { + return apperr.Errorf("fprint: %w", err) + } + return nil +} - f, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644) +func Generate(ctx context.Context, dst io.Writer, src, dialect, language string) error { + ddl, err := Parse(ctx, language, src) if err != nil { - return apperr.Errorf("os.OpenFile: %w", err) + return apperr.Errorf("parse: %w", err) } - if err := Fprint(f, config.Dialect(), ddl); err != nil { + if err := Fprint(dst, dialect, ddl); err != nil { return apperr.Errorf("fprint: %w", err) } return nil @@ -77,7 +64,7 @@ func Parse(ctx context.Context, language string, src string) (*generator.DDL, er case ddlctlgo.Language: ddl, err := ddlctlgo.Parse(ctx, src) if err != nil { - return nil, apperr.Errorf("ddlgengo.Parse: %w", err) + return nil, apperr.Errorf("ddlctlgo.Parse: %w", err) } return ddl, nil default: diff --git a/pkg/ddlctl/ddlctl_show.go b/pkg/ddlctl/show/ddlctl_show.go similarity index 91% rename from pkg/ddlctl/ddlctl_show.go rename to pkg/ddlctl/show/ddlctl_show.go index d63ee6e..bdf3273 100644 --- a/pkg/ddlctl/ddlctl_show.go +++ b/pkg/ddlctl/show/ddlctl_show.go @@ -1,4 +1,4 @@ -package ddlctl +package show import ( "context" @@ -19,12 +19,12 @@ import ( spanshow "github.com/kunitsucom/ddlctl/pkg/show/spanner" ) -func Show(ctx context.Context, args []string) error { +func Command(ctx context.Context, args []string) error { if _, err := config.Load(ctx); err != nil { return apperr.Errorf("config.Load: %w", err) } - ddl, err := ShowDDL(ctx, config.Dialect(), args[0]) + ddl, err := Show(ctx, config.Dialect(), args[0]) if err != nil { return apperr.Errorf("diff: %w", err) } @@ -37,7 +37,7 @@ func Show(ctx context.Context, args []string) error { } //nolint:cyclop,funlen,gocognit -func ShowDDL(ctx context.Context, dialect string, dsn string) (ddl string, err error) { +func Show(ctx context.Context, dialect string, dsn string) (ddl string, err error) { driverName := func() string { switch dialect { case crdbddl.Dialect: diff --git a/pkg/internal/config/config.go b/pkg/internal/config/config.go index 4dd1d05..940010f 100644 --- a/pkg/internal/config/config.go +++ b/pkg/internal/config/config.go @@ -9,7 +9,7 @@ import ( cliz "github.com/kunitsucom/util.go/exp/cli" apperr "github.com/kunitsucom/ddlctl/pkg/apperr" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) // Use a structure so that settings can be backed up. @@ -21,8 +21,6 @@ type config struct { Debug bool `json:"debug"` Language string `json:"language"` Dialect string `json:"dialect"` - Source string `json:"source"` - Destination string `json:"destination"` AutoApprove bool `json:"auto_approve"` // Golang ColumnTagGo string `json:"column_tag_go"` @@ -80,8 +78,6 @@ func load(ctx context.Context) (cfg *config, err error) { //nolint:unparam Debug: loadDebug(ctx, cmd), Language: loadLanguage(ctx, cmd), Dialect: loadDialect(ctx, cmd), - Source: loadSource(ctx, cmd), - Destination: loadDestination(ctx, cmd), AutoApprove: loadAutoApprove(ctx, cmd), ColumnTagGo: loadColumnTagGo(ctx, cmd), DDLTagGo: loadDDLTagGo(ctx, cmd), diff --git a/pkg/internal/config/destination.go b/pkg/internal/config/destination.go deleted file mode 100644 index 23a8861..0000000 --- a/pkg/internal/config/destination.go +++ /dev/null @@ -1,20 +0,0 @@ -package config - -import ( - "context" - - cliz "github.com/kunitsucom/util.go/exp/cli" - - "github.com/kunitsucom/ddlctl/pkg/internal/consts" -) - -func loadDestination(_ context.Context, cmd *cliz.Command) string { - v, _ := cmd.GetOptionString(consts.OptionDestination) - return v -} - -func Destination() string { - globalConfigMu.RLock() - defer globalConfigMu.RUnlock() - return globalConfig.Destination -} diff --git a/pkg/internal/config/source.go b/pkg/internal/config/source.go deleted file mode 100644 index d76a9d5..0000000 --- a/pkg/internal/config/source.go +++ /dev/null @@ -1,20 +0,0 @@ -package config - -import ( - "context" - - cliz "github.com/kunitsucom/util.go/exp/cli" - - "github.com/kunitsucom/ddlctl/pkg/internal/consts" -) - -func loadSource(_ context.Context, cmd *cliz.Command) string { - v, _ := cmd.GetOptionString(consts.OptionSource) - return v -} - -func Source() string { - globalConfigMu.RLock() - defer globalConfigMu.RUnlock() - return globalConfig.Source -} diff --git a/pkg/internal/generator/dialect/mysql/integrationtest_go_test.go b/pkg/internal/generator/dialect/mysql/integrationtest_go_test.go index 19bbe53..8874a42 100644 --- a/pkg/internal/generator/dialect/mysql/integrationtest_go_test.go +++ b/pkg/internal/generator/dialect/mysql/integrationtest_go_test.go @@ -24,25 +24,25 @@ func Test_integrationtest_go_spanner(t *testing.T) { t.Parallel() cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=myddl", + "--go-pk-tag=pkey", + "integrationtest_go_001.source", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=myddl", - "--go-pk-tag=pkey", - "--src=integrationtest_go_001.source", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) - ddl, err := ddlctlgo.Parse(ctx, config.Source()) + ddl, err := ddlctlgo.Parse(ctx, args[1]) require.NoError(t, err) buf := bytes.NewBuffer(nil) diff --git a/pkg/internal/generator/dialect/mysql/mysql.go b/pkg/internal/generator/dialect/mysql/mysql.go index d112f8a..8ac5ee0 100644 --- a/pkg/internal/generator/dialect/mysql/mysql.go +++ b/pkg/internal/generator/dialect/mysql/mysql.go @@ -5,7 +5,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) const ( diff --git a/pkg/internal/generator/dialect/mysql/mysql_test.go b/pkg/internal/generator/dialect/mysql/mysql_test.go index 67da49e..07b8496 100644 --- a/pkg/internal/generator/dialect/mysql/mysql_test.go +++ b/pkg/internal/generator/dialect/mysql/mysql_test.go @@ -12,7 +12,7 @@ import ( "github.com/kunitsucom/util.go/testing/require" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest diff --git a/pkg/internal/generator/dialect/postgres/integrationtest_go_test.go b/pkg/internal/generator/dialect/postgres/integrationtest_go_test.go index f87af81..303da7c 100644 --- a/pkg/internal/generator/dialect/postgres/integrationtest_go_test.go +++ b/pkg/internal/generator/dialect/postgres/integrationtest_go_test.go @@ -24,26 +24,26 @@ func Test_integrationtest_go_spanner(t *testing.T) { t.Parallel() cmd := fixture.Cmd() - { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=pgddl", - "--go-pk-tag=pkey", - "--src=integrationtest_go_001.source", - "--dst=dummy", - }) - require.NoError(t, err) - } + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=pgddl", + "--go-pk-tag=pkey", + "integrationtest_go_001.source", + "dummy", + }) + require.NoError(t, err) ctx := cliz.WithContext(context.Background(), cmd) - _, err := config.Load(ctx) - require.NoError(t, err) + { + _, err := config.Load(ctx) + require.NoError(t, err) + } - ddl, err := ddlctlgo.Parse(ctx, config.Source()) + ddl, err := ddlctlgo.Parse(ctx, args[1]) require.NoError(t, err) buf := bytes.NewBuffer(nil) diff --git a/pkg/internal/generator/dialect/postgres/postgres.go b/pkg/internal/generator/dialect/postgres/postgres.go index 7126397..b6a0428 100644 --- a/pkg/internal/generator/dialect/postgres/postgres.go +++ b/pkg/internal/generator/dialect/postgres/postgres.go @@ -5,7 +5,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) const ( diff --git a/pkg/internal/generator/dialect/postgres/postgres_test.go b/pkg/internal/generator/dialect/postgres/postgres_test.go index 0421119..0fedbca 100644 --- a/pkg/internal/generator/dialect/postgres/postgres_test.go +++ b/pkg/internal/generator/dialect/postgres/postgres_test.go @@ -12,7 +12,7 @@ import ( "github.com/kunitsucom/util.go/testing/require" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest diff --git a/pkg/internal/generator/dialect/spanner/integrationtest_go_test.go b/pkg/internal/generator/dialect/spanner/integrationtest_go_test.go index 49c50c5..e1d9e5b 100644 --- a/pkg/internal/generator/dialect/spanner/integrationtest_go_test.go +++ b/pkg/internal/generator/dialect/spanner/integrationtest_go_test.go @@ -24,26 +24,26 @@ func Test_integrationtest_go_spanner(t *testing.T) { t.Parallel() cmd := fixture.Cmd() - { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=integrationtest_go_001.source", - "--dst=dummy", - }) - require.NoError(t, err) - } + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "integrationtest_go_001.source", + "dummy", + }) + require.NoError(t, err) ctx := cliz.WithContext(context.Background(), cmd) - _, err := config.Load(ctx) - require.NoError(t, err) + { + _, err := config.Load(ctx) + require.NoError(t, err) + } - ddl, err := ddlctlgo.Parse(ctx, config.Source()) + ddl, err := ddlctlgo.Parse(ctx, args[1]) require.NoError(t, err) buf := bytes.NewBuffer(nil) diff --git a/pkg/internal/generator/dialect/spanner/spanner.go b/pkg/internal/generator/dialect/spanner/spanner.go index b92a250..4c22057 100644 --- a/pkg/internal/generator/dialect/spanner/spanner.go +++ b/pkg/internal/generator/dialect/spanner/spanner.go @@ -5,7 +5,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) const ( diff --git a/pkg/internal/generator/dialect/spanner/spanner_test.go b/pkg/internal/generator/dialect/spanner/spanner_test.go index 6f7d9a8..351036f 100644 --- a/pkg/internal/generator/dialect/spanner/spanner_test.go +++ b/pkg/internal/generator/dialect/spanner/spanner_test.go @@ -12,7 +12,7 @@ import ( "github.com/kunitsucom/util.go/testing/require" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) //nolint:paralleltest diff --git a/pkg/internal/integrationtest/integrationtest_test.go b/pkg/internal/integrationtest/integrationtest_test.go index 5bbe005..ae9218c 100644 --- a/pkg/internal/integrationtest/integrationtest_test.go +++ b/pkg/internal/integrationtest/integrationtest_test.go @@ -10,7 +10,7 @@ import ( "github.com/kunitsucom/util.go/testing/assert" "github.com/kunitsucom/util.go/testing/require" - "github.com/kunitsucom/ddlctl/pkg/ddlctl" + "github.com/kunitsucom/ddlctl/pkg/ddlctl/diff" "github.com/kunitsucom/ddlctl/pkg/internal/fixture" ) @@ -35,7 +35,7 @@ func Test_ddlctl_diff(t *testing.T) { os.Stdout = w { - err := ddlctl.Diff(ctx, args) + err := diff.Command(ctx, args) require.NoError(t, err) } result := closeFunc() diff --git a/pkg/internal/lang/go/dump_source.go b/pkg/internal/lang/go/dump_source.go index 414f1ee..b17f81b 100644 --- a/pkg/internal/lang/go/dump_source.go +++ b/pkg/internal/lang/go/dump_source.go @@ -6,7 +6,7 @@ import ( "go/token" "io" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) func dumpDDLSource(fset *token.FileSet, ddlSrc []*ddlSource) { diff --git a/pkg/internal/lang/go/extract_source.go b/pkg/internal/lang/go/extract_source.go index 4bfd892..9582262 100644 --- a/pkg/internal/lang/go/extract_source.go +++ b/pkg/internal/lang/go/extract_source.go @@ -12,7 +12,7 @@ import ( apperr "github.com/kunitsucom/ddlctl/pkg/apperr" "github.com/kunitsucom/ddlctl/pkg/internal/config" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) type ddlSource struct { diff --git a/pkg/internal/lang/go/parse.go b/pkg/internal/lang/go/parse.go index 3da672f..316fd7f 100644 --- a/pkg/internal/lang/go/parse.go +++ b/pkg/internal/lang/go/parse.go @@ -21,8 +21,8 @@ import ( "github.com/kunitsucom/ddlctl/pkg/internal/config" ddlast "github.com/kunitsucom/ddlctl/pkg/internal/generator" langutil "github.com/kunitsucom/ddlctl/pkg/internal/lang/util" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" "github.com/kunitsucom/ddlctl/pkg/internal/util" + "github.com/kunitsucom/ddlctl/pkg/logs" ) const ( diff --git a/pkg/internal/lang/go/parse_test.go b/pkg/internal/lang/go/parse_test.go index 26e9ccf..077997c 100644 --- a/pkg/internal/lang/go/parse_test.go +++ b/pkg/internal/lang/go/parse_test.go @@ -22,25 +22,25 @@ import ( func TestParse(t *testing.T) { t.Run("success,common.source", func(t *testing.T) { cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests/common.source", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests/common.source", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) - ddl, err := Parse(ctx, config.Source()) + ddl, err := Parse(ctx, args[1]) require.NoError(t, err) if !assert.Equal(t, 6, len(ddl.Stmts)) { // TODO: 確認 for _, stmt := range ddl.Stmts { @@ -51,30 +51,30 @@ func TestParse(t *testing.T) { t.Run("success,info.IsDir", func(t *testing.T) { cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) backup := fileSuffix t.Cleanup(func() { fileSuffix = backup }) fileSuffix = ".source" { - ddl, err := Parse(ctx, config.Source()) + ddl, err := Parse(ctx, args[1]) require.NoError(t, err) if !assert.Equal(t, 6, len(ddl.Stmts)) { // TODO: 確認 for _, stmt := range ddl.Stmts { @@ -93,53 +93,54 @@ func TestParse(t *testing.T) { } cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + tempDir, + "dummy", + }) + require.NoError(t, err) + + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=" + tempDir, - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) { - _, err := Parse(ctx, config.Source()) + _, err := Parse(ctx, args[1]) require.ErrorContains(t, err, "expected 'package', found 'EOF'") } }) t.Run("failure,os.ErrNotExist", func(t *testing.T) { cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests/no-such-file.source", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests/no-such-file.source", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) { t.Setenv("PWD", "\\") - _, err := Parse(ctx, config.Source()) + _, err := Parse(ctx, args[1]) require.Error(t, err) assert.ErrorIs(t, err, os.ErrNotExist) } @@ -147,26 +148,26 @@ func TestParse(t *testing.T) { t.Run("failure,parser.ParseFile", func(t *testing.T) { cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests/no.errsource", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests/no.errsource", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) { - _, err := Parse(ctx, config.Source()) + _, err := Parse(ctx, args[1]) require.Error(t, err) assert.ErrorContains(t, err, "expected 'package', found 'EOF'") } @@ -174,26 +175,26 @@ func TestParse(t *testing.T) { t.Run("failure,extractDDLSource", func(t *testing.T) { cmd := fixture.Cmd() + args, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests/no-go-ddl-tag.source", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests/no-go-ddl-tag.source", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) { - _, err := Parse(ctx, config.Source()) + _, err := Parse(ctx, args[1]) require.Error(t, err) assert.ErrorIs(t, err, apperr.ErrDDLTagGoAnnotationNotFoundInSource) } @@ -207,23 +208,23 @@ func Test_walkDirFn(t *testing.T) { t.Parallel() cmd := fixture.Cmd() + _, err := cmd.Parse([]string{ + "ddlctl", + "--lang=go", + "--dialect=spanner", + "--go-column-tag=dbtest", + "--go-ddl-tag=spanddl", + "--go-pk-tag=pkey", + "tests", + "dummy", + }) + require.NoError(t, err) + ctx := cliz.WithContext(context.Background(), cmd) + { - _, err := cmd.Parse([]string{ - "ddlctl", - "--lang=go", - "--dialect=spanner", - "--go-column-tag=dbtest", - "--go-ddl-tag=spanddl", - "--go-pk-tag=pkey", - "--src=tests", - "--dst=dummy", - }) + _, err := config.Load(ctx) require.NoError(t, err) } - ctx := cliz.WithContext(context.Background(), cmd) - - _, err := config.Load(ctx) - require.NoError(t, err) ddl := ddlast.NewDDL(ctx) fn := walkDirFn(ctx, ddl) diff --git a/pkg/internal/logs/logger.go b/pkg/internal/logs/logger.go deleted file mode 100644 index b6e27e4..0000000 --- a/pkg/internal/logs/logger.go +++ /dev/null @@ -1,63 +0,0 @@ -package logs - -import ( - "bytes" - "fmt" - "io" - "log" - "os" - - ioz "github.com/kunitsucom/util.go/io" -) - -//nolint:gochecknoglobals -var ( - Trace Logger = NewDiscard() //nolint:revive - Debug Logger = NewDiscard() //nolint:revive - Info Logger = logger{log.New(os.Stderr, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)} - Warn Logger = logger{log.New(os.Stderr, "WARN: ", log.Ldate|log.Ltime|log.Lshortfile)} -) - -func NewDiscard() Logger { //nolint:ireturn - return logger{log.New(io.Discard, "", 0)} -} - -func NewTrace() Logger { //nolint:ireturn - return logger{log.New(os.Stderr, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile)} -} - -func NewDebug() Logger { //nolint:ireturn - return logger{log.New(os.Stderr, "DEBUG: ", log.Ldate|log.Ltime|log.Lshortfile)} -} - -type Logger interface { - io.Writer - Print(v ...interface{}) - Printf(format string, v ...interface{}) - LineWriter(prefix string) io.Writer -} - -const callerSkip = 2 - -type logger struct{ l *log.Logger } - -func (l logger) Print(v ...interface{}) { _ = l.l.Output(callerSkip, fmt.Sprint(v...)) } -func (l logger) Printf(format string, v ...interface{}) { - _ = l.l.Output(callerSkip, fmt.Sprintf(format, v...)) -} - -func (l logger) Write(p []byte) (n int, err error) { - l.Print(string(p)) - return len(p), nil -} - -func (l logger) LineWriter(prefix string) io.Writer { - return ioz.WriteFunc(func(p []byte) (n int, err error) { - lines := bytes.Split(p, []byte("\n")) - for _, line := range lines { - _ = l.l.Output(1, prefix+string(line)) - } - - return len(p), nil - }) -} diff --git a/pkg/internal/util/abs.go b/pkg/internal/util/abs.go index b33629c..e2765df 100644 --- a/pkg/internal/util/abs.go +++ b/pkg/internal/util/abs.go @@ -3,7 +3,7 @@ package util import ( "path/filepath" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) func Abs(path string) string { diff --git a/pkg/logs/logger.go b/pkg/logs/logger.go new file mode 100644 index 0000000..4db9527 --- /dev/null +++ b/pkg/logs/logger.go @@ -0,0 +1,65 @@ +package logs + +import ( + "bytes" + "fmt" + "io" + "log" + "os" + + ioz "github.com/kunitsucom/util.go/io" +) + +//nolint:gochecknoglobals +var ( + Trace Logger = NewDiscard() //nolint:revive + Debug Logger = NewDiscard() //nolint:revive + Info Logger = &DefaultLogger{log.New(os.Stderr, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)} + Warn Logger = &DefaultLogger{log.New(os.Stderr, "WARN: ", log.Ldate|log.Ltime|log.Lshortfile)} +) + +func NewDiscard() Logger { //nolint:ireturn + return &DefaultLogger{log.New(io.Discard, "", 0)} +} + +func NewTrace() Logger { //nolint:ireturn + return &DefaultLogger{log.New(os.Stderr, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile)} +} + +func NewDebug() Logger { //nolint:ireturn + return &DefaultLogger{log.New(os.Stderr, "DEBUG: ", log.Ldate|log.Ltime|log.Lshortfile)} +} + +type Logger interface { + io.Writer + Print(v ...interface{}) + Printf(format string, v ...interface{}) + LineWriter(prefix string) io.Writer +} + +const callerSkip = 2 + +type DefaultLogger struct { + *log.Logger +} + +func (l *DefaultLogger) Print(v ...interface{}) { _ = l.Logger.Output(callerSkip, fmt.Sprint(v...)) } +func (l *DefaultLogger) Printf(format string, v ...interface{}) { + _ = l.Logger.Output(callerSkip, fmt.Sprintf(format, v...)) +} + +func (l *DefaultLogger) Write(p []byte) (n int, err error) { + l.Print(string(p)) + return len(p), nil +} + +func (l *DefaultLogger) LineWriter(prefix string) io.Writer { + return ioz.WriteFunc(func(p []byte) (n int, err error) { + lines := bytes.Split(p, []byte("\n")) + for _, line := range lines { + _ = l.Logger.Output(1, prefix+string(line)) + } + + return len(p), nil + }) +} diff --git a/pkg/show/spanner/show_create_all_tables.go b/pkg/show/spanner/show_create_all_tables.go index 70db92a..e76a71c 100644 --- a/pkg/show/spanner/show_create_all_tables.go +++ b/pkg/show/spanner/show_create_all_tables.go @@ -8,7 +8,7 @@ import ( sqlz "github.com/kunitsucom/util.go/database/sql" apperr "github.com/kunitsucom/ddlctl/pkg/apperr" - "github.com/kunitsucom/ddlctl/pkg/internal/logs" + "github.com/kunitsucom/ddlctl/pkg/logs" ) // NOTE: https://cloud.google.com/spanner/docs/information-schema?hl=ja