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
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 tbpgr
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,856 @@
|
|
1
|
+
# Dslable
|
2
|
+
|
3
|
+
Dslable is generator for simple spec gem.
|
4
|
+
|
5
|
+
## Summary
|
6
|
+
* create gem template with DslSettingFile.
|
7
|
+
* you can get bin-executable gem.
|
8
|
+
* generated gem has 1-DslSettingFile.
|
9
|
+
* generated gem has 1-core logic class.
|
10
|
+
* generated gem has 1-dsl class.
|
11
|
+
* generated gem has 1-dsl-model class.
|
12
|
+
* generated gem has 1-core class's RSpec spec.
|
13
|
+
* generated gem has Gemfile.(already has minimum necessary gem)
|
14
|
+
|
15
|
+
## Purpose
|
16
|
+
* to create simple spec gem easier.
|
17
|
+
|
18
|
+
## Structure
|
19
|
+
### Dsldefine
|
20
|
+
this is setting file.
|
21
|
+
|
22
|
+
set ...
|
23
|
+
|
24
|
+
* gem_name: your gem name. set snake case name
|
25
|
+
* bin_name: your bin name. set snake case name
|
26
|
+
* field: your dsl field.
|
27
|
+
|
28
|
+
### generated code: lib/your_gem_name_core.rb
|
29
|
+
* main logic.
|
30
|
+
* init method generate DslSettingFile.
|
31
|
+
* execute method is main logic. you must edit additional logic manually.
|
32
|
+
|
33
|
+
### generated code: lib/your_gem_name_dsl.rb
|
34
|
+
* this file keeps values from DslSettingFile.
|
35
|
+
|
36
|
+
### generated code: lib/your_gem_name_dsl_model.rb
|
37
|
+
* this file define DslSettingFile's model.
|
38
|
+
|
39
|
+
### generated code: bin/your_bin_name
|
40
|
+
* this file has command line interface logic.
|
41
|
+
|
42
|
+
### generated code: spec/your_gem_name_core_spec.rb
|
43
|
+
* this file is RSpec spec for 'your_gem_name_core.rb'.
|
44
|
+
|
45
|
+
## DSL List
|
46
|
+
### Global DSL
|
47
|
+
| dsl | mean |
|
48
|
+
|:----------- |:------------ |
|
49
|
+
| gem_name |set your gem name.(snake_case)|
|
50
|
+
| bin_name |set your bin name.(snake_case)|
|
51
|
+
| field |set your field information by block|
|
52
|
+
|
53
|
+
### Field DSL
|
54
|
+
| dsl | mean |
|
55
|
+
|:----------- |:------------ |
|
56
|
+
| desc |set your field description|
|
57
|
+
|
58
|
+
### Args DSL
|
59
|
+
| dsl | mean |
|
60
|
+
|:----------- |:------------ |
|
61
|
+
| desc |set your args description |
|
62
|
+
| klass |set your args data type. you can choose [String, Array, Hash] |
|
63
|
+
| required |if you want to set required, use this. |
|
64
|
+
| default_value|if you want to set default value, use this. |
|
65
|
+
|
66
|
+
## Installation
|
67
|
+
|
68
|
+
Add this line to your application's Gemfile:
|
69
|
+
|
70
|
+
gem 'dslable'
|
71
|
+
|
72
|
+
And then execute:
|
73
|
+
|
74
|
+
$ bundle
|
75
|
+
|
76
|
+
Or install it yourself as:
|
77
|
+
|
78
|
+
$ gem install dslable
|
79
|
+
|
80
|
+
## Sample Usage
|
81
|
+
### Sample Spec
|
82
|
+
* create FizzBuzzGem
|
83
|
+
* if you execute 'fizzbuzzgem', result is...
|
84
|
+
~~~bash
|
85
|
+
1 2 fizz 3 4 buzz 5 fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz
|
86
|
+
~~~
|
87
|
+
* you can choose output 'fizz/buzz/fizzbuzz' or 'FIZZ/BUZZ/FIZZBUZZ' by setting file.
|
88
|
+
* you can set fizzbuzz range by setting file.
|
89
|
+
|
90
|
+
### Steps: 'dslable init'. generate Dsldefine Template.
|
91
|
+
~~~bash
|
92
|
+
$ dslable init
|
93
|
+
$ ls
|
94
|
+
Dsldefine
|
95
|
+
~~~
|
96
|
+
|
97
|
+
Dsldefine Template Contents
|
98
|
+
~~~ruby
|
99
|
+
# encoding: utf-8
|
100
|
+
|
101
|
+
# set your gem name. this is use in rb-filename and class-name
|
102
|
+
gem_name "TODO: set your gem_name"
|
103
|
+
|
104
|
+
# set your bin name
|
105
|
+
bin_name "TODO: set your bin_name"
|
106
|
+
|
107
|
+
# set your dsl filed
|
108
|
+
field :field_name1 do |f|
|
109
|
+
# set your field description
|
110
|
+
f.desc "field1 description"
|
111
|
+
f.args :args_name do |a|
|
112
|
+
# set your args description
|
113
|
+
a.desc "args description"
|
114
|
+
# you can use String, Array and Hash
|
115
|
+
a.klass String
|
116
|
+
# if you want not required, comment out following line
|
117
|
+
a.required
|
118
|
+
# if you comment out following line, default => nil
|
119
|
+
a.default_value "args_value2"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# field :field_name2 do |f|
|
124
|
+
# f.desc "field2 description"
|
125
|
+
# f.args :args_name do |a|
|
126
|
+
# a.desc "args description"
|
127
|
+
# a.klass String
|
128
|
+
# a.required
|
129
|
+
# a.default_value "args_value2"
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
~~~
|
133
|
+
|
134
|
+
### Steps: Edit Dsldefine manually.
|
135
|
+
~~~ruby
|
136
|
+
# encoding: utf-8
|
137
|
+
gem_name "fizz_buzz_gem"
|
138
|
+
|
139
|
+
bin_name "fizzbuzzgem"
|
140
|
+
|
141
|
+
field :is_upper_case do |f|
|
142
|
+
f.desc "is_upper_case"
|
143
|
+
f.args :is_upper_case do |a|
|
144
|
+
a.desc "is_upper_case flg."
|
145
|
+
a.klass String
|
146
|
+
a.required
|
147
|
+
a.default_value "false"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
field :range do |f|
|
152
|
+
f.desc "range"
|
153
|
+
f.args :range do |a|
|
154
|
+
a.desc "range."
|
155
|
+
a.klass Array
|
156
|
+
a.default_value (1..15).to_a
|
157
|
+
end
|
158
|
+
end
|
159
|
+
~~~
|
160
|
+
|
161
|
+
### Steps: 'dslable generate'. generate template.
|
162
|
+
~~~bash
|
163
|
+
dslable generate
|
164
|
+
~~~
|
165
|
+
|
166
|
+
FileTree
|
167
|
+
~~~
|
168
|
+
fizz_buzz_gem
|
169
|
+
│ .gitignore
|
170
|
+
│ .rspec
|
171
|
+
│ fizz_buzz_gem.gemspec
|
172
|
+
│ Gemfile
|
173
|
+
│ LICENSE.txt
|
174
|
+
│ Rakefile
|
175
|
+
│ README.md
|
176
|
+
│
|
177
|
+
├─.git
|
178
|
+
├─bin
|
179
|
+
│ fizzbuzzgem
|
180
|
+
│
|
181
|
+
├─lib
|
182
|
+
│ │ fizz_buzz_gem_core.rb
|
183
|
+
│ │ fizz_buzz_gem_dsl.rb
|
184
|
+
│ │ fizz_buzz_gem_dsl_model.rb
|
185
|
+
│ │
|
186
|
+
│ └─fizz_buzz_gem
|
187
|
+
│ version.rb
|
188
|
+
│
|
189
|
+
└─spec
|
190
|
+
fizz_buzz_gem_core_spec.rb
|
191
|
+
spec_helper.rb
|
192
|
+
~~~
|
193
|
+
|
194
|
+
Gemfile Template
|
195
|
+
~~~ruby
|
196
|
+
source 'https://rubygems.org'
|
197
|
+
|
198
|
+
gemspec
|
199
|
+
gem "rspec", "~> 2.14.1"
|
200
|
+
gem "thor", "~> 0.18.1"
|
201
|
+
gem "simplecov", "~> 0.8.2"
|
202
|
+
gem "activesupport", "~> 4.0.1"
|
203
|
+
gem "activemodel", "~> 4.0.2"
|
204
|
+
~~~
|
205
|
+
|
206
|
+
core source Template
|
207
|
+
fizz_buzz_gem_core.rb
|
208
|
+
~~~ruby
|
209
|
+
# encoding: utf-8
|
210
|
+
require 'fizz_buzz_gem_dsl'
|
211
|
+
|
212
|
+
module FizzBuzzGem
|
213
|
+
# FizzBuzzGem Core
|
214
|
+
class Core
|
215
|
+
FIZZ_BUZZ_GEM_FILE = "Fizzbuzzgemfile"
|
216
|
+
FIZZ_BUZZ_GEM_TEMPLATE =<<-EOS
|
217
|
+
# encoding: utf-8
|
218
|
+
|
219
|
+
# is_upper_case
|
220
|
+
# is_upper_case is required
|
221
|
+
# is_upper_case allow only String
|
222
|
+
# is_upper_case's default value => "false"
|
223
|
+
is_upper_case "false"
|
224
|
+
|
225
|
+
# range
|
226
|
+
# range allow only Array
|
227
|
+
# range's default value => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
228
|
+
range [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
229
|
+
|
230
|
+
EOS
|
231
|
+
|
232
|
+
#== generate Fizzbuzzgemfile to current directory.
|
233
|
+
def init
|
234
|
+
File.open(FIZZ_BUZZ_GEM_FILE, "w") {|f|f.puts FIZZ_BUZZ_GEM_TEMPLATE}
|
235
|
+
end
|
236
|
+
|
237
|
+
#== TODO: write your gem's specific contents
|
238
|
+
def execute
|
239
|
+
src = read_dsl
|
240
|
+
dsl = FizzBuzzGem::Dsl.new
|
241
|
+
dsl.instance_eval src
|
242
|
+
|
243
|
+
# TODO: implement your gem's specific logic
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
private
|
248
|
+
def read_dsl
|
249
|
+
File.open(FIZZ_BUZZ_GEM_FILE) {|f|f.read}
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
~~~
|
254
|
+
|
255
|
+
dsl source Template
|
256
|
+
fizz_buzz_gem_dsl.rb
|
257
|
+
~~~ruby
|
258
|
+
# encoding: utf-8
|
259
|
+
require 'fizz_buzz_gem_dsl_model'
|
260
|
+
|
261
|
+
module FizzBuzzGem
|
262
|
+
class Dsl
|
263
|
+
attr_accessor :fizz_buzz_gem
|
264
|
+
|
265
|
+
[:is_upper_case].each do |f|
|
266
|
+
define_method f do |value|
|
267
|
+
eval "@fizz_buzz_gem.#{f.to_s} = '#{value}'", binding
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
[:range].each do |f|
|
272
|
+
define_method f do |value|
|
273
|
+
eval "@fizz_buzz_gem.#{f.to_s} = #{value}", binding
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def initialize
|
278
|
+
@fizz_buzz_gem = FizzBuzzGem::DslModel.new
|
279
|
+
@fizz_buzz_gem.is_upper_case = 'false'
|
280
|
+
@fizz_buzz_gem.range = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
~~~
|
285
|
+
|
286
|
+
dsl model source Template
|
287
|
+
fizz_buzz_gem_dsl_model.rb
|
288
|
+
~~~ruby
|
289
|
+
# encoding: utf-8
|
290
|
+
require 'active_model'
|
291
|
+
|
292
|
+
module FizzBuzzGem
|
293
|
+
class DslModel
|
294
|
+
include ActiveModel::Model
|
295
|
+
|
296
|
+
# is_upper_case
|
297
|
+
attr_accessor :is_upper_case
|
298
|
+
validates :is_upper_case, :presence => true
|
299
|
+
|
300
|
+
# range
|
301
|
+
attr_accessor :range
|
302
|
+
|
303
|
+
end
|
304
|
+
end
|
305
|
+
~~~
|
306
|
+
|
307
|
+
bin source Template
|
308
|
+
~~~ruby
|
309
|
+
#!/usr/bin/env ruby
|
310
|
+
# encoding: utf-8
|
311
|
+
|
312
|
+
require "fizz_buzz_gem_core"
|
313
|
+
require "fizz_buzz_gem/version"
|
314
|
+
require "thor"
|
315
|
+
|
316
|
+
module FizzBuzzGem
|
317
|
+
#= FizzBuzzGem CLI
|
318
|
+
class CLI < Thor
|
319
|
+
class_option :help, :type => :boolean, :aliases => '-h', :desc => 'help message.'
|
320
|
+
class_option :version, :type => :boolean, :desc => 'version'
|
321
|
+
|
322
|
+
desc "execute", "TODO: write your desc"
|
323
|
+
def execute
|
324
|
+
FizzBuzzGem::Core.new.execute
|
325
|
+
end
|
326
|
+
|
327
|
+
desc "init", "generate Fizzbuzzgemfile"
|
328
|
+
def init
|
329
|
+
FizzBuzzGem::Core.new.init
|
330
|
+
end
|
331
|
+
|
332
|
+
desc "version", "version"
|
333
|
+
def version
|
334
|
+
p FizzBuzzGem::VERSION
|
335
|
+
end
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
FizzBuzzGem::CLI.start(ARGV)
|
340
|
+
~~~
|
341
|
+
|
342
|
+
spec source Template
|
343
|
+
~~~ruby
|
344
|
+
# encoding: utf-8
|
345
|
+
require "spec_helper"
|
346
|
+
require "fizz_buzz_gem_core"
|
347
|
+
|
348
|
+
describe FizzBuzzGem::Core do
|
349
|
+
|
350
|
+
context :init do
|
351
|
+
cases = [
|
352
|
+
{
|
353
|
+
case_no: 1,
|
354
|
+
case_title: "case_title",
|
355
|
+
expected: "expected",
|
356
|
+
|
357
|
+
},
|
358
|
+
]
|
359
|
+
|
360
|
+
cases.each do |c|
|
361
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
362
|
+
begin
|
363
|
+
case_before c
|
364
|
+
|
365
|
+
# -- given --
|
366
|
+
fizz_buzz_gem_core = FizzBuzzGem::Core.new
|
367
|
+
|
368
|
+
# -- when --
|
369
|
+
# TODO: implement execute code
|
370
|
+
# actual = fizz_buzz_gem_core.init
|
371
|
+
|
372
|
+
# -- then --
|
373
|
+
# TODO: implement assertion code
|
374
|
+
# ret = expect(actual).to eq(c[:expected])
|
375
|
+
ensure
|
376
|
+
case_after c
|
377
|
+
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def case_before(c)
|
382
|
+
# implement each case before
|
383
|
+
|
384
|
+
end
|
385
|
+
|
386
|
+
def case_after(c)
|
387
|
+
# implement each case after
|
388
|
+
end
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
context :execute do
|
393
|
+
cases = [
|
394
|
+
{
|
395
|
+
case_no: 1,
|
396
|
+
case_title: "case_title",
|
397
|
+
expected: "expected",
|
398
|
+
|
399
|
+
},
|
400
|
+
]
|
401
|
+
|
402
|
+
cases.each do |c|
|
403
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
404
|
+
begin
|
405
|
+
case_before c
|
406
|
+
|
407
|
+
# -- given --
|
408
|
+
fizz_buzz_gem_core = FizzBuzzGem::Core.new
|
409
|
+
|
410
|
+
# -- when --
|
411
|
+
# TODO: implement execute code
|
412
|
+
# actual = fizz_buzz_gem_core.execute
|
413
|
+
|
414
|
+
# -- then --
|
415
|
+
# TODO: implement assertion code
|
416
|
+
# ret = expect(actual).to eq(c[:expected])
|
417
|
+
ensure
|
418
|
+
case_after c
|
419
|
+
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
def case_before(c)
|
424
|
+
# implement each case before
|
425
|
+
|
426
|
+
end
|
427
|
+
|
428
|
+
def case_after(c)
|
429
|
+
# implement each case after
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
end
|
435
|
+
~~~
|
436
|
+
|
437
|
+
### Steps: implement 'fizz_buzz_core_spec.rb' manually. (TDD step)
|
438
|
+
~~~ruby
|
439
|
+
# encoding: utf-8
|
440
|
+
require "spec_helper"
|
441
|
+
require "fizz_buzz_gem_core"
|
442
|
+
|
443
|
+
describe FizzBuzzGem::Core do
|
444
|
+
|
445
|
+
context :init do
|
446
|
+
cases = [
|
447
|
+
{
|
448
|
+
case_no: 1,
|
449
|
+
case_title: "output template",
|
450
|
+
expected: FizzBuzzGem::Core::FIZZ_BUZZ_GEM_TEMPLATE
|
451
|
+
},
|
452
|
+
]
|
453
|
+
|
454
|
+
cases.each do |c|
|
455
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
456
|
+
begin
|
457
|
+
case_before c
|
458
|
+
|
459
|
+
# -- given --
|
460
|
+
fizz_buzz_core = FizzBuzzGem::Core.new
|
461
|
+
|
462
|
+
# -- when --
|
463
|
+
fizz_buzz_core.init
|
464
|
+
|
465
|
+
# -- then --
|
466
|
+
actual = File.read(FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE)
|
467
|
+
expect(actual).to eq(c[:expected])
|
468
|
+
ensure
|
469
|
+
case_after c
|
470
|
+
|
471
|
+
end
|
472
|
+
end
|
473
|
+
|
474
|
+
def case_before(c)
|
475
|
+
# implement each case before
|
476
|
+
end
|
477
|
+
|
478
|
+
def case_after(c)
|
479
|
+
# implement each case after
|
480
|
+
FileUtils.rm_rf(FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE) if File.exists? FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
context :execute do
|
486
|
+
FIZZBUZZGEMFILE_CASE1 =<<-EOS
|
487
|
+
# encoding: utf-8
|
488
|
+
is_upper_case "false"
|
489
|
+
EOS
|
490
|
+
|
491
|
+
FIZZBUZZGEMFILE_CASE2 =<<-EOS
|
492
|
+
# encoding: utf-8
|
493
|
+
is_upper_case "true"
|
494
|
+
range (1..16).to_a
|
495
|
+
EOS
|
496
|
+
|
497
|
+
cases = [
|
498
|
+
{
|
499
|
+
case_no: 1,
|
500
|
+
case_title: "upper false, range default",
|
501
|
+
fizzgemfile: FIZZBUZZGEMFILE_CASE1,
|
502
|
+
expected: "1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz",
|
503
|
+
},
|
504
|
+
{
|
505
|
+
case_no: 2,
|
506
|
+
case_title: "upper true, range 1..16",
|
507
|
+
fizzgemfile: FIZZBUZZGEMFILE_CASE2,
|
508
|
+
expected: "1 2 FIZZ 4 BUZZ FIZZ 7 8 FIZZ BUZZ 11 FIZZ 13 14 FIZZBUZZ 16",
|
509
|
+
},
|
510
|
+
]
|
511
|
+
|
512
|
+
cases.each do |c|
|
513
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
514
|
+
begin
|
515
|
+
case_before c
|
516
|
+
|
517
|
+
# -- given --
|
518
|
+
fizz_buzz_gem_core = FizzBuzzGem::Core.new
|
519
|
+
|
520
|
+
# -- when --
|
521
|
+
actual = fizz_buzz_gem_core.execute
|
522
|
+
|
523
|
+
# -- then --
|
524
|
+
ret = expect(actual).to eq(c[:expected])
|
525
|
+
ensure
|
526
|
+
case_after c
|
527
|
+
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
531
|
+
def case_before(c)
|
532
|
+
# implement each case before
|
533
|
+
File.open(FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE, "w") {|f|f.puts c[:fizzgemfile]}
|
534
|
+
end
|
535
|
+
|
536
|
+
def case_after(c)
|
537
|
+
# implement each case after
|
538
|
+
FileUtils.rm_rf(FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE) if File.exists? FizzBuzzGem::Core::FIZZ_BUZZ_GEM_FILE
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
end
|
544
|
+
~~~
|
545
|
+
|
546
|
+
### Steps: execute 'rspec' and fail.
|
547
|
+
~~~bash
|
548
|
+
$ rspec
|
549
|
+
Run options: include {:focus=>true}
|
550
|
+
|
551
|
+
All examples were filtered out; ignoring {:focus=>true}
|
552
|
+
.FF
|
553
|
+
|
554
|
+
Failures:
|
555
|
+
|
556
|
+
1) FizzBuzzGem::Core execute |case_no=1|case_title=upper false, range default
|
557
|
+
Failure/Error: ret = expect(actual).to eq(c[:expected])
|
558
|
+
|
559
|
+
expected: "1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz"
|
560
|
+
got: "false"
|
561
|
+
|
562
|
+
(compared using ==)
|
563
|
+
# ./spec/fizz_buzz_gem_core_spec.rb:86:in `block (4 levels) in <top (required)>'
|
564
|
+
|
565
|
+
2) FizzBuzzGem::Core execute |case_no=2|case_title=upper true, range 1..16
|
566
|
+
Failure/Error: ret = expect(actual).to eq(c[:expected])
|
567
|
+
|
568
|
+
expected: "1 2 FIZZ 4 BUZZ FIZZ 7 8 FIZZ BUZZ 11 FIZZ 13 14 FIZZBUZZ 16"
|
569
|
+
got: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
|
570
|
+
|
571
|
+
(compared using ==)
|
572
|
+
# ./spec/fizz_buzz_gem_core_spec.rb:86:in `block (4 levels) in <top (required)>'
|
573
|
+
|
574
|
+
Finished in 0.01 seconds
|
575
|
+
3 examples, 2 failures
|
576
|
+
|
577
|
+
Failed examples:
|
578
|
+
|
579
|
+
rspec ./spec/fizz_buzz_gem_core_spec.rb:75 # FizzBuzzGem::Core execute |case_no=1|case_title=upper false, range default
|
580
|
+
rspec ./spec/fizz_buzz_gem_core_spec.rb:75 # FizzBuzzGem::Core execute |case_no=2|case_title=upper true, range 1..16
|
581
|
+
|
582
|
+
Randomized with seed 63051
|
583
|
+
~~~
|
584
|
+
|
585
|
+
### Steps: implement 'fizz_buzz_core.rb' manually.
|
586
|
+
~~~ruby
|
587
|
+
# encoding: utf-8
|
588
|
+
require 'fizz_buzz_gem_dsl'
|
589
|
+
|
590
|
+
module FizzBuzzGem
|
591
|
+
# FizzBuzzGem Core
|
592
|
+
class Core
|
593
|
+
FIZZ_BUZZ_GEM_FILE = "Fizzbuzzgemfile"
|
594
|
+
FIZZ_BUZZ_GEM_TEMPLATE =<<-EOS
|
595
|
+
# encoding: utf-8
|
596
|
+
|
597
|
+
# is_upper_case
|
598
|
+
# is_upper_case is required
|
599
|
+
# is_upper_case allow only String
|
600
|
+
# is_upper_case's default value => "false"
|
601
|
+
is_upper_case "false"
|
602
|
+
|
603
|
+
# range
|
604
|
+
# range allow only Array
|
605
|
+
# range's default value => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
606
|
+
range [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
607
|
+
|
608
|
+
EOS
|
609
|
+
|
610
|
+
#== generate Fizzbuzzgemfile to current directory.
|
611
|
+
def init
|
612
|
+
File.open(FIZZ_BUZZ_GEM_FILE, "w") {|f|f.puts FIZZ_BUZZ_GEM_TEMPLATE}
|
613
|
+
end
|
614
|
+
|
615
|
+
#== TODO: write your gem's specific contents
|
616
|
+
def execute
|
617
|
+
src = read_dsl
|
618
|
+
dsl = FizzBuzzGem::Dsl.new
|
619
|
+
dsl.instance_eval src
|
620
|
+
output_fizzbuzz(dsl)
|
621
|
+
end
|
622
|
+
|
623
|
+
private
|
624
|
+
def read_dsl
|
625
|
+
File.open(FIZZ_BUZZ_GEM_FILE) {|f|f.read}
|
626
|
+
end
|
627
|
+
|
628
|
+
def output_fizzbuzz(dsl)
|
629
|
+
ret = []
|
630
|
+
dsl.fizz_buzz_gem.range.each do |i|
|
631
|
+
if i % 15 == 0
|
632
|
+
ret << 'fizzbuzz'
|
633
|
+
elsif i % 3 == 0
|
634
|
+
ret << 'fizz'
|
635
|
+
elsif i % 5 == 0
|
636
|
+
ret << 'buzz'
|
637
|
+
else
|
638
|
+
ret << i
|
639
|
+
end
|
640
|
+
end
|
641
|
+
output = ret.join(' ')
|
642
|
+
dsl.fizz_buzz_gem.is_upper_case == 'true' ? output.upcase : output
|
643
|
+
end
|
644
|
+
end
|
645
|
+
end
|
646
|
+
~~~
|
647
|
+
|
648
|
+
### Steps: execute rspec
|
649
|
+
~~~bash
|
650
|
+
$rspec
|
651
|
+
Run options: include {:focus=>true}
|
652
|
+
|
653
|
+
All examples were filtered out; ignoring {:focus=>true}
|
654
|
+
...
|
655
|
+
|
656
|
+
Finished in 0.011 seconds
|
657
|
+
3 examples, 0 failures
|
658
|
+
|
659
|
+
Randomized with seed 29906
|
660
|
+
~~~
|
661
|
+
|
662
|
+
### Steps: Edit fizz_buzz_gem.gemspec manually
|
663
|
+
~~~ruby
|
664
|
+
# coding: utf-8
|
665
|
+
lib = File.expand_path('../lib', __FILE__)
|
666
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
667
|
+
require 'fizz_buzz_gem/version'
|
668
|
+
|
669
|
+
Gem::Specification.new do |spec|
|
670
|
+
spec.name = "fizz_buzz_gem"
|
671
|
+
spec.version = FizzBuzzGem::VERSION
|
672
|
+
spec.authors = ["yourname"]
|
673
|
+
spec.email = ["your@mail.address"]
|
674
|
+
spec.description = %q{fizz buzz gem}
|
675
|
+
spec.summary = %q{fizz buzz gem}
|
676
|
+
spec.homepage = ""
|
677
|
+
spec.license = "MIT"
|
678
|
+
|
679
|
+
spec.files = `git ls-files`.split($/)
|
680
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
681
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
682
|
+
spec.require_paths = ["lib"]
|
683
|
+
|
684
|
+
spec.add_runtime_dependency "thor", "~> 0.18.1"
|
685
|
+
spec.add_runtime_dependency "activesupport", "~> 4.0.1"
|
686
|
+
spec.add_runtime_dependency "activemodel", "~> 4.0.2"
|
687
|
+
|
688
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
689
|
+
spec.add_development_dependency "rake"
|
690
|
+
spec.add_development_dependency "rspec", "~> 2.14.1"
|
691
|
+
spec.add_development_dependency "simplecov", "~> 0.8.2"
|
692
|
+
end
|
693
|
+
~~~
|
694
|
+
|
695
|
+
### Steps: Edit bin bin/fizzbuzzgem manually
|
696
|
+
~~~ruby
|
697
|
+
#!/usr/bin/env ruby
|
698
|
+
# encoding: utf-8
|
699
|
+
|
700
|
+
require "fizz_buzz_gem_core"
|
701
|
+
require "fizz_buzz_gem/version"
|
702
|
+
require "thor"
|
703
|
+
|
704
|
+
module FizzBuzzGem
|
705
|
+
#= FizzBuzzGem CLI
|
706
|
+
class CLI < Thor
|
707
|
+
class_option :help, :type => :boolean, :aliases => '-h', :desc => 'help message.'
|
708
|
+
class_option :version, :type => :boolean, :desc => 'version'
|
709
|
+
|
710
|
+
desc "execute", "execute fizz buzz"
|
711
|
+
def execute
|
712
|
+
puts FizzBuzzGem::Core.new.execute
|
713
|
+
end
|
714
|
+
|
715
|
+
desc "init", "generate Fizzbuzzgemfile"
|
716
|
+
def init
|
717
|
+
FizzBuzzGem::Core.new.init
|
718
|
+
end
|
719
|
+
|
720
|
+
desc "version", "version"
|
721
|
+
def version
|
722
|
+
p FizzBuzzGem::VERSION
|
723
|
+
end
|
724
|
+
end
|
725
|
+
end
|
726
|
+
|
727
|
+
FizzBuzzGem::CLI.start(ARGV)
|
728
|
+
~~~
|
729
|
+
|
730
|
+
### Steps: Edit README.md manually
|
731
|
+
~~~ruby
|
732
|
+
# FizzBuzzGem
|
733
|
+
|
734
|
+
FizzBuzzApplication summary.
|
735
|
+
|
736
|
+
## Installation
|
737
|
+
|
738
|
+
Add this line to your application's Gemfile:
|
739
|
+
|
740
|
+
gem 'fizz_buzz_gem'
|
741
|
+
|
742
|
+
And then execute:
|
743
|
+
|
744
|
+
$ bundle
|
745
|
+
|
746
|
+
Or install it yourself as:
|
747
|
+
|
748
|
+
$ gem install fizz_buzz_gem
|
749
|
+
|
750
|
+
## Usage
|
751
|
+
|
752
|
+
usage...
|
753
|
+
|
754
|
+
## Contributing
|
755
|
+
|
756
|
+
1. Fork it
|
757
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
758
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
759
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
760
|
+
5. Create new Pull Request
|
761
|
+
~~~
|
762
|
+
|
763
|
+
### Steps: git add, commit
|
764
|
+
~~~bash
|
765
|
+
$ git add -A
|
766
|
+
$ git add -u
|
767
|
+
$ git commit -m "first commit"
|
768
|
+
~~~
|
769
|
+
|
770
|
+
### Steps: rake install
|
771
|
+
~~~bash
|
772
|
+
$ rake install
|
773
|
+
fizz_buzz_gem 0.0.1 built to pkg/fizz_buzz_gem-0.0.1.gem.
|
774
|
+
fizz_buzz_gem (0.0.1) installed.
|
775
|
+
~~~
|
776
|
+
|
777
|
+
### Steps: test use fizzbuzzgem
|
778
|
+
show help
|
779
|
+
~~~bash
|
780
|
+
$ fizzbuzzgem
|
781
|
+
Commands:
|
782
|
+
fizzbuzzgem execute # TODO: write your desc
|
783
|
+
fizzbuzzgem help [COMMAND] # Describe available commands or one specific c...
|
784
|
+
fizzbuzzgem init # generate Fizzbuzzgemfile
|
785
|
+
fizzbuzzgem version # version
|
786
|
+
|
787
|
+
Options:
|
788
|
+
-h, [--help] # help message.
|
789
|
+
[--version] # version
|
790
|
+
~~~
|
791
|
+
|
792
|
+
fizzbuzzgem init
|
793
|
+
~~~bash
|
794
|
+
$ fizzbuzzgem init
|
795
|
+
$ ls
|
796
|
+
Fizzbuzzgemfile*
|
797
|
+
$ cat Fizzbuzzgemfile
|
798
|
+
# encoding: utf-8
|
799
|
+
|
800
|
+
# is_upper_case
|
801
|
+
# is_upper_case is required
|
802
|
+
# is_upper_case allow only String
|
803
|
+
# is_upper_case's default value => "false"
|
804
|
+
is_upper_case "false"
|
805
|
+
|
806
|
+
# range
|
807
|
+
# range allow only Array
|
808
|
+
# range's default value => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
809
|
+
range [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
810
|
+
~~~
|
811
|
+
|
812
|
+
edit Fizzbuzzgemfile manually
|
813
|
+
~~~ruby
|
814
|
+
# encoding: utf-8
|
815
|
+
is_upper_case "true"
|
816
|
+
range (1..16).to_a
|
817
|
+
~~~
|
818
|
+
|
819
|
+
execute 'fizzbuzzgem execute'
|
820
|
+
~~~bash
|
821
|
+
$ fizzbuzzgem execute
|
822
|
+
1 2 FIZZ 4 BUZZ FIZZ 7 8 FIZZ BUZZ 11 FIZZ 13 14 FIZZBUZZ 16
|
823
|
+
~~~
|
824
|
+
|
825
|
+
re-edit Fizzbuzzgemfile manually
|
826
|
+
~~~ruby
|
827
|
+
# encoding: utf-8
|
828
|
+
is_upper_case "false"
|
829
|
+
~~~
|
830
|
+
|
831
|
+
execute 'fizzbuzzgem execute'
|
832
|
+
~~~bash
|
833
|
+
$ fizzbuzzgem e
|
834
|
+
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz
|
835
|
+
~~~
|
836
|
+
|
837
|
+
### Steps: if test using is ok, release gem to RubyGems
|
838
|
+
~~~csh
|
839
|
+
$ rake release
|
840
|
+
~~~
|
841
|
+
|
842
|
+
## Notes
|
843
|
+
* this gem uses 'bundle gem' command to create gem template. (bundler gem).
|
844
|
+
* this gem uses 'rspec --init' command to create RSpec template (rspec gem).
|
845
|
+
* this gem uses 'piccolo' command to create RSpec spec template (rspec_piccolo gem).
|
846
|
+
|
847
|
+
## History
|
848
|
+
* version 0.0.1 : first release.
|
849
|
+
|
850
|
+
## Contributing
|
851
|
+
|
852
|
+
1. Fork it
|
853
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
854
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
855
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
856
|
+
5. Create new Pull Request
|