Skip to content

Commit

Permalink
adds constructor method and defines options for all the generators (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ottogiron authored and Raphaël Simon committed Jan 2, 2017
1 parent f7c5c81 commit 6d87153
Show file tree
Hide file tree
Showing 16 changed files with 443 additions and 1 deletion.
1 change: 0 additions & 1 deletion goagen/gen_app/generator.go
Expand Up @@ -15,7 +15,6 @@ import (
//NewGenerator returns an initialized instance of an Application Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}

g.validator = codegen.NewValidator()

for _, option := range options {
Expand Down
11 changes: 11 additions & 0 deletions goagen/gen_client/generator.go
Expand Up @@ -20,6 +20,17 @@ import (
// Filename used to generate all data types (without the ".go" extension)
const typesFileName = "datatypes"

//NewGenerator returns an initialized instance of a Go Client Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}

for _, option := range options {
option(g)
}

return g
}

// Generator is the application code generator.
type Generator struct {
API *design.APIDefinition // The API definition
Expand Down
46 changes: 46 additions & 0 deletions goagen/gen_client/generator_test.go
Expand Up @@ -481,6 +481,52 @@ var _ = Describe("Generate", func() {
})
})

var _ = Describe("NewGenerator", func() {
var generator *genclient.Generator

var args = struct {
api *design.APIDefinition
outDir string
target string
toolDirName string
tool string
noTool bool
}{
api: &design.APIDefinition{
Name: "test api",
},
target: "app",
toolDirName: "test_dir",
tool: "mycli",
noTool: true,
}

Context("with options all options set", func() {
BeforeEach(func() {

generator = genclient.NewGenerator(
genclient.API(args.api),
genclient.OutDir(args.outDir),
genclient.Target(args.target),
genclient.ToolDirName(args.toolDirName),
genclient.Tool(args.tool),
genclient.NoTool(args.noTool),
)
})

It("has all public properties set with expected value", func() {
Ω(generator).ShouldNot(BeNil())
Ω(generator.API.Name).Should(Equal(args.api.Name))
Ω(generator.OutDir).Should(Equal(args.outDir))
Ω(generator.Target).Should(Equal(args.target))
Ω(generator.ToolDirName).Should(Equal(args.toolDirName))
Ω(generator.Tool).Should(Equal(args.tool))
Ω(generator.NoTool).Should(Equal(args.noTool))
})

})
})

const clientHeaderTmpl = `// Code generated by goagen {{ .version }}, command line:
// $ goagen
// --out=$(GOPATH){{sep}}src{{sep}}{{.tmpDir}}
Expand Down
50 changes: 50 additions & 0 deletions goagen/gen_client/options.go
@@ -0,0 +1,50 @@
package genclient

import (
"github.com/goadesign/goa/design"
)

//Option a generator option definition
type Option func(*Generator)

//API The API definition
func API(API *design.APIDefinition) Option {
return func(g *Generator) {
g.API = API
}
}

//OutDir Path to output directory
func OutDir(outDir string) Option {
return func(g *Generator) {
g.OutDir = outDir
}
}

//Target Name of generated package
func Target(target string) Option {
return func(g *Generator) {
g.Target = target
}
}

//ToolDirName Name of tool directory where CLI main is generated once
func ToolDirName(toolDirName string) Option {
return func(g *Generator) {
g.ToolDirName = toolDirName
}
}

//Tool Name of CLI tool
func Tool(tool string) Option {
return func(g *Generator) {
g.Tool = tool
}
}

//NoTool Whether to skip tool generation
func NoTool(noTool bool) Option {
return func(g *Generator) {
g.NoTool = noTool
}
}
11 changes: 11 additions & 0 deletions goagen/gen_js/generator.go
Expand Up @@ -16,6 +16,17 @@ import (
"github.com/goadesign/goa/goagen/utils"
)

//NewGenerator returns an initialized instance of a JavaScript Client Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}

for _, option := range options {
option(g)
}

return g
}

// Generator is the application code generator.
type Generator struct {
API *design.APIDefinition // The API definition
Expand Down
49 changes: 49 additions & 0 deletions goagen/gen_js/generator_test.go
Expand Up @@ -6,6 +6,8 @@ import (
"path/filepath"
"strings"

"time"

"github.com/goadesign/goa/design"
"github.com/goadesign/goa/goagen/gen_js"
"github.com/goadesign/goa/version"
Expand Down Expand Up @@ -98,3 +100,50 @@ var _ = Describe("Generate", func() {
})
})
})

var _ = Describe("NewGenerator", func() {
var generator *genjs.Generator

var args = struct {
api *design.APIDefinition
outDir string
timeout time.Duration
scheme string
host string
noExample bool
}{
api: &design.APIDefinition{
Name: "test api",
},
outDir: "out_dir",
timeout: time.Millisecond * 500,
scheme: "http",
host: "localhost",
noExample: true,
}

Context("with options all options set", func() {
BeforeEach(func() {

generator = genjs.NewGenerator(
genjs.API(args.api),
genjs.OutDir(args.outDir),
genjs.Timeout(args.timeout),
genjs.Scheme(args.scheme),
genjs.Host(args.host),
genjs.NoExample(args.noExample),
)
})

It("has all public properties set with expected value", func() {
Ω(generator).ShouldNot(BeNil())
Ω(generator.API.Name).Should(Equal(args.api.Name))
Ω(generator.OutDir).Should(Equal(args.outDir))
Ω(generator.Timeout).Should(Equal(args.timeout))
Ω(generator.Scheme).Should(Equal(args.scheme))
Ω(generator.Host).Should(Equal(args.host))
Ω(generator.NoExample).Should(Equal(args.noExample))
})

})
})
49 changes: 49 additions & 0 deletions goagen/gen_js/options.go
@@ -0,0 +1,49 @@
package genjs

import "github.com/goadesign/goa/design"
import "time"

//Option a generator option definition
type Option func(*Generator)

//API The API definition
func API(API *design.APIDefinition) Option {
return func(g *Generator) {
g.API = API
}
}

//OutDir Path to output directory
func OutDir(outDir string) Option {
return func(g *Generator) {
g.OutDir = outDir
}
}

//Timeout Timeout used by JavaScript client when making requests
func Timeout(timeout time.Duration) Option {
return func(g *Generator) {
g.Timeout = timeout
}
}

//Scheme Scheme used by JavaScript client
func Scheme(scheme string) Option {
return func(g *Generator) {
g.Scheme = scheme
}
}

//Host addressed by JavaScript client
func Host(host string) Option {
return func(g *Generator) {
g.Host = host
}
}

//NoExample Do not generate an HTML example file
func NoExample(noExample bool) Option {
return func(g *Generator) {
g.NoExample = noExample
}
}
11 changes: 11 additions & 0 deletions goagen/gen_main/generator.go
Expand Up @@ -15,6 +15,17 @@ import (
"github.com/goadesign/goa/goagen/utils"
)

//NewGenerator returns an initialized instance of a JavaScript Client Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}

for _, option := range options {
option(g)
}

return g
}

// Generator is the application code generator.
type Generator struct {
API *design.APIDefinition // The API definition
Expand Down
44 changes: 44 additions & 0 deletions goagen/gen_main/generator_test.go
Expand Up @@ -57,3 +57,47 @@ var _ = Describe("Generate", func() {
})
})
})

var _ = Describe("NewGenerator", func() {
var generator *genmain.Generator

var args = struct {
api *design.APIDefinition
outDir string
designPkg string
target string
force bool
noExample bool
}{
api: &design.APIDefinition{
Name: "test api",
},
outDir: "out_dir",
designPkg: "design",
target: "app",
force: false,
}

Context("with options all options set", func() {
BeforeEach(func() {

generator = genmain.NewGenerator(
genmain.API(args.api),
genmain.OutDir(args.outDir),
genmain.DesignPkg(args.designPkg),
genmain.Target(args.target),
genmain.Force(args.force),
)
})

It("has all public properties set with expected value", func() {
Ω(generator).ShouldNot(BeNil())
Ω(generator.API.Name).Should(Equal(args.api.Name))
Ω(generator.OutDir).Should(Equal(args.outDir))
Ω(generator.DesignPkg).Should(Equal(args.designPkg))
Ω(generator.Target).Should(Equal(args.target))
Ω(generator.Force).Should(Equal(args.force))
})

})
})
41 changes: 41 additions & 0 deletions goagen/gen_main/options.go
@@ -0,0 +1,41 @@
package genmain

import "github.com/goadesign/goa/design"

//Option a generator option definition
type Option func(*Generator)

//API The API definition
func API(API *design.APIDefinition) Option {
return func(g *Generator) {
g.API = API
}
}

//OutDir Path to output directory
func OutDir(outDir string) Option {
return func(g *Generator) {
g.OutDir = outDir
}
}

//DesignPkg Path to design package, only used to mark generated files.
func DesignPkg(designPkg string) Option {
return func(g *Generator) {
g.DesignPkg = designPkg
}
}

//Target Name of generated "app" package
func Target(target string) Option {
return func(g *Generator) {
g.Target = target
}
}

//Force Whether to override existing files
func Force(force bool) Option {
return func(g *Generator) {
g.Force = force
}
}
11 changes: 11 additions & 0 deletions goagen/gen_schema/generator.go
Expand Up @@ -11,6 +11,17 @@ import (
"github.com/goadesign/goa/goagen/utils"
)

//NewGenerator returns an initialized instance of a JavaScript Client Generator
func NewGenerator(options ...Option) *Generator {
g := &Generator{}

for _, option := range options {
option(g)
}

return g
}

// Generator is the application code generator.
type Generator struct {
API *design.APIDefinition // The API definition
Expand Down

0 comments on commit 6d87153

Please sign in to comment.