Skip to content

Commit

Permalink
gozero template (zeromicro#147)
Browse files Browse the repository at this point in the history
* model/rpc generate code from template cache

* delete unused(deprecated) code

* support template init|update|clean|revert

* model: return the execute result for insert and update operation

* // deprecated: containsAny

* add template test

* add default buildVersion

* update build version
  • Loading branch information
Keson authored Oct 21, 2020
1 parent fe0d068 commit 41964f9
Show file tree
Hide file tree
Showing 43 changed files with 904 additions and 115 deletions.
26 changes: 26 additions & 0 deletions tools/goctl/api/gogen/template.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package gogen

import (
"fmt"

"github.com/tal-tech/go-zero/tools/goctl/util"
"github.com/urfave/cli"
)
Expand All @@ -27,3 +29,27 @@ var templates = map[string]string{
func GenTemplates(_ *cli.Context) error {
return util.InitTemplates(category, templates)
}

func RevertTemplate(name string) error {
content, ok := templates[name]
if !ok {
return fmt.Errorf("%s: no such file name", name)
}
return util.CreateTemplate(category, name, content)
}

func Update(category string) error {
err := Clean()
if err != nil {
return err
}
return util.InitTemplates(category, templates)
}

func Clean() error {
return util.Clean(category)
}

func GetCategory() string {
return category
}
92 changes: 92 additions & 0 deletions tools/goctl/api/gogen/template_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package gogen

import (
"io/ioutil"
"path/filepath"
"testing"

"github.com/stretchr/testify/assert"
"github.com/tal-tech/go-zero/tools/goctl/util"
)

func TestGenTemplates(t *testing.T) {
err := util.InitTemplates(category, templates)
assert.Nil(t, err)
dir, err := util.GetTemplateDir(category)
assert.Nil(t, err)
file := filepath.Join(dir, "main.tpl")
data, err := ioutil.ReadFile(file)
assert.Nil(t, err)
assert.Equal(t, string(data), mainTemplate)
}

func TestRevertTemplate(t *testing.T) {
name := "main.tpl"
err := util.InitTemplates(category, templates)
assert.Nil(t, err)

dir, err := util.GetTemplateDir(category)
assert.Nil(t, err)

file := filepath.Join(dir, name)
data, err := ioutil.ReadFile(file)
assert.Nil(t, err)

modifyData := string(data) + "modify"
err = util.CreateTemplate(category, name, modifyData)
assert.Nil(t, err)

data, err = ioutil.ReadFile(file)
assert.Nil(t, err)

assert.Equal(t, string(data), modifyData)

assert.Nil(t, RevertTemplate(name))

data, err = ioutil.ReadFile(file)
assert.Nil(t, err)
assert.Equal(t, mainTemplate, string(data))
}

func TestClean(t *testing.T) {
name := "main.tpl"
err := util.InitTemplates(category, templates)
assert.Nil(t, err)

assert.Nil(t, Clean())

dir, err := util.GetTemplateDir(category)
assert.Nil(t, err)

file := filepath.Join(dir, name)
_, err = ioutil.ReadFile(file)
assert.NotNil(t, err)
}

func TestUpdate(t *testing.T) {
name := "main.tpl"
err := util.InitTemplates(category, templates)
assert.Nil(t, err)

dir, err := util.GetTemplateDir(category)
assert.Nil(t, err)

file := filepath.Join(dir, name)
data, err := ioutil.ReadFile(file)
assert.Nil(t, err)

modifyData := string(data) + "modify"
err = util.CreateTemplate(category, name, modifyData)
assert.Nil(t, err)

data, err = ioutil.ReadFile(file)
assert.Nil(t, err)

assert.Equal(t, string(data), modifyData)

assert.Nil(t, Update(category))

data, err = ioutil.ReadFile(file)
assert.Nil(t, err)
assert.Equal(t, mainTemplate, string(data))
}
18 changes: 0 additions & 18 deletions tools/goctl/feature/feature.go

This file was deleted.

57 changes: 45 additions & 12 deletions tools/goctl/goctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"fmt"
"os"
"runtime"

"github.com/tal-tech/go-zero/core/logx"
"github.com/tal-tech/go-zero/tools/goctl/api/apigen"
Expand All @@ -17,15 +18,15 @@ import (
"github.com/tal-tech/go-zero/tools/goctl/api/validate"
"github.com/tal-tech/go-zero/tools/goctl/configgen"
"github.com/tal-tech/go-zero/tools/goctl/docker"
"github.com/tal-tech/go-zero/tools/goctl/feature"
model "github.com/tal-tech/go-zero/tools/goctl/model/sql/command"
rpc "github.com/tal-tech/go-zero/tools/goctl/rpc/command"
"github.com/tal-tech/go-zero/tools/goctl/tpl"
"github.com/urfave/cli"
)

var (
BuildTime = "not set"
commands = []cli.Command{
BuildVersion = "20201021"
commands = []cli.Command{
{
Name: "api",
Usage: "generate api related files",
Expand Down Expand Up @@ -328,14 +329,46 @@ var (
Action: configgen.GenConfigCommand,
},
{
Name: "feature",
Usage: "the features of the latest version",
Action: feature.Feature,
},
{
Name: "template",
Usage: "initialize the api templates",
Action: gogen.GenTemplates,
Name: "template",
Usage: "template operation",
Subcommands: []cli.Command{
{
Name: "init",
Usage: "initialize the all templates(force update)",
Action: tpl.GenTemplates,
},
{
Name: "clean",
Usage: "clean the all cache templates",
Action: tpl.CleanTemplates,
},
{
Name: "update",
Usage: "update template of the target category to the latest",
Flags: []cli.Flag{
cli.StringFlag{
Name: "category,c",
Usage: "the category of template, enum [api,rpc,model]",
},
},
Action: tpl.UpdateTemplates,
},
{
Name: "revert",
Usage: "revert the target template to the latest",
Flags: []cli.Flag{
cli.StringFlag{
Name: "category,c",
Usage: "the category of template, enum [api,rpc,model]",
},
cli.StringFlag{
Name: "name,n",
Usage: "the target file name of template",
},
},
Action: tpl.RevertTemplates,
},
},
},
}
)
Expand All @@ -345,7 +378,7 @@ func main() {

app := cli.NewApp()
app.Usage = "a cli tool to generate code"
app.Version = BuildTime
app.Version = fmt.Sprintf("%s %s/%s", BuildVersion, runtime.GOOS, runtime.GOARCH)
app.Commands = commands
// cli already print error messages
if err := app.Run(os.Args); err != nil {
Expand Down
4 changes: 4 additions & 0 deletions tools/goctl/model/sql/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change log

## 2020-10-19

* 增加template

## 2020-08-20

* 新增支持通过连接数据库生成model
Expand Down
20 changes: 20 additions & 0 deletions tools/goctl/model/sql/converter/types_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package converter

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestConvertDataType(t *testing.T) {
v, err := ConvertDataType("tinyint")
assert.Nil(t, err)
assert.Equal(t, "int64", v)

v, err = ConvertDataType("timestamp")
assert.Nil(t, err)
assert.Equal(t, "time.Time", v)

_, err = ConvertDataType("float32")
assert.NotNil(t, err)
}
2 changes: 1 addition & 1 deletion tools/goctl/model/sql/example/generator.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
goctl model mysql ddl -src="./sql/user.sql" -dir="./sql/model" -c

# generate model with cache from data source
goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="table1,table2" -dir="./model"
#goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="table1,table2" -dir="./model"
7 changes: 6 additions & 1 deletion tools/goctl/model/sql/gen/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,13 @@ func genDelete(table Table, withCache bool) (string, error) {
}

camel := table.Name.ToCamel()
text, err := util.LoadTemplate(category, deleteTemplateFile, template.Delete)
if err != nil {
return "", err
}

output, err := util.With("delete").
Parse(template.Delete).
Parse(text).
Execute(map[string]interface{}{
"upperStartCamelObject": camel,
"withCache": withCache,
Expand Down
8 changes: 7 additions & 1 deletion tools/goctl/model/sql/gen/field.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,14 @@ func genField(field parser.Field) (string, error) {
if err != nil {
return "", err
}

text, err := util.LoadTemplate(category, fieldTemplateFile, template.Field)
if err != nil {
return "", err
}

output, err := util.With("types").
Parse(template.Field).
Parse(text).
Execute(map[string]interface{}{
"name": field.Name.ToCamel(),
"type": field.DataType,
Expand Down
7 changes: 6 additions & 1 deletion tools/goctl/model/sql/gen/findone.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@ import (

func genFindOne(table Table, withCache bool) (string, error) {
camel := table.Name.ToCamel()
text, err := util.LoadTemplate(category, findOneTemplateFile, template.FindOne)
if err != nil {
return "", err
}

output, err := util.With("findOne").
Parse(template.FindOne).
Parse(text).
Execute(map[string]interface{}{
"withCache": withCache,
"upperStartCamelObject": camel,
Expand Down
16 changes: 14 additions & 2 deletions tools/goctl/model/sql/gen/findonebyfield.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ import (
)

func genFindOneByField(table Table, withCache bool) (string, string, error) {
t := util.With("findOneByField").Parse(template.FindOneByField)
text, err := util.LoadTemplate(category, findOneByFieldTemplateFile, template.FindOneByField)
if err != nil {
return "", "", err
}

t := util.With("findOneByField").Parse(text)
var list []string
camelTableName := table.Name.ToCamel()
for _, field := range table.Fields {
Expand All @@ -33,10 +38,16 @@ func genFindOneByField(table Table, withCache bool) (string, string, error) {
if err != nil {
return "", "", err
}

list = append(list, output.String())
}
if withCache {
out, err := util.With("findOneByFieldExtraMethod").Parse(template.FindOneByFieldExtraMethod).Execute(map[string]interface{}{
text, err := util.LoadTemplate(category, findOneByFieldExtraMethodTemplateFile, template.FindOneByFieldExtraMethod)
if err != nil {
return "", "", err
}

out, err := util.With("findOneByFieldExtraMethod").Parse(text).Execute(map[string]interface{}{
"upperStartCamelObject": camelTableName,
"primaryKeyLeft": table.CacheKey[table.PrimaryKey.Name.Source()].Left,
"lowerStartCamelObject": stringx.From(camelTableName).UnTitle(),
Expand All @@ -45,6 +56,7 @@ func genFindOneByField(table Table, withCache bool) (string, string, error) {
if err != nil {
return "", "", err
}

return strings.Join(list, "\n"), out.String(), nil
}
return strings.Join(list, "\n"), "", nil
Expand Down
16 changes: 14 additions & 2 deletions tools/goctl/model/sql/gen/imports.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,32 @@ import (

func genImports(withCache, timeImport bool) (string, error) {
if withCache {
buffer, err := util.With("import").Parse(template.Imports).Execute(map[string]interface{}{
text, err := util.LoadTemplate(category, importsTemplateFile, template.Imports)
if err != nil {
return "", err
}

buffer, err := util.With("import").Parse(text).Execute(map[string]interface{}{
"time": timeImport,
})
if err != nil {
return "", err
}

return buffer.String(), nil
} else {
buffer, err := util.With("import").Parse(template.ImportsNoCache).Execute(map[string]interface{}{
text, err := util.LoadTemplate(category, importsWithNoCacheTemplateFile, template.ImportsNoCache)
if err != nil {
return "", err
}

buffer, err := util.With("import").Parse(text).Execute(map[string]interface{}{
"time": timeImport,
})
if err != nil {
return "", err
}

return buffer.String(), nil
}
}
Loading

0 comments on commit 41964f9

Please sign in to comment.