transpec 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -0
  3. data/CHANGELOG.md +4 -0
  4. data/lib/transpec/version.rb +1 -1
  5. data/transpec.gemspec +4 -3
  6. metadata +3 -97
  7. data/spec/.rubocop.yml +0 -23
  8. data/spec/integration/configuration_modification_spec.rb +0 -186
  9. data/spec/integration/conversion_spec.rb +0 -145
  10. data/spec/spec_helper.rb +0 -52
  11. data/spec/support/cache_helper.rb +0 -62
  12. data/spec/support/file_helper.rb +0 -25
  13. data/spec/support/shared_context.rb +0 -84
  14. data/spec/transpec/cli_spec.rb +0 -341
  15. data/spec/transpec/commit_message_spec.rb +0 -81
  16. data/spec/transpec/config_spec.rb +0 -99
  17. data/spec/transpec/converter_spec.rb +0 -1374
  18. data/spec/transpec/directory_cloner_spec.rb +0 -74
  19. data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +0 -143
  20. data/spec/transpec/dynamic_analyzer_spec.rb +0 -329
  21. data/spec/transpec/git_spec.rb +0 -151
  22. data/spec/transpec/option_parser_spec.rb +0 -275
  23. data/spec/transpec/processed_source_spec.rb +0 -93
  24. data/spec/transpec/project_spec.rb +0 -194
  25. data/spec/transpec/record_spec.rb +0 -128
  26. data/spec/transpec/report_spec.rb +0 -126
  27. data/spec/transpec/rspec_version_spec.rb +0 -129
  28. data/spec/transpec/spec_file_finder_spec.rb +0 -118
  29. data/spec/transpec/spec_suite_spec.rb +0 -108
  30. data/spec/transpec/static_context_inspector_spec.rb +0 -713
  31. data/spec/transpec/syntax/allow_spec.rb +0 -122
  32. data/spec/transpec/syntax/be_boolean_spec.rb +0 -176
  33. data/spec/transpec/syntax/be_close_spec.rb +0 -51
  34. data/spec/transpec/syntax/current_example_spec.rb +0 -319
  35. data/spec/transpec/syntax/double_spec.rb +0 -175
  36. data/spec/transpec/syntax/example_group_spec.rb +0 -716
  37. data/spec/transpec/syntax/example_spec.rb +0 -301
  38. data/spec/transpec/syntax/expect_spec.rb +0 -313
  39. data/spec/transpec/syntax/have_spec.rb +0 -1276
  40. data/spec/transpec/syntax/hook_spec.rb +0 -215
  41. data/spec/transpec/syntax/its_spec.rb +0 -448
  42. data/spec/transpec/syntax/matcher_definition_spec.rb +0 -59
  43. data/spec/transpec/syntax/method_stub_spec.rb +0 -1301
  44. data/spec/transpec/syntax/oneliner_should_spec.rb +0 -628
  45. data/spec/transpec/syntax/operator_spec.rb +0 -871
  46. data/spec/transpec/syntax/pending_spec.rb +0 -415
  47. data/spec/transpec/syntax/raise_error_spec.rb +0 -354
  48. data/spec/transpec/syntax/receive_spec.rb +0 -499
  49. data/spec/transpec/syntax/rspec_configure_spec.rb +0 -870
  50. data/spec/transpec/syntax/should_receive_spec.rb +0 -1108
  51. data/spec/transpec/syntax/should_spec.rb +0 -497
  52. data/spec/transpec/util_spec.rb +0 -115
  53. data/spec/transpec_spec.rb +0 -22
data/spec/spec_helper.rb DELETED
@@ -1,52 +0,0 @@
1
- # coding: utf-8
2
-
3
- RSpec.configure do |config|
4
- unless ENV['TRANSPEC_TEST']
5
- # Yes, I'm writing specs in should syntax intentionally!
6
- config.expect_with :rspec do |c|
7
- c.syntax = :should
8
- end
9
-
10
- config.mock_with :rspec do |c|
11
- c.syntax = :should
12
- end
13
- end
14
-
15
- config.color_enabled = true
16
- config.treat_symbols_as_metadata_keys_with_true_values = true
17
-
18
- # These two settings work together to allow you to limit a spec run
19
- # to individual examples or groups you care about by tagging them with
20
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
21
- # get run.
22
- config.filter_run :focus
23
- config.run_all_when_everything_filtered = true
24
-
25
- config.before(:suite) do
26
- require 'rainbow'
27
- Rainbow.enabled = false
28
-
29
- if ENV['TRAVIS']
30
- system('git config --global user.email "you@example.com"')
31
- system('git config --global user.name "Your Name"')
32
- end
33
- end
34
- end
35
-
36
- if ENV['TRAVIS'] || ENV['COVERAGE']
37
- require 'simplecov'
38
-
39
- if ENV['TRAVIS']
40
- require 'coveralls'
41
- SimpleCov.formatter = Coveralls::SimpleCov::Formatter
42
- end
43
-
44
- SimpleCov.start do
45
- add_filter '/spec/'
46
- add_filter '/vendor/bundle/'
47
- end
48
- end
49
-
50
- Dir[File.join(File.dirname(__FILE__), 'support', '*')].each do |path|
51
- require path
52
- end
@@ -1,62 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'digest/sha1'
4
-
5
- module CacheHelper
6
- module_function
7
-
8
- def with_cache(key)
9
- cache_file_path = cache_file_path(key)
10
-
11
- if File.exist?(cache_file_path)
12
- load_cache(cache_file_path)
13
- else
14
- data = yield
15
- save_cache(cache_file_path, data)
16
- data
17
- end
18
- end
19
-
20
- def with_cached_dir(dirname)
21
- dir_path = File.join(cache_dir, dirname)
22
-
23
- cached = Dir.exist?(dir_path)
24
- FileUtils.mkdir_p(dir_path) unless cached
25
-
26
- Dir.chdir(dir_path) do
27
- yield cached
28
- end
29
- end
30
-
31
- def load_cache(path)
32
- File.open(path) do |file|
33
- Marshal.load(file)
34
- end
35
- end
36
-
37
- def save_cache(path, data)
38
- File.open(path, 'w') do |file|
39
- Marshal.dump(data, file)
40
- end
41
- end
42
-
43
- def cache_file_path(key)
44
- filename = Digest::SHA1.hexdigest(key)
45
- File.join(cache_dir, filename)
46
- end
47
-
48
- def cache_dir
49
- @cache_dir ||= begin
50
- project_root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
51
- ruby_version = [RUBY_ENGINE, RUBY_VERSION].join('-')
52
- cache_dir = File.join(project_root, '.cache', 'spec', ruby_version)
53
-
54
- unless Dir.exist?(cache_dir)
55
- require 'fileutils'
56
- FileUtils.mkdir_p(cache_dir)
57
- end
58
-
59
- cache_dir
60
- end
61
- end
62
- end
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'fileutils'
4
-
5
- module FileHelper
6
- module_function
7
-
8
- def create_file(file_path, content)
9
- file_path = File.expand_path(file_path)
10
-
11
- dir_path = File.dirname(file_path)
12
- FileUtils.makedirs(dir_path) unless File.exist?(dir_path)
13
-
14
- File.open(file_path, 'w') do |file|
15
- case content
16
- when String
17
- file.puts content
18
- when Array
19
- file.puts content.join("\n")
20
- else
21
- fail 'Unsupported type!'
22
- end
23
- end
24
- end
25
- end
@@ -1,84 +0,0 @@
1
- # coding: utf-8
2
-
3
- # This context requires `source` to be defined with #let.
4
- shared_context 'parsed objects' do
5
- let(:source_path) { nil }
6
-
7
- let(:processed_source) do
8
- require 'transpec/processed_source'
9
- Transpec::ProcessedSource.new(source, source_path)
10
- end
11
-
12
- let(:ast) do
13
- processed_source.ast
14
- end
15
-
16
- let(:source_rewriter) do
17
- require 'parser'
18
- Parser::Source::Rewriter.new(processed_source.buffer)
19
- end
20
-
21
- let(:rewritten_source) { source_rewriter.process }
22
-
23
- # Include 'dynamic analysis objects' after this context so that this nil will be overridden.
24
- let(:runtime_data) { nil }
25
-
26
- let(:project) do
27
- require 'transpec/project'
28
- Transpec::Project.new
29
- end
30
- end
31
-
32
- # This context requires `source` to be defined with #let.
33
- shared_context 'dynamic analysis objects' do
34
- include_context 'isolated environment'
35
-
36
- let(:source_path) { 'spec/example_spec.rb' }
37
-
38
- runtime_data_cache = {}
39
-
40
- let(:runtime_data) do
41
- require 'transpec/dynamic_analyzer'
42
-
43
- if runtime_data_cache[source]
44
- runtime_data_cache[source]
45
- else
46
- FileHelper.create_file(source_path, source)
47
- dynamic_analyzer = Transpec::DynamicAnalyzer.new(silent: true)
48
- runtime_data_cache[source] = dynamic_analyzer.analyze
49
- end
50
- end
51
- end
52
-
53
- # This context depends on the context 'parsed objects'.
54
- shared_context 'syntax object' do |syntax_class, name|
55
- let(name) do
56
- ast.each_node do |node|
57
- syntax = syntax_class.new(node, runtime_data, project, source_rewriter)
58
- return syntax if syntax.conversion_target?
59
- end
60
-
61
- fail "No #{syntax_class.name} conversion target is found!"
62
- end
63
- end
64
-
65
- shared_context 'isolated environment' do
66
- around do |example|
67
- require 'tmpdir'
68
- Dir.mktmpdir do |tmpdir|
69
- Dir.chdir(tmpdir) do
70
- example.run
71
- end
72
- end
73
- end
74
- end
75
-
76
- shared_context 'inside of git repository' do
77
- around do |example|
78
- Dir.mkdir('repo')
79
- Dir.chdir('repo') do
80
- `git init`
81
- example.run
82
- end
83
- end
84
- end
@@ -1,341 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
- require 'transpec/cli'
5
-
6
- module Transpec
7
- describe CLI do
8
- include FileHelper
9
-
10
- subject(:cli) { CLI.new }
11
-
12
- before do
13
- cli.project.stub(:rspec_version).and_return(Transpec.required_rspec_version)
14
- end
15
-
16
- describe '.run' do
17
- it 'invokes #run' do
18
- args = ['foo', 'bar']
19
- CLI.any_instance.should_receive(:run).with(args)
20
- CLI.run(args)
21
- end
22
- end
23
-
24
- describe '#run' do
25
- include_context 'isolated environment'
26
-
27
- subject { cli.run(args) }
28
-
29
- let(:args) { [file_path] }
30
- let(:file_path) { 'spec/example_spec.rb' }
31
- let(:file_content) do
32
- <<-END
33
- describe 'something' do
34
- it 'is 1' do
35
- 1.should == 1
36
- end
37
- end
38
- END
39
- end
40
-
41
- before do
42
- cli.stub(:puts)
43
- cli.stub(:warn)
44
- DynamicAnalyzer.any_instance.stub(:analyze).and_return(DynamicAnalyzer::RuntimeData.new)
45
- create_file(file_path, file_content)
46
- end
47
-
48
- shared_examples 'rewrites files' do
49
- it 'rewrites files' do
50
- cli.should_receive(:convert_spec)
51
- cli.run(args)
52
- end
53
-
54
- it 'returns true' do
55
- should be_true
56
- end
57
- end
58
-
59
- shared_examples 'aborts processing' do
60
- it 'aborts processing' do
61
- cli.should_not_receive(:convert_spec)
62
- cli.run(args).should be_false
63
- end
64
- end
65
-
66
- shared_examples 'generates commit message' do
67
- it 'generates commit message to .git/COMMIT_EDITMSG' do
68
- cli.run(args)
69
- File.read('.git/COMMIT_EDITMSG').should start_with('Convert specs')
70
- end
71
- end
72
-
73
- shared_examples 'does not generate commit message' do
74
- it 'does not generate commit message' do
75
- cli.run(args)
76
- File.exist?('.git/COMMIT_EDITMSG').should be_false
77
- end
78
- end
79
-
80
- context 'when git is available' do
81
- before { Git.stub(:command_available?).and_return(true) }
82
-
83
- context 'and inside of a repository' do
84
- include_context 'inside of git repository'
85
-
86
- context 'and the repository is not clean' do
87
- before { Git.stub(:clean?).and_return(false) }
88
-
89
- context 'and --force option is not specified' do
90
- include_examples 'aborts processing'
91
- include_examples 'does not generate commit message'
92
-
93
- it 'warns and suggests the use of -f/--force option' do
94
- cli.should_receive(:warn) do |message|
95
- message.should include('clean')
96
- message.should include('-f/--force')
97
- end
98
-
99
- cli.run(args)
100
- end
101
- end
102
-
103
- context 'and --force option is specified' do
104
- before { args << '--force' }
105
- include_examples 'rewrites files'
106
- include_examples 'generates commit message'
107
- end
108
- end
109
-
110
- context 'and the repository is clean' do
111
- before { Git.stub(:clean?).and_return(true) }
112
-
113
- include_examples 'rewrites files'
114
- include_examples 'generates commit message'
115
-
116
- context 'and no conversion is done' do
117
- let(:file_content) { '' }
118
- include_examples 'does not generate commit message'
119
- end
120
- end
121
- end
122
-
123
- context 'and not inside of a repository' do
124
- include_examples 'rewrites files'
125
- include_examples 'does not generate commit message'
126
- end
127
- end
128
-
129
- context 'when git is not available' do
130
- before { Git.stub(:command_available?).and_return(false) }
131
- include_examples 'rewrites files'
132
- include_examples 'does not generate commit message'
133
- end
134
-
135
- context "when the project's RSpec dependency is older than the required version" do
136
- before do
137
- cli.project.stub(:rspec_version).and_return(RSpecVersion.new('2.13.0'))
138
- end
139
-
140
- include_examples 'aborts processing'
141
-
142
- it 'warns to the version' do
143
- cli.should_receive(:warn).with(/rspec.+dependency/i)
144
- cli.run(args)
145
- end
146
- end
147
-
148
- context 'when analysis error is raised in the dynamic analysis' do
149
- before do
150
- DynamicAnalyzer.any_instance.stub(:analyze).and_raise(DynamicAnalyzer::AnalysisError)
151
- end
152
-
153
- include_examples 'aborts processing'
154
- end
155
-
156
- context 'when a syntax error is raised while processing files' do
157
- let(:args) { [invalid_syntax_file_path, valid_syntax_file_path] }
158
- let(:invalid_syntax_file_path) { 'spec/invalid_example.rb' }
159
- let(:valid_syntax_file_path) { 'spec/valid_example.rb' }
160
-
161
- before do
162
- create_file(invalid_syntax_file_path, 'This is invalid syntax <')
163
- create_file(valid_syntax_file_path, 'this_is_valid_syntax')
164
- end
165
-
166
- it 'warns to the user' do
167
- cli.should_receive(:warn)
168
- .with('Syntax error at spec/invalid_example.rb:2:1. Skipping the file.')
169
- cli.run(args)
170
- end
171
-
172
- it 'continues processing files' do
173
- cli.should_receive(:puts).with("Converting #{invalid_syntax_file_path}")
174
- cli.should_receive(:puts).with("Converting #{valid_syntax_file_path}")
175
- cli.run(args)
176
- end
177
- end
178
-
179
- context 'when an encoding error is raised while processing files' do
180
- let(:args) { [invalid_encoding_file_path, valid_encoding_file_path] }
181
- let(:invalid_encoding_file_path) { 'spec/invalid_example.rb' }
182
- let(:valid_encoding_file_path) { 'spec/valid_example.rb' }
183
-
184
- before do
185
- create_file(invalid_encoding_file_path, <<-END)
186
- # coding: utf-8
187
- \xff
188
- END
189
-
190
- create_file(valid_encoding_file_path, 'this_is_valid_encoding')
191
- end
192
-
193
- it 'warns of the error' do
194
- cli.should_receive(:warn)
195
- .with('Encoding error in spec/invalid_example.rb. Skipping the file.')
196
- cli.run(args)
197
- end
198
-
199
- it 'continues processing files' do
200
- cli.should_receive(:puts).with("Converting #{invalid_encoding_file_path}")
201
- cli.should_receive(:puts).with("Converting #{valid_encoding_file_path}")
202
- cli.run(args)
203
- end
204
- end
205
-
206
- context 'when any other error is raised while running' do
207
- let(:args) { ['non-existent-file'] }
208
-
209
- it 'does not catch the error' do
210
- -> { cli.run(args) }.should raise_error
211
- end
212
- end
213
-
214
- context 'when -s/--skip-dynamic-analysis option is specified' do
215
- let(:args) { ['--skip-dynamic-analysis', file_path] }
216
-
217
- it 'skips dynamic analysis' do
218
- DynamicAnalyzer.any_instance.should_not_receive(:analyze)
219
- cli.should_receive(:convert_spec)
220
- cli.run(args)
221
- end
222
- end
223
-
224
- context 'when -c/--rspec-command option is specified' do
225
- include_context 'inside of git repository'
226
-
227
- let(:args) { ['--force', '--rspec-command', 'rspec --profile'] }
228
-
229
- it 'passes the command to DynamicAnalyzer' do
230
- DynamicAnalyzer.should_receive(:new) do |arg|
231
- arg[:rspec_command].should == 'rspec --profile'
232
- end.and_call_original
233
-
234
- cli.run(args)
235
- end
236
- end
237
- end
238
-
239
- describe '#convert_spec' do
240
- include_context 'isolated environment'
241
-
242
- let(:processed_source) do
243
- path = 'example.rb'
244
- create_file(path, source)
245
- ProcessedSource.from_file(path)
246
- end
247
-
248
- let(:spec_suite) { SpecSuite.new }
249
-
250
- before do
251
- cli.stub(:puts)
252
- end
253
-
254
- context 'when the source has a monkey-patched expectation outside of example group context' do
255
- let(:source) do
256
- <<-END
257
- describe 'example group' do
258
- class Klass
259
- def some_method
260
- 1.should == 1
261
- end
262
- end
263
-
264
- it 'is an example' do
265
- Klass.new.some_method
266
- end
267
- end
268
- END
269
- end
270
-
271
- it 'warns of the conversion error' do
272
- cli.should_receive(:warn) do |message|
273
- message.should =~ /cannot/i
274
- message.should =~ /context/i
275
- end
276
-
277
- cli.convert_spec(processed_source, spec_suite)
278
- end
279
- end
280
-
281
- context 'when it did a less accurate conversion due to a lack of runtime information' do
282
- let(:source) do
283
- <<-END
284
- describe 'example group' do
285
- it 'is an example' do
286
- expect(obj).to have(2).items
287
- end
288
- end
289
- END
290
- end
291
-
292
- it 'warns of less accurate conversion' do
293
- cli.should_receive(:warn).with(/converted.+but.+incorrect/i)
294
- cli.convert_spec(processed_source, spec_suite)
295
- end
296
- end
297
-
298
- context 'when both conversion errors and less accurate records are reported' do
299
- let(:source) do
300
- <<-END
301
- describe 'example group' do
302
- it 'is first' do
303
- expect(obj).to have(1).item
304
- end
305
-
306
- class Klass
307
- def second
308
- 2.should == 2
309
- end
310
- end
311
-
312
- it 'is an example' do
313
- Klass.new.some_method
314
- end
315
-
316
- it 'is third' do
317
- expect(obj).to have(3).items
318
- end
319
- end
320
- END
321
- end
322
-
323
- it 'displays them in order of line number' do
324
- times = 1
325
-
326
- cli.should_receive(:warn).exactly(3).times do |message|
327
- line_number = case times
328
- when 1 then 3
329
- when 2 then 8
330
- when 3 then 17
331
- end
332
- message.should include(":#{line_number}:")
333
- times += 1
334
- end
335
-
336
- cli.convert_spec(processed_source, spec_suite)
337
- end
338
- end
339
- end
340
- end
341
- end