transpec 2.0.0 → 2.1.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +7 -0
- data/README.md +25 -1
- data/README.md.erb +56 -1
- data/lib/transpec/dynamic_analyzer/helper.rb.erb +4 -4
- data/lib/transpec/report.rb +3 -3
- data/lib/transpec/syntax/have.rb +8 -1
- data/lib/transpec/syntax/have/dynamic_analysis.rb +4 -0
- data/lib/transpec/syntax/mixin/expect_base.rb +2 -1
- data/lib/transpec/syntax/oneliner_should.rb +2 -0
- data/lib/transpec/syntax/rspec_configure.rb +2 -2
- data/lib/transpec/syntax/should.rb +14 -6
- data/lib/transpec/version.rb +1 -1
- data/spec/transpec/report_spec.rb +1 -1
- data/spec/transpec/syntax/current_example_spec.rb +1 -2
- data/spec/transpec/syntax/have_spec.rb +108 -33
- data/spec/transpec/syntax/raise_error_spec.rb +22 -0
- data/spec/transpec/syntax/should_spec.rb +2 -1
- data/transpec.gemspec +1 -1
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2402b33bb816bb8834d369cd49ea5b93199f0c7f
|
4
|
+
data.tar.gz: 3fc7140d2ebbf711de884459b1a8d424ce073a1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e023997e0b62507e833df7fe92a7fad689c2aa6fc601378df904e54d66d8122ea97af22eec4ca8c0c901aa043c7717221188dba3871828e0822e104b4d6e93f2
|
7
|
+
data.tar.gz: 1c2c697e5f2d143be79ecc6d8718e488466eb3f53c3d9629fd94c447529ab5c0c1423f4333c28b6af07f4a657aac48b37d291a25e69dde1b01b51ad0699f6ca9
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
## Development
|
4
4
|
|
5
|
+
## v2.1.0
|
6
|
+
|
7
|
+
* Disable invalid conversion of `expect(model).to have(n).errors_on(:attr)`. ([#62](https://github.com/yujinakayama/transpec/issues/62))
|
8
|
+
* Fix false positive conversion of `expect { }.should raise_error(SpecificErrorClass)`. ([#64](https://github.com/yujinakayama/transpec/issues/64))
|
9
|
+
* Support conversion of `expect { do_something }.should`.
|
10
|
+
* Relax `activesupport` dependency from `'~> 4.0'` to `'>= 3.0', '< 5.0'` in case that `transpec` is added to a `Gemfile`. ([#63](https://github.com/yujinakayama/transpec/pull/63))
|
11
|
+
|
5
12
|
## v2.0.0
|
6
13
|
|
7
14
|
* Support conversion of implicit spec types in rspec-rails. ([#57](https://github.com/yujinakayama/transpec/issues/57))
|
data/README.md
CHANGED
@@ -639,6 +639,9 @@ expect(team).to have(3).players
|
|
639
639
|
|
640
640
|
# Assume #players is a private method.
|
641
641
|
expect(team).to have(3).players
|
642
|
+
|
643
|
+
# Validation expectations in rspec-rails.
|
644
|
+
expect(model).to have(2).errors_on(:name)
|
642
645
|
```
|
643
646
|
|
644
647
|
Will be converted to:
|
@@ -656,6 +659,9 @@ expect(team.players.size).to eq(3)
|
|
656
659
|
|
657
660
|
# have(n).items matcher invokes #players even if it's a private method.
|
658
661
|
expect(team.send(:players).size).to eq(3)
|
662
|
+
|
663
|
+
# Conversion of `have(n).errors_on(:attr)` is not supported.
|
664
|
+
expect(model).to have(2).errors_on(:name)
|
659
665
|
```
|
660
666
|
|
661
667
|
There's an option to continue using `have(n).items` matcher with [rspec-collection_matchers](https://github.com/rspec/rspec-collection_matchers) which is a gem extracted from `rspec-expectations`.
|
@@ -664,7 +670,25 @@ If you choose to do so, disable this conversion by either:
|
|
664
670
|
* Specify `--keep have_items` option manually.
|
665
671
|
* Require `rspec-collection_matchers` in your spec so that Transpec automatically disables this conversion.
|
666
672
|
|
667
|
-
|
673
|
+
#### Note about `expect(model).to have(n).errors_on(:attr)`
|
674
|
+
|
675
|
+
The idiom `expect(model).to have(n).errors_on(:attr)` in rspec-rails 2 consists of
|
676
|
+
`have(n).items` matcher and a monkey-patch [`ActiveModel::Validations#errors_on`](https://github.com/rspec/rspec-rails/blob/v2.14.2/lib/rspec/rails/extensions/active_record/base.rb#L34-L57).
|
677
|
+
In RSpec 2 the monkey-patch was provided by rspec-rails,
|
678
|
+
but in RSpec 3 it's extracted to rspec-collection_matchers along with `have(n).items` matcher.
|
679
|
+
So if you convert it to `expect(model.errors_on(:attr).size).to eq(2)` without rspec-collection_matchers,
|
680
|
+
it fails with error `undefined method 'error_on' for #<Model ...>`.
|
681
|
+
|
682
|
+
Technically it can be converted to:
|
683
|
+
|
684
|
+
```ruby
|
685
|
+
model.valid?
|
686
|
+
expect(model.errors[:attr].size).to eq(n)
|
687
|
+
```
|
688
|
+
|
689
|
+
However currently Transpec doesn't support this conversion
|
690
|
+
since this is probably not what most people want.
|
691
|
+
So using rspec-collection_matchers gem is recommended for now.
|
668
692
|
|
669
693
|
* This conversion can be disabled by: `--keep have_items`
|
670
694
|
* Deprecation: deprecated since RSpec 2.99, removed in RSpec 3.0
|
data/README.md.erb
CHANGED
@@ -640,6 +640,13 @@ private_method_example = <<END
|
|
640
640
|
expect(team).to have(3).players
|
641
641
|
END
|
642
642
|
-%>
|
643
|
+
|
644
|
+
# Validation expectations in rspec-rails.
|
645
|
+
<%=
|
646
|
+
errors_on_example = <<END
|
647
|
+
expect(model).to have(2).errors_on(:name)
|
648
|
+
END
|
649
|
+
-%>
|
643
650
|
```
|
644
651
|
|
645
652
|
Will be converted to:
|
@@ -680,6 +687,36 @@ end
|
|
680
687
|
team = Team.new
|
681
688
|
END
|
682
689
|
-%>
|
690
|
+
|
691
|
+
# Conversion of `have(n).errors_on(:attr)` is not supported.
|
692
|
+
<%=
|
693
|
+
convert(errors_on_example, dynamic: true, wrap_with: :example, hidden: <<END)
|
694
|
+
module ActiveModel
|
695
|
+
module Validations
|
696
|
+
def errors_on(attribute, options = {})
|
697
|
+
valid_args = [options[:context]].compact
|
698
|
+
self.valid?(*valid_args)
|
699
|
+
|
700
|
+
[self.errors[attribute]].flatten.compact
|
701
|
+
end
|
702
|
+
end
|
703
|
+
end
|
704
|
+
|
705
|
+
class Model
|
706
|
+
include ActiveModel::Validations
|
707
|
+
|
708
|
+
def valid?(*)
|
709
|
+
false
|
710
|
+
end
|
711
|
+
|
712
|
+
def errors
|
713
|
+
{ name: [:foo, :bar] }
|
714
|
+
end
|
715
|
+
end
|
716
|
+
|
717
|
+
model = Model.new
|
718
|
+
END
|
719
|
+
-%>
|
683
720
|
```
|
684
721
|
|
685
722
|
There's an option to continue using `have(n).items` matcher with [rspec-collection_matchers](https://github.com/rspec/rspec-collection_matchers) which is a gem extracted from `rspec-expectations`.
|
@@ -688,7 +725,25 @@ If you choose to do so, disable this conversion by either:
|
|
688
725
|
* Specify `--keep have_items` option manually.
|
689
726
|
* Require `rspec-collection_matchers` in your spec so that Transpec automatically disables this conversion.
|
690
727
|
|
691
|
-
|
728
|
+
#### Note about `expect(model).to have(n).errors_on(:attr)`
|
729
|
+
|
730
|
+
The idiom `expect(model).to have(n).errors_on(:attr)` in rspec-rails 2 consists of
|
731
|
+
`have(n).items` matcher and a monkey-patch [`ActiveModel::Validations#errors_on`](https://github.com/rspec/rspec-rails/blob/v2.14.2/lib/rspec/rails/extensions/active_record/base.rb#L34-L57).
|
732
|
+
In RSpec 2 the monkey-patch was provided by rspec-rails,
|
733
|
+
but in RSpec 3 it's extracted to rspec-collection_matchers along with `have(n).items` matcher.
|
734
|
+
So if you convert it to `expect(model.errors_on(:attr).size).to eq(2)` without rspec-collection_matchers,
|
735
|
+
it fails with error `undefined method 'error_on' for #<Model ...>`.
|
736
|
+
|
737
|
+
Technically it can be converted to:
|
738
|
+
|
739
|
+
```ruby
|
740
|
+
model.valid?
|
741
|
+
expect(model.errors[:attr].size).to eq(n)
|
742
|
+
```
|
743
|
+
|
744
|
+
However currently Transpec doesn't support this conversion
|
745
|
+
since this is probably not what most people want.
|
746
|
+
So using rspec-collection_matchers gem is recommended for now.
|
692
747
|
|
693
748
|
* This conversion can be disabled by: `--keep have_items`
|
694
749
|
* Deprecation: deprecated since RSpec 2.99, removed in RSpec 3.0
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module TranspecAnalysis
|
2
2
|
@base_path = Dir.pwd
|
3
3
|
|
4
|
-
def self.
|
4
|
+
def self.temporary_data
|
5
5
|
@data ||= {}
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.
|
8
|
+
def self.data
|
9
9
|
@data ||= {}
|
10
10
|
end
|
11
11
|
|
@@ -18,7 +18,7 @@ module TranspecAnalysis
|
|
18
18
|
require 'json'
|
19
19
|
path = File.join(@base_path, '<%= RESULT_FILE %>')
|
20
20
|
File.open(path, 'w') do |file|
|
21
|
-
JSON.dump(
|
21
|
+
JSON.dump(data, file)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -38,7 +38,7 @@ def <%= ANALYSIS_METHOD %>(object, context, node_id, analysis_codes)
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
TranspecAnalysis.
|
41
|
+
TranspecAnalysis.data[node_id] = node_data
|
42
42
|
|
43
43
|
object
|
44
44
|
end
|
data/lib/transpec/report.rb
CHANGED
@@ -59,7 +59,7 @@ module Transpec
|
|
59
59
|
:green
|
60
60
|
end
|
61
61
|
|
62
|
-
|
62
|
+
conversion_incomplete_warning_stats(base_color) + error_stats(base_color)
|
63
63
|
end
|
64
64
|
|
65
65
|
def stats
|
@@ -97,10 +97,10 @@ module Transpec
|
|
97
97
|
text << indentation + ' ' + colorize('to: ', :cyan) + record.converted_syntax + "\n"
|
98
98
|
end
|
99
99
|
|
100
|
-
def
|
100
|
+
def conversion_incomplete_warning_stats(color)
|
101
101
|
text = pluralize(records.count, 'conversion') + ', '
|
102
102
|
text << pluralize(conversion_errors.count, 'incomplete') + ', '
|
103
|
-
text << pluralize(annotation_count, '
|
103
|
+
text << pluralize(annotation_count, 'warning') + ', '
|
104
104
|
colorize(text, color)
|
105
105
|
end
|
106
106
|
|
data/lib/transpec/syntax/have.rb
CHANGED
@@ -29,7 +29,9 @@ module Transpec
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def conversion_target?
|
32
|
-
|
32
|
+
return false unless super
|
33
|
+
return false if runtime_subject_data(:project_requires_collection_matcher?)
|
34
|
+
!active_model_errors_on?
|
33
35
|
end
|
34
36
|
|
35
37
|
def convert_to_standard_expectation!(parenthesize_matcher_arg = true)
|
@@ -70,6 +72,11 @@ module Transpec
|
|
70
72
|
runtime_subject_data(:collection_accessor)
|
71
73
|
end
|
72
74
|
|
75
|
+
def active_model_errors_on?
|
76
|
+
return false unless runtime_subject_data(:subject_includes_active_model_validations?)
|
77
|
+
[:errors_on, :error_on].include?(items_name)
|
78
|
+
end
|
79
|
+
|
73
80
|
def collection_accessor_is_private?
|
74
81
|
runtime_subject_data(:collection_accessor_is_private?)
|
75
82
|
end
|
@@ -29,6 +29,10 @@ module Transpec
|
|
29
29
|
code = "#{subject_code}.private_methods.include?(#{items_name.inspect})"
|
30
30
|
rewriter.register_request(target_node, key, code, target_type)
|
31
31
|
|
32
|
+
key = :subject_includes_active_model_validations?
|
33
|
+
code = 'is_a?(ActiveModel::Validations)'
|
34
|
+
rewriter.register_request(target_node, key, code, target_type)
|
35
|
+
|
32
36
|
key = :project_requires_collection_matcher?
|
33
37
|
code = 'defined?(RSpec::CollectionMatchers)'
|
34
38
|
rewriter.register_request(target_node, key, code, :context)
|
@@ -5,6 +5,8 @@ require 'transpec/syntax/mixin/should_base'
|
|
5
5
|
require 'transpec/rspec_dsl'
|
6
6
|
require 'transpec/util'
|
7
7
|
require 'active_support/inflector/methods'
|
8
|
+
require 'active_support/inflector/inflections'
|
9
|
+
require 'active_support/inflections'
|
8
10
|
|
9
11
|
module Transpec
|
10
12
|
class Syntax
|
@@ -15,8 +15,8 @@ module Transpec
|
|
15
15
|
include Mixin::Send, Mixin::RSpecRails, ConfigModification
|
16
16
|
|
17
17
|
define_dynamic_analysis do |rewriter|
|
18
|
-
code = "TranspecAnalysis.
|
19
|
-
'TranspecAnalysis.
|
18
|
+
code = "TranspecAnalysis.temporary_data[:rspec_configure_run_order] ||= 0\n" \
|
19
|
+
'TranspecAnalysis.temporary_data[:rspec_configure_run_order] += 1'
|
20
20
|
rewriter.register_request(node, :run_order, code)
|
21
21
|
end
|
22
22
|
|
@@ -30,14 +30,10 @@ module Transpec
|
|
30
30
|
super && receiver_node && [:should, :should_not].include?(method_name)
|
31
31
|
end
|
32
32
|
|
33
|
-
def expect_available?
|
34
|
-
syntax_available?(__method__)
|
35
|
-
end
|
36
|
-
|
37
33
|
def expectize!(negative_form = 'not_to')
|
38
34
|
fail ContextError.new("##{method_name}", '#expect', selector_range) unless expect_available?
|
39
35
|
|
40
|
-
if
|
36
|
+
if proc_subject?
|
41
37
|
replace(range_of_subject_method_taking_block, 'expect')
|
42
38
|
else
|
43
39
|
wrap_subject_in_expect!
|
@@ -51,13 +47,25 @@ module Transpec
|
|
51
47
|
|
52
48
|
private
|
53
49
|
|
50
|
+
def expect_available?
|
51
|
+
syntax_available?(__method__)
|
52
|
+
end
|
53
|
+
|
54
|
+
def proc_subject?
|
55
|
+
return true if proc_literal?(subject_node)
|
56
|
+
return false unless subject_node.block_type?
|
57
|
+
send_node = subject_node.children.first
|
58
|
+
receiver_node, method_name, = *send_node
|
59
|
+
receiver_node.nil? && method_name == :expect
|
60
|
+
end
|
61
|
+
|
54
62
|
def range_of_subject_method_taking_block
|
55
63
|
send_node = subject_node.children.first
|
56
64
|
send_node.loc.expression
|
57
65
|
end
|
58
66
|
|
59
67
|
def register_record(negative_form_of_to)
|
60
|
-
if
|
68
|
+
if proc_subject?
|
61
69
|
original_syntax = "#{range_of_subject_method_taking_block.source} { }.should"
|
62
70
|
converted_syntax = 'expect { }.'
|
63
71
|
else
|
data/lib/transpec/version.rb
CHANGED
@@ -231,10 +231,9 @@ module Transpec
|
|
231
231
|
end
|
232
232
|
|
233
233
|
let(:current_example_objects) do
|
234
|
-
ast.each_node.
|
234
|
+
ast.each_node.each_with_object([]) do |node, objects|
|
235
235
|
current_example_object = CurrentExample.new(node, source_rewriter, runtime_data)
|
236
236
|
objects << current_example_object if current_example_object.conversion_target?
|
237
|
-
objects
|
238
237
|
end
|
239
238
|
end
|
240
239
|
|
@@ -139,6 +139,81 @@ module Transpec
|
|
139
139
|
it { should be_false }
|
140
140
|
end
|
141
141
|
end
|
142
|
+
|
143
|
+
context 'with expression `expect(obj).to have(2).errors_on(:name)`' do
|
144
|
+
subject { expect_object.have_matcher.conversion_target? }
|
145
|
+
|
146
|
+
context 'and subject includes ActiveModel::Validations' do
|
147
|
+
let(:source) do
|
148
|
+
<<-END
|
149
|
+
module ActiveModel
|
150
|
+
module Validations
|
151
|
+
def errors_on(attribute, options = {})
|
152
|
+
valid_args = [options[:context]].compact
|
153
|
+
self.valid?(*valid_args)
|
154
|
+
|
155
|
+
[self.errors[attribute]].flatten.compact
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
class SomeModel
|
161
|
+
include ActiveModel::Validations
|
162
|
+
|
163
|
+
def valid?(*)
|
164
|
+
false
|
165
|
+
end
|
166
|
+
|
167
|
+
def errors
|
168
|
+
{ name: [:foo, :bar] }
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe SomeModel do
|
173
|
+
it 'has 2 errors on name' do
|
174
|
+
expect(subject).to have(2).errors_on(:name)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
END
|
178
|
+
end
|
179
|
+
|
180
|
+
context 'without runtime information' do
|
181
|
+
it { should be_true }
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'with runtime information' do
|
185
|
+
include_context 'dynamic analysis objects'
|
186
|
+
it { should be_false }
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'and subject includes ActiveModel::Validations' do
|
191
|
+
let(:source) do
|
192
|
+
<<-END
|
193
|
+
class SomeModel
|
194
|
+
def errors_on(*)
|
195
|
+
[:foo, :bar]
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe SomeModel do
|
200
|
+
it 'has 2 errors on name' do
|
201
|
+
expect(subject).to have(2).errors_on(:name)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
END
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'without runtime information' do
|
208
|
+
it { should be_true }
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'with runtime information' do
|
212
|
+
include_context 'dynamic analysis objects'
|
213
|
+
it { should be_true }
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
142
217
|
end
|
143
218
|
|
144
219
|
describe '#convert_to_standard_expectation!' do
|
@@ -931,24 +1006,24 @@ module Transpec
|
|
931
1006
|
end
|
932
1007
|
end
|
933
1008
|
|
934
|
-
context 'with expression `expect(obj).to have(2).
|
1009
|
+
context 'with expression `expect(obj).to have(2).attrs_on(:name)`' do
|
935
1010
|
let(:have_object) { expect_object.have_matcher }
|
936
1011
|
|
937
1012
|
context 'with runtime information' do
|
938
1013
|
include_context 'dynamic analysis objects'
|
939
1014
|
|
940
|
-
context 'and subject responds to #
|
1015
|
+
context 'and subject responds to #attrs_on' do
|
941
1016
|
let(:source) do
|
942
1017
|
<<-END
|
943
1018
|
class SomeModel
|
944
|
-
def
|
1019
|
+
def attrs_on(attribute)
|
945
1020
|
[:foo, :bar]
|
946
1021
|
end
|
947
1022
|
end
|
948
1023
|
|
949
1024
|
describe SomeModel do
|
950
|
-
it 'has 2
|
951
|
-
expect(subject).to have(2).
|
1025
|
+
it 'has 2 attributes on name' do
|
1026
|
+
expect(subject).to have(2).attrs_on(:name)
|
952
1027
|
end
|
953
1028
|
end
|
954
1029
|
END
|
@@ -957,46 +1032,46 @@ module Transpec
|
|
957
1032
|
let(:expected_source) do
|
958
1033
|
<<-END
|
959
1034
|
class SomeModel
|
960
|
-
def
|
1035
|
+
def attrs_on(attribute)
|
961
1036
|
[:foo, :bar]
|
962
1037
|
end
|
963
1038
|
end
|
964
1039
|
|
965
1040
|
describe SomeModel do
|
966
|
-
it 'has 2
|
967
|
-
expect(subject.
|
1041
|
+
it 'has 2 attributes on name' do
|
1042
|
+
expect(subject.attrs_on(:name).size).to eq(2)
|
968
1043
|
end
|
969
1044
|
end
|
970
1045
|
END
|
971
1046
|
end
|
972
1047
|
|
973
|
-
it 'converts to `expect(obj.
|
1048
|
+
it 'converts to `expect(obj.attrs_on(:name).size).to eq(2)` form' do
|
974
1049
|
have_object.convert_to_standard_expectation!
|
975
1050
|
rewritten_source.should == expected_source
|
976
1051
|
end
|
977
1052
|
|
978
1053
|
it 'adds record ' \
|
979
|
-
'`expect(obj).to have(n).
|
1054
|
+
'`expect(obj).to have(n).attrs_on(...)` -> `expect(obj.attrs_on(...).size).to eq(n)`' do
|
980
1055
|
have_object.convert_to_standard_expectation!
|
981
|
-
record.original_syntax.should == 'expect(obj).to have(n).
|
982
|
-
record.converted_syntax.should == 'expect(obj.
|
1056
|
+
record.original_syntax.should == 'expect(obj).to have(n).attrs_on(...)'
|
1057
|
+
record.converted_syntax.should == 'expect(obj.attrs_on(...).size).to eq(n)'
|
983
1058
|
end
|
984
1059
|
end
|
985
1060
|
|
986
|
-
context 'and #
|
1061
|
+
context 'and #attrs_on is a private method' do
|
987
1062
|
let(:source) do
|
988
1063
|
<<-END
|
989
1064
|
class SomeModel
|
990
1065
|
private
|
991
1066
|
|
992
|
-
def
|
1067
|
+
def attrs_on(attribute)
|
993
1068
|
[:foo, :bar]
|
994
1069
|
end
|
995
1070
|
end
|
996
1071
|
|
997
1072
|
describe SomeModel do
|
998
|
-
it 'has 2
|
999
|
-
expect(subject).to have(2).
|
1073
|
+
it 'has 2 attributes on name' do
|
1074
|
+
expect(subject).to have(2).attrs_on(:name)
|
1000
1075
|
end
|
1001
1076
|
end
|
1002
1077
|
END
|
@@ -1007,29 +1082,29 @@ module Transpec
|
|
1007
1082
|
class SomeModel
|
1008
1083
|
private
|
1009
1084
|
|
1010
|
-
def
|
1085
|
+
def attrs_on(attribute)
|
1011
1086
|
[:foo, :bar]
|
1012
1087
|
end
|
1013
1088
|
end
|
1014
1089
|
|
1015
1090
|
describe SomeModel do
|
1016
|
-
it 'has 2
|
1017
|
-
expect(subject.send(:
|
1091
|
+
it 'has 2 attributes on name' do
|
1092
|
+
expect(subject.send(:attrs_on, :name).size).to eq(2)
|
1018
1093
|
end
|
1019
1094
|
end
|
1020
1095
|
END
|
1021
1096
|
end
|
1022
1097
|
|
1023
|
-
it 'converts to `expect(obj.send(:
|
1098
|
+
it 'converts to `expect(obj.send(:attrs_on, :name).size).to eq(2)` form' do
|
1024
1099
|
have_object.convert_to_standard_expectation!
|
1025
1100
|
rewritten_source.should == expected_source
|
1026
1101
|
end
|
1027
1102
|
|
1028
1103
|
it 'adds record ' \
|
1029
|
-
'`expect(obj).to have(n).
|
1104
|
+
'`expect(obj).to have(n).attrs_on(...)` -> `expect(obj.send(:attrs_on, ...).size).to eq(n)`' do
|
1030
1105
|
have_object.convert_to_standard_expectation!
|
1031
|
-
record.original_syntax.should == 'expect(obj).to have(n).
|
1032
|
-
record.converted_syntax.should == 'expect(obj.send(:
|
1106
|
+
record.original_syntax.should == 'expect(obj).to have(n).attrs_on(...)'
|
1107
|
+
record.converted_syntax.should == 'expect(obj.send(:attrs_on, ...).size).to eq(n)'
|
1033
1108
|
end
|
1034
1109
|
end
|
1035
1110
|
end
|
@@ -1038,14 +1113,14 @@ module Transpec
|
|
1038
1113
|
let(:source) do
|
1039
1114
|
<<-END
|
1040
1115
|
class SomeModel
|
1041
|
-
def
|
1116
|
+
def attrs_on(attribute)
|
1042
1117
|
[:foo, :bar]
|
1043
1118
|
end
|
1044
1119
|
end
|
1045
1120
|
|
1046
1121
|
describe SomeModel do
|
1047
|
-
it 'has 2
|
1048
|
-
expect(subject).to have(2).
|
1122
|
+
it 'has 2 attributes on name' do
|
1123
|
+
expect(subject).to have(2).attrs_on(:name)
|
1049
1124
|
end
|
1050
1125
|
end
|
1051
1126
|
END
|
@@ -1054,29 +1129,29 @@ module Transpec
|
|
1054
1129
|
let(:expected_source) do
|
1055
1130
|
<<-END
|
1056
1131
|
class SomeModel
|
1057
|
-
def
|
1132
|
+
def attrs_on(attribute)
|
1058
1133
|
[:foo, :bar]
|
1059
1134
|
end
|
1060
1135
|
end
|
1061
1136
|
|
1062
1137
|
describe SomeModel do
|
1063
|
-
it 'has 2
|
1064
|
-
expect(subject.
|
1138
|
+
it 'has 2 attributes on name' do
|
1139
|
+
expect(subject.attrs_on(:name).size).to eq(2)
|
1065
1140
|
end
|
1066
1141
|
end
|
1067
1142
|
END
|
1068
1143
|
end
|
1069
1144
|
|
1070
|
-
it 'converts to `expect(obj.
|
1145
|
+
it 'converts to `expect(obj.attrs_on(:name).size).to eq(2)` form' do
|
1071
1146
|
have_object.convert_to_standard_expectation!
|
1072
1147
|
rewritten_source.should == expected_source
|
1073
1148
|
end
|
1074
1149
|
|
1075
1150
|
it 'adds record ' \
|
1076
|
-
'`expect(obj).to have(n).
|
1151
|
+
'`expect(obj).to have(n).attrs_on(...)` -> `expect(obj.attrs_on(...).size).to eq(n)`' do
|
1077
1152
|
have_object.convert_to_standard_expectation!
|
1078
|
-
record.original_syntax.should == 'expect(obj).to have(n).
|
1079
|
-
record.converted_syntax.should == 'expect(obj.
|
1153
|
+
record.original_syntax.should == 'expect(obj).to have(n).attrs_on(...)'
|
1154
|
+
record.converted_syntax.should == 'expect(obj.attrs_on(...).size).to eq(n)'
|
1080
1155
|
end
|
1081
1156
|
end
|
1082
1157
|
end
|
@@ -63,6 +63,28 @@ module Transpec
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
context 'with expression `expect { }.should raise_error(SpecificErrorClass)`' do
|
67
|
+
let(:source) do
|
68
|
+
<<-END
|
69
|
+
describe 'example' do
|
70
|
+
it 'raises SpecificErrorClass' do
|
71
|
+
expect { do_something }.should raise_error(SpecificErrorClass)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
END
|
75
|
+
end
|
76
|
+
|
77
|
+
let(:raise_error_object) { expect_object.raise_error_matcher }
|
78
|
+
|
79
|
+
it 'does nothing' do
|
80
|
+
rewritten_source.should == source
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'reports nothing' do
|
84
|
+
raise_error_object.report.records.should be_empty
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
66
88
|
context 'with expression `lambda { }.should raise_error(SpecificErrorClass) { |error| ... }`' do
|
67
89
|
let(:source) do
|
68
90
|
<<-END
|
@@ -399,7 +399,8 @@ module Transpec
|
|
399
399
|
'lambda', 'Kernel.lambda', '::Kernel.lambda',
|
400
400
|
'proc', 'Kernel.proc', '::Kernel.proc',
|
401
401
|
'Proc.new', '::Proc.new',
|
402
|
-
'->'
|
402
|
+
'->',
|
403
|
+
'expect'
|
403
404
|
].each do |method|
|
404
405
|
context "with expression `#{method} { ... }.should`" do
|
405
406
|
let(:source) do
|
data/transpec.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency 'bundler', '~> 1.3'
|
27
27
|
spec.add_runtime_dependency 'rainbow', '>= 1.99.1', '< 3.0'
|
28
28
|
spec.add_runtime_dependency 'json', '~> 1.8'
|
29
|
-
spec.add_runtime_dependency 'activesupport', '
|
29
|
+
spec.add_runtime_dependency 'activesupport', '>= 3.0', '< 5.0'
|
30
30
|
|
31
31
|
spec.add_development_dependency 'rake', '~> 10.1'
|
32
32
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
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: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuji Nakayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -82,16 +82,22 @@ dependencies:
|
|
82
82
|
name: activesupport
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- - "
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3.0'
|
88
|
+
- - "<"
|
86
89
|
- !ruby/object:Gem::Version
|
87
|
-
version: '
|
90
|
+
version: '5.0'
|
88
91
|
type: :runtime
|
89
92
|
prerelease: false
|
90
93
|
version_requirements: !ruby/object:Gem::Requirement
|
91
94
|
requirements:
|
92
|
-
- - "
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '3.0'
|
98
|
+
- - "<"
|
93
99
|
- !ruby/object:Gem::Version
|
94
|
-
version: '
|
100
|
+
version: '5.0'
|
95
101
|
- !ruby/object:Gem::Dependency
|
96
102
|
name: rake
|
97
103
|
requirement: !ruby/object:Gem::Requirement
|