From 6fe19d961100f631a07d82022bba0ebf4d639c75 Mon Sep 17 00:00:00 2001 From: theoneLee <623507020@qq.com> Date: Sat, 12 Oct 2019 18:18:12 +0800 Subject: [PATCH] custom namer support --- naming.go | 6 ++--- naming_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/naming.go b/naming.go index 6b0a4fdd..04529ba1 100644 --- a/naming.go +++ b/naming.go @@ -66,7 +66,7 @@ func ToColumnName(name string) string { return TheNamingStrategy.ColumnName(name) } -var smap = newSafeMap() +var Smap = newSafeMap() func defaultNamer(name string) string { const ( @@ -74,7 +74,7 @@ func defaultNamer(name string) string { upper = true ) - if v := smap.Get(name); v != "" { + if v := Smap.Get(name); v != "" { return v } @@ -119,6 +119,6 @@ func defaultNamer(name string) string { buf.WriteByte(value[len(value)-1]) s := strings.ToLower(buf.String()) - smap.Set(name, s) + Smap.Set(name, s) return s } diff --git a/naming_test.go b/naming_test.go index 0c6f7713..4f05d202 100644 --- a/naming_test.go +++ b/naming_test.go @@ -1,6 +1,7 @@ package gorm_test import ( + "bytes" "testing" "github.com/jinzhu/gorm" @@ -29,6 +30,71 @@ func TestTheNamingStrategy(t *testing.T) { } +func TestAddNamingStrategy(t *testing.T) { + + // users can set their custom namer + custom := &gorm.NamingStrategy{ + Column: CustomNamer, + } + gorm.AddNamingStrategy(custom) + + // test + cases := []struct { + name string + namer gorm.Namer + expected string + }{ + {name: "auth", expected: "auth", namer: gorm.TheNamingStrategy.DB}, + {name: "userRestrictions", expected: "user_restrictions", namer: gorm.TheNamingStrategy.Table}, + + {name: "clientID", expected: "clientID", namer: gorm.TheNamingStrategy.Column}, + {name: "Client0ID", expected: "client0ID", namer: gorm.TheNamingStrategy.Column}, + {name: "_Client_ID_", expected: "_Client_ID_", namer: gorm.TheNamingStrategy.Column}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + result := c.namer(c.name) + if result != c.expected { + t.Errorf("error in naming strategy. expected: %v got :%v\n", c.expected, result) + } + }) + } + +} + +func CustomNamer(name string) string { + // set `smap` public access and users can use it to cache + if v := gorm.Smap.Get(name); v != "" { + return v + } + + const ( + lower = false + upper = true + ) + + var ( + value = name + buf = bytes.NewBufferString("") + currCase bool + ) + + for i, v := range value { + currCase = bool(value[i] >= 'A' && value[i] <= 'Z') + if i == 0 && currCase == upper { + buf.WriteRune(v + 32) + } else { + buf.WriteRune(v) + } + } + + s := buf.String() + gorm.Smap.Set(name, s) + + return s +} + func TestNamingStrategy(t *testing.T) { dbNameNS := func(name string) string {