rspec-kickstarter 0.0.6

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.
@@ -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: []