transpec 1.10.4 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -3
- data/CHANGELOG.md +9 -0
- data/README.md +96 -18
- data/README.md.erb +117 -51
- data/lib/transpec/base_rewriter.rb +25 -28
- data/lib/transpec/cli.rb +27 -14
- data/lib/transpec/configuration.rb +2 -1
- data/lib/transpec/converter.rb +54 -32
- data/lib/transpec/dynamic_analyzer/helper.rb.erb +44 -0
- data/lib/transpec/dynamic_analyzer/node_util.rb +17 -0
- data/lib/transpec/dynamic_analyzer/rewriter.rb +12 -4
- data/lib/transpec/dynamic_analyzer/runtime_data.rb +3 -4
- data/lib/transpec/dynamic_analyzer.rb +14 -52
- data/lib/transpec/option_parser.rb +89 -81
- data/lib/transpec/processed_source.rb +48 -0
- data/lib/transpec/record.rb +2 -2
- data/lib/transpec/report.rb +5 -1
- data/lib/transpec/rspec_dsl.rb +12 -2
- data/lib/transpec/rspec_version.rb +8 -7
- data/lib/transpec/spec_suite.rb +114 -0
- data/lib/transpec/syntax/example.rb +4 -20
- data/lib/transpec/syntax/example_group.rb +38 -0
- data/lib/transpec/syntax/have.rb +6 -9
- data/lib/transpec/syntax/its.rb +5 -7
- data/lib/transpec/syntax/method_stub.rb +12 -13
- data/lib/transpec/syntax/mixin/any_instance_block.rb +14 -6
- data/lib/transpec/syntax/mixin/context_sensitive.rb +41 -0
- data/lib/transpec/syntax/mixin/matcher_owner.rb +16 -26
- data/lib/transpec/syntax/mixin/monkey_patch_any_instance.rb +1 -1
- data/lib/transpec/syntax/mixin/no_message_allowance.rb +2 -2
- data/lib/transpec/syntax/mixin/useless_and_return.rb +2 -2
- data/lib/transpec/syntax/oneliner_should.rb +9 -13
- data/lib/transpec/syntax/operator.rb +3 -7
- data/lib/transpec/syntax/pending.rb +4 -20
- data/lib/transpec/syntax/rspec_configure/configuration_modification.rb +86 -0
- data/lib/transpec/syntax/rspec_configure/framework.rb +45 -86
- data/lib/transpec/syntax/rspec_configure.rb +18 -6
- data/lib/transpec/syntax/should.rb +3 -5
- data/lib/transpec/syntax/should_receive.rb +1 -1
- data/lib/transpec/syntax.rb +8 -0
- data/lib/transpec/util.rb +0 -8
- data/lib/transpec/version.rb +2 -2
- data/spec/acceptance/configuration_modification_spec.rb +132 -0
- data/spec/acceptance/conversion_spec.rb +114 -0
- data/spec/support/shared_context.rb +6 -12
- data/spec/transpec/cli_spec.rb +21 -23
- data/spec/transpec/configuration_spec.rb +2 -1
- data/spec/transpec/converter_spec.rb +292 -213
- data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +3 -3
- data/spec/transpec/dynamic_analyzer_spec.rb +8 -2
- data/spec/transpec/option_parser_spec.rb +42 -4
- data/spec/transpec/processed_source_spec.rb +67 -0
- data/spec/transpec/rspec_version_spec.rb +8 -2
- data/spec/transpec/spec_suite_spec.rb +107 -0
- data/spec/transpec/syntax/allow_spec.rb +9 -27
- data/spec/transpec/syntax/example_group_spec.rb +172 -0
- data/spec/transpec/syntax/expect_spec.rb +18 -54
- data/spec/transpec/syntax/have_spec.rb +35 -14
- data/spec/transpec/syntax/its_spec.rb +27 -7
- data/spec/transpec/syntax/method_stub_spec.rb +31 -8
- data/spec/transpec/syntax/oneliner_should_spec.rb +22 -131
- data/spec/transpec/syntax/rspec_configure_spec.rb +118 -15
- data/spec/transpec/syntax/should_spec.rb +51 -82
- data/tasks/fixtures/guard/COMMIT_EDITMSG +80 -0
- data/tasks/fixtures/mail/COMMIT_EDITMSG +84 -0
- data/tasks/fixtures/twitter/COMMIT_EDITMSG +36 -0
- data/tasks/lib/transpec_test.rb +23 -2
- data/tasks/readme.rake +35 -0
- metadata +22 -4
- data/lib/transpec/parser.rb +0 -9
data/lib/transpec/cli.rb
CHANGED
@@ -4,10 +4,10 @@ require 'transpec/commit_message'
|
|
4
4
|
require 'transpec/configuration'
|
5
5
|
require 'transpec/converter'
|
6
6
|
require 'transpec/dynamic_analyzer'
|
7
|
-
require 'transpec/file_finder'
|
8
7
|
require 'transpec/option_parser'
|
9
8
|
require 'transpec/project'
|
10
9
|
require 'transpec/report'
|
10
|
+
require 'transpec/spec_suite'
|
11
11
|
require 'rainbow'
|
12
12
|
require 'rainbow/ext/string' unless String.method_defined?(:color)
|
13
13
|
|
@@ -34,7 +34,12 @@ module Transpec
|
|
34
34
|
return false
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
begin
|
38
|
+
process(paths)
|
39
|
+
rescue DynamicAnalyzer::AnalysisError
|
40
|
+
warn_dynamic_analysis_error
|
41
|
+
return false
|
42
|
+
end
|
38
43
|
|
39
44
|
display_summary
|
40
45
|
generate_commit_message
|
@@ -50,16 +55,23 @@ module Transpec
|
|
50
55
|
runtime_data = run_dynamic_analysis(paths)
|
51
56
|
end
|
52
57
|
|
53
|
-
|
54
|
-
|
58
|
+
spec_suite = SpecSuite.new(paths, runtime_data)
|
59
|
+
# Actually #analyze does not need to be invoked here, but doing this will avoid long freeze
|
60
|
+
# while conversion of files.
|
61
|
+
puts 'Aggregating spec suite data...'
|
62
|
+
spec_suite.analyze
|
63
|
+
puts
|
64
|
+
|
65
|
+
spec_suite.specs.each do |spec|
|
66
|
+
convert_spec(spec, spec_suite)
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
58
|
-
def
|
59
|
-
puts "Converting #{
|
70
|
+
def convert_spec(spec, spec_suite)
|
71
|
+
puts "Converting #{spec.path}"
|
60
72
|
|
61
|
-
converter = Converter.new(configuration, project.rspec_version
|
62
|
-
converter.convert_file!(
|
73
|
+
converter = Converter.new(spec_suite, configuration, project.rspec_version)
|
74
|
+
converter.convert_file!(spec)
|
63
75
|
|
64
76
|
warn_annotations(converter.report)
|
65
77
|
report << converter.report
|
@@ -96,12 +108,6 @@ module Transpec
|
|
96
108
|
puts
|
97
109
|
|
98
110
|
runtime_data
|
99
|
-
rescue DynamicAnalyzer::AnalysisError
|
100
|
-
warn 'Failed running dynamic analysis. ' \
|
101
|
-
'Transpec needs to run your specs in a copied project directory for dynamic analysis. ' \
|
102
|
-
'If your project requires some special setup or commands to run specs, ' \
|
103
|
-
'use -c/--rspec-command option.'
|
104
|
-
exit(1)
|
105
111
|
end
|
106
112
|
|
107
113
|
def display_summary
|
@@ -138,6 +144,13 @@ module Transpec
|
|
138
144
|
puts "Done! Now run #{'rspec'.bright} and check if everything is green."
|
139
145
|
end
|
140
146
|
|
147
|
+
def warn_dynamic_analysis_error
|
148
|
+
warn 'Failed running dynamic analysis. ' \
|
149
|
+
'Transpec runs your specs in a copied project directory. ' \
|
150
|
+
'If your project requires some special setup or commands to run specs, ' \
|
151
|
+
'use -c/--rspec-command option.'
|
152
|
+
end
|
153
|
+
|
141
154
|
def warn_syntax_error(error)
|
142
155
|
warn "Syntax error at #{error.diagnostic.location}. Skipping the file.".color(:red)
|
143
156
|
end
|
@@ -17,7 +17,8 @@ module Transpec
|
|
17
17
|
[:convert_deprecated_method, true],
|
18
18
|
[:parenthesize_matcher_arg, true],
|
19
19
|
[:add_receiver_arg_to_any_instance_implementation_block, true],
|
20
|
-
[:
|
20
|
+
[:convert_stub_with_hash_to_allow_to_receive_and_return, false],
|
21
|
+
[:convert_example_group, false],
|
21
22
|
[:forced, false],
|
22
23
|
[:skip_dynamic_analysis, false]
|
23
24
|
].freeze
|
data/lib/transpec/converter.rb
CHANGED
@@ -4,24 +4,30 @@ require 'transpec/base_rewriter'
|
|
4
4
|
require 'transpec/configuration'
|
5
5
|
require 'transpec/report'
|
6
6
|
require 'transpec/rspec_version'
|
7
|
+
require 'transpec/spec_suite'
|
7
8
|
require 'transpec/syntax'
|
8
9
|
|
9
10
|
Transpec::Syntax.require_all
|
10
11
|
|
11
12
|
module Transpec
|
12
13
|
class Converter < BaseRewriter # rubocop:disable ClassLength
|
13
|
-
attr_reader :
|
14
|
+
attr_reader :spec_suite, :configuration, :rspec_version, :report
|
14
15
|
|
15
16
|
alias_method :convert_file!, :rewrite_file!
|
17
|
+
alias_method :convert_source, :rewrite_source
|
16
18
|
alias_method :convert, :rewrite
|
17
19
|
|
18
|
-
def initialize(
|
20
|
+
def initialize(spec_suite = nil, configuration = nil, rspec_version = nil)
|
21
|
+
@spec_suite = spec_suite || SpecSuite.new
|
19
22
|
@configuration = configuration || Configuration.new
|
20
23
|
@rspec_version = rspec_version || Transpec.required_rspec_version
|
21
|
-
@runtime_data = runtime_data
|
22
24
|
@report = Report.new
|
23
25
|
end
|
24
26
|
|
27
|
+
def runtime_data
|
28
|
+
spec_suite.runtime_data
|
29
|
+
end
|
30
|
+
|
25
31
|
def process(ast, source_rewriter)
|
26
32
|
return unless ast
|
27
33
|
ast.each_node do |node|
|
@@ -33,10 +39,7 @@ module Transpec
|
|
33
39
|
Syntax.standalone_syntaxes.each do |syntax_class|
|
34
40
|
syntax = syntax_class.new(node, source_rewriter, runtime_data, report)
|
35
41
|
next unless syntax.conversion_target?
|
36
|
-
|
37
|
-
handler_name = "process_#{syntax_class.snake_case_name}"
|
38
|
-
send(handler_name, syntax)
|
39
|
-
|
42
|
+
dispatch_syntax(syntax)
|
40
43
|
break
|
41
44
|
end
|
42
45
|
rescue OverlappedRewriteError # rubocop:disable HandleExceptions
|
@@ -44,49 +47,41 @@ module Transpec
|
|
44
47
|
report.conversion_errors << error
|
45
48
|
end
|
46
49
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
def dispatch_syntax(syntax)
|
51
|
+
handler_name = "process_#{syntax.class.snake_case_name}"
|
52
|
+
send(handler_name, syntax)
|
53
|
+
|
54
|
+
syntax.dependent_syntaxes.each do |dependent_syntax|
|
55
|
+
next unless dependent_syntax.conversion_target?
|
56
|
+
dispatch_syntax(dependent_syntax)
|
53
57
|
end
|
58
|
+
end
|
54
59
|
|
55
|
-
|
56
|
-
|
60
|
+
def process_should(should)
|
61
|
+
return unless configuration.convert_should?
|
62
|
+
should.expectize!(configuration.negative_form_of_to)
|
57
63
|
end
|
58
64
|
|
59
65
|
def process_oneliner_should(oneliner_should)
|
60
66
|
negative_form = configuration.negative_form_of_to
|
61
|
-
parenthesize = configuration.parenthesize_matcher_arg?
|
62
|
-
|
63
|
-
# TODO: Referencing oneliner_should.have_matcher.project_requires_collection_matcher?
|
64
|
-
# from this converter is considered bad design.
|
65
67
|
should_convert_have_items = configuration.convert_have_items? &&
|
66
|
-
oneliner_should.have_matcher
|
67
|
-
!oneliner_should.have_matcher.project_requires_collection_matcher?
|
68
|
+
oneliner_should.have_matcher.conversion_target?
|
68
69
|
|
69
70
|
if should_convert_have_items
|
70
71
|
if configuration.convert_should?
|
71
|
-
oneliner_should.convert_have_items_to_standard_expect!(negative_form
|
72
|
+
oneliner_should.convert_have_items_to_standard_expect!(negative_form)
|
72
73
|
else
|
73
74
|
oneliner_should.convert_have_items_to_standard_should!
|
74
75
|
end
|
75
76
|
elsif configuration.convert_oneliner? && rspec_version.oneliner_is_expected_available?
|
76
|
-
oneliner_should.expectize!(negative_form
|
77
|
+
oneliner_should.expectize!(negative_form)
|
77
78
|
end
|
78
|
-
|
79
|
-
process_raise_error(oneliner_should.raise_error_matcher)
|
80
79
|
end
|
81
80
|
|
82
81
|
def process_expect(expect)
|
83
|
-
process_have(expect.have_matcher)
|
84
|
-
process_raise_error(expect.raise_error_matcher)
|
85
|
-
process_messaging_host(expect.receive_matcher)
|
86
82
|
end
|
87
83
|
|
88
84
|
def process_allow(allow)
|
89
|
-
process_messaging_host(allow.receive_matcher)
|
90
85
|
end
|
91
86
|
|
92
87
|
def process_should_receive(should_receive)
|
@@ -115,7 +110,7 @@ module Transpec
|
|
115
110
|
if configuration.convert_stub?
|
116
111
|
if !method_stub.hash_arg? ||
|
117
112
|
rspec_version.receive_messages_available? ||
|
118
|
-
configuration.
|
113
|
+
configuration.convert_stub_with_hash_to_allow_to_receive_and_return?
|
119
114
|
method_stub.allowize!(rspec_version)
|
120
115
|
elsif configuration.convert_deprecated_method?
|
121
116
|
method_stub.convert_deprecated_method!
|
@@ -129,6 +124,17 @@ module Transpec
|
|
129
124
|
process_messaging_host(method_stub)
|
130
125
|
end
|
131
126
|
|
127
|
+
def process_operator(operator)
|
128
|
+
return unless configuration.convert_should?
|
129
|
+
return if operator.expectation.is_a?(Syntax::OnelinerShould) &&
|
130
|
+
!rspec_version.oneliner_is_expected_available?
|
131
|
+
operator.convert_operator!(configuration.parenthesize_matcher_arg?)
|
132
|
+
end
|
133
|
+
|
134
|
+
def process_receive(receive)
|
135
|
+
process_messaging_host(receive)
|
136
|
+
end
|
137
|
+
|
132
138
|
def process_be_boolean(be_boolean)
|
133
139
|
return unless rspec_version.be_truthy_available?
|
134
140
|
return unless configuration.convert_deprecated_method?
|
@@ -176,7 +182,14 @@ module Transpec
|
|
176
182
|
matcher_definition.convert_deprecated_method! if configuration.convert_deprecated_method?
|
177
183
|
end
|
178
184
|
|
185
|
+
def process_example_group(example_group)
|
186
|
+
return unless rspec_version.non_monkey_patch_example_group_available?
|
187
|
+
example_group.convert_to_non_monkey_patch! if configuration.convert_example_group?
|
188
|
+
end
|
189
|
+
|
179
190
|
def process_rspec_configure(rspec_configure)
|
191
|
+
return unless spec_suite.main_rspec_configure_node?(rspec_configure.node)
|
192
|
+
|
180
193
|
if need_to_modify_expectation_syntax_configuration?(rspec_configure)
|
181
194
|
rspec_configure.expectations.syntaxes = :expect
|
182
195
|
end
|
@@ -185,8 +198,12 @@ module Transpec
|
|
185
198
|
rspec_configure.mocks.syntaxes = :expect
|
186
199
|
end
|
187
200
|
|
188
|
-
if rspec_version.
|
189
|
-
|
201
|
+
if rspec_version.non_monkey_patch_example_group_available? &&
|
202
|
+
configuration.convert_example_group?
|
203
|
+
rspec_configure.expose_dsl_globally = false
|
204
|
+
end
|
205
|
+
|
206
|
+
if need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?
|
190
207
|
should_yield = configuration.add_receiver_arg_to_any_instance_implementation_block?
|
191
208
|
rspec_configure.mocks.yield_receiver_to_any_instance_implementation_blocks = should_yield
|
192
209
|
end
|
@@ -216,6 +233,11 @@ module Transpec
|
|
216
233
|
messaging_host.add_receiver_arg_to_any_instance_implementation_block!
|
217
234
|
end
|
218
235
|
|
236
|
+
def need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?
|
237
|
+
rspec_version.rspec_2_99? && configuration.convert_deprecated_method? &&
|
238
|
+
spec_suite.need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?
|
239
|
+
end
|
240
|
+
|
219
241
|
def need_to_modify_expectation_syntax_configuration?(rspec_configure)
|
220
242
|
return false unless configuration.convert_should?
|
221
243
|
rspec_configure.expectations.syntaxes == [:should]
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module TranspecAnalysis
|
2
|
+
@base_path = Dir.pwd
|
3
|
+
|
4
|
+
def self.global_data
|
5
|
+
@data ||= {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.node_data
|
9
|
+
@data ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
at_exit do
|
13
|
+
# Use JSON rather than Marshal so that:
|
14
|
+
# * Unknown third-party class information won't be serialized.
|
15
|
+
# (Such objects are stored as a string.)
|
16
|
+
# * Singleton method information won't be serialized.
|
17
|
+
# (With Marshal.load, `singleton can't be dumped (TypeError)` will be raised.)
|
18
|
+
require 'json'
|
19
|
+
path = File.join(@base_path, '<%= RESULT_FILE %>')
|
20
|
+
File.open(path, 'w') do |file|
|
21
|
+
JSON.dump(node_data, file)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
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.node_data[node_id] = node_data
|
42
|
+
|
43
|
+
object
|
44
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Transpec
|
6
|
+
class DynamicAnalyzer
|
7
|
+
module NodeUtil
|
8
|
+
def node_id(node)
|
9
|
+
source_range = node.loc.expression
|
10
|
+
source_buffer = source_range.source_buffer
|
11
|
+
absolute_path = File.expand_path(source_buffer.name)
|
12
|
+
relative_path = Pathname.new(absolute_path).relative_path_from(Pathname.pwd).to_s
|
13
|
+
[relative_path, source_range.begin_pos, source_range.end_pos].join('_')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,15 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'transpec/base_rewriter'
|
4
4
|
require 'transpec/dynamic_analyzer'
|
5
|
-
require 'transpec/
|
5
|
+
require 'transpec/dynamic_analyzer/node_util'
|
6
6
|
require 'transpec/util'
|
7
|
+
require 'transpec/syntax'
|
7
8
|
|
8
9
|
Transpec::Syntax.require_all
|
9
10
|
|
10
11
|
module Transpec
|
11
12
|
class DynamicAnalyzer
|
12
13
|
class Rewriter < BaseRewriter
|
13
|
-
include Util
|
14
|
+
include NodeUtil, Util
|
14
15
|
|
15
16
|
EVAL_TARGET_TYPES = [:object, :context]
|
16
17
|
|
@@ -46,12 +47,19 @@ module Transpec
|
|
46
47
|
ast.each_node do |node|
|
47
48
|
Syntax.standalone_syntaxes.each do |syntax_class|
|
48
49
|
syntax = syntax_class.new(node)
|
49
|
-
|
50
|
-
syntax.register_dynamic_analysis_request(self)
|
50
|
+
collect_requests_of_syntax(syntax)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
def collect_requests_of_syntax(syntax)
|
56
|
+
return unless syntax.dynamic_analysis_target?
|
57
|
+
syntax.register_dynamic_analysis_request(self)
|
58
|
+
syntax.dependent_syntaxes.each do |dependent_syntax|
|
59
|
+
collect_requests_of_syntax(dependent_syntax)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
55
63
|
def process_requests(source_rewriter)
|
56
64
|
requests.each do |node, analysis_codes|
|
57
65
|
inject_analysis_code(node, analysis_codes, source_rewriter)
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require 'transpec/
|
3
|
+
require 'transpec/dynamic_analyzer/node_util'
|
4
4
|
require 'json'
|
5
5
|
require 'ostruct'
|
6
|
-
require 'pathname'
|
7
6
|
|
8
7
|
module Transpec
|
9
8
|
class DynamicAnalyzer
|
10
9
|
class RuntimeData
|
11
|
-
include
|
10
|
+
include NodeUtil
|
12
11
|
|
13
12
|
attr_reader :data
|
14
13
|
|
@@ -30,7 +29,7 @@ module Transpec
|
|
30
29
|
end
|
31
30
|
|
32
31
|
def run?(node)
|
33
|
-
|
32
|
+
self[node]
|
34
33
|
end
|
35
34
|
|
36
35
|
def present?(node, key)
|
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'transpec/dynamic_analyzer/rewriter'
|
4
4
|
require 'transpec/dynamic_analyzer/runtime_data'
|
5
|
-
require 'transpec/file_finder'
|
6
5
|
require 'transpec/project'
|
6
|
+
require 'transpec/spec_suite'
|
7
7
|
require 'tmpdir'
|
8
8
|
require 'find'
|
9
9
|
require 'pathname'
|
10
10
|
require 'fileutils'
|
11
11
|
require 'shellwords'
|
12
|
+
require 'erb'
|
12
13
|
require 'English'
|
13
14
|
|
14
15
|
module Transpec
|
@@ -16,50 +17,6 @@ module Transpec
|
|
16
17
|
ANALYSIS_METHOD = 'transpec_analyze'
|
17
18
|
HELPER_FILE = 'transpec_analysis_helper.rb'
|
18
19
|
RESULT_FILE = 'transpec_analysis_result.json'
|
19
|
-
HELPER_SOURCE = <<-END
|
20
|
-
require 'pathname'
|
21
|
-
|
22
|
-
module TranspecAnalysis
|
23
|
-
@base_path = Dir.pwd
|
24
|
-
|
25
|
-
def self.data
|
26
|
-
@data ||= {}
|
27
|
-
end
|
28
|
-
|
29
|
-
at_exit do
|
30
|
-
# Use JSON rather than Marshal so that:
|
31
|
-
# * Unknown third-party class information won't be serialized.
|
32
|
-
# (Such objects are stored as a string.)
|
33
|
-
# * Singleton method information won't be serialized.
|
34
|
-
# (With Marshal.load, `singleton can't be dumped (TypeError)` will be raised.)
|
35
|
-
require 'json'
|
36
|
-
path = File.join(@base_path, '#{RESULT_FILE}')
|
37
|
-
File.open(path, 'w') do |file|
|
38
|
-
JSON.dump(data, file)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def #{ANALYSIS_METHOD}(object, context, node_id, analysis_codes)
|
44
|
-
node_data = {}
|
45
|
-
|
46
|
-
analysis_codes.each do |key, (target_type, code)|
|
47
|
-
target = case target_type
|
48
|
-
when :object then object
|
49
|
-
when :context then context
|
50
|
-
end
|
51
|
-
|
52
|
-
begin
|
53
|
-
node_data[key] = target.instance_eval(code)
|
54
|
-
rescue Exception
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
TranspecAnalysis.data[node_id] = node_data
|
59
|
-
|
60
|
-
object
|
61
|
-
end
|
62
|
-
END
|
63
20
|
|
64
21
|
attr_reader :project, :rspec_command, :silent
|
65
22
|
alias_method :silent?, :silent
|
@@ -88,7 +45,7 @@ module Transpec
|
|
88
45
|
in_copied_project do
|
89
46
|
rewrite_specs(paths)
|
90
47
|
|
91
|
-
File.write(HELPER_FILE,
|
48
|
+
File.write(HELPER_FILE, helper_source)
|
92
49
|
|
93
50
|
run_rspec(paths)
|
94
51
|
|
@@ -153,15 +110,20 @@ module Transpec
|
|
153
110
|
def rewrite_specs(paths)
|
154
111
|
rewriter = Rewriter.new
|
155
112
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
113
|
+
spec_suite = SpecSuite.new(paths)
|
114
|
+
|
115
|
+
spec_suite.specs.each do |spec|
|
116
|
+
next if spec.syntax_error
|
117
|
+
rewriter.rewrite_file!(spec)
|
162
118
|
end
|
163
119
|
end
|
164
120
|
|
121
|
+
def helper_source
|
122
|
+
erb_path = File.join(File.dirname(__FILE__), 'dynamic_analyzer', 'helper.rb.erb')
|
123
|
+
erb = ERB.new(File.read(erb_path), nil)
|
124
|
+
erb.result(binding)
|
125
|
+
end
|
126
|
+
|
165
127
|
def copy(source, destination)
|
166
128
|
if File.symlink?(source)
|
167
129
|
File.symlink(File.readlink(source), destination)
|