dslable 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +856 -0
- data/Rakefile +1 -0
- data/bin/dslable +30 -0
- data/dslable.gemspec +29 -0
- data/lib/dslable/version.rb +3 -0
- data/lib/dslable_args.rb +44 -0
- data/lib/dslable_core.rb +79 -0
- data/lib/dslable_dsl.rb +50 -0
- data/lib/dslable_field.rb +36 -0
- data/lib/generators/gem_template.rb +24 -0
- data/lib/generators/generators.rb +6 -0
- data/lib/generators/product_codes/cli.rb +74 -0
- data/lib/generators/product_codes/core.rb +134 -0
- data/lib/generators/product_codes/dsl.rb +94 -0
- data/lib/generators/product_codes/dsl_model.rb +63 -0
- data/lib/generators/rspec/spec_template.rb +21 -0
- data/lib/generators/rspec/specs.rb +27 -0
- data/lib/generators/settings/gemfile.rb +33 -0
- data/spec/dslable_args_spec.rb +262 -0
- data/spec/dslable_core_spec.rb +175 -0
- data/spec/dslable_dsl_spec.rb +235 -0
- data/spec/dslable_field_spec.rb +116 -0
- data/spec/generators/gem_template_spec.rb +52 -0
- data/spec/generators/product_codes/cli_spec.rb +111 -0
- data/spec/generators/product_codes/core_spec.rb +139 -0
- data/spec/generators/product_codes/dsl_model_spec.rb +109 -0
- data/spec/generators/product_codes/dsl_spec.rb +110 -0
- data/spec/generators/rspec/spec_template_spec.rb +54 -0
- data/spec/generators/rspec/specs_spec.rb +56 -0
- data/spec/generators/settings/gemfile_spec.rb +78 -0
- data/spec/spec_helper.rb +8 -0
- metadata +173 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "generators/generators"
|
3
|
+
require "erb"
|
4
|
+
require 'active_support/inflector'
|
5
|
+
require "dslable_dsl"
|
6
|
+
|
7
|
+
module Dslable::Generators::ProductCodes
|
8
|
+
class Dsl
|
9
|
+
DSL_TEMPLATE =<<-EOF
|
10
|
+
# encoding: utf-8
|
11
|
+
require '<%=gem_name%>_dsl_model'
|
12
|
+
|
13
|
+
module <%=gem_name_camel%>
|
14
|
+
class Dsl
|
15
|
+
attr_accessor :<%=gem_name%>
|
16
|
+
|
17
|
+
# String Define
|
18
|
+
[<%=string_fields%>].each do |f|
|
19
|
+
define_method f do |value|
|
20
|
+
eval "@<%=gem_name%>.#\{f.to_s} = '#\{value}'", binding
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Array/Hash Define
|
25
|
+
[<%=array_hash_fields%>].each do |f|
|
26
|
+
define_method f do |value|
|
27
|
+
eval "@<%=gem_name%>.#\{f.to_s} = #\{value}", binding
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@<%=gem_name%> = <%=gem_name_camel%>::DslModel.new
|
33
|
+
<%=set_defaults%>
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
EOF
|
38
|
+
|
39
|
+
attr_accessor :dsl
|
40
|
+
|
41
|
+
#== initialize dsl
|
42
|
+
#=== Params
|
43
|
+
#- _dsl: input from dsl
|
44
|
+
def initialize(_dsl)
|
45
|
+
raise InvalidDslError.new("dsl not allow nil") if _dsl.nil?
|
46
|
+
@dsl = _dsl
|
47
|
+
end
|
48
|
+
|
49
|
+
def generate
|
50
|
+
dsl_src = adapt_template(@dsl.camelized_gem_name, get_string_fields, get_array_hash_fields, get_set_defaults)
|
51
|
+
generate_dsl_src dsl_src
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def get_string_fields
|
56
|
+
fields = []
|
57
|
+
@dsl.fields.each do |field|
|
58
|
+
fields << ":#{field._field_name}" if field._args._klass == String
|
59
|
+
end
|
60
|
+
fields.join(", ")
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_array_hash_fields
|
64
|
+
fields = []
|
65
|
+
@dsl.fields.each do |field|
|
66
|
+
fields << ":#{field._field_name}" unless field._args._klass == String
|
67
|
+
end
|
68
|
+
fields.join(", ")
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_set_defaults
|
72
|
+
set_defaults = []
|
73
|
+
gem_name = @dsl._gem_name
|
74
|
+
@dsl.fields.each_with_index do |field, index|
|
75
|
+
next if field._args._default_value.nil?
|
76
|
+
default_value = field._args._klass == String ? "'#{field._args._default_value}'" : field._args._default_value
|
77
|
+
set_defaults << " @#{gem_name}.#{field._field_name} = #{default_value}"
|
78
|
+
end
|
79
|
+
set_defaults.join("\n")
|
80
|
+
end
|
81
|
+
|
82
|
+
def adapt_template(gem_name_camel, string_fields, array_hash_fields, set_defaults)
|
83
|
+
gem_name = @dsl._gem_name
|
84
|
+
erb = ERB.new(DSL_TEMPLATE)
|
85
|
+
erb.result(binding)
|
86
|
+
end
|
87
|
+
|
88
|
+
def generate_dsl_src(dsl_src)
|
89
|
+
File.open("./lib/#{@dsl._gem_name}_dsl.rb", "w") {|f|f.puts dsl_src}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class InvalidDslError < StandardError;end
|
94
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "generators/generators"
|
3
|
+
require "erb"
|
4
|
+
require 'active_support/inflector'
|
5
|
+
require "dslable_dsl"
|
6
|
+
|
7
|
+
module Dslable::Generators::ProductCodes
|
8
|
+
class DslModel
|
9
|
+
DSL_MODEL_TEMPLATE =<<-EOF
|
10
|
+
# encoding: utf-8
|
11
|
+
require 'active_model'
|
12
|
+
|
13
|
+
module <%=gem_name_camel%>
|
14
|
+
class DslModel
|
15
|
+
include ActiveModel::Model
|
16
|
+
|
17
|
+
<%=fields%>
|
18
|
+
end
|
19
|
+
end
|
20
|
+
EOF
|
21
|
+
|
22
|
+
attr_accessor :dsl
|
23
|
+
|
24
|
+
#== initialize dsl model
|
25
|
+
#=== Params
|
26
|
+
#- _dsl: input from dsl
|
27
|
+
def initialize(_dsl)
|
28
|
+
raise InvalidDslError.new("dsl not allow nil") if _dsl.nil?
|
29
|
+
@dsl = _dsl
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate
|
33
|
+
dsl_model_src = adapt_template(@dsl.camelized_gem_name, get_fields)
|
34
|
+
generate_dsl_model_src dsl_model_src
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def get_fields
|
39
|
+
fields = []
|
40
|
+
@dsl.fields.each do |field|
|
41
|
+
field_codes = []
|
42
|
+
field_codes << " # #{field._desc}"
|
43
|
+
field_codes << " attr_accessor :#{field._field_name}"
|
44
|
+
field_codes << " validates :#{field._field_name}, :presence => true" if field._args._required
|
45
|
+
field_codes << ""
|
46
|
+
fields << field_codes.join("\n")
|
47
|
+
end
|
48
|
+
fields.join("\n")
|
49
|
+
end
|
50
|
+
|
51
|
+
def adapt_template(gem_name_camel, fields)
|
52
|
+
gem_name = @dsl._gem_name
|
53
|
+
erb = ERB.new(DSL_MODEL_TEMPLATE)
|
54
|
+
erb.result(binding)
|
55
|
+
end
|
56
|
+
|
57
|
+
def generate_dsl_model_src(dsl_model_src)
|
58
|
+
File.open("./lib/#{@dsl._gem_name}_dsl_model.rb", "w") {|f|f.puts dsl_model_src}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class InvalidDslError < StandardError;end
|
63
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "generators/generators"
|
3
|
+
|
4
|
+
module Dslable::Generators::RSpec
|
5
|
+
# Dslable::Generators::RSpec RSpec Template Generator(only execute 'rspec --init')
|
6
|
+
class SpecTemplate
|
7
|
+
attr_accessor :dsl
|
8
|
+
|
9
|
+
#== initialize generate rspec template
|
10
|
+
#=== Params
|
11
|
+
#- _dsl: input from dsl
|
12
|
+
def initialize(_dsl)
|
13
|
+
@dsl = _dsl
|
14
|
+
end
|
15
|
+
|
16
|
+
#== generate rspec template
|
17
|
+
def generate
|
18
|
+
`rspec --init`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "generators/generators"
|
3
|
+
|
4
|
+
module Dslable::Generators::RSpec
|
5
|
+
# Dslable::Generators::RSpec Specs Generator specs
|
6
|
+
class Specs
|
7
|
+
attr_accessor :dsl
|
8
|
+
|
9
|
+
#== initialize generate specs
|
10
|
+
#=== Params
|
11
|
+
#- _dsl: input from dsl
|
12
|
+
def initialize(_dsl)
|
13
|
+
@dsl = _dsl
|
14
|
+
end
|
15
|
+
|
16
|
+
#== generate specs
|
17
|
+
def generate
|
18
|
+
generate_core
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_core
|
22
|
+
core_class_name = "#{@dsl.camelized_gem_name}::Core"
|
23
|
+
core_class_file_name = "#{@dsl._gem_name}_core"
|
24
|
+
`piccolo e #{core_class_name} #{core_class_file_name} init execute`
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "generators/generators"
|
3
|
+
require "dslable_dsl"
|
4
|
+
|
5
|
+
module Dslable::Generators::Settings
|
6
|
+
class Gemfile
|
7
|
+
GEMFILE_TEMPLATE =<<-EOF
|
8
|
+
source 'https://rubygems.org'
|
9
|
+
|
10
|
+
gemspec
|
11
|
+
gem "rspec", "~> 2.14.1"
|
12
|
+
gem "thor", "~> 0.18.1"
|
13
|
+
gem "simplecov", "~> 0.8.2"
|
14
|
+
gem "activesupport", "~> 4.0.1"
|
15
|
+
gem "activemodel", "~> 4.0.2"
|
16
|
+
EOF
|
17
|
+
|
18
|
+
attr_accessor :dsl
|
19
|
+
|
20
|
+
#== initialize dsl model
|
21
|
+
#=== Params
|
22
|
+
#- _dsl: input from dsl
|
23
|
+
def initialize(_dsl)
|
24
|
+
raise InvalidDslError.new("dsl not allow nil") if _dsl.nil?
|
25
|
+
@dsl = _dsl
|
26
|
+
end
|
27
|
+
|
28
|
+
def generate
|
29
|
+
File.open("./Gemfile", "w") {|f|f.puts GEMFILE_TEMPLATE}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
class InvalidDslError < StandardError;end
|
33
|
+
end
|
@@ -0,0 +1,262 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "dslable_args"
|
4
|
+
|
5
|
+
describe Dslable::Args do
|
6
|
+
context :desc do
|
7
|
+
cases = [
|
8
|
+
{
|
9
|
+
case_no: 1,
|
10
|
+
case_title: "valid description",
|
11
|
+
input: "this is descripotion",
|
12
|
+
expected: "this is descripotion"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
case_no: 2,
|
16
|
+
case_title: "empty description",
|
17
|
+
input: "",
|
18
|
+
expected: ""
|
19
|
+
},
|
20
|
+
{
|
21
|
+
case_no: 3,
|
22
|
+
case_title: "nil description",
|
23
|
+
input: nil,
|
24
|
+
expected: ""
|
25
|
+
},
|
26
|
+
]
|
27
|
+
|
28
|
+
cases.each do |c|
|
29
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
30
|
+
begin
|
31
|
+
case_before c
|
32
|
+
|
33
|
+
# -- given --
|
34
|
+
dslable_args = Dslable::Args.new
|
35
|
+
|
36
|
+
# -- when --
|
37
|
+
dslable_args.desc c[:input]
|
38
|
+
|
39
|
+
# -- then --
|
40
|
+
actual = dslable_args._desc
|
41
|
+
expect(actual).to eq(c[:expected])
|
42
|
+
ensure
|
43
|
+
case_after c
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def case_before(c)
|
48
|
+
# implement each case before
|
49
|
+
end
|
50
|
+
|
51
|
+
def case_after(c)
|
52
|
+
# implement each case after
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context :args_name do
|
58
|
+
cases = [
|
59
|
+
{
|
60
|
+
case_no: 1,
|
61
|
+
case_title: "valid dsl_args name",
|
62
|
+
input: "abcdefghijklmnopqrstuvwxyz01234567891_",
|
63
|
+
expected: "abcdefghijklmnopqrstuvwxyz01234567891_"
|
64
|
+
},
|
65
|
+
{
|
66
|
+
case_no: 2,
|
67
|
+
case_title: "empty dsl_args name",
|
68
|
+
input: "",
|
69
|
+
expect_error: true
|
70
|
+
},
|
71
|
+
{
|
72
|
+
case_no: 3,
|
73
|
+
case_title: "nil dsl_args name",
|
74
|
+
input: nil,
|
75
|
+
expect_error: true
|
76
|
+
},
|
77
|
+
{
|
78
|
+
case_no: 4,
|
79
|
+
case_title: "invalid dsl_args name contain space",
|
80
|
+
input: "method name",
|
81
|
+
expect_error: true
|
82
|
+
},
|
83
|
+
]
|
84
|
+
|
85
|
+
cases.each do |c|
|
86
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
87
|
+
begin
|
88
|
+
case_before c
|
89
|
+
|
90
|
+
# -- given --
|
91
|
+
dslable_args = Dslable::Args.new
|
92
|
+
|
93
|
+
# -- when --
|
94
|
+
if c[:expect_error]
|
95
|
+
lambda {dslable_args.args_name c[:input]}.should raise_error(Dslable::InvalidArgsError)
|
96
|
+
next
|
97
|
+
end
|
98
|
+
dslable_args.args_name c[:input]
|
99
|
+
actual = dslable_args._args_name
|
100
|
+
|
101
|
+
# -- then --
|
102
|
+
expect(actual).to eq(c[:expected])
|
103
|
+
ensure
|
104
|
+
case_after c
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def case_before(c)
|
109
|
+
# implement each case before
|
110
|
+
end
|
111
|
+
|
112
|
+
def case_after(c)
|
113
|
+
# implement each case after
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context :klass do
|
119
|
+
cases = [
|
120
|
+
{
|
121
|
+
case_no: 1,
|
122
|
+
case_title: "valid klass String",
|
123
|
+
input: String,
|
124
|
+
expected: String
|
125
|
+
},
|
126
|
+
{
|
127
|
+
case_no: 2,
|
128
|
+
case_title: "valid klass Array",
|
129
|
+
input: Array,
|
130
|
+
expected: Array
|
131
|
+
},
|
132
|
+
{
|
133
|
+
case_no: 3,
|
134
|
+
case_title: "valid klass Hash",
|
135
|
+
input: Hash,
|
136
|
+
expected: Hash
|
137
|
+
},
|
138
|
+
{
|
139
|
+
case_no: 4,
|
140
|
+
case_title: "invalid klass Hash",
|
141
|
+
input: Fixnum,
|
142
|
+
expect_error: true
|
143
|
+
},
|
144
|
+
{
|
145
|
+
case_no: 5,
|
146
|
+
case_title: "nil klass",
|
147
|
+
input: nil,
|
148
|
+
expect_error: true
|
149
|
+
},
|
150
|
+
]
|
151
|
+
|
152
|
+
cases.each do |c|
|
153
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
154
|
+
begin
|
155
|
+
case_before c
|
156
|
+
|
157
|
+
# -- given --
|
158
|
+
dslable_args = Dslable::Args.new
|
159
|
+
|
160
|
+
# -- when --
|
161
|
+
if c[:expect_error]
|
162
|
+
lambda {dslable_args.klass c[:input]}.should raise_error(Dslable::InvalidArgsError)
|
163
|
+
next
|
164
|
+
end
|
165
|
+
dslable_args.klass c[:input]
|
166
|
+
actual = dslable_args._klass
|
167
|
+
|
168
|
+
# -- then --
|
169
|
+
expect(actual).to eq(c[:expected])
|
170
|
+
ensure
|
171
|
+
case_after c
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def case_before(c)
|
176
|
+
# implement each case before
|
177
|
+
end
|
178
|
+
|
179
|
+
def case_after(c)
|
180
|
+
# implement each case after
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context :required do
|
186
|
+
cases = [
|
187
|
+
{
|
188
|
+
case_no: 1,
|
189
|
+
case_title: "valid required",
|
190
|
+
expected: true
|
191
|
+
},
|
192
|
+
]
|
193
|
+
|
194
|
+
cases.each do |c|
|
195
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
196
|
+
begin
|
197
|
+
case_before c
|
198
|
+
|
199
|
+
# -- given --
|
200
|
+
dslable_args = Dslable::Args.new
|
201
|
+
|
202
|
+
# -- when --
|
203
|
+
dslable_args.required
|
204
|
+
actual = dslable_args._required
|
205
|
+
|
206
|
+
# -- then --
|
207
|
+
expect(actual).to eq(c[:expected])
|
208
|
+
ensure
|
209
|
+
case_after c
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def case_before(c)
|
214
|
+
# implement each case before
|
215
|
+
end
|
216
|
+
|
217
|
+
def case_after(c)
|
218
|
+
# implement each case after
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context :default_value do
|
224
|
+
cases = [
|
225
|
+
{
|
226
|
+
case_no: 1,
|
227
|
+
case_title: "valid default",
|
228
|
+
input: "valid default",
|
229
|
+
expected: "valid default"
|
230
|
+
},
|
231
|
+
]
|
232
|
+
|
233
|
+
cases.each do |c|
|
234
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
235
|
+
begin
|
236
|
+
case_before c
|
237
|
+
|
238
|
+
# -- given --
|
239
|
+
dslable_args = Dslable::Args.new
|
240
|
+
|
241
|
+
# -- when --
|
242
|
+
dslable_args.default_value c[:input]
|
243
|
+
actual = dslable_args._default_value
|
244
|
+
|
245
|
+
# -- then --
|
246
|
+
expect(actual).to eq(c[:expected])
|
247
|
+
ensure
|
248
|
+
case_after c
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def case_before(c)
|
253
|
+
# implement each case before
|
254
|
+
end
|
255
|
+
|
256
|
+
def case_after(c)
|
257
|
+
# implement each case after
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
end
|