transpec 2.3.2 → 2.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/transpec/dynamic_analyzer.rb +2 -1
- data/lib/transpec/dynamic_analyzer/rewriter.rb +1 -1
- data/lib/transpec/dynamic_analyzer/transpec_analysis_helper.rb.erb +25 -23
- data/lib/transpec/version.rb +1 -1
- data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +4 -4
- data/spec/transpec/dynamic_analyzer_spec.rb +33 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 585693816f02d6ca49a0a8a4e0ccec79e5514b96
|
4
|
+
data.tar.gz: 082314811f1021acf7036e0bccd4f88c99348f07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7c2c4e9b46e0a3e70939acbcda80531511edab54637e75ff1e070e88490e648f36ff69a55dd86af680d0b355c67537f2e86747e392b86d3e1889bfb8e40fc54
|
7
|
+
data.tar.gz: 648882d9a093d0be7abc399922f3d1deadef1af0386e0028fd25b7cfc0f7aee5c71af05e050940c3e12d7bb34e8e5013f1523d1dd06a68b6737fc3531b96a286
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
## Development
|
4
4
|
|
5
|
+
## v2.3.3
|
6
|
+
|
7
|
+
* Fix failure on dynamic analysis when there's a RSpec-like method invocation in a context that undefines `Object` methods (e.g. `after` callback in [factory_girl definition context](https://github.com/thoughtbot/factory_girl/blob/v4.4.0/lib/factory_girl/definition_proxy.rb#L3-L7)). ([#66](https://github.com/yujinakayama/transpec/issues/66))
|
8
|
+
|
5
9
|
## v2.3.2
|
6
10
|
|
7
11
|
* Fix a bug where explicit spec type metadata are added to wrong position when the `describe` has multiple non-metadata arguments (e.g. `describe Something, '#some_method' { }`). ([#77](https://github.com/yujinakayama/transpec/issues/77))
|
@@ -12,7 +12,8 @@ require 'English'
|
|
12
12
|
|
13
13
|
module Transpec
|
14
14
|
class DynamicAnalyzer
|
15
|
-
|
15
|
+
ANALYSIS_MODULE = 'TranspecAnalysis'
|
16
|
+
ANALYSIS_METHOD = 'analyze'
|
16
17
|
HELPER_TEMPLATE_FILE = 'transpec_analysis_helper.rb.erb'
|
17
18
|
RESULT_FILE = 'transpec_analysis_result.json'
|
18
19
|
|
@@ -82,7 +82,7 @@ module Transpec
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def build_wrapper_codes(node, analysis_codes)
|
85
|
-
front = "#{ANALYSIS_METHOD}(("
|
85
|
+
front = "#{ANALYSIS_MODULE}.#{ANALYSIS_METHOD}(("
|
86
86
|
rear = format('), self, %s, %s)', node_id(node).inspect, hash_literal(analysis_codes))
|
87
87
|
[front, rear]
|
88
88
|
end
|
@@ -1,14 +1,36 @@
|
|
1
|
-
module
|
1
|
+
module <%= ANALYSIS_MODULE %>
|
2
2
|
@base_path = Dir.pwd
|
3
3
|
|
4
|
-
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def temporary_data
|
5
7
|
@temporary_data ||= {}
|
6
8
|
end
|
7
9
|
|
8
|
-
def
|
10
|
+
def data
|
9
11
|
@data ||= {}
|
10
12
|
end
|
11
13
|
|
14
|
+
def <%= ANALYSIS_METHOD %>(object, context, node_id, analysis_codes)
|
15
|
+
node_data = {}
|
16
|
+
|
17
|
+
analysis_codes.each do |key, (target_type, code)|
|
18
|
+
target = case target_type
|
19
|
+
when :object then object
|
20
|
+
when :context then context
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
node_data[key] = target.instance_eval(code)
|
25
|
+
rescue Exception
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
data[node_id] = node_data
|
30
|
+
|
31
|
+
object
|
32
|
+
end
|
33
|
+
|
12
34
|
at_exit do
|
13
35
|
# Use JSON rather than Marshal so that:
|
14
36
|
# * Unknown third-party class information won't be serialized.
|
@@ -22,23 +44,3 @@ module TranspecAnalysis
|
|
22
44
|
end
|
23
45
|
end
|
24
46
|
end
|
25
|
-
|
26
|
-
def <%= ANALYSIS_METHOD %>(object, context, node_id, analysis_codes)
|
27
|
-
node_data = {}
|
28
|
-
|
29
|
-
analysis_codes.each do |key, (target_type, code)|
|
30
|
-
target = case target_type
|
31
|
-
when :object then object
|
32
|
-
when :context then context
|
33
|
-
end
|
34
|
-
|
35
|
-
begin
|
36
|
-
node_data[key] = target.instance_eval(code)
|
37
|
-
rescue Exception
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
TranspecAnalysis.data[node_id] = node_data
|
42
|
-
|
43
|
-
object
|
44
|
-
end
|
data/lib/transpec/version.rb
CHANGED
@@ -22,7 +22,7 @@ module Transpec
|
|
22
22
|
# rubocop:disable LineLength
|
23
23
|
let(:expected_source) do
|
24
24
|
<<-'END'
|
25
|
-
|
25
|
+
TranspecAnalysis.analyze((TranspecAnalysis.analyze((subject), self, "(string)_12_19", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should be(foo)), self, "(string)_12_34", { :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"] })
|
26
26
|
END
|
27
27
|
end
|
28
28
|
# rubocop:enable LineLength
|
@@ -43,7 +43,7 @@ module Transpec
|
|
43
43
|
# rubocop:disable LineLength
|
44
44
|
let(:expected_source) do
|
45
45
|
<<-'END'
|
46
|
-
|
46
|
+
TranspecAnalysis.analyze((TranspecAnalysis.analyze((subject), self, "(string)_14_21", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should), self, "(string)_14_28", { :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"], :"=~_source_location" => [:object, "method(:=~).source_location"], :"=~_example_method_defined_by_user?" => [:object, "owner = method(:=~).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }) =~ TranspecAnalysis.analyze((<<-HEREDOC.gsub('foo', 'bar')), self, "(string)_32_61", { :enumerable_arg? => [:object, "is_a?(Enumerable)"] })
|
47
47
|
foo
|
48
48
|
HEREDOC
|
49
49
|
END
|
@@ -65,7 +65,7 @@ module Transpec
|
|
65
65
|
# rubocop:disable LineLength
|
66
66
|
let(:expected_source) do
|
67
67
|
<<-'END'
|
68
|
-
|
68
|
+
TranspecAnalysis.analyze((expect { do_something }), self, "(string)_14_20", { :expect_source_location => [:context, "method(:expect).source_location"], :expect_example_method_defined_by_user? => [:context, "owner = method(:expect).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).to throw_symbol
|
69
69
|
END
|
70
70
|
end
|
71
71
|
# rubocop:enable LineLength
|
@@ -85,7 +85,7 @@ module Transpec
|
|
85
85
|
# rubocop:disable LineLength
|
86
86
|
let(:expected_source) do
|
87
87
|
<<-'END'
|
88
|
-
|
88
|
+
TranspecAnalysis.analyze((double 'something'), self, "(string)_14_32", { :double_source_location => [:context, "method(:double).source_location"], :double_example_method_defined_by_user? => [:context, "owner = method(:double).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] })
|
89
89
|
END
|
90
90
|
end
|
91
91
|
# rubocop:enable LineLength
|
@@ -215,6 +215,39 @@ module Transpec
|
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
218
|
+
context 'when there is a proxy/delegator Class that undefines Object methods' do
|
219
|
+
let(:source) do
|
220
|
+
# https://github.com/thoughtbot/factory_girl/blob/v4.4.0/lib/factory_girl/definition_proxy.rb#L3-L7
|
221
|
+
<<-END
|
222
|
+
class SomeProxy
|
223
|
+
UNPROXIED_METHODS = %w(__send__ object_id initialize instance_eval).map(&:to_sym)
|
224
|
+
|
225
|
+
(instance_methods + private_instance_methods).each do |method|
|
226
|
+
undef_method(method) unless UNPROXIED_METHODS.include?(method)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe 'example' do
|
231
|
+
it 'is 1' do
|
232
|
+
proxy = SomeProxy.new
|
233
|
+
proxy.instance_eval do
|
234
|
+
1.should == 1
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
END
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'properly analyzes even in such context' do
|
242
|
+
should_node = find_node_in_file(spec_file_path) do |node|
|
243
|
+
node.send_type? && node.children[1] == :should
|
244
|
+
end
|
245
|
+
|
246
|
+
runtime_data = dynamic_analyzer.analyze
|
247
|
+
runtime_data.run?(should_node).should be_true
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
218
251
|
runtime_data_cache = {}
|
219
252
|
|
220
253
|
subject(:runtime_data) do
|