transpec 2.3.2 → 2.3.3
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/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
|