From 53feedcae0b40c91120f7219566a55d1eacd1e5a Mon Sep 17 00:00:00 2001 From: Kemal Hadimli Date: Mon, 24 Apr 2023 13:52:22 +0100 Subject: [PATCH] fix: TransformWithStruct/DefaultNameTransformer change for invalid column names --- schema/table.go | 7 +++++-- transformers/struct.go | 4 +++- transformers/struct_test.go | 21 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/schema/table.go b/schema/table.go index 6576f2e68e..d20266db79 100644 --- a/schema/table.go +++ b/schema/table.go @@ -360,8 +360,7 @@ func (t *Table) ValidateDuplicateColumns() error { func (t *Table) ValidateColumnNames() error { for _, c := range t.Columns { - ok := reValidColumnName.MatchString(c.Name) - if !ok { + if !ValidColumnName(c.Name) { return fmt.Errorf("column name %q on table %q is not valid: column names must contain only lower-case letters, numbers and underscores, and must start with a lower-case letter or underscore", c.Name, t.Name) } } @@ -430,3 +429,7 @@ func (t *Table) Copy(parent *Table) *Table { } return &c } + +func ValidColumnName(name string) bool { + return reValidColumnName.MatchString(name) +} diff --git a/transformers/struct.go b/transformers/struct.go index fdb399feef..37fe2f3bbd 100644 --- a/transformers/struct.go +++ b/transformers/struct.go @@ -363,7 +363,9 @@ func DefaultNameTransformer(field reflect.StructField) (string, error) { if jsonTag == "-" { return "", nil } - name = jsonTag + if schema.ValidColumnName(jsonTag) { + name = jsonTag + } } return defaultCaser.ToSnake(name), nil } diff --git a/transformers/struct_test.go b/transformers/struct_test.go index 2e9a086f8c..156ed5e28c 100644 --- a/transformers/struct_test.go +++ b/transformers/struct_test.go @@ -66,6 +66,10 @@ type ( Name string `json:"name"` Version int `json:"version"` } + + testFunnyStruct struct { + AFunnyLookingField string `json:"OS-EXT:a-funny-looking-field"` + } ) var ( @@ -243,6 +247,16 @@ var ( }, }, } + + expectedFunnyTable = schema.Table{ + Name: "test_funny_struct", + Columns: schema.ColumnList{ + { + Name: "a_funny_looking_field", + Type: schema.TypeString, + }, + }, + } ) func TestTableFromGoStruct(t *testing.T) { @@ -356,6 +370,13 @@ func TestTableFromGoStruct(t *testing.T) { want: expectedTableWithPKs, wantErr: true, }, + { + name: "Should properly transform structs with funny looking fields", + args: args{ + testStruct: testFunnyStruct{}, + }, + want: expectedFunnyTable, + }, } for _, tt := range tests {