From 9f0d214146c34cc7fc15024b83e5859ab8745e18 Mon Sep 17 00:00:00 2001 From: Songa Ogutu Date: Thu, 21 Apr 2022 13:08:02 +0300 Subject: [PATCH 1/5] Refactor and add test for StructName --- internal/codegen/golang/mysql_type.go | 6 ++- internal/codegen/golang/postgresql_type.go | 6 ++- internal/codegen/golang/result.go | 16 +++++--- internal/codegen/golang/struct.go | 13 +++++-- internal/codegen/golang/struct_test.go | 44 ++++++++++++++++++++++ 5 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 internal/codegen/golang/struct_test.go diff --git a/internal/codegen/golang/mysql_type.go b/internal/codegen/golang/mysql_type.go index 76d7271774..ad37109bdb 100644 --- a/internal/codegen/golang/mysql_type.go +++ b/internal/codegen/golang/mysql_type.go @@ -87,9 +87,11 @@ func mysqlType(req *plugin.CodeGenRequest, col *plugin.Column) string { for _, enum := range schema.Enums { if enum.Name == columnType { if schema.Name == req.Catalog.DefaultSchema { - return StructName(enum.Name, req.Settings) + return StructName(enum.Name, req.Settings.Rename[enum.Name]) } - return StructName(schema.Name+"_"+enum.Name, req.Settings) + + schemaEnumName := schema.Name + "_" + enum.Name + return StructName(schemaEnumName, req.Settings.Rename[schemaEnumName]) } } } diff --git a/internal/codegen/golang/postgresql_type.go b/internal/codegen/golang/postgresql_type.go index afa5a21aa7..5df26fd5b6 100644 --- a/internal/codegen/golang/postgresql_type.go +++ b/internal/codegen/golang/postgresql_type.go @@ -281,9 +281,11 @@ func postgresType(req *plugin.CodeGenRequest, col *plugin.Column) string { for _, enum := range schema.Enums { if rel.Name == enum.Name && rel.Schema == schema.Name { if schema.Name == req.Catalog.DefaultSchema { - return StructName(enum.Name, req.Settings) + return StructName(enum.Name, req.Settings.Rename[enum.Name]) } - return StructName(schema.Name+"_"+enum.Name, req.Settings) + + schemaEnumName := schema.Name + "_" + enum.Name + return StructName(schemaEnumName, req.Settings.Rename[schemaEnumName]) } } diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 1feb800b22..2a7b7a555f 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -24,7 +24,7 @@ func buildEnums(req *plugin.CodeGenRequest) []Enum { enumName = schema.Name + "_" + enum.Name } e := Enum{ - Name: StructName(enumName, req.Settings), + Name: StructName(enumName, req.Settings.Rename[enumName]), Comment: enum.Comment, } seen := make(map[string]struct{}, len(enum.Vals)) @@ -33,8 +33,11 @@ func buildEnums(req *plugin.CodeGenRequest) []Enum { if _, found := seen[value]; found || value == "" { value = fmt.Sprintf("value_%d", i) } + + nameWithValue := enumName + "_" + value + e.Constants = append(e.Constants, Constant{ - Name: StructName(enumName+"_"+value, req.Settings), + Name: StructName(nameWithValue, req.Settings.Rename[nameWithValue]), Value: v, Type: e.Name, }) @@ -68,7 +71,7 @@ func buildStructs(req *plugin.CodeGenRequest) []Struct { } s := Struct{ Table: plugin.Identifier{Schema: schema.Name, Name: table.Rel.Name}, - Name: StructName(structName, req.Settings), + Name: StructName(structName, req.Settings.Rename[structName]), Comment: table.Comment, } for _, column := range table.Columns { @@ -80,7 +83,7 @@ func buildStructs(req *plugin.CodeGenRequest) []Struct { tags["json:"] = JSONTagName(column.Name, req.Settings) } s.Fields = append(s.Fields, Field{ - Name: StructName(column.Name, req.Settings), + Name: StructName(column.Name, req.Settings.Rename[column.Name]), Type: goType(req, column), Tags: tags, Comment: column.Comment, @@ -207,7 +210,8 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) same := true for i, f := range s.Fields { c := query.Columns[i] - sameName := f.Name == StructName(columnName(c, i), req.Settings) + colName := columnName(c, i) + sameName := f.Name == StructName(colName, req.Settings.Rename[colName]) sameType := f.Type == goType(req, c) sameTable := sdk.SameTableName(c.Table, &s.Table, req.Catalog.DefaultSchema) if !sameName || !sameType || !sameTable { @@ -266,7 +270,7 @@ func columnsToStruct(req *plugin.CodeGenRequest, name string, columns []goColumn for i, c := range columns { colName := columnName(c.Column, i) tagName := colName - fieldName := StructName(colName, req.Settings) + fieldName := StructName(colName, req.Settings.Rename[colName]) baseFieldName := fieldName // Track suffixes by the ID of the column, so that columns referring to the same numbered parameter can be // reused. diff --git a/internal/codegen/golang/struct.go b/internal/codegen/golang/struct.go index 1d36e92aba..6e307c9597 100644 --- a/internal/codegen/golang/struct.go +++ b/internal/codegen/golang/struct.go @@ -4,6 +4,8 @@ import ( "strings" "github.com/kyleconroy/sqlc/internal/plugin" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) type Struct struct { @@ -13,17 +15,22 @@ type Struct struct { Comment string } -func StructName(name string, settings *plugin.Settings) string { - if rename := settings.Rename[name]; rename != "" { +// StructName constructs a valid camel case value from a snake case +func StructName(name, rename string) string { + + if rename != "" { return rename } + out := "" + for _, p := range strings.Split(name, "_") { if p == "id" { out += "ID" } else { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } } + return out } diff --git a/internal/codegen/golang/struct_test.go b/internal/codegen/golang/struct_test.go new file mode 100644 index 0000000000..5ae0f2081b --- /dev/null +++ b/internal/codegen/golang/struct_test.go @@ -0,0 +1,44 @@ +package golang + +import "testing" + +func TestStructName(t *testing.T) { + + testCases := []struct { + name string + snakeCaseName string + rename string + out string + }{ + { + name: "Rename Not Empty", + snakeCaseName: "my_value", + rename: "MyValue", + out: "MyValue", + }, + { + name: "ID to Upper Case", + snakeCaseName: "id", + rename: "", + out: "ID", + }, + { + name: "Camel Case", + snakeCaseName: "user_id", + rename: "", + out: "UserID", + }, + } + + for i := range testCases { + + tc := testCases[i] + + t.Run(tc.name, func(t *testing.T) { + out := StructName(tc.snakeCaseName, tc.rename) + if out != tc.out { + t.Errorf("StructName(%s,%s) = %s; want %s", tc.snakeCaseName, tc.rename, out, tc.out) + } + }) + } +} From 321977ae3f85a18c16bb32722576b151f9a5d32b Mon Sep 17 00:00:00 2001 From: Songa Ogutu Date: Thu, 21 Apr 2022 13:12:50 +0300 Subject: [PATCH 2/5] Remove depricated strings.Title (Go v1.18) --- internal/codegen/golang/enum.go | 5 ++++- internal/codegen/golang/field.go | 4 +++- internal/codegen/golang/result.go | 4 +++- internal/codegen/kotlin/gen.go | 8 +++++--- internal/codegen/python/gen.go | 4 +++- internal/codegen/sdk/utils.go | 5 ++++- internal/compiler/compile.go | 6 ++++-- internal/tools/sqlc-pg-gen/main.go | 4 +++- 8 files changed, 29 insertions(+), 11 deletions(-) diff --git a/internal/codegen/golang/enum.go b/internal/codegen/golang/enum.go index c6a0d1ccbf..383e907fed 100644 --- a/internal/codegen/golang/enum.go +++ b/internal/codegen/golang/enum.go @@ -3,6 +3,9 @@ package golang import ( "regexp" "strings" + + "golang.org/x/text/cases" + "golang.org/x/text/language" ) var IdentPattern = regexp.MustCompile("[^a-zA-Z0-9_]+") @@ -33,7 +36,7 @@ func EnumValueName(value string) string { id = strings.Replace(id, "/", "_", -1) id = IdentPattern.ReplaceAllString(id, "") for _, part := range strings.Split(id, "_") { - name += strings.Title(part) + name += cases.Title(language.English).String(part) } return name } diff --git a/internal/codegen/golang/field.go b/internal/codegen/golang/field.go index 6b22c8798b..ec36b9ec71 100644 --- a/internal/codegen/golang/field.go +++ b/internal/codegen/golang/field.go @@ -6,6 +6,8 @@ import ( "strings" "github.com/kyleconroy/sqlc/internal/plugin" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) type Field struct { @@ -72,7 +74,7 @@ func toCamelInitCase(name string, initUpper bool) string { if p == "id" { out += "ID" } else { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } } return out diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 2a7b7a555f..e2b57a7b53 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -8,6 +8,8 @@ import ( "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/inflection" "github.com/kyleconroy/sqlc/internal/plugin" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) func buildEnums(req *plugin.CodeGenRequest) []Enum { @@ -125,7 +127,7 @@ func argName(name string) string { } else if p == "id" { out += "ID" } else { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } } return out diff --git a/internal/codegen/kotlin/gen.go b/internal/codegen/kotlin/gen.go index 275b76c2b2..0b58123840 100644 --- a/internal/codegen/kotlin/gen.go +++ b/internal/codegen/kotlin/gen.go @@ -14,6 +14,8 @@ import ( "github.com/kyleconroy/sqlc/internal/inflection" "github.com/kyleconroy/sqlc/internal/metadata" "github.com/kyleconroy/sqlc/internal/plugin" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) var ktIdentPattern = regexp.MustCompile("[^a-zA-Z0-9_]+") @@ -252,7 +254,7 @@ func dataClassName(name string, settings *plugin.Settings) string { } out := "" for _, p := range strings.Split(name, "_") { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } return out } @@ -409,7 +411,7 @@ func ktArgName(name string) string { if i == 0 { out += strings.ToLower(p) } else { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } } return out @@ -456,7 +458,7 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) gq := Query{ Cmd: query.Cmd, - ClassName: strings.Title(query.Name), + ClassName: cases.Title(language.English).String(query.Name), ConstantName: sdk.LowerTitle(query.Name), FieldName: sdk.LowerTitle(query.Name) + "Stmt", MethodName: sdk.LowerTitle(query.Name), diff --git a/internal/codegen/python/gen.go b/internal/codegen/python/gen.go index 6bdb5491b1..c818c26746 100644 --- a/internal/codegen/python/gen.go +++ b/internal/codegen/python/gen.go @@ -15,6 +15,8 @@ import ( pyast "github.com/kyleconroy/sqlc/internal/python/ast" "github.com/kyleconroy/sqlc/internal/python/poet" pyprint "github.com/kyleconroy/sqlc/internal/python/printer" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) type Constant struct { @@ -216,7 +218,7 @@ func modelName(name string, settings *plugin.Settings) string { } out := "" for _, p := range strings.Split(name, "_") { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } return out } diff --git a/internal/codegen/sdk/utils.go b/internal/codegen/sdk/utils.go index 1dffda9e7e..a2cef001fa 100644 --- a/internal/codegen/sdk/utils.go +++ b/internal/codegen/sdk/utils.go @@ -3,6 +3,9 @@ package sdk import ( "strings" "unicode" + + "golang.org/x/text/cases" + "golang.org/x/text/language" ) func LowerTitle(s string) string { @@ -16,7 +19,7 @@ func LowerTitle(s string) string { } func Title(s string) string { - return strings.Title(s) + return cases.Title(language.English).String(s) } // Go string literals cannot contain backtick. If a string contains diff --git a/internal/compiler/compile.go b/internal/compiler/compile.go index 57a8e48c59..c0f447a296 100644 --- a/internal/compiler/compile.go +++ b/internal/compiler/compile.go @@ -16,6 +16,8 @@ import ( "github.com/kyleconroy/sqlc/internal/sql/ast" "github.com/kyleconroy/sqlc/internal/sql/sqlerr" "github.com/kyleconroy/sqlc/internal/sql/sqlpath" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) // TODO: Rename this interface Engine @@ -32,7 +34,7 @@ func structName(name string) string { if p == "id" { out += "ID" } else { - out += strings.Title(p) + out += cases.Title(language.English).String(p) } } return out @@ -47,7 +49,7 @@ func enumValueName(value string) string { id = strings.Replace(id, "/", "_", -1) id = identPattern.ReplaceAllString(id, "") for _, part := range strings.Split(id, "_") { - name += strings.Title(part) + name += cases.Title(language.English).String(part) } return name } diff --git a/internal/tools/sqlc-pg-gen/main.go b/internal/tools/sqlc-pg-gen/main.go index 990920d1d0..6b3f0cac21 100644 --- a/internal/tools/sqlc-pg-gen/main.go +++ b/internal/tools/sqlc-pg-gen/main.go @@ -12,6 +12,8 @@ import ( "text/template" pgx "github.com/jackc/pgx/v4" + "golang.org/x/text/cases" + "golang.org/x/text/language" "github.com/kyleconroy/sqlc/internal/sql/ast" "github.com/kyleconroy/sqlc/internal/sql/catalog" @@ -262,7 +264,7 @@ func run(ctx context.Context) error { var funcName string for _, part := range strings.Split(name, "_") { - funcName += strings.Title(part) + funcName += cases.Title(language.English).String(part) } _, err := conn.Exec(ctx, fmt.Sprintf("CREATE EXTENSION IF NOT EXISTS \"%s\"", extension)) From c88e344fce0c978ef17dfe5ce2afdd302e50ee72 Mon Sep 17 00:00:00 2001 From: Songa Ogutu Date: Fri, 6 May 2022 14:44:11 +0300 Subject: [PATCH 3/5] Update sdk.Title --- internal/codegen/golang/enum.go | 5 +- internal/codegen/golang/field.go | 5 +- internal/codegen/golang/result.go | 4 +- internal/codegen/golang/struct.go | 5 +- internal/codegen/kotlin/gen.go | 8 +-- internal/codegen/python/gen.go | 4 +- internal/codegen/sdk/utils.go | 14 ++++- internal/codegen/sdk/utils_test.go | 95 ++++++++++++++++++++++++++---- internal/compiler/compile.go | 7 +-- internal/tools/sqlc-pg-gen/main.go | 5 +- 10 files changed, 112 insertions(+), 40 deletions(-) diff --git a/internal/codegen/golang/enum.go b/internal/codegen/golang/enum.go index 383e907fed..c7385bcb77 100644 --- a/internal/codegen/golang/enum.go +++ b/internal/codegen/golang/enum.go @@ -4,8 +4,7 @@ import ( "regexp" "strings" - "golang.org/x/text/cases" - "golang.org/x/text/language" + "github.com/kyleconroy/sqlc/internal/codegen/sdk" ) var IdentPattern = regexp.MustCompile("[^a-zA-Z0-9_]+") @@ -36,7 +35,7 @@ func EnumValueName(value string) string { id = strings.Replace(id, "/", "_", -1) id = IdentPattern.ReplaceAllString(id, "") for _, part := range strings.Split(id, "_") { - name += cases.Title(language.English).String(part) + name += sdk.Title(part) } return name } diff --git a/internal/codegen/golang/field.go b/internal/codegen/golang/field.go index ec36b9ec71..298c850f87 100644 --- a/internal/codegen/golang/field.go +++ b/internal/codegen/golang/field.go @@ -5,9 +5,8 @@ import ( "sort" "strings" + "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/plugin" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) type Field struct { @@ -74,7 +73,7 @@ func toCamelInitCase(name string, initUpper bool) string { if p == "id" { out += "ID" } else { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } } return out diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index e2b57a7b53..935d2ef402 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -8,8 +8,6 @@ import ( "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/inflection" "github.com/kyleconroy/sqlc/internal/plugin" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) func buildEnums(req *plugin.CodeGenRequest) []Enum { @@ -127,7 +125,7 @@ func argName(name string) string { } else if p == "id" { out += "ID" } else { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } } return out diff --git a/internal/codegen/golang/struct.go b/internal/codegen/golang/struct.go index cd2fa90644..fdd8037803 100644 --- a/internal/codegen/golang/struct.go +++ b/internal/codegen/golang/struct.go @@ -5,9 +5,8 @@ import ( "unicode" "unicode/utf8" + "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/plugin" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) type Struct struct { @@ -30,7 +29,7 @@ func StructName(name, rename string) string { if p == "id" { out += "ID" } else { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } } diff --git a/internal/codegen/kotlin/gen.go b/internal/codegen/kotlin/gen.go index 0b58123840..00875f870a 100644 --- a/internal/codegen/kotlin/gen.go +++ b/internal/codegen/kotlin/gen.go @@ -14,8 +14,6 @@ import ( "github.com/kyleconroy/sqlc/internal/inflection" "github.com/kyleconroy/sqlc/internal/metadata" "github.com/kyleconroy/sqlc/internal/plugin" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) var ktIdentPattern = regexp.MustCompile("[^a-zA-Z0-9_]+") @@ -254,7 +252,7 @@ func dataClassName(name string, settings *plugin.Settings) string { } out := "" for _, p := range strings.Split(name, "_") { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } return out } @@ -411,7 +409,7 @@ func ktArgName(name string) string { if i == 0 { out += strings.ToLower(p) } else { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } } return out @@ -458,7 +456,7 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) gq := Query{ Cmd: query.Cmd, - ClassName: cases.Title(language.English).String(query.Name), + ClassName: sdk.Title(query.Name), ConstantName: sdk.LowerTitle(query.Name), FieldName: sdk.LowerTitle(query.Name) + "Stmt", MethodName: sdk.LowerTitle(query.Name), diff --git a/internal/codegen/python/gen.go b/internal/codegen/python/gen.go index c818c26746..07a13d78bf 100644 --- a/internal/codegen/python/gen.go +++ b/internal/codegen/python/gen.go @@ -15,8 +15,6 @@ import ( pyast "github.com/kyleconroy/sqlc/internal/python/ast" "github.com/kyleconroy/sqlc/internal/python/poet" pyprint "github.com/kyleconroy/sqlc/internal/python/printer" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) type Constant struct { @@ -218,7 +216,7 @@ func modelName(name string, settings *plugin.Settings) string { } out := "" for _, p := range strings.Split(name, "_") { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } return out } diff --git a/internal/codegen/sdk/utils.go b/internal/codegen/sdk/utils.go index a2cef001fa..860902a965 100644 --- a/internal/codegen/sdk/utils.go +++ b/internal/codegen/sdk/utils.go @@ -19,7 +19,19 @@ func LowerTitle(s string) string { } func Title(s string) string { - return cases.Title(language.English).String(s) + + if s == "" { + return s + } + + // If the first character is a digit return s + // + // When a string starts with a digit cases.Title skips all the digits and title case + // the first character it finds. + if unicode.IsDigit(rune(s[0])) { + return s + } + return cases.Title(language.English, cases.NoLower).String(s) } // Go string literals cannot contain backtick. If a string contains diff --git a/internal/codegen/sdk/utils_test.go b/internal/codegen/sdk/utils_test.go index e16244883a..c415d306c9 100644 --- a/internal/codegen/sdk/utils_test.go +++ b/internal/codegen/sdk/utils_test.go @@ -6,23 +6,94 @@ import ( func TestLowerTitle(t *testing.T) { - // empty - if LowerTitle("") != "" { - t.Fatal("expected empty title to remain empty") + testCases := []struct { + name string + value string + out string + err string + }{ + { + name: "Empty", + value: "", + out: "", + err: "expected empty title to remain empty", + }, + { + name: "All Lowercase", + value: "lowercase", + out: "lowercase", + err: "expected no changes when input is all lowercase", + }, + { + name: "All Uppercase", + value: "UPPERCASE", + out: "uPPERCASE", + err: "expected first rune to be lower when input is all uppercase", + }, + { + name: "Title Case", + value: "Title Case", + out: "title Case", + err: "expected first rune to be lower when input is Title Case", + }, } - // all lowercase - if LowerTitle("lowercase") != "lowercase" { - t.Fatal("expected no changes when input is all lowercase") + for i := range testCases { + + tc := testCases[i] + + t.Run(tc.name, func(t *testing.T) { + out := LowerTitle(tc.value) + if out != tc.out { + t.Fatal(tc.err) + } + }) } +} - // all uppercase - if LowerTitle("UPPERCASE") != "uPPERCASE" { - t.Fatal("expected first rune to be lower when input is all uppercase") +func TestTitle(t *testing.T) { + + testCases := []struct { + name string + value string + out string + err string + }{ + { + name: "Empty", + value: "", + out: "", + err: "expected empty title to remain empty", + }, + { + name: "Lowercase", + value: "lowercase", + out: "Lowercase", + err: "expected frist rune to be uppercase", + }, + { + name: "CamelCase", + value: "camelCase", + out: "CamelCase", + err: "expected only first rune to be converted to uppercase", + }, + { + name: "Digit Prefix", + value: "1title", + out: "1title", + err: "expected 1title to remain 1title", + }, } - // Title Case - if LowerTitle("Title Case") != "title Case" { - t.Fatal("expected first rune to be lower when input is Title Case") + for i := range testCases { + + tc := testCases[i] + + t.Run(tc.name, func(t *testing.T) { + out := Title(tc.value) + if out != tc.out { + t.Fatal(tc.err) + } + }) } } diff --git a/internal/compiler/compile.go b/internal/compiler/compile.go index c0f447a296..3a09318b17 100644 --- a/internal/compiler/compile.go +++ b/internal/compiler/compile.go @@ -9,6 +9,7 @@ import ( "regexp" "strings" + "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/metadata" "github.com/kyleconroy/sqlc/internal/migrations" "github.com/kyleconroy/sqlc/internal/multierr" @@ -16,8 +17,6 @@ import ( "github.com/kyleconroy/sqlc/internal/sql/ast" "github.com/kyleconroy/sqlc/internal/sql/sqlerr" "github.com/kyleconroy/sqlc/internal/sql/sqlpath" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) // TODO: Rename this interface Engine @@ -34,7 +33,7 @@ func structName(name string) string { if p == "id" { out += "ID" } else { - out += cases.Title(language.English).String(p) + out += sdk.Title(p) } } return out @@ -49,7 +48,7 @@ func enumValueName(value string) string { id = strings.Replace(id, "/", "_", -1) id = identPattern.ReplaceAllString(id, "") for _, part := range strings.Split(id, "_") { - name += cases.Title(language.English).String(part) + name += sdk.Title(part) } return name } diff --git a/internal/tools/sqlc-pg-gen/main.go b/internal/tools/sqlc-pg-gen/main.go index 6b3f0cac21..b7f5623045 100644 --- a/internal/tools/sqlc-pg-gen/main.go +++ b/internal/tools/sqlc-pg-gen/main.go @@ -12,9 +12,8 @@ import ( "text/template" pgx "github.com/jackc/pgx/v4" - "golang.org/x/text/cases" - "golang.org/x/text/language" + "github.com/kyleconroy/sqlc/internal/codegen/sdk" "github.com/kyleconroy/sqlc/internal/sql/ast" "github.com/kyleconroy/sqlc/internal/sql/catalog" ) @@ -264,7 +263,7 @@ func run(ctx context.Context) error { var funcName string for _, part := range strings.Split(name, "_") { - funcName += cases.Title(language.English).String(part) + funcName += sdk.Title(part) } _, err := conn.Exec(ctx, fmt.Sprintf("CREATE EXTENSION IF NOT EXISTS \"%s\"", extension)) From 924f86be79111e54b833ee7d1a21825da40975f8 Mon Sep 17 00:00:00 2001 From: Songa Ogutu Date: Fri, 6 May 2022 14:50:21 +0300 Subject: [PATCH 4/5] Update TestStructName to test value with digit prefix --- internal/codegen/golang/struct_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/codegen/golang/struct_test.go b/internal/codegen/golang/struct_test.go index 5ae0f2081b..5a487c8598 100644 --- a/internal/codegen/golang/struct_test.go +++ b/internal/codegen/golang/struct_test.go @@ -28,6 +28,12 @@ func TestStructName(t *testing.T) { rename: "", out: "UserID", }, + { + name: "Add Prefix Underscore", + snakeCaseName: "1value", + rename: "", + out: "_1value", + }, } for i := range testCases { From 3c52e965b083f7e1b7f8ac513478ed3d42d5be54 Mon Sep 17 00:00:00 2001 From: Songa Ogutu Date: Thu, 12 May 2022 08:27:04 +0300 Subject: [PATCH 5/5] Remove unit test --- internal/codegen/golang/struct_test.go | 50 -------------------------- 1 file changed, 50 deletions(-) delete mode 100644 internal/codegen/golang/struct_test.go diff --git a/internal/codegen/golang/struct_test.go b/internal/codegen/golang/struct_test.go deleted file mode 100644 index 5a487c8598..0000000000 --- a/internal/codegen/golang/struct_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package golang - -import "testing" - -func TestStructName(t *testing.T) { - - testCases := []struct { - name string - snakeCaseName string - rename string - out string - }{ - { - name: "Rename Not Empty", - snakeCaseName: "my_value", - rename: "MyValue", - out: "MyValue", - }, - { - name: "ID to Upper Case", - snakeCaseName: "id", - rename: "", - out: "ID", - }, - { - name: "Camel Case", - snakeCaseName: "user_id", - rename: "", - out: "UserID", - }, - { - name: "Add Prefix Underscore", - snakeCaseName: "1value", - rename: "", - out: "_1value", - }, - } - - for i := range testCases { - - tc := testCases[i] - - t.Run(tc.name, func(t *testing.T) { - out := StructName(tc.snakeCaseName, tc.rename) - if out != tc.out { - t.Errorf("StructName(%s,%s) = %s; want %s", tc.snakeCaseName, tc.rename, out, tc.out) - } - }) - } -}