rspec-kickstarter 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,8 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "rspec_kickstarter/generator"
4
+ require "rspec_kickstarter/version"
5
+
6
+ module RSpecKickstarter
7
+ end
8
+
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module RSpecKickstarter
2
+ VERSION = "0.0.6"
3
+ end
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: []