Skip to content

Commit

Permalink
Merge branch 'master' into use-bindata
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhenghui Wang committed Apr 21, 2017
2 parents ba033c4 + 23eea0f commit 279e14f
Show file tree
Hide file tree
Showing 69 changed files with 1,182 additions and 110 deletions.
11 changes: 6 additions & 5 deletions codegen/gateway.go
Expand Up @@ -753,11 +753,12 @@ type GatewaySpec struct {
EndpointModules map[string]*EndpointSpec
MiddlewareModules map[string]*MiddlewareSpec

gatewayName string
configDirName string
clientConfigDir string
endpointConfigDir string
middlewareConfig string
gatewayName string
configDirName string
clientConfigDir string
endpointConfigDir string
middlewareConfig string
copyrightHeaderFile string
}

// NewGatewaySpec sets up gateway spec
Expand Down
10 changes: 9 additions & 1 deletion codegen/module_system.go
Expand Up @@ -125,6 +125,7 @@ func (generator *HTTPClientGenerator) Generate(
client, err := generator.templates.execTemplate(
"http_client.tmpl",
clientMeta,
generator.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
Expand All @@ -134,7 +135,11 @@ func (generator *HTTPClientGenerator) Generate(
)
}

structs, err := generator.templates.execTemplate("structs.tmpl", clientMeta)
structs, err := generator.templates.execTemplate(
"structs.tmpl",
clientMeta,
generator.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
err,
Expand Down Expand Up @@ -220,6 +225,7 @@ func (generator *TCahnnelClientGenerator) Generate(
client, err := generator.templates.execTemplate(
"tchannel_client.tmpl",
clientMeta,
generator.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
Expand All @@ -232,6 +238,7 @@ func (generator *TCahnnelClientGenerator) Generate(
server, err := generator.templates.execTemplate(
"tchannel_server.tmpl",
clientMeta,
generator.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
Expand All @@ -244,6 +251,7 @@ func (generator *TCahnnelClientGenerator) Generate(
handler, err := generator.templates.execTemplate(
"tchannel_handler.tmpl",
clientMeta,
generator.packageHelper,
)
if err != nil {
return nil, errors.Wrapf(
Expand Down
4 changes: 4 additions & 0 deletions codegen/package.go
Expand Up @@ -41,6 +41,8 @@ type PackageHelper struct {
targetGenDir string
// The root directory for the gateway test config files.
testConfigsRootDir string
// String containing copyright header to add to generated code.
copyrightHeader string
}

// NewPackageHelper creates a package helper.
Expand All @@ -49,6 +51,7 @@ func NewPackageHelper(
genCodePackage string,
targetGenDir string,
gatewayNamespace string,
copyrightHeader string,
) (*PackageHelper, error) {
genDir, err := filepath.Abs(targetGenDir)
if err != nil {
Expand All @@ -69,6 +72,7 @@ func NewPackageHelper(
genCodePackage: genCodePackage,
gatewayNamespace: gatewayNamespace,
targetGenDir: genDir,
copyrightHeader: copyrightHeader,
}
return p, nil
}
Expand Down
21 changes: 21 additions & 0 deletions codegen/package_test.go
Expand Up @@ -35,6 +35,26 @@ var fooThrift = filepath.Join(
"examples/example-gateway/idl/",
"clients/foo/foo.thrift")

var testCopyrightHeader = `// Copyright (c) 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.`

func newPackageHelper(t *testing.T) *codegen.PackageHelper {
relativeGatewayPath := "../examples/example-gateway"
absGatewayPath, err := filepath.Abs(relativeGatewayPath)
Expand All @@ -47,6 +67,7 @@ func newPackageHelper(t *testing.T) *codegen.PackageHelper {
"github.com/uber/zanzibar/examples/example-gateway/build/gen-code",
tmpDir,
"github.com/uber/zanzibar",
testCopyrightHeader,
)
if !assert.NoError(t, err, "failed to create package helper") {
return nil
Expand Down
13 changes: 12 additions & 1 deletion codegen/runner/runner.go
Expand Up @@ -23,6 +23,7 @@ package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"

Expand Down Expand Up @@ -56,14 +57,24 @@ func main() {

configDirName, err := filepath.Abs(configDirName)
checkError(
err, fmt.Sprintf("cant get abs path of config dir %s", configDirName),
err, fmt.Sprintf("can not get abs path of config dir %s", configDirName),
)

copyright, err := ioutil.ReadFile(filepath.Join(
configDirName,
config.MustGetString("copyrightHeader"),
))
if err != nil {
// Default to an empty copyright for now
copyright = []byte("")
}

packageHelper, err := codegen.NewPackageHelper(
filepath.Join(configDirName, config.MustGetString("thriftRootDir")),
config.MustGetString("genCodePackage"),
filepath.Join(configDirName, config.MustGetString("targetGenDir")),
config.MustGetString("gatewayNamespace"),
string(copyright),
)
checkError(
err, fmt.Sprintf("Can't build package helper %s", configDirName),
Expand Down
142 changes: 82 additions & 60 deletions codegen/template.go
Expand Up @@ -23,6 +23,7 @@ package codegen
import (
"bytes"
"encoding/json"
"io"
"io/ioutil"
"os"
"os/exec"
Expand Down Expand Up @@ -190,39 +191,6 @@ type ClientMeta struct {
Services []*ServiceSpec
}

// GenerateClientFile generates Go http code for services defined in thrift file.
// It returns the path of generated client file and struct file or an error.
func (t *Template) GenerateClientFile(
c *ClientSpec, h *PackageHelper,
) (*ClientFiles, error) {
m := c.ModuleSpec

if len(m.Services) == 0 {
return nil, nil
}

clientMeta := &ClientMeta{
PackageName: m.PackageName,
Services: m.Services,
IncludedPackages: m.IncludedPackages,
ClientID: c.ClientID,
}
err := t.execTemplateAndFmt("http_client.tmpl", c.GoFileName, clientMeta)
if err != nil {
return nil, errors.Wrap(err, "could not run http_client template")
}

err = t.execTemplateAndFmt("structs.tmpl", c.GoStructsFileName, clientMeta)
if err != nil {
return nil, errors.Wrap(err, "could not run structs template")
}

return &ClientFiles{
ClientFile: c.GoFileName,
StructFile: c.GoStructsFileName,
}, nil
}

func findMethod(
m *ModuleSpec, serviceName string, methodName string,
) *MethodSpec {
Expand Down Expand Up @@ -253,7 +221,7 @@ func (t *Template) GenerateEndpointFile(
}

err := t.execTemplateAndFmt(
"structs.tmpl", e.GoStructsFileName, m,
"structs.tmpl", e.GoStructsFileName, m, h,
)
if err != nil {
return nil, errors.Wrap(err, "could not run structs template")
Expand Down Expand Up @@ -301,7 +269,7 @@ func (t *Template) GenerateEndpointFile(
WorkflowName: workflowName,
}

err = t.execTemplateAndFmt("endpoint.tmpl", dest, meta)
err = t.execTemplateAndFmt("endpoint.tmpl", dest, meta, h)
if err != nil {
return nil, errors.Wrap(err, "could not run endpoint template")
}
Expand Down Expand Up @@ -433,7 +401,11 @@ func (t *Template) GenerateEndpointTestFile(
TestStubs: testStubs,
}

err = t.execTemplateAndFmt("endpoint_test.tmpl", dest, meta)
err = t.execTemplateAndFmt(
"endpoint_test.tmpl",
dest,
meta,
h)
if err != nil {
return nil, errors.Wrap(err, "could not run endpoint_test template")
}
Expand Down Expand Up @@ -525,7 +497,11 @@ func (t *Template) GenerateClientsInitFile(
}

targetFile := h.TargetClientsInitPath()
err := t.execTemplateAndFmt("init_clients.tmpl", targetFile, meta)
err := t.execTemplateAndFmt(
"init_clients.tmpl",
targetFile,
meta,
h)
if err != nil {
return "", err
}
Expand Down Expand Up @@ -649,7 +625,11 @@ func (t *Template) GenerateEndpointRegisterFile(
}

targetFile := h.TargetEndpointsRegisterPath()
err := t.execTemplateAndFmt("endpoint_register.tmpl", targetFile, meta)
err := t.execTemplateAndFmt(
"endpoint_register.tmpl",
targetFile,
meta,
h)
if err != nil {
return "", err
}
Expand Down Expand Up @@ -714,13 +694,17 @@ func (t *Template) GenerateMainFile(
}

mainFile := h.TargetMainPath()
err = t.execTemplateAndFmt("main.tmpl", mainFile, meta)
err = t.execTemplateAndFmt("main.tmpl", mainFile, meta, h)
if err != nil {
return nil, err
}

mainTestFile := h.TargetMainTestPath()
err = t.execTemplateAndFmt("main_test.tmpl", mainTestFile, meta)
err = t.execTemplateAndFmt(
"main_test.tmpl",
mainTestFile,
meta,
h)
if err != nil {
return nil, err
}
Expand All @@ -731,32 +715,33 @@ func (t *Template) GenerateMainFile(
}, nil
}

func (t *Template) execTemplate(
tplName string,
tplData interface{},
) ([]byte, error) {
tplBuffer := bytes.NewBuffer(nil)
func (t *Template) execTemplateAndFmt(
templName string,
filePath string,
data interface{},
pkgHelper *PackageHelper,
) error {

if err := t.template.ExecuteTemplate(
tplBuffer,
tplName,
tplData,
); err != nil {
return nil, errors.Wrapf(
err,
"Error generating template %s",
tplName,
)
file, err := openFileOrCreate(filePath)
if err != nil {
return errors.Wrapf(err, "failed to open file: %s", err)
}

return tplBuffer.Bytes(), nil
}
_, err = io.WriteString(file, "// Code generated by zanzibar \n"+
"// @generated \n \n")
if err != nil {
return errors.Wrapf(err, "failed to write to file: %s", err)
}

func (t *Template) execTemplateAndFmt(templName string, filePath string, data interface{}) error {
file, err := openFileOrCreate(filePath)
_, err = io.WriteString(file, pkgHelper.copyrightHeader)
if err != nil {
return errors.Wrapf(err, "failed to open file: %s", err)
return errors.Wrapf(err, "failed to write to file: %s", err)
}
_, err = io.WriteString(file, "\n\n")
if err != nil {
return errors.Wrapf(err, "failed to write to file: %s", err)
}

if err := t.template.ExecuteTemplate(file, templName, data); err != nil {
return errors.Wrapf(err, "failed to execute template files for file %s", file)
}
Expand Down Expand Up @@ -784,6 +769,43 @@ func (t *Template) execTemplateAndFmt(templName string, filePath string, data in
return nil
}

func (t *Template) execTemplate(
tplName string,
tplData interface{},
pkgHelper *PackageHelper,
) ([]byte, error) {
tplBuffer := bytes.NewBuffer(nil)

_, err := io.WriteString(tplBuffer, "// Code generated by zanzibar \n"+
"// @generated \n \n")
if err != nil {
return nil, errors.Wrapf(err, "failed to write to file: %s", err)
}

_, err = io.WriteString(tplBuffer, pkgHelper.copyrightHeader)
if err != nil {
return nil, errors.Wrapf(err, "failed to write to file: %s", err)
}
_, err = io.WriteString(tplBuffer, "\n\n")
if err != nil {
return nil, errors.Wrapf(err, "failed to write to file: %s", err)
}

if err := t.template.ExecuteTemplate(
tplBuffer,
tplName,
tplData,
); err != nil {
return nil, errors.Wrapf(
err,
"Error generating template %s",
tplName,
)
}

return tplBuffer.Bytes(), nil
}

func openFileOrCreate(file string) (*os.File, error) {
if _, err := os.Stat(file); os.IsNotExist(err) {
if err := os.MkdirAll(filepath.Dir(file), os.ModePerm); err != nil {
Expand Down
1 change: 1 addition & 0 deletions codegen/template_test.go
Expand Up @@ -63,6 +63,7 @@ func TestGenerateBar(t *testing.T) {
"github.com/uber/zanzibar/examples/example-gateway/build/gen-code",
tmpDir,
"github.com/uber/zanzibar",
testCopyrightHeader,
)
if !assert.NoError(t, err, "failed to create package helper", err) {
return
Expand Down
2 changes: 0 additions & 2 deletions codegen/templates/endpoint.tmpl
@@ -1,6 +1,4 @@
{{/* template to render gateway http endpoint code */ -}}
// Code generated by zanzibar
// @generated

package {{.PackageName}}

Expand Down

0 comments on commit 279e14f

Please sign in to comment.