goon_model_gen 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/goon_model_gen/builder/abstract_builder.rb +104 -0
- data/lib/goon_model_gen/builder/model_builder.rb +74 -0
- data/lib/goon_model_gen/builder/store_builder.rb +45 -0
- data/lib/goon_model_gen/builder/validation_builder.rb +32 -0
- data/lib/goon_model_gen/cli.rb +38 -11
- data/lib/goon_model_gen/config.rb +4 -2
- data/lib/goon_model_gen/generator.rb +6 -0
- data/lib/goon_model_gen/golang/field.rb +1 -0
- data/lib/goon_model_gen/golang/packages.rb +5 -0
- data/lib/goon_model_gen/golang/struct.rb +2 -2
- data/lib/goon_model_gen/golang/type.rb +5 -0
- data/lib/goon_model_gen/source/field.rb +1 -2
- data/lib/goon_model_gen/source/file.rb +1 -0
- data/lib/goon_model_gen/source/loader.rb +19 -1
- data/lib/goon_model_gen/source/type.rb +1 -1
- data/lib/goon_model_gen/templates/model/enum/02_Map.go.erb +1 -1
- data/lib/goon_model_gen/templates/store/goon/01_Binder.go.erb +10 -0
- data/lib/goon_model_gen/templates/store/goon/02_Hook.go.erb +10 -0
- data/lib/goon_model_gen/templates/store/goon/03_struct.go.erb +4 -0
- data/lib/goon_model_gen/templates/store/goon/04_KindName.go.erb +3 -0
- data/lib/goon_model_gen/templates/store/goon/05_Query.go.erb +11 -0
- data/lib/goon_model_gen/templates/store/goon/06_Run.go.erb +10 -0
- data/lib/goon_model_gen/templates/store/goon/07_All.go.erb +8 -0
- data/lib/goon_model_gen/templates/store/goon/08_AllBy.go.erb +24 -0
- data/lib/goon_model_gen/templates/store/goon/09_Select.go.erb +9 -0
- data/lib/goon_model_gen/templates/store/goon/10_FirstBy.go.erb +17 -0
- data/lib/goon_model_gen/templates/store/goon/11_CountBy.go.erb +16 -0
- data/lib/goon_model_gen/templates/store/goon/12_ByID.go.erb +20 -0
- data/lib/goon_model_gen/templates/store/goon/13_ByKey.go.erb +15 -0
- data/lib/goon_model_gen/templates/store/goon/14_Get.go.erb +22 -0
- data/lib/goon_model_gen/templates/store/goon/15_IsValidKey.go.erb +20 -0
- data/lib/goon_model_gen/templates/store/goon/16_Exist.go.erb +28 -0
- data/lib/goon_model_gen/templates/store/goon/17_Create.go.erb +24 -0
- data/lib/goon_model_gen/templates/store/goon/18_Update.go.erb +24 -0
- data/lib/goon_model_gen/templates/store/goon/19_PutWith.go.erb +28 -0
- data/lib/goon_model_gen/templates/store/goon/20_Put.go.erb +17 -0
- data/lib/goon_model_gen/templates/store/goon/21_Delete.go.erb +20 -0
- data/lib/goon_model_gen/templates/store/goon/22_ValidateUniqueness.go.erb +35 -0
- data/lib/goon_model_gen/templates/store/goon/23_Validate.go.erb +14 -0
- data/lib/goon_model_gen/templates/validation/error/01_struct.go.erb +4 -0
- data/lib/goon_model_gen/templates/validation/error/02_Error.go.erb +4 -0
- data/lib/goon_model_gen/version.rb +1 -1
- metadata +30 -2
- data/lib/goon_model_gen/model_builder.rb +0 -137
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 316458bf5f2033fb2e803fc8cb74b8a8ef80a44eb2adf8bec57862a9283b19ad
|
4
|
+
data.tar.gz: 57100fe6b8c389a3f0eb7faa8ea4e7ac063e386c9866d9eb24eeb0c0ea82ef55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f52397b1dbb695e7f65826cccb701b9cb171bc861b03c50274fd00d94a3a53b5312022f096bedc2fca6d956c0d18748daa2344c673b47c84cfd0b7bbe7ff582
|
7
|
+
data.tar.gz: 8226739cfb3a3404a70eb5814e6d0b7ba8169216850ad509f11493bad632bc3ed0392e4b40da811c06f56cdc5378e10a26b7dd8bbbb8cc04557937e4988b2c58
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require "goon_model_gen"
|
2
|
+
|
3
|
+
require "goon_model_gen/golang/packages"
|
4
|
+
|
5
|
+
module GoonModelGen
|
6
|
+
module Builder
|
7
|
+
class AbstractBuilder
|
8
|
+
attr_reader :base_package_path
|
9
|
+
|
10
|
+
# @param base_package_path [String]
|
11
|
+
def initialize(base_package_path)
|
12
|
+
@base_package_path = base_package_path
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param context [Source::Context]
|
16
|
+
# @return [Golang::Packages]
|
17
|
+
def build(context)
|
18
|
+
Golang::Packages.new.tap do |r|
|
19
|
+
build_sentences = []
|
20
|
+
context.files.each do |f|
|
21
|
+
package_path = File.join(base_package_path, f.basename)
|
22
|
+
pkg, procs = build_package(package_path, f.types)
|
23
|
+
r << pkg
|
24
|
+
build_sentences.concat(procs)
|
25
|
+
end
|
26
|
+
resolve_type_names(r)
|
27
|
+
build_sentences.each(&:call)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param package_path [String]
|
32
|
+
# @param types [Array<Source::Type>]
|
33
|
+
# @return [Golang::Package, Array<Proc>]
|
34
|
+
def build_package(package_path, types)
|
35
|
+
raise NotImplementedError, "#{self.type.name} doesn't implement build_package method"
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param pkgs [Golang::Packages]
|
39
|
+
def resolve_type_names(pkgs)
|
40
|
+
raise NotImplementedError, "#{self.type.name} doesn't implement resolve_type_names method"
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param action [string] directory name under templates directory. ex. model, store...
|
44
|
+
# @param kind [string] directory name under the directory specified by action. ex. goon, struct, enum, slice
|
45
|
+
# @param t [Source::Struct]
|
46
|
+
# @param go_type [Golang::Type]
|
47
|
+
def build_sentences(action, kind, t, go_type)
|
48
|
+
template_base = File.join(action, kind)
|
49
|
+
build_sentences_with(template_base, go_type, t.generators[action])
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param template_base [string] template directory path from templates directory. ex. model/enum, store/goon...
|
53
|
+
# @param generators [Hash<string,Object>]
|
54
|
+
# @param go_type [Golang::Type]
|
55
|
+
def build_sentences_with(template_base, go_type, generators)
|
56
|
+
m2t = method_to_template_for(template_base)
|
57
|
+
generators ||= default_generators_for(template_base)
|
58
|
+
generators.each do |name, suffix|
|
59
|
+
next if !suffix
|
60
|
+
template = m2t[name]
|
61
|
+
raise "No template found for #{name.inspect}" unless template
|
62
|
+
parts = [go_type.name.underscore]
|
63
|
+
custom_suffix = false
|
64
|
+
if suffix.is_a?(String)
|
65
|
+
parts << suffix
|
66
|
+
custom_suffix = true
|
67
|
+
end
|
68
|
+
filename = parts.join('_') << '.go'
|
69
|
+
go_type.package.find_or_new_file(filename).tap do |file|
|
70
|
+
file.custom_suffix = custom_suffix
|
71
|
+
file.new_sentence(File.join(template_base, template), go_type)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def default_generators_for(template_base)
|
77
|
+
method_to_template_for(template_base).keys.
|
78
|
+
each_with_object({}){|name, d| d[name] = true }
|
79
|
+
end
|
80
|
+
|
81
|
+
def method_to_template_map
|
82
|
+
@method_to_template_map ||= {}
|
83
|
+
end
|
84
|
+
|
85
|
+
def method_to_template_for(template_base)
|
86
|
+
method_to_template_map[template_base] ||=
|
87
|
+
begin
|
88
|
+
templates_for(template_base).each_with_object({}) do |filename, d|
|
89
|
+
m = filename.sub(/\A\d+\_/, '').sub(/\.go\.erb\z/, '')
|
90
|
+
d[m] = filename
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def templates_for(template_base)
|
96
|
+
base_dir = File.join(File.expand_path('../../templates', __FILE__), template_base)
|
97
|
+
Dir.chdir(base_dir) do
|
98
|
+
Dir.glob('*.go.erb')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "goon_model_gen"
|
2
|
+
|
3
|
+
require "goon_model_gen/builder/abstract_builder"
|
4
|
+
|
5
|
+
require "goon_model_gen/source/struct"
|
6
|
+
require "goon_model_gen/source/enum"
|
7
|
+
require "goon_model_gen/source/named_slice"
|
8
|
+
|
9
|
+
require "goon_model_gen/golang/package"
|
10
|
+
require "goon_model_gen/golang/packages"
|
11
|
+
require "goon_model_gen/golang/datastore_supported"
|
12
|
+
|
13
|
+
require "active_support/core_ext/string"
|
14
|
+
|
15
|
+
module GoonModelGen
|
16
|
+
module Builder
|
17
|
+
class ModelBuilder < AbstractBuilder
|
18
|
+
|
19
|
+
# @param package_path [String]
|
20
|
+
# @param types [Array<Source::Type>]
|
21
|
+
# @return [Golang::Package, Array<Proc>]
|
22
|
+
def build_package(package_path, types)
|
23
|
+
procs = []
|
24
|
+
pkg = Golang::Package.new(package_path).tap do |pkg|
|
25
|
+
types.each do |t|
|
26
|
+
case t
|
27
|
+
when Source::Struct then
|
28
|
+
go_type = build_struct(t, pkg)
|
29
|
+
kind = (t.id_name && t.id_type) ? 'goon' : 'struct'
|
30
|
+
procs << Proc.new{ build_sentences('model', kind, t, go_type) }
|
31
|
+
when Source::Enum then
|
32
|
+
go_type = pkg.new_enum(t.name, t.base_type, t.map)
|
33
|
+
procs << Proc.new{ build_sentences('model', 'enum', t, go_type) }
|
34
|
+
when Source::NamedSlice then
|
35
|
+
go_type = pkg.new_named_slice(t.name, t.base_type_name)
|
36
|
+
procs << Proc.new{ build_sentences('model', 'slice', t, go_type) }
|
37
|
+
else
|
38
|
+
raise "Unsupported type #{t.class.name} #{t.inspect}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return pkg, procs
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param pkgs [Golang::Packages]
|
46
|
+
def resolve_type_names(pkgs)
|
47
|
+
pkgs.resolve_type_names(Golang::DatastoreSupported.packages)
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param t [Source::Struct]
|
51
|
+
# @param pkg [Golang::Package]
|
52
|
+
# @return [Golang::Struct]
|
53
|
+
def build_struct(t, pkg)
|
54
|
+
pkg.new_struct(t.name).tap do |s|
|
55
|
+
s.ref_name = t.ref_name
|
56
|
+
if t.id_name && t.id_type
|
57
|
+
tags = {
|
58
|
+
'goon' => ['id'],
|
59
|
+
'datastore' => ['-'],
|
60
|
+
'json' => [t.id_name.underscore],
|
61
|
+
}
|
62
|
+
s.new_field(t.id_name, t.id_type, tags, goon_id: true)
|
63
|
+
end
|
64
|
+
t.fields.each do |f|
|
65
|
+
s.new_field(f.name, f.type_name, f.build_tags).tap do |field|
|
66
|
+
field.unique = f.unique
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "goon_model_gen"
|
2
|
+
|
3
|
+
require "goon_model_gen/builder/abstract_builder"
|
4
|
+
|
5
|
+
require "goon_model_gen/source/struct"
|
6
|
+
|
7
|
+
require "goon_model_gen/golang/package"
|
8
|
+
require "goon_model_gen/golang/datastore_supported"
|
9
|
+
|
10
|
+
|
11
|
+
module GoonModelGen
|
12
|
+
module Builder
|
13
|
+
class StoreBuilder < AbstractBuilder
|
14
|
+
attr_reader :model_packages
|
15
|
+
|
16
|
+
# @param base_package_path [String]
|
17
|
+
# @param model_packages [Golang::Packages]
|
18
|
+
def initialize(base_package_path, model_packages)
|
19
|
+
super(base_package_path)
|
20
|
+
@model_packages = model_packages
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param package_path [String]
|
24
|
+
# @param types [Array<Source::Type>]
|
25
|
+
# @return [Golang::Package, Array<Proc>]
|
26
|
+
def build_package(package_path, types)
|
27
|
+
procs = []
|
28
|
+
pkg = Golang::Package.new(package_path).tap do |pkg|
|
29
|
+
types.select{|t| t.is_a?(Source::Struct) && t.id_name && t.id_type }.each do |t|
|
30
|
+
store_type = pkg.new_struct(t.name + "Store")
|
31
|
+
procs << Proc.new{ build_sentences('store', 'goon', t, store_type) }
|
32
|
+
store_type.memo[:model] = model_packages.detect_by(t.file.basename).lookup(t.name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return pkg, procs
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param pkgs [Golang::Packages]
|
39
|
+
def resolve_type_names(pkgs)
|
40
|
+
pkgs.resolve_type_names(Golang::DatastoreSupported.packages.dup.add(model_packages))
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "goon_model_gen"
|
2
|
+
|
3
|
+
require "goon_model_gen/builder/abstract_builder"
|
4
|
+
|
5
|
+
require "goon_model_gen/golang/packages"
|
6
|
+
require "goon_model_gen/golang/datastore_supported"
|
7
|
+
|
8
|
+
|
9
|
+
module GoonModelGen
|
10
|
+
module Builder
|
11
|
+
class ValidationBuilder < AbstractBuilder
|
12
|
+
|
13
|
+
# @return [Golang::Packages]
|
14
|
+
def build(*)
|
15
|
+
Golang::Packages.new.tap do |r|
|
16
|
+
r.new_package(base_package_path).tap do |pkg|
|
17
|
+
t = pkg.new_struct('ValidationError')
|
18
|
+
pkg.new_file('validation_error.go').tap do |f|
|
19
|
+
build_sentences_with('validation/error', t, nil)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param pkgs [Golang::Packages]
|
26
|
+
def resolve_type_names(pkgs)
|
27
|
+
pkgs.resolve_type_names(Golang::DatastoreSupported.packages)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/goon_model_gen/cli.rb
CHANGED
@@ -5,7 +5,9 @@ require "yaml"
|
|
5
5
|
require "thor"
|
6
6
|
|
7
7
|
require "goon_model_gen/config"
|
8
|
-
require "goon_model_gen/model_builder"
|
8
|
+
require "goon_model_gen/builder/model_builder"
|
9
|
+
require "goon_model_gen/builder/store_builder"
|
10
|
+
require "goon_model_gen/builder/validation_builder"
|
9
11
|
require "goon_model_gen/source/loader"
|
10
12
|
require "goon_model_gen/generator"
|
11
13
|
|
@@ -30,17 +32,29 @@ module GoonModelGen
|
|
30
32
|
puts YAML.dump(context)
|
31
33
|
end
|
32
34
|
|
33
|
-
desc "build FILE1...", "Build golang objects from source YAML files"
|
34
|
-
def build(*paths)
|
35
|
-
packages = build_model_objects(paths)
|
36
|
-
puts YAML.dump(packages)
|
37
|
-
end
|
38
|
-
|
39
35
|
desc "model FILE1...", "Generate model files from source YAML files"
|
36
|
+
option :inspect, type: :boolean, desc: "Don't generate any file and show package objects if given"
|
40
37
|
def model(*paths)
|
41
38
|
packages = build_model_objects(paths)
|
42
|
-
|
43
|
-
|
39
|
+
if options[:inspect]
|
40
|
+
puts YAML.dump(packages)
|
41
|
+
else
|
42
|
+
packages.map(&:files).flatten.each do |f|
|
43
|
+
new_generator(f, packages).run
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "store FILE1...", "Generate store files from source YAML files"
|
49
|
+
option :inspect, type: :boolean, desc: "Don't generate any file and show package objects if given"
|
50
|
+
def store(*paths)
|
51
|
+
packages = build_store_packages(paths).add(*validation_packages)
|
52
|
+
if options[:inspect]
|
53
|
+
puts YAML.dump(packages)
|
54
|
+
else
|
55
|
+
packages.map(&:files).flatten.each do |f|
|
56
|
+
new_generator(f, packages).run
|
57
|
+
end
|
44
58
|
end
|
45
59
|
end
|
46
60
|
|
@@ -59,8 +73,16 @@ module GoonModelGen
|
|
59
73
|
# @return [Array<Golang::Package>]
|
60
74
|
def build_model_objects(paths)
|
61
75
|
context = Source::Loader.new.process(paths)
|
62
|
-
|
63
|
-
|
76
|
+
Builder::ModelBuilder.new(cfg.model_package_path).build(context)
|
77
|
+
end
|
78
|
+
|
79
|
+
# @param paths [Array<String>] Source::Context
|
80
|
+
# @return [Array<Golang::Package>]
|
81
|
+
def build_store_packages(paths)
|
82
|
+
context = Source::Loader.new.process(paths)
|
83
|
+
model_packages = Builder::ModelBuilder.new(cfg.model_package_path).build(context)
|
84
|
+
store_packages = Builder::StoreBuilder.new(cfg.store_package_path, model_packages).build(context)
|
85
|
+
return store_packages
|
64
86
|
end
|
65
87
|
|
66
88
|
# @param f [Golang::File]
|
@@ -74,6 +96,11 @@ module GoonModelGen
|
|
74
96
|
g.overwrite_custom_file = options[:overwrite_custom_file]
|
75
97
|
return g
|
76
98
|
end
|
99
|
+
|
100
|
+
# @return [Golang::Package]
|
101
|
+
def validation_packages
|
102
|
+
Builder::ValidationBuilder.new(cfg.validation_package_path).build
|
103
|
+
end
|
77
104
|
end
|
78
105
|
end
|
79
106
|
end
|
@@ -14,8 +14,8 @@ module GoonModelGen
|
|
14
14
|
base_package_path
|
15
15
|
model_dir
|
16
16
|
model_package_path
|
17
|
-
|
18
|
-
|
17
|
+
validation_dir
|
18
|
+
validation_package_path
|
19
19
|
store_dir
|
20
20
|
store_package_path
|
21
21
|
converter_dir
|
@@ -31,11 +31,13 @@ module GoonModelGen
|
|
31
31
|
@gofmt_disabled ||= false
|
32
32
|
@model_dir ||= "./model"
|
33
33
|
@store_dir ||= "./stores"
|
34
|
+
@validation_dir ||= "./validation"
|
34
35
|
@converter_dir ||= "./converters"
|
35
36
|
@goa_gen_dir ||= "./gen"
|
36
37
|
@base_package_path ||= default_go_package
|
37
38
|
@model_package_path ||= join_paths(@base_package_path, @model_dir)
|
38
39
|
@store_package_path ||= join_paths(@base_package_path, @store_dir)
|
40
|
+
@validation_package_path ||= join_paths(@base_package_path, @validation_dir)
|
39
41
|
@converter_package_path ||= join_paths(@base_package_path, @converter_dir)
|
40
42
|
@goa_gen_package_path ||= join_paths(@base_package_path, @goa_gen_dir)
|
41
43
|
@structs_gen_dir ||= "./cmd/structs"
|
@@ -41,12 +41,15 @@ module GoonModelGen
|
|
41
41
|
end
|
42
42
|
|
43
43
|
content = execute(variables)
|
44
|
+
return unless content
|
44
45
|
|
45
46
|
options = {skip: skip, force: force}
|
46
47
|
thor.create_file(output_path, content, options)
|
47
48
|
end
|
48
49
|
|
49
50
|
def execute(variables = {})
|
51
|
+
return nil if file.sentences.empty?
|
52
|
+
|
50
53
|
variables.each do |key, val|
|
51
54
|
define_singleton_method(key){ val }
|
52
55
|
end
|
@@ -57,6 +60,9 @@ module GoonModelGen
|
|
57
60
|
# local variables used in tempaltes
|
58
61
|
type = sentence.type
|
59
62
|
package = type.package
|
63
|
+
type.memo.each do |key, val|
|
64
|
+
define_singleton_method(key){ val }
|
65
|
+
end
|
60
66
|
|
61
67
|
erb = ERB.new(File.read(template_path), nil, "-")
|
62
68
|
erb.filename = template_path
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "goon_model_gen"
|
2
2
|
|
3
|
+
require "goon_model_gen/golang/package"
|
3
4
|
require "goon_model_gen/golang/modifier"
|
4
5
|
|
5
6
|
require "active_support/core_ext/string"
|
@@ -25,6 +26,10 @@ module GoonModelGen
|
|
25
26
|
self
|
26
27
|
end
|
27
28
|
|
29
|
+
def new_package(path)
|
30
|
+
Package.new(path).tap{|pkg| add(pkg)}
|
31
|
+
end
|
32
|
+
|
28
33
|
def detect_by(basename)
|
29
34
|
detect{|pkg| pkg.basename == basename}
|
30
35
|
end
|
@@ -12,8 +12,8 @@ module GoonModelGen
|
|
12
12
|
@fields ||= []
|
13
13
|
end
|
14
14
|
|
15
|
-
# @param name [
|
16
|
-
# @param t [
|
15
|
+
# @param name [String]
|
16
|
+
# @param t [String]
|
17
17
|
# @param tags [Hash<String,Array<String>>]
|
18
18
|
def new_field(name, t, tags, options = {})
|
19
19
|
Field.new(name, t, tags, options).tap do |f|
|
@@ -48,7 +48,25 @@ module GoonModelGen
|
|
48
48
|
else
|
49
49
|
raise "Unsupported type definition named '#{name}': #{t.inspect}"
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
|
+
source_type.generators =
|
53
|
+
case t['generates']
|
54
|
+
when false then Hash.new({}) # Return empty Hash not to generate any file
|
55
|
+
when nil, true then Hash.new(nil) # Fulfill by default methods
|
56
|
+
when Hash then
|
57
|
+
t['generates'].each_with_object({}) do |(k,v), d|
|
58
|
+
d[k] =
|
59
|
+
case v
|
60
|
+
when false then {}
|
61
|
+
when nil, true then nil
|
62
|
+
when Array then v.each_with_object({}){|i,d| d[i] = true}
|
63
|
+
when Hash then v
|
64
|
+
else raise "Invalid generates value in #{k.inspect}: #{v.inspect}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
when Array then t['generates'].each_with_object({}){|i,d| d[i] = true}
|
68
|
+
else raise "Invalid generates: #{t['generates'].inspect}"
|
69
|
+
end
|
52
70
|
end
|
53
71
|
end
|
54
72
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%-
|
2
|
+
import 'google.golang.org/appengine/datastore'
|
3
|
+
import model.package
|
4
|
+
-%>
|
5
|
+
|
6
|
+
type <%= type.name %>Binder interface {
|
7
|
+
Query(q *datastore.Query) *datastore.Query
|
8
|
+
Visible(m *<%= model.qualified_name %>) bool
|
9
|
+
Prepare(m *<%= model.qualified_name %>)
|
10
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
-%>
|
5
|
+
|
6
|
+
type <%= type.name %>Hook interface {
|
7
|
+
AfterQuery(ctx context.Context, m *[]*<%= model.qualified_name %>) error
|
8
|
+
AfterGet(ctx context.Context, m *<%= model.qualified_name %>) error
|
9
|
+
BeforeValidation(ctx context.Context, m *<%= model.qualified_name %>) error
|
10
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
import 'google.golang.org/appengine/log'
|
6
|
+
-%>
|
7
|
+
|
8
|
+
func (s *<%= type.name %>) AllBy(ctx context.Context, q *datastore.Query) ([]*<%= model.qualified_name %>, error) {
|
9
|
+
g := goon.FromContext(ctx)
|
10
|
+
r := []*<%= model.qualified_name %>{}
|
11
|
+
_, err := g.GetAll(q.EventualConsistency(), &r)
|
12
|
+
if err != nil {
|
13
|
+
log.Errorf(ctx, "Failed to AllBy <%= model.qualified_name %> because of %v\n", err)
|
14
|
+
return nil, err
|
15
|
+
}
|
16
|
+
|
17
|
+
if s.Hook != nil {
|
18
|
+
if err := s.Hook.AfterQuery(ctx, &r); err != nil {
|
19
|
+
return nil, err
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
return r, nil
|
24
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
-%>
|
6
|
+
|
7
|
+
func (s *<%= type.name %>) FirstBy(ctx context.Context, q *datastore.Query) (*<%= model.qualified_name %>, error) {
|
8
|
+
r, err := s.AllBy(ctx, q.Limit(1))
|
9
|
+
if err != nil {
|
10
|
+
return nil, err
|
11
|
+
}
|
12
|
+
if len(r) > 0 {
|
13
|
+
return r[0], nil
|
14
|
+
} else {
|
15
|
+
return nil, nil
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import 'google.golang.org/appengine/datastore'
|
4
|
+
import 'google.golang.org/appengine/log'
|
5
|
+
import 'github.com/mjibson/goon'
|
6
|
+
-%>
|
7
|
+
|
8
|
+
func (s *<%= type.name %>) CountBy(ctx context.Context, q *datastore.Query) (int, error) {
|
9
|
+
g := goon.FromContext(ctx)
|
10
|
+
c, err := g.Count(q)
|
11
|
+
if err != nil {
|
12
|
+
log.Errorf(ctx, "Failed to count <%= model.qualified_name %> with %v because of %v\n", q, err)
|
13
|
+
return 0, err
|
14
|
+
}
|
15
|
+
return c, nil
|
16
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
-%>
|
5
|
+
|
6
|
+
func (s *<%= type.name %>) ByID(ctx context.Context, iD int64) (*<%= model.qualified_name %>, error) {
|
7
|
+
r := <%= model.qualified_name %>{ID: iD}
|
8
|
+
err := s.Get(ctx, &r)
|
9
|
+
if err != nil {
|
10
|
+
return nil, err
|
11
|
+
}
|
12
|
+
|
13
|
+
if s.Hook != nil {
|
14
|
+
if err := s.Hook.AfterGet(ctx, &r); err != nil {
|
15
|
+
return nil, err
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
return &r, nil
|
20
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
import 'google.golang.org/appengine/log'
|
6
|
+
-%>
|
7
|
+
|
8
|
+
func (s *<%= type.name %>) ByKey(ctx context.Context, key *datastore.Key) (*<%= model.qualified_name %>, error) {
|
9
|
+
if err := s.IsValidKey(ctx, key); err != nil {
|
10
|
+
log.Errorf(ctx, "<%= type.name %>.ByKey got Invalid key: %v because of %v\n", key, err)
|
11
|
+
return nil, err
|
12
|
+
}
|
13
|
+
|
14
|
+
return s.ByID(ctx, key.IntID())
|
15
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
import 'google.golang.org/appengine/log'
|
6
|
+
import 'github.com/mjibson/goon'
|
7
|
+
-%>
|
8
|
+
|
9
|
+
func (s *<%= type.name %>) Get(ctx context.Context, m *<%= model.qualified_name %>) error {
|
10
|
+
g := goon.FromContext(ctx)
|
11
|
+
err := g.Get(m)
|
12
|
+
if err != nil {
|
13
|
+
log.Errorf(ctx, "Failed to Get <%= model.qualified_name %> because of %v\n", err)
|
14
|
+
return err
|
15
|
+
}
|
16
|
+
|
17
|
+
if s.Binder != nil && !s.Binder.Visible(m) {
|
18
|
+
return datastore.ErrNoSuchEntity
|
19
|
+
}
|
20
|
+
|
21
|
+
return nil
|
22
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import 'fmt'
|
4
|
+
import model.package
|
5
|
+
import 'google.golang.org/appengine/datastore'
|
6
|
+
import 'google.golang.org/appengine/log'
|
7
|
+
import 'github.com/mjibson/goon'
|
8
|
+
-%>
|
9
|
+
|
10
|
+
func (s *<%= type.name %>) IsValidKey(ctx context.Context, key *datastore.Key) error {
|
11
|
+
if key == nil {
|
12
|
+
return fmt.Errorf("key is nil")
|
13
|
+
}
|
14
|
+
g := goon.FromContext(ctx)
|
15
|
+
expected := g.Kind(&<%= model.qualified_name %>{})
|
16
|
+
if key.Kind() != expected {
|
17
|
+
return fmt.Errorf("key kind must be %s but was %s", expected, key.Kind())
|
18
|
+
}
|
19
|
+
return nil
|
20
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
import 'google.golang.org/appengine/log'
|
6
|
+
import 'github.com/mjibson/goon'
|
7
|
+
-%>
|
8
|
+
|
9
|
+
func (s *<%= type.name %>) Exist(ctx context.Context, m *<%= model.qualified_name %>) (bool, error) {
|
10
|
+
if m.ID == 0 {
|
11
|
+
return false, nil
|
12
|
+
}
|
13
|
+
g := goon.FromContext(ctx)
|
14
|
+
key, err := g.KeyError(m)
|
15
|
+
if err != nil {
|
16
|
+
log.Errorf(ctx, "Failed to Get Key of %v because of %v\n", m, err)
|
17
|
+
return false, err
|
18
|
+
}
|
19
|
+
_, err = s.ByKey(ctx, key)
|
20
|
+
if err == datastore.ErrNoSuchEntity {
|
21
|
+
return false, nil
|
22
|
+
} else if err != nil {
|
23
|
+
log.Errorf(ctx, "Failed to get existance of %v because of %v\n", m, err)
|
24
|
+
return false, err
|
25
|
+
} else {
|
26
|
+
return true, nil
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import 'fmt'
|
4
|
+
import model.package
|
5
|
+
import 'google.golang.org/appengine/datastore'
|
6
|
+
import 'google.golang.org/appengine/log'
|
7
|
+
-%>
|
8
|
+
|
9
|
+
func (s *<%= type.name %>) Create(ctx context.Context, m *<%= model.qualified_name %>) (*datastore.Key, error) {
|
10
|
+
if err := m.PrepareToCreate(); err != nil {
|
11
|
+
return nil, err
|
12
|
+
}
|
13
|
+
return s.PutWith(ctx, m, func() error {
|
14
|
+
exist, err := s.Exist(ctx, m)
|
15
|
+
if err != nil {
|
16
|
+
return err
|
17
|
+
}
|
18
|
+
if exist {
|
19
|
+
log.Errorf(ctx, "Failed to create %v because of another entity has same key\n", m)
|
20
|
+
return fmt.Errorf("Duplicate ID error: %q of %v\n", m.ID, m)
|
21
|
+
}
|
22
|
+
return nil
|
23
|
+
})
|
24
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import 'fmt'
|
4
|
+
import model.package
|
5
|
+
import 'google.golang.org/appengine/datastore'
|
6
|
+
import 'google.golang.org/appengine/log'
|
7
|
+
-%>
|
8
|
+
|
9
|
+
func (s *<%= type.name %>) Update(ctx context.Context, m *<%= model.qualified_name %>) (*datastore.Key, error) {
|
10
|
+
if err := m.PrepareToUpdate(); err != nil {
|
11
|
+
return nil, err
|
12
|
+
}
|
13
|
+
return s.PutWith(ctx, m, func() error {
|
14
|
+
exist, err := s.Exist(ctx, m)
|
15
|
+
if err != nil {
|
16
|
+
return err
|
17
|
+
}
|
18
|
+
if !exist {
|
19
|
+
log.Errorf(ctx, "Failed to update %v because it doesn't exist\n", m)
|
20
|
+
return fmt.Errorf("No data to update %q of %v\n", m.ID, m)
|
21
|
+
}
|
22
|
+
return nil
|
23
|
+
})
|
24
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
-%>
|
6
|
+
|
7
|
+
func (s *<%= type.name %>) PutWith(ctx context.Context, m *<%= model.qualified_name %>, f func() error) (*datastore.Key, error) {
|
8
|
+
if s.Binder != nil {
|
9
|
+
s.Binder.Prepare(m)
|
10
|
+
}
|
11
|
+
|
12
|
+
if s.Hook != nil {
|
13
|
+
if err := s.Hook.BeforeValidation(ctx, m); err != nil {
|
14
|
+
return nil, err
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
if err := s.Validate(ctx, m); err != nil {
|
19
|
+
return nil, err
|
20
|
+
}
|
21
|
+
if f != nil {
|
22
|
+
if err := f(); err != nil {
|
23
|
+
return nil, err
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
return s.Put(ctx, m)
|
28
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/datastore'
|
5
|
+
import 'google.golang.org/appengine/log'
|
6
|
+
import 'github.com/mjibson/goon'
|
7
|
+
-%>
|
8
|
+
|
9
|
+
func (s *<%= type.name %>) Put(ctx context.Context, m *<%= model.qualified_name %>) (*datastore.Key, error) {
|
10
|
+
g := goon.FromContext(ctx)
|
11
|
+
key, err := g.Put(m)
|
12
|
+
if err != nil {
|
13
|
+
log.Errorf(ctx, "Failed to Put %v because of %v\n", m, err)
|
14
|
+
return nil, err
|
15
|
+
}
|
16
|
+
return key, nil
|
17
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
import 'google.golang.org/appengine/log'
|
5
|
+
import 'github.com/mjibson/goon'
|
6
|
+
-%>
|
7
|
+
|
8
|
+
func (s *<%= type.name %>) Delete(ctx context.Context, m *<%= model.qualified_name %>) error {
|
9
|
+
g := goon.FromContext(ctx)
|
10
|
+
key, err := g.KeyError(m)
|
11
|
+
if err != nil {
|
12
|
+
log.Errorf(ctx, "Failed to Get key of %v because of %v\n", m, err)
|
13
|
+
return err
|
14
|
+
}
|
15
|
+
if err := g.Delete(key); err != nil {
|
16
|
+
log.Errorf(ctx, "Failed to Delete %v because of %v\n", m, err)
|
17
|
+
return err
|
18
|
+
}
|
19
|
+
return nil
|
20
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import 'fmt'
|
4
|
+
import model.package
|
5
|
+
|
6
|
+
validation_error = packages.type_for('ValidationError')
|
7
|
+
raise "ValidationError not found" unless validation_error
|
8
|
+
import validation_error.package
|
9
|
+
-%>
|
10
|
+
|
11
|
+
func (s *<%= type.name %>) ValidateUniqueness(ctx context.Context, m *<%= model.qualified_name %>) error {
|
12
|
+
conditions := map[string]interface{}{
|
13
|
+
<%- model.fields.select(&:unique).each do |field| -%>
|
14
|
+
"<%= field.name %>": m.<%= field.name %>,
|
15
|
+
<%- end -%>
|
16
|
+
}
|
17
|
+
for field, value := range conditions {
|
18
|
+
q := s.Query().Filter(field+" =", value)
|
19
|
+
c, err := s.CountBy(ctx, q)
|
20
|
+
if err != nil {
|
21
|
+
return err
|
22
|
+
}
|
23
|
+
b := 0
|
24
|
+
if m.IsPersisted() {
|
25
|
+
b = 1
|
26
|
+
}
|
27
|
+
if c > b {
|
28
|
+
return &<%= validation_error.qualified_name %>{
|
29
|
+
Field: field,
|
30
|
+
Message: fmt.Sprintf("%v has already been taken", value),
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
return nil
|
35
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%-
|
2
|
+
import 'context'
|
3
|
+
import model.package
|
4
|
+
-%>
|
5
|
+
|
6
|
+
func (s *<%= type.name %>) Validate(ctx context.Context, m *<%= model.qualified_name %>) error {
|
7
|
+
if err := m.Validate(ctx); err != nil {
|
8
|
+
return err
|
9
|
+
}
|
10
|
+
if err := s.ValidateUniqueness(ctx, m); err != nil {
|
11
|
+
return err
|
12
|
+
}
|
13
|
+
return nil
|
14
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goon_model_gen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akm
|
@@ -143,6 +143,10 @@ files:
|
|
143
143
|
- exe/goon_model_gen
|
144
144
|
- goon_model_gen.gemspec
|
145
145
|
- lib/goon_model_gen.rb
|
146
|
+
- lib/goon_model_gen/builder/abstract_builder.rb
|
147
|
+
- lib/goon_model_gen/builder/model_builder.rb
|
148
|
+
- lib/goon_model_gen/builder/store_builder.rb
|
149
|
+
- lib/goon_model_gen/builder/validation_builder.rb
|
146
150
|
- lib/goon_model_gen/cli.rb
|
147
151
|
- lib/goon_model_gen/config.rb
|
148
152
|
- lib/goon_model_gen/generator.rb
|
@@ -160,7 +164,6 @@ files:
|
|
160
164
|
- lib/goon_model_gen/golang/sentence.rb
|
161
165
|
- lib/goon_model_gen/golang/struct.rb
|
162
166
|
- lib/goon_model_gen/golang/type.rb
|
163
|
-
- lib/goon_model_gen/model_builder.rb
|
164
167
|
- lib/goon_model_gen/source/context.rb
|
165
168
|
- lib/goon_model_gen/source/contextual.rb
|
166
169
|
- lib/goon_model_gen/source/enum.rb
|
@@ -187,6 +190,31 @@ files:
|
|
187
190
|
- lib/goon_model_gen/templates/model/goon/06_IsPersisted.go.erb
|
188
191
|
- lib/goon_model_gen/templates/model/slice/01_base.go.erb
|
189
192
|
- lib/goon_model_gen/templates/model/struct/01_struct.go.erb
|
193
|
+
- lib/goon_model_gen/templates/store/goon/01_Binder.go.erb
|
194
|
+
- lib/goon_model_gen/templates/store/goon/02_Hook.go.erb
|
195
|
+
- lib/goon_model_gen/templates/store/goon/03_struct.go.erb
|
196
|
+
- lib/goon_model_gen/templates/store/goon/04_KindName.go.erb
|
197
|
+
- lib/goon_model_gen/templates/store/goon/05_Query.go.erb
|
198
|
+
- lib/goon_model_gen/templates/store/goon/06_Run.go.erb
|
199
|
+
- lib/goon_model_gen/templates/store/goon/07_All.go.erb
|
200
|
+
- lib/goon_model_gen/templates/store/goon/08_AllBy.go.erb
|
201
|
+
- lib/goon_model_gen/templates/store/goon/09_Select.go.erb
|
202
|
+
- lib/goon_model_gen/templates/store/goon/10_FirstBy.go.erb
|
203
|
+
- lib/goon_model_gen/templates/store/goon/11_CountBy.go.erb
|
204
|
+
- lib/goon_model_gen/templates/store/goon/12_ByID.go.erb
|
205
|
+
- lib/goon_model_gen/templates/store/goon/13_ByKey.go.erb
|
206
|
+
- lib/goon_model_gen/templates/store/goon/14_Get.go.erb
|
207
|
+
- lib/goon_model_gen/templates/store/goon/15_IsValidKey.go.erb
|
208
|
+
- lib/goon_model_gen/templates/store/goon/16_Exist.go.erb
|
209
|
+
- lib/goon_model_gen/templates/store/goon/17_Create.go.erb
|
210
|
+
- lib/goon_model_gen/templates/store/goon/18_Update.go.erb
|
211
|
+
- lib/goon_model_gen/templates/store/goon/19_PutWith.go.erb
|
212
|
+
- lib/goon_model_gen/templates/store/goon/20_Put.go.erb
|
213
|
+
- lib/goon_model_gen/templates/store/goon/21_Delete.go.erb
|
214
|
+
- lib/goon_model_gen/templates/store/goon/22_ValidateUniqueness.go.erb
|
215
|
+
- lib/goon_model_gen/templates/store/goon/23_Validate.go.erb
|
216
|
+
- lib/goon_model_gen/templates/validation/error/01_struct.go.erb
|
217
|
+
- lib/goon_model_gen/templates/validation/error/02_Error.go.erb
|
190
218
|
- lib/goon_model_gen/version.rb
|
191
219
|
homepage: https://github.com/akm/goon_model_gen
|
192
220
|
licenses:
|
@@ -1,137 +0,0 @@
|
|
1
|
-
require "goon_model_gen"
|
2
|
-
|
3
|
-
require "goon_model_gen/source/context"
|
4
|
-
require "goon_model_gen/source/struct"
|
5
|
-
require "goon_model_gen/source/enum"
|
6
|
-
require "goon_model_gen/source/named_slice"
|
7
|
-
|
8
|
-
|
9
|
-
require "goon_model_gen/golang/package"
|
10
|
-
require "goon_model_gen/golang/packages"
|
11
|
-
require "goon_model_gen/golang/datastore_supported"
|
12
|
-
|
13
|
-
require "active_support/core_ext/string"
|
14
|
-
|
15
|
-
module GoonModelGen
|
16
|
-
class ModelBuilder
|
17
|
-
attr_reader :base_package_path
|
18
|
-
|
19
|
-
def initialize(base_package_path)
|
20
|
-
@base_package_path = base_package_path
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
# @param context [Source::Context]
|
25
|
-
# @return [Golang::Packages]
|
26
|
-
def build(context)
|
27
|
-
Golang::Packages.new.tap do |r|
|
28
|
-
build_sentences = []
|
29
|
-
context.files.each do |f|
|
30
|
-
package_path = File.join(base_package_path, f.basename)
|
31
|
-
pkg, procs = build_package(package_path, f.types)
|
32
|
-
r << pkg
|
33
|
-
build_sentences.concat(procs)
|
34
|
-
end
|
35
|
-
r.resolve_type_names(Golang::DatastoreSupported.packages)
|
36
|
-
build_sentences.each(&:call)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# @param package_path [String]
|
41
|
-
# @param types [Array<Source::Type>]
|
42
|
-
# @return [Golang::Package, Array<Proc>]
|
43
|
-
def build_package(package_path, types)
|
44
|
-
procs = []
|
45
|
-
pkg = Golang::Package.new(package_path).tap do |pkg|
|
46
|
-
types.each do |t|
|
47
|
-
case t
|
48
|
-
when Source::Struct then
|
49
|
-
go_type = build_struct(t, pkg)
|
50
|
-
template = (t.id_name && t.id_type) ? "model/goon" : "model/struct"
|
51
|
-
procs << Proc.new{ build_sentences(template, t, go_type) }
|
52
|
-
when Source::Enum then
|
53
|
-
go_type = pkg.new_enum(t.name, t.base_type, t.map)
|
54
|
-
procs << Proc.new{ build_sentences("model/enum", t, go_type) }
|
55
|
-
when Source::NamedSlice then
|
56
|
-
go_type = pkg.new_named_slice(t.name, t.base_type_name)
|
57
|
-
procs << Proc.new{ build_sentences("model/slice", t, go_type) }
|
58
|
-
else
|
59
|
-
raise "Unsupported type #{t.class.name} #{t.inspect}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
return pkg, procs
|
64
|
-
end
|
65
|
-
|
66
|
-
# @param t [Source::Struct]
|
67
|
-
# @param pkg [Golang::Package]
|
68
|
-
# @return [Golang::Struct]
|
69
|
-
def build_struct(t, pkg)
|
70
|
-
pkg.new_struct(t.name).tap do |s|
|
71
|
-
s.ref_name = t.ref_name
|
72
|
-
if t.id_name && t.id_type
|
73
|
-
tags = {
|
74
|
-
'goon' => ['id'],
|
75
|
-
'datastore' => ['-'],
|
76
|
-
'json' => [t.id_name.underscore],
|
77
|
-
}
|
78
|
-
s.new_field(t.id_name, t.id_type, tags, goon_id: true)
|
79
|
-
end
|
80
|
-
t.fields.each do |f|
|
81
|
-
s.new_field(f.name, f.type_name, f.build_tags)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
# @param template_base [string]
|
88
|
-
# @param t [Source::Struct]
|
89
|
-
# @param go_type [Golang::Type]
|
90
|
-
def build_sentences(template_base, t, go_type)
|
91
|
-
m2t = method_to_template_for(template_base)
|
92
|
-
t.generators ||= default_generators_for(template_base)
|
93
|
-
t.generators.each do |name, suffix|
|
94
|
-
next if !suffix
|
95
|
-
template = m2t[name]
|
96
|
-
parts = [t.name.underscore]
|
97
|
-
custom_suffix = false
|
98
|
-
if suffix.is_a?(String)
|
99
|
-
parts << suffix
|
100
|
-
custom_suffix = true
|
101
|
-
end
|
102
|
-
filename = parts.join('_') << '.go'
|
103
|
-
go_type.package.find_or_new_file(filename).tap do |file|
|
104
|
-
file.custom_suffix = custom_suffix
|
105
|
-
file.new_sentence(File.join(template_base, template), go_type)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def default_generators_for(template_base)
|
111
|
-
method_to_template_for(template_base).keys.
|
112
|
-
each_with_object({}){|name, d| d[name] = true }
|
113
|
-
end
|
114
|
-
|
115
|
-
def method_to_template_map
|
116
|
-
@method_to_template_map ||= {}
|
117
|
-
end
|
118
|
-
|
119
|
-
def method_to_template_for(template_base)
|
120
|
-
method_to_template_map[template_base] ||=
|
121
|
-
begin
|
122
|
-
templates_for(template_base).each_with_object({}) do |filename, d|
|
123
|
-
m = filename.sub(/\A\d+\_/, '').sub(/\.go\.erb\z/, '')
|
124
|
-
d[m] = filename
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def templates_for(template_base)
|
130
|
-
base_dir = File.join(File.expand_path('../templates', __FILE__), template_base)
|
131
|
-
Dir.chdir(base_dir) do
|
132
|
-
Dir.glob('*.go.erb')
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
end
|