goa_model_gen 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/goa_model_gen/cli.rb +59 -24
- data/lib/goa_model_gen/config.rb +66 -0
- data/lib/goa_model_gen/generator.rb +15 -6
- data/lib/goa_model_gen/templates/converter.go.erb +2 -2
- data/lib/goa_model_gen/templates/converter_base.go.erb +60 -0
- data/lib/goa_model_gen/templates/goon.go.erb +27 -0
- data/lib/goa_model_gen/templates/model.go.erb +2 -2
- data/lib/goa_model_gen/templates/model_validation.go.erb +13 -0
- data/lib/goa_model_gen/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a94a826ba73aaaf70ac461966a30335bd2172b4b21dc8b2a9cdb67b900c18adb
|
4
|
+
data.tar.gz: c98e3ae9d9e57a0c45bd2cc5fcf8452ae40de3957a7813cb1fc8ba67ce0ff874
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d4f762066e7d4d2f797a159041833918f955107b51fcb39f52b02050e2eb9252fdc1e594aafc22d30c8d7c8da5aecee58c31df66d522c6f194d52ddf94e6b45
|
7
|
+
data.tar.gz: 8c00b816ebd1805f36f497e9e336794abb403d57dbf5a9282cd6f461246ca8a05bec0b8ec4ee0192ce837f31d3a17cbe3f8a83cdb8a22be8cc33a43a3bcd14cf
|
data/lib/goa_model_gen/cli.rb
CHANGED
@@ -1,59 +1,94 @@
|
|
1
1
|
require "goa_model_gen"
|
2
2
|
|
3
|
-
require "erb"
|
4
|
-
|
5
3
|
require "thor"
|
6
4
|
|
5
|
+
require "goa_model_gen/config"
|
7
6
|
require "goa_model_gen/loader"
|
8
7
|
require "goa_model_gen/generator"
|
9
8
|
|
10
9
|
module GoaModelGen
|
11
10
|
class Cli < Thor
|
12
|
-
class_option :
|
11
|
+
class_option :version, type: :boolean, aliases: 'v', desc: 'Show version before processing'
|
12
|
+
class_option :config, type: :string, aliases: 'c', default: './goa_model_gen.yaml', desc: 'Path to config file. You can generate it by config subcommand'
|
13
|
+
|
14
|
+
desc "config", "Generate config file"
|
15
|
+
def config(path = './goa_model_gen.yaml')
|
16
|
+
show_version_if_required
|
17
|
+
open(path, 'w'){|f| f.puts(Config.new.fulfill.to_yaml) }
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "bootstrap", "Generate files not concerned with model"
|
21
|
+
def bootstrap
|
22
|
+
show_version_if_required
|
23
|
+
generator = new_generator
|
24
|
+
{
|
25
|
+
"templates/goon.go.erb" => "model/goon.go",
|
26
|
+
"templates/converter_base.go.erb" => "controller/converter_base.go",
|
27
|
+
}.each do |template, dest|
|
28
|
+
generator.run(template, dest, overwrite: true)
|
29
|
+
end
|
30
|
+
end
|
13
31
|
|
14
32
|
desc "show FILE1...", "Show model info from definition files"
|
15
33
|
def show(*paths)
|
16
|
-
|
34
|
+
show_version_if_required
|
35
|
+
load_types_for(paths) do |path, types|
|
17
36
|
puts "types in #{path}"
|
18
37
|
puts YAML.dump(types)
|
19
38
|
end
|
20
39
|
end
|
21
40
|
|
22
41
|
desc "model FILE1...", "Generate model files from definition files"
|
23
|
-
option :dir, type: :string, default: './model', desc: 'Output directory path'
|
24
|
-
option :gofmt, type: :boolean, default: true, desc: 'Run gofmt for generated file'
|
25
42
|
def model(*paths)
|
26
|
-
|
27
|
-
load_types_for(paths
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
43
|
+
show_version_if_required
|
44
|
+
load_types_for(paths) do |path, types|
|
45
|
+
generator = new_generator.tap{|g| g.types = types }
|
46
|
+
[
|
47
|
+
{path: 'templates/model.go.erb', suffix: '.go', overwrite: true},
|
48
|
+
{path: 'templates/model_validation.go.erb', suffix: '_validation.go', overwrite: false},
|
49
|
+
].each do |d|
|
50
|
+
dest = File.join(cfg.model_dir, File.basename(path, ".*") + d[:suffix])
|
51
|
+
generator.run(d[:path], dest, overwrite: d[:overwrite])
|
32
52
|
end
|
33
53
|
end
|
34
54
|
end
|
35
55
|
|
36
56
|
desc "converter FILE1...", "Generate converter files from definition files and swagger.yaml"
|
37
|
-
option :package, type: :string, default: 'controller', desc: 'package name'
|
38
|
-
option :dir, type: :string, default: './controller', desc: 'Output directory path'
|
39
|
-
option :gofmt, type: :boolean, default: true, desc: 'Run gofmt for generated file'
|
40
57
|
def converter(*paths)
|
41
|
-
|
42
|
-
load_types_for(paths
|
43
|
-
|
58
|
+
show_version_if_required
|
59
|
+
load_types_for(paths) do |path, types|
|
60
|
+
generator = new_generator.tap{|g| g.types = types }
|
61
|
+
dest = File.join(cfg.controller_dir, File.basename(path, ".*") + "_conv.go")
|
44
62
|
if types.any?{|t| !!t.payload || !!t.media_type}
|
45
|
-
generator.run(
|
46
|
-
if options[:gofmt]
|
47
|
-
system("gofmt -w #{dest}")
|
48
|
-
end
|
63
|
+
generator.run('templates/converter.go.erb', dest, overwrite: true)
|
49
64
|
end
|
50
65
|
end
|
51
66
|
end
|
52
67
|
|
68
|
+
desc "version", "Show version"
|
69
|
+
def version
|
70
|
+
show_version
|
71
|
+
end
|
72
|
+
|
53
73
|
no_commands do
|
74
|
+
def show_version_if_required
|
75
|
+
show_version if options[:version]
|
76
|
+
end
|
77
|
+
|
78
|
+
def show_version
|
79
|
+
puts "#{$PROGRAM_NAME} version:#{::GoaModelGen::VERSION}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def cfg
|
83
|
+
@cfg ||= GoaModelGen::Config.new.load_from(options[:config])
|
84
|
+
end
|
85
|
+
|
86
|
+
def new_generator
|
87
|
+
GoaModelGen::Generator.new(cfg)
|
88
|
+
end
|
54
89
|
|
55
|
-
def load_types_for(paths
|
56
|
-
swagger_loader = GoaModelGen::SwaggerLoader.new(swagger_yaml)
|
90
|
+
def load_types_for(paths)
|
91
|
+
swagger_loader = GoaModelGen::SwaggerLoader.new(cfg.swagger_yaml)
|
57
92
|
path_to_types = {}
|
58
93
|
defined_types = {}
|
59
94
|
paths.each do |path|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "goa_model_gen"
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "yaml"
|
5
|
+
require "pathname"
|
6
|
+
|
7
|
+
require "active_support/core_ext/string"
|
8
|
+
|
9
|
+
module GoaModelGen
|
10
|
+
class Config
|
11
|
+
|
12
|
+
ATTRIBUTES = %w[
|
13
|
+
go_package
|
14
|
+
swagger_yaml
|
15
|
+
gofmt_disabled
|
16
|
+
model_dir
|
17
|
+
controller_dir
|
18
|
+
].freeze
|
19
|
+
|
20
|
+
attr_reader *ATTRIBUTES
|
21
|
+
|
22
|
+
def fulfill
|
23
|
+
@go_package ||= default_go_package
|
24
|
+
@swagger_yaml ||= "./swagger/swagger.yaml"
|
25
|
+
@gofmt_disabled ||= false
|
26
|
+
@model_dir ||= "./model"
|
27
|
+
@controller_dir ||= "./controller"
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_from(path)
|
32
|
+
erb = ERB.new(File.read(path), nil, "-")
|
33
|
+
erb.filename = path
|
34
|
+
config = YAML.load(erb.result, path)
|
35
|
+
|
36
|
+
ATTRIBUTES.each do |name|
|
37
|
+
instance_variable_set("@#{name}", config[name].presence)
|
38
|
+
end
|
39
|
+
|
40
|
+
fulfill
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_hash
|
44
|
+
ATTRIBUTES.each_with_object({}) do |name, d|
|
45
|
+
d[name] = send(name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_yaml
|
50
|
+
YAML.dump(to_hash)
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_go_package
|
54
|
+
return default_go_package!
|
55
|
+
rescue
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def default_go_package!
|
60
|
+
gopath = ENV['GOPATH'] || ''
|
61
|
+
raise "$GOPATH not found" if gopath.empty?
|
62
|
+
return Pathname.new(Dir.pwd).relative_path_from(Pathname.new(File.join(gopath, "src"))).to_s
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -7,15 +7,24 @@ require "active_support/core_ext/string"
|
|
7
7
|
|
8
8
|
module GoaModelGen
|
9
9
|
class Generator
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
# These are used in templates
|
11
|
+
attr_reader :config
|
12
|
+
attr_accessor :types
|
13
|
+
|
14
|
+
def initialize(config)
|
15
|
+
@config = config
|
14
16
|
end
|
15
17
|
|
16
|
-
def run(
|
17
|
-
|
18
|
+
def run(rel_path, path, overwrite: false)
|
19
|
+
return if File.exist?(path) && !overwrite
|
20
|
+
abs_path = File.expand_path('../' + rel_path, __FILE__)
|
21
|
+
erb = ERB.new(File.read(abs_path), nil, "-")
|
22
|
+
erb.filename = abs_path
|
23
|
+
content = erb.result(binding)
|
18
24
|
open(path, 'w'){|f| f.puts(content) }
|
25
|
+
if (File.extname(path) == '.go') && !config.gofmt_disabled
|
26
|
+
system("gofmt -w #{path}")
|
27
|
+
end
|
19
28
|
end
|
20
29
|
|
21
30
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package controller
|
2
2
|
|
3
3
|
import (
|
4
|
-
"
|
5
|
-
"
|
4
|
+
"<%= config.go_package %>/app"
|
5
|
+
"<%= config.go_package %>/model"
|
6
6
|
)
|
7
7
|
|
8
8
|
<%- types.select(&:gen_converter?).each do |type| -%>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
package controller
|
2
|
+
|
3
|
+
import (
|
4
|
+
"strconv"
|
5
|
+
)
|
6
|
+
|
7
|
+
func BoolPointerToBool(v *bool) bool {
|
8
|
+
return BoolPointerToBoolWith(v, false)
|
9
|
+
}
|
10
|
+
|
11
|
+
func BoolPointerToBoolWith(v *bool, d bool) bool {
|
12
|
+
if v == nil {
|
13
|
+
return d
|
14
|
+
}
|
15
|
+
return *v
|
16
|
+
}
|
17
|
+
|
18
|
+
func IntPointerToInt(v *int) int {
|
19
|
+
return IntPointerToIntWith(v, 0)
|
20
|
+
}
|
21
|
+
|
22
|
+
func IntPointerToIntWith(v *int, d int) int {
|
23
|
+
if v == nil {
|
24
|
+
return d
|
25
|
+
}
|
26
|
+
return *v
|
27
|
+
}
|
28
|
+
|
29
|
+
func IntToInt64(v int) int64 {
|
30
|
+
return int64(v)
|
31
|
+
}
|
32
|
+
|
33
|
+
func IntToInt64Pointer(v int) *int64 {
|
34
|
+
r := IntToInt64(v)
|
35
|
+
return &r
|
36
|
+
}
|
37
|
+
|
38
|
+
func StringPointerToString(v *string) string {
|
39
|
+
return StringPointerToStringWith(v, "")
|
40
|
+
}
|
41
|
+
|
42
|
+
func StringPointerToStringWith(v *string, d string) string {
|
43
|
+
if v == nil {
|
44
|
+
return d
|
45
|
+
}
|
46
|
+
return *v
|
47
|
+
}
|
48
|
+
|
49
|
+
func StringToInt64(v string) (int64, error) {
|
50
|
+
return strconv.ParseInt(v, 10, 64)
|
51
|
+
}
|
52
|
+
|
53
|
+
func Int64ToString(v int64) string {
|
54
|
+
return strconv.FormatInt(v, 10)
|
55
|
+
}
|
56
|
+
|
57
|
+
func Int64ToStringPointer(v int64) *string {
|
58
|
+
s := Int64ToString(v)
|
59
|
+
return &s
|
60
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
package model
|
2
|
+
|
3
|
+
import (
|
4
|
+
"golang.org/x/net/context"
|
5
|
+
|
6
|
+
"github.com/mjibson/goon"
|
7
|
+
)
|
8
|
+
|
9
|
+
// // Use the following code if you want to change kind name from model struct name.
|
10
|
+
// var ModelNameToKindMap = map[string]string{
|
11
|
+
// "Person": "People",
|
12
|
+
// "Book": "Books",
|
13
|
+
// }
|
14
|
+
|
15
|
+
func GoonFromContext(c context.Context) *goon.Goon {
|
16
|
+
r := goon.FromContext(c)
|
17
|
+
// baseResolver := r.KindNameResolver
|
18
|
+
// r.KindNameResolver = func(src interface{}) string {
|
19
|
+
// base := baseResolver(src)
|
20
|
+
// mapped := ModelNameToKindMap[base]
|
21
|
+
// if mapped != "" {
|
22
|
+
// return mapped
|
23
|
+
// }
|
24
|
+
// return base
|
25
|
+
// }
|
26
|
+
return r
|
27
|
+
}
|
@@ -196,7 +196,7 @@ func (s *<%= store_name %>) Create(ctx context.Context, m *<%= model.name %>) (*
|
|
196
196
|
}
|
197
197
|
if exist {
|
198
198
|
log.Errorf(ctx, "Failed to create %v because of another entity has same key\n", m)
|
199
|
-
return nil, fmt.Errorf("Duplicate
|
199
|
+
return nil, fmt.Errorf("Duplicate <%= model.goon['id_name'] %> error: %q of %v\n", m.<%= model.goon['id_name'] %>, m)
|
200
200
|
}
|
201
201
|
<%- end -%>
|
202
202
|
|
@@ -219,7 +219,7 @@ func (s *<%= store_name %>) Update(ctx context.Context, m *<%= model.name %>) (*
|
|
219
219
|
}
|
220
220
|
if !exist {
|
221
221
|
log.Errorf(ctx, "Failed to update %v because it doesn't exist\n", m)
|
222
|
-
return nil, fmt.Errorf("No data to update %q of %v\n", m.
|
222
|
+
return nil, fmt.Errorf("No data to update %q of %v\n", m.<%= model.goon['id_name'] %>, m)
|
223
223
|
}
|
224
224
|
<%- end -%>
|
225
225
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goa_model_gen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -116,12 +116,16 @@ files:
|
|
116
116
|
- goa_model_gen.gemspec
|
117
117
|
- lib/goa_model_gen.rb
|
118
118
|
- lib/goa_model_gen/cli.rb
|
119
|
+
- lib/goa_model_gen/config.rb
|
119
120
|
- lib/goa_model_gen/field.rb
|
120
121
|
- lib/goa_model_gen/generator.rb
|
121
122
|
- lib/goa_model_gen/goa.rb
|
122
123
|
- lib/goa_model_gen/loader.rb
|
123
124
|
- lib/goa_model_gen/templates/converter.go.erb
|
125
|
+
- lib/goa_model_gen/templates/converter_base.go.erb
|
126
|
+
- lib/goa_model_gen/templates/goon.go.erb
|
124
127
|
- lib/goa_model_gen/templates/model.go.erb
|
128
|
+
- lib/goa_model_gen/templates/model_validation.go.erb
|
125
129
|
- lib/goa_model_gen/type.rb
|
126
130
|
- lib/goa_model_gen/version.rb
|
127
131
|
homepage: https://github.com/akm/goa_model_gen
|