rspec-kickstarter 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,12 +8,22 @@ require 'rspec_kickstarter/generator'
8
8
 
9
9
  force_write = false
10
10
  dry_run = false
11
+ rails_mode = false
11
12
  spec_dir = './spec'
13
+ delta_path = nil
14
+ full_path = nil
12
15
 
13
16
  opt = OptionParser.new
14
17
  opt.on('-f', 'Create if absent or append to the existing spec') { |_| force_write = true }
18
+ opt.on('--force', '') { |_| force_write = true }
15
19
  opt.on('-n', 'Dry run mode (shows generated code to console)') { |_| dry_run = true }
16
- opt.on('-o VAL', 'Output directory Output directory (default: ./spec)') { |dir| spec_dir = dir }
20
+ opt.on('--dry-run', '') { |_| dry_run = true }
21
+ opt.on('-r', 'Run in Rails mode') { |_| rails_mode = true }
22
+ opt.on('--rails', '') { |_| rails_mode = true }
23
+ opt.on('-o VAL', 'Output directory (default: ./spec)') { |dir| spec_dir = dir }
24
+ opt.on('--output-dir VAL', '') { |dir| spec_dir = dir }
25
+ opt.on('--delta-template VAL', 'Delta template filepath') { |path| delta_path = path }
26
+ opt.on('--full-template VAL', 'Full template filepath') { |path| full_path = path }
17
27
 
18
28
  args = opt.parse(ARGV)
19
29
  dir_or_file = args.first
@@ -25,8 +35,18 @@ unless dir_or_file.match(/.rb$/)
25
35
  dir_or_file = dir_or_file.gsub(/\/$/, '') + "/**/*.rb"
26
36
  end
27
37
 
28
- generator = RSpecKickstarter::Generator.new(spec_dir)
38
+ delta_template = nil
39
+ if ! delta_path.nil? && File.exist?(delta_path)
40
+ delta_template = File.read(delta_path)
41
+ end
42
+ full_template = nil
43
+ if ! full_path.nil? && File.exist?(full_path)
44
+ full_template = File.read(full_path)
45
+ end
46
+
47
+ generator = RSpecKickstarter::Generator.new(spec_dir, delta_template, full_template)
48
+
29
49
  Dir.glob(dir_or_file).each do |file_path|
30
- generator.write_spec(file_path, force_write, dry_run)
50
+ generator.write_spec(file_path, force_write, dry_run, rails_mode)
31
51
  end
32
52
 
@@ -1,21 +1,24 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'erb'
3
4
  require 'rdoc'
4
- require 'rdoc/parser/ruby'
5
- require 'rdoc/options'
6
5
  require 'rdoc/generator'
6
+ require 'rdoc/options'
7
+ require 'rdoc/parser/ruby'
7
8
  require 'rdoc/stats'
8
9
  require 'rspec_kickstarter'
9
10
 
10
11
  class RSpecKickstarter::Generator
11
12
 
12
- attr_accessor :spec_dir
13
+ attr_accessor :spec_dir, :append_templtae, :full_template
13
14
 
14
- def initialize(spec_dir = './spec')
15
+ def initialize(spec_dir = './spec', delta_template = nil, full_template = nil)
15
16
  @spec_dir = spec_dir.gsub(/\/$/, '')
17
+ @delta_template = delta_template
18
+ @full_template = full_template
16
19
  end
17
20
 
18
- def write_spec(file_path, force_write = false, dry_run = false)
21
+ def write_spec(file_path, force_write = false, dry_run = false, rails_mode = false)
19
22
 
20
23
  top_level = get_ruby_parser(file_path).scan
21
24
  c = extract_target_class_or_module(top_level)
@@ -37,19 +40,18 @@ class RSpecKickstarter::Generator
37
40
  if lacking_methods.empty?
38
41
  puts "#{spec_path} skipped."
39
42
  else
40
- additional_spec = <<SPEC
41
- #{lacking_methods.map { |method|
42
- <<EACH_SPEC
43
- # TODO auto-generated
44
- describe '#{method.name}' do
45
- it 'works' do#{get_instantiation_code(c, method)}#{get_params_initialization_code(method)}
46
- result = #{get_method_invocation_code(c, method)}
47
- expect(result).not_to be_nil
48
- end
49
- end
50
- EACH_SPEC
51
- }.join("\n")}
52
- SPEC
43
+ methods_to_generate = lacking_methods
44
+
45
+ if ! @delta_template.nil?
46
+ additional_spec = ERB.new(@delta_template, nil, '-', '_additional_spec_code').result(binding)
47
+ elsif rails_mode && self_path.match(/controllers/)
48
+ additional_spec = ERB.new(RAILS_CONTROLLER_METHODS_PART_TEMPLATE, nil, '-', '_additional_spec_code').result(binding)
49
+ elsif rails_mode && self_path.match(/helpers/)
50
+ additional_spec = ERB.new(RAILS_HELPER_METHODS_PART_TEMPLATE, nil, '-', '_additional_spec_code').result(binding)
51
+ else
52
+ additional_spec = ERB.new(BASIC_METHODS_PART_TEMPLATE, nil, '-', '_additional_spec_code').result(binding)
53
+ end
54
+
53
55
  last_end_not_found = true
54
56
  code = existing_spec.split("\n").reverse.reject { |line|
55
57
  if last_end_not_found
@@ -70,30 +72,19 @@ SPEC
70
72
 
71
73
  else
72
74
  # Create a new spec
73
-
74
75
  self_path = to_string_value_to_require(file_path)
75
- code = <<SPEC
76
- # -*- encoding: utf-8 -*-
77
- require 'spec_helper'
78
- require '#{self_path}'
79
-
80
- describe #{get_complete_class_name(c)} do
76
+ methods_to_generate = c.method_list.select { |m| m.visibility == :public }
77
+
78
+ if ! @full_template.nil?
79
+ code = ERB.new(@full_template, nil, '-', '_new_spec_code').result(binding)
80
+ elsif rails_mode && self_path.match(/controllers/)
81
+ code = ERB.new(RAILS_CONTROLLER_NEW_SPEC_TEMPLATE, nil, '-', '_new_spec_code').result(binding)
82
+ elsif rails_mode && self_path.match(/helpers/)
83
+ code = ERB.new(RAILS_HELPER_NEW_SPEC_TEMPLATE, nil, '-', '_new_spec_code').result(binding)
84
+ else
85
+ code = ERB.new(BASIC_NEW_SPEC_TEMPLATE, nil, '-', '_new_spec_code').result(binding)
86
+ end
81
87
 
82
- #{c.method_list
83
- .select { |m| m.visibility == :public }
84
- .map { |method|
85
- <<EACH_SPEC
86
- # TODO auto-generated
87
- describe '#{method.name}' do
88
- it 'works' do#{get_instantiation_code(c, method)}#{get_params_initialization_code(method)}
89
- result = #{get_method_invocation_code(c, method)}
90
- expect(result).not_to be_nil
91
- end
92
- end
93
- EACH_SPEC
94
- }.join("\n")}
95
- end
96
- SPEC
97
88
  if dry_run
98
89
  puts "----- #{spec_path} -----"
99
90
  puts code
@@ -222,10 +213,10 @@ SPEC
222
213
  else
223
214
  constructor = c.method_list.find { |m| m.name == 'new' }
224
215
  if constructor.nil?
225
- "\n #{instance_name(c)} = #{get_complete_class_name(c)}.new"
216
+ " #{instance_name(c)} = #{get_complete_class_name(c)}.new\n"
226
217
  else
227
218
  get_params_initialization_code(constructor) +
228
- "\n #{instance_name(c)} = #{get_complete_class_name(c)}.new(#{to_param_names_array(constructor.params).join(', ')})"
219
+ " #{instance_name(c)} = #{get_complete_class_name(c)}.new(#{to_param_names_array(constructor.params).join(', ')})\n"
229
220
  end
230
221
  end
231
222
  end
@@ -236,19 +227,23 @@ SPEC
236
227
  # b = stub('b')
237
228
  #
238
229
  def get_params_initialization_code(method)
239
- code = to_param_names_array(method.params).map { |p| " #{p} = stub('#{p}')" }.join("\n")
240
- code.empty? ? "" : "\n#{code}"
230
+ code = to_param_names_array(method.params).map { |p| " #{p} = stub('#{p}')" }.join("\n")
231
+ code.empty? ? "" : "#{code}\n"
241
232
  end
242
233
 
243
234
  #
244
235
  # e.g. BarBaz.do_something(a, b) { |c| }
245
236
  #
246
237
  def get_method_invocation_code(c, method)
247
- if method.singleton
248
- "#{get_complete_class_name(c)}.#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
249
- else
250
- "#{instance_name(c)}.#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
251
- end
238
+ target = method.singleton ? get_complete_class_name(c) : instance_name(c)
239
+ "#{target}.#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
240
+ end
241
+
242
+ #
243
+ # e.g. do_something(a, b) { |c| }
244
+ #
245
+ def get_rails_helper_method_invocation_code(method)
246
+ "#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
252
247
  end
253
248
 
254
249
  #
@@ -262,5 +257,90 @@ SPEC
262
257
  end
263
258
  end
264
259
 
260
+ def get_rails_http_method(method_name)
261
+ http_method = RAILS_RESOURCE_METHOD_AND_HTTPMETHOD[method_name]
262
+ http_method.nil? ? 'get' : http_method
263
+ end
264
+
265
+ BASIC_METHODS_PART_TEMPLATE = <<SPEC
266
+ <%- methods_to_generate.map { |method| %>
267
+ # TODO auto-generated
268
+ describe '<%= method.name %>' do
269
+ it 'works' do
270
+ <%- unless get_instantiation_code(c, method).nil? -%><%= get_instantiation_code(c, method) %><%- end -%>
271
+ <%- unless get_params_initialization_code(method).nil? -%><%= get_params_initialization_code(method) %><%- end -%>
272
+ result = <%= get_method_invocation_code(c, method) %>
273
+ expect(result).not_to be_nil
274
+ end
275
+ end
276
+ <% } %>
277
+ SPEC
278
+
279
+ BASIC_NEW_SPEC_TEMPLATE = <<SPEC
280
+ # -*- encoding: utf-8 -*-
281
+
282
+ require 'spec_helper'
283
+ <% unless rails_mode then %>require '<%= self_path %>'
284
+ <% end -%>
285
+
286
+ describe <%= get_complete_class_name(c) %> do
287
+ <%= ERB.new(BASIC_METHODS_PART_TEMPLATE, nil, '-').result(binding) -%>
288
+ end
289
+ SPEC
290
+
291
+ RAILS_RESOURCE_METHOD_AND_HTTPMETHOD = {
292
+ 'index' => 'get',
293
+ 'new' => 'get',
294
+ 'create' => 'post',
295
+ 'show' => 'get',
296
+ 'edit' => 'get',
297
+ 'update' => 'put',
298
+ 'destroy' => 'delete'
299
+ }
300
+
301
+ RAILS_CONTROLLER_METHODS_PART_TEMPLATE = <<SPEC
302
+ <%- methods_to_generate.map { |method| %>
303
+ # TODO auto-generated
304
+ describe '<%= method.name %>' do
305
+ it 'returns OK' do
306
+ <%= get_rails_http_method(method.name) %> :<%= method.name %>, {}, {}
307
+ expect(response.status).to eq(200)
308
+ end
309
+ end
310
+ <% } %>
311
+ SPEC
312
+
313
+ RAILS_CONTROLLER_NEW_SPEC_TEMPLATE = <<SPEC
314
+ # -*- encoding: utf-8 -*-
315
+
316
+ require 'spec_helper'
317
+
318
+ describe <%= get_complete_class_name(c) %> do
319
+ <%= ERB.new(RAILS_CONTROLLER_METHODS_PART_TEMPLATE, nil, '-').result(binding) -%>
320
+ end
321
+ SPEC
322
+
323
+ RAILS_HELPER_METHODS_PART_TEMPLATE = <<SPEC
324
+ <%- methods_to_generate.map { |method| %>
325
+ # TODO auto-generated
326
+ describe '<%= method.name %>' do
327
+ it 'works' do
328
+ result = <%= get_rails_helper_method_invocation_code(method) %>
329
+ expect(result).not_to be_nil
330
+ end
331
+ end
332
+ <% } %>
333
+ SPEC
334
+
335
+ RAILS_HELPER_NEW_SPEC_TEMPLATE = <<SPEC
336
+ # -*- encoding: utf-8 -*-
337
+
338
+ require 'spec_helper'
339
+
340
+ describe <%= get_complete_class_name(c) %> do
341
+ <%= ERB.new(RAILS_HELPER_METHODS_PART_TEMPLATE, nil, '-').result(binding) -%>
342
+ end
343
+ SPEC
344
+
265
345
  end
266
346
 
@@ -1,3 +1,3 @@
1
1
  module RSpecKickstarter
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-kickstarter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: