rspec_piccolo 0.0.6 → 0.0.7
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/README.md +30 -15
- data/bin/piccolo +31 -30
- data/lib/rspec_piccolo.rb +227 -158
- data/lib/rspec_piccolo/version.rb +3 -3
- data/spec/rspec_piccolo_spec.rb +837 -747
- data/spec/spec_helper.rb +8 -8
- data/test.txt +1 -0
- metadata +15 -14
data/README.md
CHANGED
@@ -24,7 +24,7 @@ You have to execute these commands in your project root directory.
|
|
24
24
|
piccolo execute SomeClass some_class_place
|
25
25
|
~~~
|
26
26
|
|
27
|
-
Result, spec/
|
27
|
+
Result, spec/some_class_place_spec.rb
|
28
28
|
~~~ruby
|
29
29
|
# encoding: utf-8
|
30
30
|
require "spec_helper"
|
@@ -40,7 +40,7 @@ end
|
|
40
40
|
piccolo execute SomeModule::SomeClass some_directory/some_class_place
|
41
41
|
~~~
|
42
42
|
|
43
|
-
Result, spec/some_directory/
|
43
|
+
Result, spec/some_directory/some_class_place_spec.rb
|
44
44
|
~~~ruby
|
45
45
|
# encoding: utf-8
|
46
46
|
require "spec_helper"
|
@@ -56,7 +56,7 @@ end
|
|
56
56
|
piccolo execute SomeClass some_class_place method1 method2
|
57
57
|
~~~
|
58
58
|
|
59
|
-
Result, spec/
|
59
|
+
Result, spec/some_class_place_spec.rb
|
60
60
|
~~~ruby
|
61
61
|
# encoding: utf-8
|
62
62
|
require "spec_helper"
|
@@ -140,7 +140,31 @@ describe SomeClass do
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
143
|
+
end
|
144
|
+
~~~
|
145
|
+
|
146
|
+
### Case class_name, class_place, method_names with product code
|
147
|
+
~~~bash
|
148
|
+
piccolo execute SomeClass some_class_place method1 method2 -p
|
149
|
+
~~~
|
150
|
+
|
151
|
+
Result, spec/some_class_place_spec.rb
|
152
|
+
~~~ruby
|
153
|
+
# omission
|
154
|
+
~~~
|
155
|
+
|
156
|
+
Result, lib/some_class_place.rb
|
157
|
+
~~~ruby
|
158
|
+
# encoding: utf-8
|
159
|
+
|
160
|
+
class SomeClass
|
161
|
+
def method1
|
162
|
+
# TOOD: implement your code
|
163
|
+
end
|
143
164
|
|
165
|
+
def method2
|
166
|
+
# TOOD: implement your code
|
167
|
+
end
|
144
168
|
end
|
145
169
|
~~~
|
146
170
|
|
@@ -149,7 +173,7 @@ end
|
|
149
173
|
piccolo execute SomeClass some_class_place instance_method class_method@c
|
150
174
|
~~~
|
151
175
|
|
152
|
-
Result, spec/
|
176
|
+
Result, spec/some_class_place_spec.rb
|
153
177
|
~~~ruby
|
154
178
|
$ cat spec/some_class_place_spec.rb
|
155
179
|
# encoding: utf-8
|
@@ -164,7 +188,6 @@ describe SomeClass do
|
|
164
188
|
case_no: 1,
|
165
189
|
case_title: "case_title",
|
166
190
|
expected: "expected",
|
167
|
-
|
168
191
|
},
|
169
192
|
]
|
170
193
|
|
@@ -185,13 +208,11 @@ describe SomeClass do
|
|
185
208
|
# ret = expect(actual).to eq(c[:expected])
|
186
209
|
ensure
|
187
210
|
case_after c
|
188
|
-
|
189
211
|
end
|
190
212
|
end
|
191
213
|
|
192
214
|
def case_before(c)
|
193
215
|
# implement each case before
|
194
|
-
|
195
216
|
end
|
196
217
|
|
197
218
|
def case_after(c)
|
@@ -206,7 +227,6 @@ describe SomeClass do
|
|
206
227
|
case_no: 1,
|
207
228
|
case_title: "case_title",
|
208
229
|
expected: "expected",
|
209
|
-
|
210
230
|
},
|
211
231
|
]
|
212
232
|
|
@@ -224,16 +244,14 @@ describe SomeClass do
|
|
224
244
|
|
225
245
|
# -- then --
|
226
246
|
# TODO: implement assertion code
|
227
|
-
#
|
247
|
+
# expect(actual).to eq(c[:expected])
|
228
248
|
ensure
|
229
249
|
case_after c
|
230
|
-
|
231
250
|
end
|
232
251
|
end
|
233
252
|
|
234
253
|
def case_before(c)
|
235
254
|
# implement each case before
|
236
|
-
|
237
255
|
end
|
238
256
|
|
239
257
|
def case_after(c)
|
@@ -241,7 +259,6 @@ describe SomeClass do
|
|
241
259
|
end
|
242
260
|
end
|
243
261
|
end
|
244
|
-
|
245
262
|
end
|
246
263
|
~~~
|
247
264
|
|
@@ -376,7 +393,6 @@ describe Hoge do
|
|
376
393
|
end
|
377
394
|
end
|
378
395
|
end
|
379
|
-
|
380
396
|
end
|
381
397
|
~~~
|
382
398
|
|
@@ -499,7 +515,6 @@ describe Hoge do
|
|
499
515
|
end
|
500
516
|
end
|
501
517
|
end
|
502
|
-
|
503
518
|
end
|
504
519
|
~~~
|
505
520
|
|
@@ -720,7 +735,6 @@ describe FizzBuzz do
|
|
720
735
|
end
|
721
736
|
end
|
722
737
|
end
|
723
|
-
|
724
738
|
end
|
725
739
|
~~~
|
726
740
|
|
@@ -737,6 +751,7 @@ Finished in 0.0045 seconds
|
|
737
751
|
~~~
|
738
752
|
|
739
753
|
## History
|
754
|
+
* version 0.0.7 : add product code generation option .delete unuse empty-line, unuse ret variable.
|
740
755
|
* version 0.0.6 : add class method generation.
|
741
756
|
* version 0.0.5 : add reportable option.
|
742
757
|
* version 0.0.4 : you can get multi level directory spec case.
|
data/bin/piccolo
CHANGED
@@ -1,30 +1,31 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'rspec_piccolo/version'
|
3
|
-
require 'rspec_piccolo'
|
4
|
-
require
|
5
|
-
|
6
|
-
module RSpecPiccolo
|
7
|
-
|
8
|
-
class CLI < Thor
|
9
|
-
class_option :help, :
|
10
|
-
class_option :version, :
|
11
|
-
class_option :reportable, :
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rspec_piccolo/version'
|
3
|
+
require 'rspec_piccolo'
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
module RSpecPiccolo
|
7
|
+
# = RSpecPiccolo CLI
|
8
|
+
class CLI < Thor
|
9
|
+
class_option :help, type: :boolean, aliases: 'h', desc: 'help message.'
|
10
|
+
class_option :version, type: :boolean, aliases: 'v', desc: 'version'
|
11
|
+
class_option :reportable, type: :boolean, aliases: 'r', desc: 'reportable'
|
12
|
+
class_option :productcode, type: :boolean, aliases: 'p', desc: 'output with productcode'
|
13
|
+
default_task :execute
|
14
|
+
|
15
|
+
desc 'execute', 'generate rspec spec_file with list_cases'
|
16
|
+
def execute(*args)
|
17
|
+
class_name = args[0]
|
18
|
+
class_path = args[1]
|
19
|
+
method_names = args[2..-1] if args.size > 2
|
20
|
+
|
21
|
+
RSpecPiccolo::Core.new.generate class_name, class_path, method_names, options
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'version', 'version'
|
25
|
+
def version
|
26
|
+
p RSpecPiccolo::VERSION
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpecPiccolo::CLI.start(ARGV)
|
data/lib/rspec_piccolo.rb
CHANGED
@@ -1,158 +1,227 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require 'active_support/inflector'
|
4
|
-
require 'fileutils'
|
5
|
-
|
6
|
-
module RSpecPiccolo
|
7
|
-
|
8
|
-
class Core
|
9
|
-
|
10
|
-
CLASS_TEMPLATE
|
11
|
-
# encoding: utf-8
|
12
|
-
require "spec_helper"
|
13
|
-
require "<%=class_path%>"
|
14
|
-
|
15
|
-
describe <%=class_name%> do
|
16
|
-
<%=reportable_prepare%>
|
17
|
-
<%=methods_template%>
|
18
|
-
end
|
19
|
-
EOS
|
20
|
-
|
21
|
-
REPORTABLE_PREPARE
|
22
|
-
REPORT = "rspec_report"
|
23
|
-
DIRS = File.path(__FILE__).gsub(/^.*\\/spec\\//, '').gsub(File.basename(__FILE__), '')
|
24
|
-
OUT_DIR = "./#\{REPORT}/#\{DIRS}"
|
25
|
-
REPORT_NAME = report_name = File.basename(__FILE__, ".rb")
|
26
|
-
REPORT_FILE = "#\{OUT_DIR}#\{REPORT_NAME}.tsv"
|
27
|
-
|
28
|
-
mkspec_report = Proc.new do
|
29
|
-
Dir.mkdir(REPORT) unless File.exists?(REPORT)
|
30
|
-
FileUtils.mkdir_p(OUT_DIR) unless File.exists?(OUT_DIR)
|
31
|
-
File.open(REPORT_FILE, "w") {|f|f.puts "method\\tcase\\ttitle\\tsuccess\\/failure"}
|
32
|
-
end.call
|
33
|
-
|
34
|
-
success = Proc.new {|c|File.open(REPORT_FILE, "a") {|f|f.puts "\\tsuccess"}}
|
35
|
-
failure = Proc.new {|c|File.open(REPORT_FILE, "a") {|f|f.puts "\\tfailure"}}
|
36
|
-
EOS
|
37
|
-
|
38
|
-
|
39
|
-
METHOD_TEMPLATE
|
40
|
-
context :<%=method_name%> do
|
41
|
-
cases = [
|
42
|
-
{
|
43
|
-
case_no: 1,
|
44
|
-
case_title: "case_title",
|
45
|
-
expected: "expected"
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
#
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
#
|
63
|
-
#
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
sf_hook = ret ? c[:success_hook] : c[:failure_hook]
|
94
|
-
sf_hook.call(c)
|
95
|
-
EOS
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
@contents =
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
end
|
1
|
+
require 'rspec_piccolo/version'
|
2
|
+
require 'erb'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module RSpecPiccolo
|
7
|
+
# RSpecPiccolo Core
|
8
|
+
class Core
|
9
|
+
# RSPec class template
|
10
|
+
CLASS_TEMPLATE = <<-EOS
|
11
|
+
# encoding: utf-8
|
12
|
+
require "spec_helper"
|
13
|
+
require "<%=class_path%>"
|
14
|
+
|
15
|
+
describe <%=class_name%> do
|
16
|
+
<%=reportable_prepare%>
|
17
|
+
<%=methods_template%>
|
18
|
+
end
|
19
|
+
EOS
|
20
|
+
|
21
|
+
REPORTABLE_PREPARE = <<-EOS
|
22
|
+
REPORT = "rspec_report"
|
23
|
+
DIRS = File.path(__FILE__).gsub(/^.*\\/spec\\//, '').gsub(File.basename(__FILE__), '')
|
24
|
+
OUT_DIR = "./#\{REPORT}/#\{DIRS}"
|
25
|
+
REPORT_NAME = report_name = File.basename(__FILE__, ".rb")
|
26
|
+
REPORT_FILE = "#\{OUT_DIR}#\{REPORT_NAME}.tsv"
|
27
|
+
|
28
|
+
mkspec_report = Proc.new do
|
29
|
+
Dir.mkdir(REPORT) unless File.exists?(REPORT)
|
30
|
+
FileUtils.mkdir_p(OUT_DIR) unless File.exists?(OUT_DIR)
|
31
|
+
File.open(REPORT_FILE, "w") {|f|f.puts "method\\tcase\\ttitle\\tsuccess\\/failure"}
|
32
|
+
end.call
|
33
|
+
|
34
|
+
success = Proc.new {|c|File.open(REPORT_FILE, "a") {|f|f.puts "\\tsuccess"}}
|
35
|
+
failure = Proc.new {|c|File.open(REPORT_FILE, "a") {|f|f.puts "\\tfailure"}}
|
36
|
+
EOS
|
37
|
+
|
38
|
+
# RSPec method template
|
39
|
+
METHOD_TEMPLATE = <<-EOS
|
40
|
+
context :<%=method_name%> do
|
41
|
+
cases = [
|
42
|
+
{
|
43
|
+
case_no: 1,
|
44
|
+
case_title: "case_title",
|
45
|
+
expected: "expected",<%=reportable_case%>
|
46
|
+
},
|
47
|
+
]
|
48
|
+
|
49
|
+
cases.each do |c|
|
50
|
+
it "|case_no=\#{c[:case_no]}|case_title=\#{c[:case_title]}" do
|
51
|
+
begin
|
52
|
+
case_before c
|
53
|
+
|
54
|
+
# -- given --
|
55
|
+
<%=given_src%>
|
56
|
+
|
57
|
+
# -- when --
|
58
|
+
# TODO: implement execute code
|
59
|
+
<%=when_src%>
|
60
|
+
|
61
|
+
# -- then --
|
62
|
+
# TODO: implement assertion code
|
63
|
+
# <%=reportable_case_ret%>expect(actual).to eq(c[:expected])
|
64
|
+
ensure
|
65
|
+
case_after c<%=reportable_case_after%>
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def case_before(c)
|
70
|
+
# implement each case before<%=reportable_case_before%>
|
71
|
+
end
|
72
|
+
|
73
|
+
def case_after(c)
|
74
|
+
# implement each case after
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
EOS
|
79
|
+
|
80
|
+
REPORTABLE_CASE = <<-EOS
|
81
|
+
|
82
|
+
success_hook: success,
|
83
|
+
failure_hook: failure
|
84
|
+
EOS
|
85
|
+
|
86
|
+
REPORTABLE_CASE_BEFORE = <<-EOS
|
87
|
+
|
88
|
+
File.open(REPORT_FILE, "a") {|f|f.print "method_name\\t\#{c[:case_no]}\\t\#{c[:case_title]}"}
|
89
|
+
EOS
|
90
|
+
|
91
|
+
REPORTABLE_CASE_AFTER = <<-EOS
|
92
|
+
|
93
|
+
sf_hook = ret ? c[:success_hook] : c[:failure_hook]
|
94
|
+
sf_hook.call(c)
|
95
|
+
EOS
|
96
|
+
|
97
|
+
REPORTABLE_CASE_RET = "ret = "
|
98
|
+
|
99
|
+
PRODUCT_CLASS_TEMPLATE = <<-EOS
|
100
|
+
# encoding: utf-8
|
101
|
+
|
102
|
+
<%=module_start%>
|
103
|
+
<%=module_indent%>class <%=class_name%>
|
104
|
+
<%=methods_template%>
|
105
|
+
<%=module_indent%>end
|
106
|
+
<%=module_end%>
|
107
|
+
EOS
|
108
|
+
|
109
|
+
# initialize
|
110
|
+
def initialize
|
111
|
+
@contents = ''
|
112
|
+
end
|
113
|
+
|
114
|
+
#== generate rspec test case
|
115
|
+
#=== params
|
116
|
+
#- class_name: spec's module+class full name
|
117
|
+
#- class_path: spec's class_path(if you want to create spec/hoge_spec.rb, you should set 'hoge_spec.rb')
|
118
|
+
#- method_names: target class's method list
|
119
|
+
#- options: options
|
120
|
+
def generate(class_name, class_path, method_names, options)
|
121
|
+
validate_class_name class_name
|
122
|
+
validate_class_path class_path
|
123
|
+
methods_template = generate_method_template(class_name, method_names, options)
|
124
|
+
@contents = generate_class_template(class_name, class_path, methods_template.chop, options)
|
125
|
+
create_spec_directory class_path
|
126
|
+
File.open("./spec/#{class_path}_spec.rb", 'w:UTF-8') { |f|f.puts @contents }
|
127
|
+
output_product_code(class_name, class_path, method_names) if output_product? options
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
def validate_class_name(class_name)
|
132
|
+
fail RSpecPiccoloError.new('class_name is not allowed nil value') if class_name.nil?
|
133
|
+
fail RSpecPiccoloError.new('class_name is not allowed empty value') if class_name.empty?
|
134
|
+
end
|
135
|
+
|
136
|
+
def validate_class_path(class_path)
|
137
|
+
fail RSpecPiccoloError.new('class_path is not allowed nil value') if class_path.nil?
|
138
|
+
fail RSpecPiccoloError.new('class_path is not allowed empty value') if class_path.empty?
|
139
|
+
end
|
140
|
+
|
141
|
+
def generate_method_template(class_name, method_names, options)
|
142
|
+
return '' if method_names.nil?
|
143
|
+
reportable_case = options[:reportable] ? REPORTABLE_CASE.chop : ''
|
144
|
+
instance_name = class_name.gsub('::', '_').underscore.downcase
|
145
|
+
method_templates = []
|
146
|
+
method_names.each do |method_name|
|
147
|
+
is_class_method = is_class_method?(method_name)
|
148
|
+
method_name = method_name.gsub('@c', '') if is_class_method
|
149
|
+
given_src = is_class_method ? '# nothing' : "#{instance_name} = #{class_name}.new"
|
150
|
+
when_src = is_class_method ? "# actual = #{class_name}.#{method_name}" : "# actual = #{instance_name}.#{method_name}"
|
151
|
+
reportable_case_before = options[:reportable] ? REPORTABLE_CASE_BEFORE.dup.chop : ''
|
152
|
+
reportable_case_before.gsub!('method_name', method_name)
|
153
|
+
reportable_case_after = options[:reportable] ? REPORTABLE_CASE_AFTER.dup.chop : ''
|
154
|
+
reportable_case_ret = options[:reportable] ? REPORTABLE_CASE_RET.dup : ''
|
155
|
+
method_templates << ERB.new(METHOD_TEMPLATE).result(binding)
|
156
|
+
end
|
157
|
+
method_templates.join("\n")
|
158
|
+
end
|
159
|
+
|
160
|
+
def create_spec_directory(class_path)
|
161
|
+
return if Dir.exists? "./spec/#{File.dirname(class_path)}"
|
162
|
+
FileUtils.mkdir_p("./spec/#{File.dirname(class_path)}")
|
163
|
+
end
|
164
|
+
|
165
|
+
def generate_class_template(class_name, class_path, methods_template, options)
|
166
|
+
reportable_prepare = options[:reportable] ? REPORTABLE_PREPARE : ''
|
167
|
+
ERB.new(CLASS_TEMPLATE).result(binding)
|
168
|
+
end
|
169
|
+
|
170
|
+
def output_product?(options)
|
171
|
+
options[:productcode] ? true : false
|
172
|
+
end
|
173
|
+
|
174
|
+
def output_product_code(class_name, class_path, method_names)
|
175
|
+
has_module = has_module? class_name
|
176
|
+
module_indent = has_module ? ' ' : ''
|
177
|
+
module_name, class_name = get_module_class_names class_name, has_module
|
178
|
+
methods_template = generate_product_method_template(method_names, module_indent)
|
179
|
+
contents = generate_product_class_template(module_name, class_name, class_path, methods_template.chop, module_indent, has_module)
|
180
|
+
create_lib_directory(class_path)
|
181
|
+
File.open("./lib/#{class_path}.rb", 'w:UTF-8') { |f|f.puts contents }
|
182
|
+
end
|
183
|
+
|
184
|
+
def create_lib_directory(class_path)
|
185
|
+
return if Dir.exists? "./lib/#{File.dirname(class_path)}"
|
186
|
+
FileUtils.mkdir_p("./lib/#{File.dirname(class_path)}")
|
187
|
+
end
|
188
|
+
|
189
|
+
def has_module?(class_name)
|
190
|
+
class_name.include?('::') ? true : false
|
191
|
+
end
|
192
|
+
|
193
|
+
def get_module_class_names(class_name, has_module)
|
194
|
+
return '', class_name unless has_module
|
195
|
+
ret = class_name.match /(.*)::(.*)/
|
196
|
+
return ret[1], ret[2]
|
197
|
+
end
|
198
|
+
|
199
|
+
def generate_product_method_template(method_names, module_indent)
|
200
|
+
method_code = []
|
201
|
+
method_names.each do |method_name|
|
202
|
+
method_name = "self.#{method_name.gsub('@c', '')}" if is_class_method?(method_name)
|
203
|
+
method_code << "#{module_indent} def #{method_name}"
|
204
|
+
method_code << "#{module_indent} # TOOD: implement your code"
|
205
|
+
method_code << "#{module_indent} end"
|
206
|
+
method_code << ""
|
207
|
+
end
|
208
|
+
method_code.join("\n")
|
209
|
+
end
|
210
|
+
|
211
|
+
def is_class_method?(method_name)
|
212
|
+
method_name.match(/@c$/) ? true : false
|
213
|
+
end
|
214
|
+
|
215
|
+
def generate_product_class_template(module_name, class_name, class_path, methods_template, module_indent, has_module)
|
216
|
+
module_start = ""
|
217
|
+
module_end = ""
|
218
|
+
if has_module
|
219
|
+
module_start = "module #{module_name}"
|
220
|
+
module_end = "end"
|
221
|
+
end
|
222
|
+
ERB.new(PRODUCT_CLASS_TEMPLATE).result(binding)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
class RSpecPiccoloError < StandardError; end
|
227
|
+
end
|