transpec 0.0.4 → 0.0.5

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: c4de7050825b2892a104decbe5977f02054f4d57
4
- data.tar.gz: 26acc442dbdfcbf63b93b94556dc6406a63165b3
3
+ metadata.gz: 9855e40cab5a33c95ac0c45e62ba2c8a166d1176
4
+ data.tar.gz: 1984df95dd4b3c84eedf68b93096f5b28b63ae83
5
5
  SHA512:
6
- metadata.gz: 2efb1b828b2c2e713e4d904cd34369abe134bb8d0cc0cc4381d06785cf77ef31ca7eae2f0f42298421c3603c498d3b85b66a4e72fdc1bb55a4c29cd30b2c2f7d
7
- data.tar.gz: 367775428c9155fd721a33621b2cf561ea3c684d16baead448019bcd3f7e9008f2f30a55771dc9ca2f2c45d3e12e665830967945fcce78f5578b1791446018e9
6
+ metadata.gz: 888b7c747f4f36905ebd892b72f391de1d25afa26b22b00c61d74634afdf88ab4ef70c90204d47412c896839d07f34ed3e0f9f9187e6e0e24d073f0529cf2969
7
+ data.tar.gz: 7d6df84751dcae9b33ec2f9a755207b22e7e0eaa99993d01e46fac69643dd278954b3dbc6f0aa02055a673a7011342f94b158ba26bf91b430beecaa48393ad27
data/.rubocop.yml CHANGED
@@ -1,4 +1,8 @@
1
1
 
2
+ AllCops:
3
+ Excludes:
4
+ - tmp/*
5
+
2
6
  LineLength:
3
7
  Max: 100
4
8
 
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Master
4
4
 
5
+ ## v0.0.5
6
+
7
+ * Support conversion of `any_number_of_times`
8
+
5
9
  ## v0.0.4
6
10
 
7
11
  * Fix a bug where necessary parentheses were not added when converting operator matcher to non-operator matcher in some cases (e.g. `== (2 - 1) + (1 + 2)` was converted into `eq(2 - 1) + (1 + 2)` unintentionally)
data/README.md CHANGED
@@ -123,6 +123,21 @@ After the conversion, run `rspec` again and check if all pass.
123
123
 
124
124
  ## Options
125
125
 
126
+ ### `--force`
127
+
128
+ Force processing even if the current Git repository is not clean.
129
+
130
+ ```bash
131
+ $ git status --short
132
+ M spec/spec_helper.rb
133
+ $ transpec
134
+ The current Git repository is not clean. Aborting.
135
+ $ transpec --force
136
+ Processing spec/spec_helper.rb
137
+ Processing spec/spec_spec.rb
138
+ Processing spec/support/file_helper.rb
139
+ ```
140
+
126
141
  ### `-d/--disable`
127
142
 
128
143
  Disable specific conversions.
data/README.md.erb CHANGED
@@ -96,6 +96,21 @@ After the conversion, run `rspec` again and check if all pass.
96
96
 
97
97
  ## Options
98
98
 
99
+ ### `--force`
100
+
101
+ Force processing even if the current Git repository is not clean.
102
+
103
+ ```bash
104
+ $ git status --short
105
+ M spec/spec_helper.rb
106
+ $ transpec
107
+ The current Git repository is not clean. Aborting.
108
+ $ transpec --force
109
+ Processing spec/spec_helper.rb
110
+ Processing spec/spec_spec.rb
111
+ Processing spec/support/file_helper.rb
112
+ ```
113
+
99
114
  ### `-d/--disable`
100
115
 
101
116
  Disable specific conversions.
data/Rakefile CHANGED
@@ -54,9 +54,11 @@ namespace :test do
54
54
  projects.each do |name, url, ref, bundler_args|
55
55
  desc "Test Transpec on #{name.to_s.capitalize} project"
56
56
  task name do
57
- require 'tmpdir'
57
+ tmpdir = 'tmp'
58
58
 
59
- Dir.chdir(Dir.mktmpdir) do
59
+ Dir.mkdir(tmpdir) unless Dir.exist?(tmpdir)
60
+
61
+ Dir.chdir(tmpdir) do
60
62
  test_on_project(name.to_s.capitalize, url, ref, bundler_args)
61
63
  end
62
64
  end
@@ -67,13 +69,9 @@ namespace :test do
67
69
 
68
70
  puts " Testing on #{name} Project ".center(80, '=')
69
71
 
70
- # Disabling checkout here to suppress "detached HEAD" warning.
71
- sh "git clone --no-checkout --depth 1 --branch #{ref} #{url}"
72
-
73
- repo_dir = File.basename(url, '.git')
72
+ repo_dir = prepare_git_repo(url, ref)
74
73
 
75
74
  Dir.chdir(repo_dir) do
76
- sh "git checkout --quiet #{ref}"
77
75
  with_clean_bundler_env do
78
76
  sh "bundle install #{bundler_args}"
79
77
  sh File.join(Transpec.root, 'bin', 'transpec')
@@ -82,6 +80,43 @@ namespace :test do
82
80
  end
83
81
  end
84
82
 
83
+ def prepare_git_repo(url, ref)
84
+ repo_dir = File.basename(url, '.git')
85
+
86
+ needs_clone = false
87
+
88
+ if Dir.exist?(repo_dir)
89
+ current_ref = nil
90
+
91
+ Dir.chdir(repo_dir) do
92
+ current_ref = `git describe --all`.chomp.sub(/\Aheads\//, '')
93
+ end
94
+
95
+ if current_ref == ref
96
+ Dir.chdir(repo_dir) do
97
+ sh 'git reset --hard'
98
+ end
99
+ else
100
+ require 'fileutils'
101
+ FileUtils.rm_rf(repo_dir)
102
+ needs_clone = true
103
+ end
104
+ else
105
+ needs_clone = true
106
+ end
107
+
108
+ if needs_clone
109
+ # Disabling checkout here to suppress "detached HEAD" warning.
110
+ sh "git clone --no-checkout --depth 1 --branch #{ref} #{url}"
111
+
112
+ Dir.chdir(repo_dir) do
113
+ sh "git checkout --quiet #{ref}"
114
+ end
115
+ end
116
+
117
+ repo_dir
118
+ end
119
+
85
120
  def with_clean_bundler_env
86
121
  if defined?(Bundler)
87
122
  Bundler.with_clean_env do
@@ -99,7 +99,13 @@ module Transpec
99
99
 
100
100
  def process_should_receive(should_receive)
101
101
  if @configuration.convert_to_expect_to_receive?
102
- should_receive.expectize!(@configuration.negative_form_of_to)
102
+ if should_receive.any_number_of_times? && @configuration.replace_deprecated_method?
103
+ should_receive.allowize_any_number_of_times!(@configuration.negative_form_of_to)
104
+ else
105
+ should_receive.expectize!(@configuration.negative_form_of_to)
106
+ end
107
+ elsif should_receive.any_number_of_times? && @configuration.replace_deprecated_method?
108
+ should_receive.stubize_any_number_of_times!
103
109
  end
104
110
  end
105
111
 
@@ -113,6 +119,8 @@ module Transpec
113
119
  elsif @configuration.replace_deprecated_method?
114
120
  method_stub.replace_deprecated_method!
115
121
  end
122
+
123
+ method_stub.remove_any_number_of_times! if @configuration.replace_deprecated_method?
116
124
  end
117
125
 
118
126
  def process_be_close(be_close)
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+
3
+ require 'transpec/syntax'
4
+
5
+ module Transpec
6
+ class Syntax
7
+ module AnyNumberOfTimesable
8
+ def any_number_of_times?
9
+ !any_number_of_times_node.nil?
10
+ end
11
+
12
+ def remove_any_number_of_times!
13
+ return unless any_number_of_times?
14
+
15
+ map = any_number_of_times_node.loc
16
+ dot_any_number_of_times_range = map.dot.join(map.selector)
17
+ remove(dot_any_number_of_times_range)
18
+ end
19
+
20
+ private
21
+
22
+ def any_number_of_times_node
23
+ each_following_chained_method_node do |chained_node|
24
+ method_name = chained_node.children[1]
25
+ return chained_node if method_name == :any_number_of_times
26
+ end
27
+ end
28
+
29
+ def each_following_chained_method_node
30
+ return to_enum(__method__) unless block_given?
31
+
32
+ @ancestor_nodes.reverse.reduce(@node) do |child_node, parent_node|
33
+ return unless [:send, :block].include?(parent_node.type)
34
+ return unless parent_node.children.first == child_node
35
+ yield parent_node, child_node
36
+ parent_node
37
+ end
38
+ nil
39
+ end
40
+ end
41
+ end
42
+ end
@@ -9,10 +9,16 @@ module Transpec
9
9
  include SendNodeSyntax
10
10
 
11
11
  def wrap_subject_in_expect!
12
+ wrap_subject_with_method!('expect')
13
+ end
14
+
15
+ private
16
+
17
+ def wrap_subject_with_method!(method)
12
18
  if Util.in_parentheses?(subject_node)
13
- insert_before(subject_range, 'expect')
19
+ insert_before(subject_range, method)
14
20
  else
15
- insert_before(subject_range, 'expect(')
21
+ insert_before(subject_range, "#{method}(")
16
22
  insert_after(subject_range, ')')
17
23
  end
18
24
  end
@@ -2,13 +2,14 @@
2
2
 
3
3
  require 'transpec/syntax'
4
4
  require 'transpec/syntax/any_instanceable'
5
+ require 'transpec/syntax/any_number_of_timesable'
5
6
  require 'transpec/util'
6
7
  require 'English'
7
8
 
8
9
  module Transpec
9
10
  class Syntax
10
11
  class MethodStub < Syntax
11
- include AnyInstanceable, Util
12
+ include AnyInstanceable, AnyNumberOfTimesable, Util
12
13
 
13
14
  def allowize!
14
15
  # There's no way of unstubbing in #allow syntax.
@@ -3,25 +3,46 @@
3
3
  require 'transpec/syntax'
4
4
  require 'transpec/syntax/expectizable'
5
5
  require 'transpec/syntax/any_instanceable'
6
+ require 'transpec/syntax/any_number_of_timesable'
6
7
 
7
8
  module Transpec
8
9
  class Syntax
9
10
  class ShouldReceive < Syntax
10
- include Expectizable, AnyInstanceable
11
+ include Expectizable, AnyInstanceable, AnyNumberOfTimesable
11
12
 
12
13
  def positive?
13
14
  method_name == :should_receive
14
15
  end
15
16
 
16
17
  def expectize!(negative_form = 'not_to')
18
+ convert_to_syntax!('expect', negative_form)
19
+ end
20
+
21
+ def allowize_any_number_of_times!(negative_form = 'not_to')
22
+ return unless any_number_of_times?
23
+
24
+ convert_to_syntax!('allow', negative_form)
25
+ remove_any_number_of_times!
26
+ end
27
+
28
+ def stubize_any_number_of_times!(negative_form = 'not_to')
29
+ return unless any_number_of_times?
30
+
31
+ replace(selector_range, 'stub')
32
+ remove_any_number_of_times!
33
+ end
34
+
35
+ private
36
+
37
+ def convert_to_syntax!(syntax, negative_form)
17
38
  unless in_example_group_context?
18
- fail NotInExampleGroupContextError.new(expression_range, "##{method_name}", '#expect')
39
+ fail NotInExampleGroupContextError.new(expression_range, "##{method_name}", "##{syntax}")
19
40
  end
20
41
 
21
42
  if any_instance?
22
43
  wrap_class_in_expect_any_instance_of!
23
44
  else
24
- wrap_subject_in_expect!
45
+ wrap_subject_with_method!(syntax)
25
46
  end
26
47
 
27
48
  replace(selector_range, "#{positive? ? 'to' : negative_form} receive")
@@ -40,8 +61,6 @@ module Transpec
40
61
  end
41
62
  end
42
63
 
43
- private
44
-
45
64
  def self.target_receiver_node?(node)
46
65
  !node.nil?
47
66
  end
@@ -60,7 +79,7 @@ module Transpec
60
79
  def broken_block_nodes
61
80
  @broken_block_nodes ||= [
62
81
  block_node_taken_by_with_method_with_no_normal_args,
63
- block_node_followed_by_message_expectation_method
82
+ block_node_following_message_expectation_method
64
83
  ].compact.uniq
65
84
  end
66
85
 
@@ -76,20 +95,12 @@ module Transpec
76
95
  # (args
77
96
  # (arg :block_arg)) nil)
78
97
  def block_node_taken_by_with_method_with_no_normal_args
79
- @ancestor_nodes.reverse.reduce(@node) do |child_node, parent_node|
80
- return nil unless [:send, :block].include?(parent_node.type)
81
- return nil unless parent_node.children.first == child_node
82
-
83
- if parent_node.type == :block
84
- return nil unless child_node.children[1] == :with
85
- return nil if child_node.children[2]
86
- return parent_node
87
- end
88
-
89
- parent_node
98
+ each_following_chained_method_node do |chained_node, child_node|
99
+ next unless chained_node.type == :block
100
+ return nil unless child_node.children[1] == :with
101
+ return nil if child_node.children[2]
102
+ return chained_node
90
103
  end
91
-
92
- nil
93
104
  end
94
105
 
95
106
  # subject.should_receive(:method_name) do |block_arg|
@@ -102,15 +113,11 @@ module Transpec
102
113
  # (sym :method_name))
103
114
  # (args
104
115
  # (arg :block_arg)) nil) :once)
105
- def block_node_followed_by_message_expectation_method
106
- @ancestor_nodes.reverse.reduce(@node) do |child_node, parent_node|
107
- return nil unless [:send, :block].include?(parent_node.type)
108
- return nil unless parent_node.children.first == child_node
109
- return child_node if child_node.type == :block && parent_node.type == :send
110
- parent_node
116
+ def block_node_following_message_expectation_method
117
+ each_following_chained_method_node do |chained_node, child_node|
118
+ next unless chained_node.type == :send
119
+ return child_node if child_node.type == :block
111
120
  end
112
-
113
- nil
114
121
  end
115
122
  end
116
123
  end
@@ -5,7 +5,7 @@ module Transpec
5
5
  module Version
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 4
8
+ PATCH = 5
9
9
 
10
10
  def self.to_s
11
11
  [MAJOR, MINOR, PATCH].join('.')
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ RSpec.configure do |config|
10
10
  c.syntax = :should
11
11
  end
12
12
 
13
+ config.color_enabled = true
13
14
  config.treat_symbols_as_metadata_keys_with_true_values = true
14
15
  config.filter_run_excluding do_not_run_in_converted_spec: ENV['TRANSPEC_CONVERTED_SPEC']
15
16
 
@@ -164,7 +164,7 @@ module Transpec
164
164
  context "when #{cli_type.inspect} is specified" do
165
165
  let(:args) { ['--disable', cli_type] }
166
166
 
167
- it "sets configuration ##{config_attr} false" do
167
+ it "sets Configuration##{config_attr} false" do
168
168
  cli.parse_options(args)
169
169
  cli.configuration.send(config_attr).should be_false
170
170
  end
@@ -197,7 +197,7 @@ module Transpec
197
197
  context "when #{form.inspect} is specified" do
198
198
  let(:args) { ['--negative-form', form] }
199
199
 
200
- it "sets configuration #negative_form_of_to? #{form.inspect}" do
200
+ it "sets Configuration#negative_form_of_to? #{form.inspect}" do
201
201
  cli.parse_options(args)
202
202
  cli.configuration.negative_form_of_to.should == form
203
203
  end
@@ -208,7 +208,7 @@ module Transpec
208
208
  describe '-p/--no-parentheses-matcher-arg option' do
209
209
  let(:args) { ['--no-parentheses-matcher-arg'] }
210
210
 
211
- it 'sets configuration #parenthesize_matcher_arg? false' do
211
+ it 'sets Configuration#parenthesize_matcher_arg? false' do
212
212
  cli.parse_options(args)
213
213
  cli.configuration.parenthesize_matcher_arg.should be_false
214
214
  end
@@ -282,7 +282,7 @@ module Transpec
282
282
  context 'when a directory path is passed' do
283
283
  let(:paths) { ['dir'] }
284
284
 
285
- it 'returns file paths with .rb extension in the directory' do
285
+ it 'returns file paths with .rb extension in the directory recursively' do
286
286
  should == ['dir/file.rb']
287
287
  end
288
288
  end