transpec 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 977f1d1608ec0a3279e492d25b71f6d89406d6c8
4
- data.tar.gz: 6e66591a69cf5ac38b5d0591ce999f70461d462a
3
+ metadata.gz: d51fbf6111c8bb052b53353d56c3f50016252f70
4
+ data.tar.gz: 79b7518a8f6b3f70cc019196e874ef342a4b3b69
5
5
  SHA512:
6
- metadata.gz: 2255fba8e8680c8dd0bcaf41375f4f189092c7eec52c50776b6cbb4eac0b714d726db8609385729dcdb3831cd1e7f973da84a6f488b2630a57e4fe2cd09dd5b3
7
- data.tar.gz: 6e7c92b6b6305ac0b9afc00c5101f5bff45b582241bedb306dae75d7f449d0f2013abff19d372fcb8c3aa075e7ea263bd575eab816d358bfe9a009650b0f5c73
6
+ metadata.gz: cb6b058d22be9aa35e1503982c4527ebe44ea19d87f8f2574190d025a9d2721e7ea1bee327be30dcba0ba4bdaf7395d658def09682d4349aa58476b4fc46564c
7
+ data.tar.gz: de624193ea2e966b865e4c1102ff0be66fd813b8af4a3843ee650401122eb1607fcaee113050c1d12972f77e66263eccf0a5c70f7583d3ed5083c6f894edfd23
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Master
4
4
 
5
+ ## v1.1.1
6
+
7
+ * Fix failure of dynamic analysis when cwd was changed at exit of rspec
8
+
5
9
  ## v1.1.0
6
10
 
7
11
  * Support conversion of `its` (#9)
data/README.md CHANGED
@@ -12,8 +12,8 @@ See the following pages for the new RSpec syntax and the plan for RSpec 3:
12
12
  * [RSpec's new message expectation syntax - Tea is awesome.](http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/)
13
13
  * [Myron Marston » The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3)
14
14
 
15
- Note that Transpec does not yet support all conversions for the RSpec changes,
16
- and also the changes for RSpec 3 is not fixed and may vary in the future.
15
+ Transpec now supports almost all conversions for the RSpec changes,
16
+ but the changes for RSpec 3 is not fixed and may vary in the future.
17
17
  So it's recommended to follow updates of both RSpec and Transpec.
18
18
 
19
19
  ## Examples
@@ -91,7 +91,7 @@ describe Account do
91
91
  end
92
92
  ```
93
93
 
94
- ### Actual Examples
94
+ ### Actual examples
95
95
 
96
96
  You can see actual conversion examples below:
97
97
 
@@ -346,10 +346,10 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
346
346
 
347
347
  ```ruby
348
348
  # Targets
349
- (1.0 / 3.0).should be_close(0.333, 0.001)
349
+ expect(1.0 / 3.0).to be_close(0.333, 0.001)
350
350
 
351
351
  # Converted
352
- (1.0 / 3.0).should be_within(0.001).of(0.333)
352
+ expect(1.0 / 3.0).to be_within(0.001).of(0.333)
353
353
  ```
354
354
 
355
355
  * Disabled by: `--keep deprecated`
@@ -388,7 +388,7 @@ If you choose so, disable this conversion with `--keep have_items`.
388
388
  * Disabled by: `--keep have_items`
389
389
  * See also: [Expectations: have(x).items matchers will be moved into an external gem - The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3#expectations__matchers_will_be_moved_into_an_external_gem)
390
390
 
391
- ### Expectations on Block
391
+ ### Expectations on block
392
392
 
393
393
  ```ruby
394
394
  # Targets
data/README.md.erb CHANGED
@@ -12,8 +12,8 @@ See the following pages for the new RSpec syntax and the plan for RSpec 3:
12
12
  * [RSpec's new message expectation syntax - Tea is awesome.](http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/)
13
13
  * [Myron Marston » The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3)
14
14
 
15
- Note that Transpec does not yet support all conversions for the RSpec changes,
16
- and also the changes for RSpec 3 is not fixed and may vary in the future.
15
+ Transpec now supports almost all conversions for the RSpec changes,
16
+ but the changes for RSpec 3 is not fixed and may vary in the future.
17
17
  So it's recommended to follow updates of both RSpec and Transpec.
18
18
 
19
19
  ## Examples
@@ -64,7 +64,7 @@ Transpec would convert it to the following form:
64
64
  <%= Transpec::Converter.new.convert(example) -%>
65
65
  ```
66
66
 
67
- ### Actual Examples
67
+ ### Actual examples
68
68
 
69
69
  You can see actual conversion examples below:
70
70
 
@@ -342,10 +342,10 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
342
342
 
343
343
  ```ruby
344
344
  # Targets
345
- (1.0 / 3.0).should be_close(0.333, 0.001)
345
+ expect(1.0 / 3.0).to be_close(0.333, 0.001)
346
346
 
347
347
  # Converted
348
- (1.0 / 3.0).should be_within(0.001).of(0.333)
348
+ expect(1.0 / 3.0).to be_within(0.001).of(0.333)
349
349
  ```
350
350
 
351
351
  * Disabled by: `--keep deprecated`
@@ -384,7 +384,7 @@ If you choose so, disable this conversion with `--keep have_items`.
384
384
  * Disabled by: `--keep have_items`
385
385
  * See also: [Expectations: have(x).items matchers will be moved into an external gem - The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3#expectations__matchers_will_be_moved_into_an_external_gem)
386
386
 
387
- ### Expectations on Block
387
+ ### Expectations on block
388
388
 
389
389
  ```ruby
390
390
  # Targets
@@ -68,10 +68,10 @@ module Transpec
68
68
  each_descendent_node.to_a
69
69
  end
70
70
 
71
- private
72
-
73
- def properties
74
- @properties ||= {}
71
+ def each_node(&block)
72
+ return to_enum(__method__) unless block_given?
73
+ yield self
74
+ each_descendent_node(&block)
75
75
  end
76
76
  end
77
77
  end
@@ -3,7 +3,6 @@
3
3
  require 'transpec/base_rewriter'
4
4
  require 'transpec/configuration'
5
5
  require 'transpec/report'
6
- require 'transpec/ast/scanner'
7
6
  require 'transpec/syntax'
8
7
  require 'transpec/syntax/be_close'
9
8
  require 'transpec/syntax/double'
@@ -30,22 +29,17 @@ module Transpec
30
29
  end
31
30
 
32
31
  def process(ast, source_rewriter)
33
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
34
- dispatch_node(node, ancestor_nodes, source_rewriter)
32
+ return unless ast
33
+ ast.each_node do |node|
34
+ dispatch_node(node, source_rewriter)
35
35
  end
36
36
  end
37
37
 
38
- def dispatch_node(node, ancestor_nodes, source_rewriter)
38
+ def dispatch_node(node, source_rewriter)
39
39
  Syntax.standalone_syntaxes.each do |syntax_class|
40
40
  next unless syntax_class.target_node?(node, @runtime_data)
41
41
 
42
- syntax = syntax_class.new(
43
- node,
44
- ancestor_nodes,
45
- source_rewriter,
46
- @runtime_data,
47
- @report
48
- )
42
+ syntax = syntax_class.new(node, source_rewriter, @runtime_data, @report)
49
43
 
50
44
  handler_name = "process_#{syntax_class.snake_case_name}"
51
45
  send(handler_name, syntax)
@@ -20,7 +20,7 @@ module Transpec
20
20
  require 'pathname'
21
21
 
22
22
  module TranspecAnalysis
23
- @base_pathname = Pathname.pwd
23
+ @base_path = Dir.pwd
24
24
 
25
25
  def self.data
26
26
  @data ||= {}
@@ -28,12 +28,17 @@ module Transpec
28
28
 
29
29
  def self.node_id(filename, begin_pos, end_pos)
30
30
  absolute_path = File.expand_path(filename)
31
- relative_path = Pathname.new(absolute_path).relative_path_from(@base_pathname).to_s
31
+ relative_path = Pathname.new(absolute_path).relative_path_from(base_pathname).to_s
32
32
  [relative_path, begin_pos, end_pos].join('_')
33
33
  end
34
34
 
35
+ def self.base_pathname
36
+ @base_pathname ||= Pathname.new(@base_path)
37
+ end
38
+
35
39
  at_exit do
36
- File.open('#{RESULT_FILE}', 'w') do |file|
40
+ path = File.join(@base_path, '#{RESULT_FILE}')
41
+ File.open(path, 'w') do |file|
37
42
  Marshal.dump(data, file)
38
43
  end
39
44
  end
@@ -82,13 +87,17 @@ module Transpec
82
87
  end
83
88
 
84
89
  def default_rspec_command
85
- if File.exist?('Gemfile')
90
+ if project_requires_bundler?
86
91
  'bundle exec rspec'
87
92
  else
88
93
  'rspec'
89
94
  end
90
95
  end
91
96
 
97
+ def project_requires_bundler?
98
+ File.exist?('Gemfile')
99
+ end
100
+
92
101
  def analyze(paths = [])
93
102
  in_copied_project do
94
103
  rewriter = Rewriter.new
@@ -152,7 +161,7 @@ module Transpec
152
161
  end
153
162
 
154
163
  def with_bundler_clean_env
155
- if defined?(Bundler)
164
+ if defined?(Bundler) && project_requires_bundler?
156
165
  Bundler.with_clean_env do
157
166
  # Bundler.with_clean_env cleans environment variables
158
167
  # which are set after bundler is loaded.
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'transpec/base_rewriter'
4
4
  require 'transpec/util'
5
- require 'transpec/ast/scanner'
6
5
 
7
6
  module Transpec
8
7
  class DynamicAnalyzer
@@ -36,11 +35,13 @@ module Transpec
36
35
  private
37
36
 
38
37
  def collect_requests(ast)
39
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
38
+ return unless ast
39
+
40
+ ast.each_node do |node|
40
41
  Syntax.standalone_syntaxes.each do |syntax_class|
41
42
  syntax_class.register_request_for_dynamic_analysis(node, self)
42
43
  next unless syntax_class.target_node?(node)
43
- syntax = syntax_class.new(node, ancestor_nodes)
44
+ syntax = syntax_class.new(node)
44
45
  syntax.register_request_for_dynamic_analysis(self)
45
46
  end
46
47
  end
@@ -53,24 +54,31 @@ module Transpec
53
54
  end
54
55
 
55
56
  def inject_analysis_method(node, analysis_codes, source_rewriter)
57
+ front, rear = build_wrapper_codes(node, analysis_codes)
58
+
59
+ source_range = if taking_block?(node)
60
+ node.parent_node.loc.expression
61
+ else
62
+ node.loc.expression
63
+ end
64
+
65
+ source_rewriter.insert_before(source_range, front)
66
+ source_rewriter.insert_after(source_range, rear)
67
+ rescue OverlappedRewriteError # rubocop:disable HandleExceptions
68
+ end
69
+
70
+ def build_wrapper_codes(node, analysis_codes)
56
71
  source_range = node.loc.expression
57
72
 
58
73
  front = "#{ANALYSIS_METHOD}(("
74
+
59
75
  rear = format(
60
76
  '), self, %s, __FILE__, %d, %d)',
61
77
  hash_literal(analysis_codes), source_range.begin_pos, source_range.end_pos
62
78
  )
63
79
  rear = "\n" + indentation_of_line(source_range.end) + rear if contain_here_document?(node)
64
80
 
65
- parent_node = node.parent_node
66
-
67
- if parent_node && parent_node.type == :block && parent_node.children.first.equal?(node)
68
- source_range = node.parent_node.loc.expression
69
- end
70
-
71
- source_rewriter.insert_before(source_range, front)
72
- source_rewriter.insert_after(source_range, rear)
73
- rescue OverlappedRewriteError # rubocop:disable HandleExceptions
81
+ [front, rear]
74
82
  end
75
83
 
76
84
  # Hash#inspect generates invalid literal with following example:
@@ -89,6 +97,11 @@ module Transpec
89
97
 
90
98
  literal << ' }'
91
99
  end
100
+
101
+ def taking_block?(node)
102
+ parent_node = node.parent_node
103
+ parent_node && parent_node.type == :block && parent_node.children.first.equal?(node)
104
+ end
92
105
  end
93
106
  end
94
107
  end
@@ -47,16 +47,15 @@ module Transpec
47
47
  [:module, :def]
48
48
  ].freeze
49
49
 
50
- attr_reader :nodes
50
+ attr_reader :node
51
51
 
52
- # @param nodes [Array] An array containing from root node to the target node.
53
- def initialize(nodes)
54
- @nodes = nodes
52
+ def initialize(node)
53
+ @node = node
55
54
  end
56
55
 
57
56
  def scopes
58
57
  @scopes ||= begin
59
- scopes = @nodes.map { |node| scope_type(node) }
58
+ scopes = @node.each_ancestor_node.reverse_each.map { |node| scope_type(node) }
60
59
  scopes.compact!
61
60
  scopes.extend(ArrayExtension)
62
61
  end
@@ -6,7 +6,7 @@ require 'transpec/report'
6
6
 
7
7
  module Transpec
8
8
  class Syntax
9
- attr_reader :node, :ancestor_nodes, :source_rewriter, :runtime_data, :report
9
+ attr_reader :node, :source_rewriter, :runtime_data, :report
10
10
 
11
11
  def self.inherited(subclass)
12
12
  all_syntaxes << subclass
@@ -38,9 +38,8 @@ module Transpec
38
38
  false
39
39
  end
40
40
 
41
- def initialize(node, ancestor_nodes, source_rewriter = nil, runtime_data = nil, report = nil)
41
+ def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
42
42
  @node = node
43
- @ancestor_nodes = ancestor_nodes
44
43
  @source_rewriter = source_rewriter
45
44
  @runtime_data = runtime_data
46
45
  @report = report || Report.new
@@ -50,11 +49,11 @@ module Transpec
50
49
  end
51
50
 
52
51
  def static_context_inspector
53
- @static_context_inspector ||= StaticContextInspector.new(@ancestor_nodes)
52
+ @static_context_inspector ||= StaticContextInspector.new(@node)
54
53
  end
55
54
 
56
55
  def parent_node
57
- @ancestor_nodes.last
56
+ @node.parent_node
58
57
  end
59
58
 
60
59
  def expression_range
@@ -59,7 +59,7 @@ module Transpec
59
59
  def each_following_chained_method_node
60
60
  return to_enum(__method__) unless block_given?
61
61
 
62
- @ancestor_nodes.reverse.reduce(@node) do |child_node, parent_node|
62
+ @node.each_ancestor_node.reduce(@node) do |child_node, parent_node|
63
63
  return unless [:send, :block].include?(parent_node.type)
64
64
  return unless parent_node.children.first == child_node
65
65
  yield parent_node, child_node
@@ -19,13 +19,6 @@ module Transpec
19
19
  !receiver_node.nil? && OPERATORS.include?(method_name)
20
20
  end
21
21
 
22
- def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
23
- @node = node
24
- @source_rewriter = source_rewriter
25
- @runtime_data = runtime_data
26
- @report = report || Report.new
27
- end
28
-
29
22
  def register_request_for_dynamic_analysis(rewriter)
30
23
  return unless method_name == :=~
31
24
  rewriter.register_request(arg_node, :arg_is_enumerable?, 'is_a?(Enumerable)')
@@ -24,7 +24,7 @@ module Transpec
24
24
  end
25
25
 
26
26
  def positive?
27
- ancestor_nodes.reverse_each do |ancestor_node|
27
+ @node.each_ancestor_node do |ancestor_node|
28
28
  next unless ancestor_node.type == :send
29
29
  expectation_method_name = ancestor_node.children[1]
30
30
  return [:should, :to].include?(expectation_method_name)
@@ -19,7 +19,7 @@ module Transpec
19
19
  !receiver_node.nil? && [:should, :should_not].include?(method_name)
20
20
  end
21
21
 
22
- def initialize(node, ancestor_nodes, source_rewriter = nil, runtime_data = nil, report = nil)
22
+ def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
23
23
  super
24
24
  @current_syntax_type = :should
25
25
  end
@@ -5,7 +5,7 @@ module Transpec
5
5
  module Version
6
6
  MAJOR = 1
7
7
  MINOR = 1
8
- PATCH = 0
8
+ PATCH = 1
9
9
 
10
10
  def self.to_s
11
11
  [MAJOR, MINOR, PATCH].join('.')
data/spec/spec_helper.rb CHANGED
@@ -15,8 +15,6 @@ RSpec.configure do |config|
15
15
  config.color_enabled = true
16
16
  config.treat_symbols_as_metadata_keys_with_true_values = true
17
17
 
18
- config.filter_run_excluding :skip_on_jruby if RUBY_ENGINE == 'jruby'
19
-
20
18
  config.before(:all) do
21
19
  require 'rainbow'
22
20
  Sickill::Rainbow.enabled = false
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'transpec/dynamic_analyzer'
4
4
  require 'transpec/ast/builder'
5
- require 'transpec/ast/scanner'
6
5
  require 'transpec/syntax/should'
7
6
  require 'transpec/syntax/expect'
8
7
  require 'parser'
@@ -55,14 +54,9 @@ end
55
54
 
56
55
  shared_context 'should object' do
57
56
  let(:should_object) do
58
- Transpec::AST::Scanner.scan(ast) do |node, ancestor_nodes|
57
+ ast.each_node do |node|
59
58
  next unless Transpec::Syntax::Should.target_node?(node)
60
- return Transpec::Syntax::Should.new(
61
- node,
62
- ancestor_nodes,
63
- source_rewriter,
64
- runtime_data
65
- )
59
+ return Transpec::Syntax::Should.new(node, source_rewriter, runtime_data)
66
60
  end
67
61
 
68
62
  fail 'No should node is found!'
@@ -73,14 +67,9 @@ end
73
67
 
74
68
  shared_context 'expect object' do
75
69
  let(:expect_object) do
76
- Transpec::AST::Scanner.scan(ast) do |node, ancestor_nodes|
70
+ ast.each_node do |node|
77
71
  next unless Transpec::Syntax::Expect.target_node?(node)
78
- return Transpec::Syntax::Expect.new(
79
- node,
80
- ancestor_nodes,
81
- source_rewriter,
82
- runtime_data
83
- )
72
+ return Transpec::Syntax::Expect.new(node, source_rewriter, runtime_data)
84
73
  end
85
74
 
86
75
  fail 'No expect node is found!'
@@ -50,7 +50,7 @@ module Transpec
50
50
  end
51
51
  end
52
52
 
53
- describe '#each_ancestor_node' do
53
+ shared_context 'ancestor nodes' do
54
54
  let(:target_node) do
55
55
  ast.each_descendent_node do |node|
56
56
  return node if node == s(:args)
@@ -58,6 +58,10 @@ module Transpec
58
58
  end
59
59
 
60
60
  let(:expected_types) { [:block, :def] }
61
+ end
62
+
63
+ describe '#each_ancestor_node' do
64
+ include_context 'ancestor nodes'
61
65
 
62
66
  context 'when a block is given' do
63
67
  it 'yields each ancestor node' do
@@ -95,8 +99,25 @@ module Transpec
95
99
  end
96
100
  end
97
101
 
98
- describe '#each_child_node' do
102
+ describe '#ancestor_nodes' do
103
+ include_context 'ancestor nodes'
104
+
105
+ it 'returns an array' do
106
+ target_node.ancestor_nodes.should be_an(Array)
107
+ end
108
+
109
+ it 'returns same nodes as #each_ancestor_node' do
110
+ types = target_node.ancestor_nodes.map(&:type)
111
+ types.should == expected_types
112
+ end
113
+ end
114
+
115
+ shared_context 'child nodes' do
99
116
  let(:expected_types) { [:args, :block] }
117
+ end
118
+
119
+ describe '#each_child_node' do
120
+ include_context 'child nodes'
100
121
 
101
122
  context 'when a block is given' do
102
123
  it 'yields each child node' do
@@ -134,10 +155,27 @@ module Transpec
134
155
  end
135
156
  end
136
157
 
137
- describe '#each_descendent_node' do
158
+ describe '#child_nodes' do
159
+ include_context 'child nodes'
160
+
161
+ it 'returns an array' do
162
+ ast.child_nodes.should be_an(Array)
163
+ end
164
+
165
+ it 'returns same nodes as #each_child_node' do
166
+ types = ast.child_nodes.map(&:type)
167
+ types.should == expected_types
168
+ end
169
+ end
170
+
171
+ shared_context 'descendent nodes' do
138
172
  let(:expected_types) do
139
173
  [:args, :arg, :arg, :block, :send, :int, :args, :send, :lvar]
140
174
  end
175
+ end
176
+
177
+ describe '#each_descendent_node' do
178
+ include_context 'descendent nodes'
141
179
 
142
180
  context 'when a block is given' do
143
181
  it 'yields each descendent node with depth first order' do
@@ -174,6 +212,60 @@ module Transpec
174
212
  end
175
213
  end
176
214
  end
215
+
216
+ describe '#descendent_nodes' do
217
+ include_context 'descendent nodes'
218
+
219
+ it 'returns an array' do
220
+ ast.descendent_nodes.should be_an(Array)
221
+ end
222
+
223
+ it 'returns same nodes as #each_descendent_node' do
224
+ types = ast.descendent_nodes.map(&:type)
225
+ types.should == expected_types
226
+ end
227
+ end
228
+
229
+ describe '#each_node' do
230
+ let(:expected_types) do
231
+ [:def, :args, :arg, :arg, :block, :send, :int, :args, :send, :lvar]
232
+ end
233
+
234
+ context 'when a block is given' do
235
+ it 'yields itself and each descendent node with depth first order' do
236
+ index = 0
237
+
238
+ ast.each_node do |node|
239
+ expected_type = expected_types[index]
240
+ node.type.should == expected_type
241
+ index += 1
242
+ end
243
+
244
+ index.should_not == 0
245
+ end
246
+
247
+ it 'returns itself' do
248
+ returned_value = ast.each_node { }
249
+ returned_value.should be(ast)
250
+ end
251
+ end
252
+
253
+ context 'when no block is given' do
254
+ it 'returns enumerator' do
255
+ ast.each_node.should be_a(Enumerator)
256
+ end
257
+
258
+ describe 'the returned enumerator' do
259
+ it 'enumerates the child nodes' do
260
+ enumerator = ast.each_node
261
+
262
+ expected_types.each do |expected_type|
263
+ enumerator.next.type.should == expected_type
264
+ end
265
+ end
266
+ end
267
+ end
268
+ end
177
269
  end
178
270
  end
179
271
  end
@@ -118,6 +118,22 @@ module Transpec
118
118
  end
119
119
  end
120
120
 
121
+ context 'when rspec exited with non-0 status' do
122
+ let(:source) { 'This is invalid syntax <' }
123
+
124
+ it 'raises error' do
125
+ -> { dynamic_analyzer.analyze }.should raise_error(/Dynamic analysis failed/)
126
+ end
127
+ end
128
+
129
+ context 'when working directory has been changed at exit of rspec' do
130
+ let(:source) { "Dir.chdir('spec')" }
131
+
132
+ it 'does not raise error' do
133
+ -> { dynamic_analyzer.analyze }.should_not raise_error
134
+ end
135
+ end
136
+
121
137
  runtime_data_cache = {}
122
138
 
123
139
  subject(:runtime_data) do
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
  require 'transpec/static_context_inspector'
5
5
 
6
6
  module Transpec
7
- describe StaticContextInspector, :skip_on_jruby do
7
+ describe StaticContextInspector do
8
8
  include CacheHelper
9
9
  include ::AST::Sexp
10
10
  include_context 'parsed objects'
@@ -51,7 +51,7 @@ module Transpec
51
51
  end
52
52
 
53
53
  it 'returns scope stack' do
54
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
54
+ ast.each_node do |node|
55
55
  expected_scopes = begin
56
56
  case node_id(node)
57
57
  when 'send nil :top_level'
@@ -90,7 +90,7 @@ module Transpec
90
90
 
91
91
  next unless expected_scopes
92
92
 
93
- context_inspector = StaticContextInspector.new(ancestor_nodes)
93
+ context_inspector = StaticContextInspector.new(node)
94
94
  context_inspector.scopes.should == expected_scopes
95
95
  end
96
96
  end
@@ -98,9 +98,9 @@ module Transpec
98
98
 
99
99
  shared_examples 'context inspection methods' do
100
100
  let(:context_inspector) do
101
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
101
+ ast.each_node do |node|
102
102
  next unless node == s(:send, nil, :target)
103
- return StaticContextInspector.new(ancestor_nodes)
103
+ return StaticContextInspector.new(node)
104
104
  end
105
105
 
106
106
  fail 'Target node not found!'
@@ -9,13 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:be_close_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless BeClose.target_node?(node)
14
- return BeClose.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter
18
- )
14
+ return BeClose.new(node, source_rewriter)
19
15
  end
20
16
  fail 'No be_close node is found!'
21
17
  end
@@ -9,13 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:double_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless Double.target_node?(node)
14
- return Double.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter
18
- )
14
+ return Double.new(node, source_rewriter)
19
15
  end
20
16
  fail 'No double node is found!'
21
17
  end
@@ -9,13 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:its_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless Its.target_node?(node)
14
- return Its.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter
18
- )
14
+ return Its.new(node, source_rewriter)
19
15
  end
20
16
  fail 'No #its node is found!'
21
17
  end
@@ -9,14 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:method_stub_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless MethodStub.target_node?(node)
14
- return MethodStub.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter,
18
- runtime_data
19
- )
14
+ return MethodStub.new(node, source_rewriter, runtime_data)
20
15
  end
21
16
  fail 'No method stub node is found!'
22
17
  end
@@ -9,13 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:raise_error_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless RaiseError.target_node?(node)
14
- return RaiseError.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter
18
- )
14
+ return RaiseError.new(node, source_rewriter)
19
15
  end
20
16
  fail 'No raise_error node is found!'
21
17
  end
@@ -9,13 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:rspec_configure) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless RSpecConfigure.target_node?(node)
14
- return RSpecConfigure.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter
18
- )
14
+ return RSpecConfigure.new(node, source_rewriter)
19
15
  end
20
16
  fail 'No RSpec.configure node is found!'
21
17
  end
@@ -9,14 +9,9 @@ module Transpec
9
9
  include_context 'parsed objects'
10
10
 
11
11
  subject(:should_receive_object) do
12
- AST::Scanner.scan(ast) do |node, ancestor_nodes|
12
+ ast.each_node do |node|
13
13
  next unless ShouldReceive.target_node?(node)
14
- return ShouldReceive.new(
15
- node,
16
- ancestor_nodes,
17
- source_rewriter,
18
- runtime_data
19
- )
14
+ return ShouldReceive.new(node, source_rewriter, runtime_data)
20
15
  end
21
16
  fail 'No should_receive node is found!'
22
17
  end
data/transpec.gemspec CHANGED
@@ -10,7 +10,8 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['Yuji Nakayama']
11
11
  spec.email = ['nkymyj@gmail.com']
12
12
  spec.summary = 'RSpec syntax converter'
13
- spec.description = 'Transpec automatically converts your specs into latest RSpec syntax with static analysis.'
13
+ spec.description = 'Transpec automatically converts your specs into latest RSpec syntax ' +
14
+ 'with static and dynamic code analysis.'
14
15
  spec.homepage = 'https://github.com/yujinakayama/transpec'
15
16
  spec.license = 'MIT'
16
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transpec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Nakayama
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-28 00:00:00.000000000 Z
11
+ date: 2013-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -165,7 +165,7 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0.3'
167
167
  description: Transpec automatically converts your specs into latest RSpec syntax with
168
- static analysis.
168
+ static and dynamic code analysis.
169
169
  email:
170
170
  - nkymyj@gmail.com
171
171
  executables:
@@ -187,7 +187,6 @@ files:
187
187
  - lib/transpec.rb
188
188
  - lib/transpec/ast/builder.rb
189
189
  - lib/transpec/ast/node.rb
190
- - lib/transpec/ast/scanner.rb
191
190
  - lib/transpec/base_rewriter.rb
192
191
  - lib/transpec/cli.rb
193
192
  - lib/transpec/commit_message.rb
@@ -228,7 +227,6 @@ files:
228
227
  - spec/support/file_helper.rb
229
228
  - spec/support/shared_context.rb
230
229
  - spec/transpec/ast/node_spec.rb
231
- - spec/transpec/ast/scanner_spec.rb
232
230
  - spec/transpec/cli_spec.rb
233
231
  - spec/transpec/commit_message_spec.rb
234
232
  - spec/transpec/configuration_spec.rb
@@ -291,7 +289,6 @@ test_files:
291
289
  - spec/support/file_helper.rb
292
290
  - spec/support/shared_context.rb
293
291
  - spec/transpec/ast/node_spec.rb
294
- - spec/transpec/ast/scanner_spec.rb
295
292
  - spec/transpec/cli_spec.rb
296
293
  - spec/transpec/commit_message_spec.rb
297
294
  - spec/transpec/configuration_spec.rb
@@ -1,41 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Transpec
4
- module AST
5
- class Scanner
6
- attr_reader :context
7
-
8
- def self.scan(origin_node, &block)
9
- instance = new(&block)
10
- instance.scan(origin_node, true)
11
- nil
12
- end
13
-
14
- def initialize(&block)
15
- @callback = block
16
- @ancestor_nodes = []
17
- end
18
-
19
- def scan(origin_node, yield_origin_node = false)
20
- return unless origin_node
21
-
22
- yield_node(origin_node) if yield_origin_node
23
-
24
- @ancestor_nodes.push(origin_node)
25
-
26
- origin_node.each_child_node do |child_node|
27
- yield_node(child_node)
28
- scan(child_node)
29
- end
30
-
31
- @ancestor_nodes.pop
32
- end
33
-
34
- private
35
-
36
- def yield_node(node)
37
- @callback.call(node, @ancestor_nodes)
38
- end
39
- end
40
- end
41
- end
@@ -1,124 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
- require 'transpec/ast/scanner'
5
-
6
- module Transpec
7
- module AST
8
- describe Scanner do
9
- include_context 'parsed objects'
10
-
11
- let(:source) do
12
- <<-END
13
- some_var = 1
14
-
15
- RSpec.configure do |config|
16
- config.before do
17
- prepare_something
18
- end
19
- end
20
-
21
- module SomeModule
22
- SOME_CONST = 1
23
-
24
- describe 'something' do
25
- def some_method(some_arg)
26
- do_something
27
- end
28
-
29
- it 'is 1' do
30
- something.should == 1
31
- end
32
- end
33
- end
34
- END
35
- end
36
-
37
- # (begin
38
- # (lvasgn :some_var
39
- # (int 1))
40
- # (block
41
- # (send
42
- # (const nil :RSpec) :configure)
43
- # (args
44
- # (arg :config))
45
- # (block
46
- # (send
47
- # (lvar :config) :before)
48
- # (args)
49
- # (send nil :prepare_something)))
50
- # (module
51
- # (const nil :SomeModule)
52
- # (begin
53
- # (casgn nil :SOME_CONST
54
- # (int 1))
55
- # (block
56
- # (send nil :describe
57
- # (str "something"))
58
- # (args)
59
- # (begin
60
- # (def :some_method
61
- # (args
62
- # (arg :some_arg))
63
- # (send nil :do_something))
64
- # (block
65
- # (send nil :it
66
- # (str "is 1"))
67
- # (args)
68
- # (send
69
- # (send
70
- # (send nil :something) :should) :==
71
- # (int 1))))))))
72
-
73
- describe '.scan' do
74
- it 'scans nodes with depth first order' do
75
- expected_node_type_order = [
76
- :begin,
77
- :lvasgn,
78
- :int,
79
- :block,
80
- :send,
81
- :const,
82
- :args
83
- ]
84
-
85
- index = 0
86
-
87
- Scanner.scan(ast) do |node|
88
- expected_node_type = expected_node_type_order[index]
89
- node.type.should == expected_node_type if expected_node_type
90
- index += 1
91
- end
92
-
93
- index.should_not == 0
94
- end
95
-
96
- it 'passes ancestor nodes of the current node to the block' do
97
- each_expected_ancestor_nodes_types = [
98
- [],
99
- [:begin],
100
- [:begin, :lvasgn],
101
- [:begin],
102
- [:begin, :block],
103
- [:begin, :block, :send],
104
- [:begin, :block],
105
- [:begin, :block, :args]
106
- ]
107
-
108
- index = 0
109
-
110
- Scanner.scan(ast) do |node, ancestor_nodes|
111
- expected_ancestor_node_types = each_expected_ancestor_nodes_types[index]
112
- if expected_ancestor_node_types
113
- ancestor_node_types = ancestor_nodes.map(&:type)
114
- ancestor_node_types.should == expected_ancestor_node_types
115
- end
116
- index += 1
117
- end
118
-
119
- index.should_not == 0
120
- end
121
- end
122
- end
123
- end
124
- end