Generate more friendly names for table and columns

This commit is contained in:
Jinzhu 2016-01-10 22:56:22 +08:00
parent 5c57885d98
commit f70de0bdff
2 changed files with 63 additions and 7 deletions

View File

@ -41,21 +41,49 @@ func newSafeMap() *safeMap {
var smap = newSafeMap() var smap = newSafeMap()
type Case bool
const (
lower Case = false
upper Case = true
)
func ToDBName(name string) string { func ToDBName(name string) string {
if v := smap.Get(name); v != "" { if v := smap.Get(name); v != "" {
return v return v
} }
value := commonInitialismsReplacer.Replace(name) var (
buf := bytes.NewBufferString("") value = commonInitialismsReplacer.Replace(name)
for i, v := range value { buf = bytes.NewBufferString("")
if i > 0 && v >= 'A' && v <= 'Z' { lastCase, currCase, nextCase Case
buf.WriteRune('_') )
for i, v := range value[:len(value)-1] {
nextCase = value[i+1] >= 'A' && value[i+1] <= 'Z'
if i > 0 {
if currCase == upper {
if lastCase == upper && nextCase == upper {
buf.WriteRune(v)
} else {
buf.WriteRune('_')
buf.WriteRune(v)
}
} else {
buf.WriteRune(v)
}
} else {
currCase = upper
buf.WriteRune(v)
} }
buf.WriteRune(v) lastCase = currCase
currCase = nextCase
} }
s := strings.ToLower(buf.String()) buf.WriteByte(value[len(value)-1])
s := strings.Replace(strings.ToLower(buf.String()), "__", "_", -1)
smap.Set(name, s) smap.Set(name, s)
return s return s
} }

28
utils_test.go Normal file
View File

@ -0,0 +1,28 @@
package gorm_test
import (
"testing"
"github.com/jinzhu/gorm"
)
func TestToDBNameGenerateFriendlyName(t *testing.T) {
var maps = map[string]string{
"ThisIsATest": "this_is_a_test",
"PFAndESI": "pf_and_esi",
"AbcAndJkl": "abc_and_jkl",
"EmployeeID": "employee_id",
"HTTPAndSMTP": "http_and_smtp",
"HTTPServerHandlerForURLID": "http_server_handler_for_url_id",
"UUID": "uuid",
"HTTPURL": "http_url",
"HTTP_URL": "http_url",
"ThisIsActuallyATestSoWeMayBeAbleToUseThisCodeInGormPackageAlsoIdCanBeUsedAtTheEndAsID": "this_is_actually_a_test_so_we_may_be_able_to_use_this_code_in_gorm_package_also_id_can_be_used_at_the_end_as_id",
}
for key, value := range maps {
if gorm.ToDBName(key) != value {
t.Errorf("%v ToDBName should equal %v, but got %v", key, value, gorm.ToDBName(key))
}
}
}