rspec-kickstarter 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/rspec-kickstarter +14 -0
- data/lib/rspec_kickstarter.rb +8 -0
- data/lib/rspec_kickstarter/generator.rb +136 -0
- data/lib/rspec_kickstarter/version.rb +3 -0
- metadata +53 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rspec_kickstarter/generator'
|
4
|
+
|
5
|
+
generator = RSpecKickstarter::Generator.new
|
6
|
+
|
7
|
+
dir_or_file = ARGV.first
|
8
|
+
unless dir_or_file.match(/.rb$/)
|
9
|
+
dir_or_file = dir_or_file.gsub(/\/$/, '') + "/**/*.rb"
|
10
|
+
end
|
11
|
+
Dir.glob(dir_or_file).each do |file_path|
|
12
|
+
generator.wite_spec_if_absent(file_path)
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rdoc'
|
4
|
+
require 'rdoc/parser/ruby'
|
5
|
+
require 'rdoc/options'
|
6
|
+
require 'rdoc/stats'
|
7
|
+
|
8
|
+
module RSpecKickstarter
|
9
|
+
class Generator
|
10
|
+
|
11
|
+
attr_accessor :spec_dir
|
12
|
+
|
13
|
+
def initialize(spec_dir = './spec')
|
14
|
+
@spec_dir = spec_dir.gsub(/\/$/, '')
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_target(top_level)
|
18
|
+
c = top_level.classes.first
|
19
|
+
if c.nil?
|
20
|
+
m = top_level.modules.first
|
21
|
+
if m.nil?
|
22
|
+
top_level.is_a?(RDoc::NormalModule) ? top_level : nil
|
23
|
+
else
|
24
|
+
get_target(m)
|
25
|
+
end
|
26
|
+
else
|
27
|
+
c
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_complete_class_name(c, name = c.name)
|
32
|
+
if !c.parent.name.nil? && c.parent.is_a?(RDoc::NormalModule)
|
33
|
+
get_complete_class_name(c.parent, "#{c.parent.name}::#{name}")
|
34
|
+
else
|
35
|
+
name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def instance_name(c)
|
40
|
+
# TODO prefer snake_case
|
41
|
+
c.name.downcase
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_param_names_array(params)
|
45
|
+
params.split(',').map { |p| p.gsub(/[\(\)\s]/, '').gsub(/=.+$/, '') }.reject { |p| p.nil? || p.empty? }
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_params_initialization_code(method)
|
49
|
+
code = to_param_names_array(method.params).map { |p| " #{p} = stub('#{p}')" }.join("\n")
|
50
|
+
code.empty? ? "" : "\n#{code}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_instantiation_code(c, method)
|
54
|
+
if method.singleton
|
55
|
+
""
|
56
|
+
else
|
57
|
+
constructor = c.method_list.find { |m| m.name == 'new' }
|
58
|
+
if constructor.nil?
|
59
|
+
"\n #{instance_name(c)} = #{get_complete_class_name(c)}.new"
|
60
|
+
else
|
61
|
+
get_params_initialization_code(constructor) +
|
62
|
+
"\n #{instance_name(c)} = #{get_complete_class_name(c)}.new#{constructor.params}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_method_invocation_code(c, method)
|
68
|
+
if method.singleton
|
69
|
+
"#{get_complete_class_name(c)}.#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
|
70
|
+
else
|
71
|
+
"#{instance_name(c)}.#{method.name}(#{to_param_names_array(method.params).join(', ')})#{get_block_code(method)}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_block_code(method)
|
76
|
+
if method.block_params.nil? || method.block_params.empty?
|
77
|
+
""
|
78
|
+
else
|
79
|
+
" { |#{method.block_params}| }"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def wite_spec_if_absent(file_path)
|
84
|
+
|
85
|
+
body = File.read(file_path)
|
86
|
+
RDoc::TopLevel.reset()
|
87
|
+
top_level = RDoc::TopLevel.new(file_path)
|
88
|
+
parser = RDoc::Parser::Ruby.new(
|
89
|
+
top_level,
|
90
|
+
file_path,
|
91
|
+
body,
|
92
|
+
RDoc::Options.new,
|
93
|
+
RDoc::Stats.new(1)
|
94
|
+
)
|
95
|
+
top_level = parser.scan
|
96
|
+
c = get_target(top_level)
|
97
|
+
|
98
|
+
if c.nil?
|
99
|
+
puts "#{file_path} skipped (Class/Module not found)."
|
100
|
+
else
|
101
|
+
|
102
|
+
self_path = file_path.gsub(/^(lib\/)|(app\/)/, '').gsub(/\.rb$/, '')
|
103
|
+
code = <<SPEC
|
104
|
+
# -*- encoding: utf-8 -*-
|
105
|
+
require 'spec_helper'
|
106
|
+
require '#{self_path}'
|
107
|
+
|
108
|
+
describe #{get_complete_class_name(c)} do
|
109
|
+
|
110
|
+
#{c.method_list.select { |m| m.visibility == :public }.map { |method|
|
111
|
+
<<EACH_SPEC
|
112
|
+
describe '#{method.name}' do
|
113
|
+
it 'should work' do#{get_instantiation_code(c, method)}#{get_params_initialization_code(method)}
|
114
|
+
result = #{get_method_invocation_code(c, method)}
|
115
|
+
# result.should_not be_nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
EACH_SPEC
|
119
|
+
}.join("\n")}
|
120
|
+
end
|
121
|
+
SPEC
|
122
|
+
|
123
|
+
# TODO improve the logic
|
124
|
+
spec_path = spec_dir + '/' + file_path.gsub(/^(lib\/)|(app\/)/, '').gsub(/\.rb$/, '_spec.rb')
|
125
|
+
if File.exist?(spec_path)
|
126
|
+
puts "#{spec_path} already exists."
|
127
|
+
else
|
128
|
+
FileUtils.mkdir_p(File.dirname(spec_path))
|
129
|
+
File.open(spec_path, 'w') { |f| f.write(code) }
|
130
|
+
puts "#{spec_path} created."
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-kickstarter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kazuhiro Sera
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-25 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: RSpec kickstarter generates spec files for existing code.
|
15
|
+
email:
|
16
|
+
- - seratch@gmail.com
|
17
|
+
- - MIT
|
18
|
+
- RSpec kickstarter generates spec files for existing code.
|
19
|
+
executables:
|
20
|
+
- rspec-kickstarter
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- bin/rspec-kickstarter
|
25
|
+
- lib/rspec_kickstarter/generator.rb
|
26
|
+
- lib/rspec_kickstarter/version.rb
|
27
|
+
- lib/rspec_kickstarter.rb
|
28
|
+
homepage: https://github.com/seratch/rspec-kickstarter
|
29
|
+
licenses:
|
30
|
+
- MIT
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 1.8.23
|
50
|
+
signing_key:
|
51
|
+
specification_version: 3
|
52
|
+
summary: RSpec kickstarter generates spec files for existing code.
|
53
|
+
test_files: []
|