transpec 0.0.1 → 0.0.2
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 +9 -0
- data/Guardfile +4 -0
- data/README.md +102 -5
- data/README.md.erb +107 -0
- data/Rakefile +26 -5
- data/bin/transpec +1 -1
- data/lib/transpec/ast/scanner.rb +3 -0
- data/lib/transpec/ast/scope_stack.rb +2 -0
- data/lib/transpec/cli.rb +4 -0
- data/lib/transpec/rewriter.rb +14 -2
- data/lib/transpec/syntax.rb +36 -1
- data/lib/transpec/syntax/any_instanceable.rb +24 -0
- data/lib/transpec/syntax/be_close.rb +32 -0
- data/lib/transpec/syntax/double.rb +14 -8
- data/lib/transpec/syntax/expectizable.rb +20 -0
- data/lib/transpec/syntax/matcher.rb +16 -8
- data/lib/transpec/syntax/method_stub.rb +26 -40
- data/lib/transpec/syntax/send_node_syntax.rb +2 -4
- data/lib/transpec/syntax/should.rb +25 -16
- data/lib/transpec/syntax/should_receive.rb +32 -35
- data/lib/transpec/version.rb +1 -1
- data/spec/spec_helper.rb +8 -6
- data/spec/support/shared_context.rb +4 -0
- data/spec/transpec/ast/scanner_spec.rb +1 -1
- data/spec/transpec/ast/scope_stack_spec.rb +1 -0
- data/spec/transpec/cli_spec.rb +1 -0
- data/spec/transpec/configuration_spec.rb +1 -0
- data/spec/transpec/git_spec.rb +8 -0
- data/spec/transpec/rewriter_spec.rb +30 -0
- data/spec/transpec/syntax/be_close_spec.rb +50 -0
- data/spec/transpec/syntax/double_spec.rb +3 -2
- data/spec/transpec/syntax/matcher_spec.rb +1 -0
- data/spec/transpec/syntax/method_stub_spec.rb +1 -0
- data/spec/transpec/syntax/should_receive_spec.rb +1 -0
- data/spec/transpec/syntax/should_spec.rb +1 -0
- data/spec/transpec/util_spec.rb +1 -0
- data/transpec.gemspec +1 -0
- metadata +23 -3
- data/lib/transpec.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3d0d724597250da7c8777978b0966f79bb8ef4a
|
4
|
+
data.tar.gz: d8cd06841df2954393cbe9ce26bb6d4b892fb8d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eaf64a911679b0b2277c3643ee3e53a2b92b8ac3b0f8d5730f6a5399e4179114b0290c32b4c308968601884a47728f52f77d8babbfdafb3309407a8ef7e8dddd
|
7
|
+
data.tar.gz: 081bd5d3f7d4e0b91a7ec37754cee098c0fcc714862044304549daff2f2e263ecb3c0d3a120c1299e049d4dcdcd7750d4cc93d9d8e9b5cf548e3fd6f69b101c6
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
ADDED
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,96 @@
|
|
1
|
+
[](http://badge.fury.io/rb/transpec) [](https://gemnasium.com/yujinakayama/transpec) [](https://travis-ci.org/yujinakayama/transpec) [](https://coveralls.io/r/yujinakayama/transpec) [](https://codeclimate.com/github/yujinakayama/transpec)
|
2
|
+
|
1
3
|
# Transpec
|
2
4
|
|
3
5
|
**Transpec** automatically converts your specs into latest [RSpec](http://rspec.info/) syntax with static analysis.
|
4
6
|
|
5
|
-
|
7
|
+
This aims to facilitate smooth transition to RSpec 3.
|
8
|
+
|
9
|
+
See the following pages for the new RSpec syntax and the plan for RSpec 3:
|
6
10
|
|
7
11
|
* [Myron Marston » RSpec's New Expectation Syntax](http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax)
|
8
12
|
* [RSpec's new message expectation syntax - Tea is awesome.](http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/)
|
9
13
|
* [Myron Marston » The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3)
|
10
14
|
|
15
|
+
Note that Transpec does not yet support all conversions for the RSpec changes,
|
16
|
+
and also the changes for RSpec 3 is not fixed and may vary in the future.
|
17
|
+
So it's recommended to follow updates of both RSpec and Transpec.
|
18
|
+
|
19
|
+
## Example
|
20
|
+
|
21
|
+
Here's an example spec:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
describe Account do
|
25
|
+
subject(:account) { Account.new(logger) }
|
26
|
+
let(:logger) { mock('logger') }
|
27
|
+
|
28
|
+
describe '#balance' do
|
29
|
+
context 'initially' do
|
30
|
+
it 'is zero' do
|
31
|
+
account.balance.should == 0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#close' do
|
37
|
+
it 'logs an account closed message' do
|
38
|
+
logger.should_receive(:account_closed).with(account)
|
39
|
+
account.close
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#renew' do
|
44
|
+
context 'when the account is renewable and not closed' do
|
45
|
+
before do
|
46
|
+
account.stub(:renewable? => true, :closed? => false)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'does not raise error' do
|
50
|
+
lambda { account.renew }.should_not raise_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
Transpec would convert it to the following form:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
describe Account do
|
61
|
+
subject(:account) { Account.new(logger) }
|
62
|
+
let(:logger) { double('logger') }
|
63
|
+
|
64
|
+
describe '#balance' do
|
65
|
+
context 'initially' do
|
66
|
+
it 'is zero' do
|
67
|
+
expect(account.balance).to eq(0)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#close' do
|
73
|
+
it 'logs an account closed message' do
|
74
|
+
expect(logger).to receive(:account_closed).with(account)
|
75
|
+
account.close
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#renew' do
|
80
|
+
context 'when the account is renewable and not closed' do
|
81
|
+
before do
|
82
|
+
allow(account).to receive(:renewable?).and_return(true)
|
83
|
+
allow(account).to receive(:closed?).and_return(false)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'does not raise error' do
|
87
|
+
expect { account.renew }.not_to raise_error
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
11
94
|
## Installation
|
12
95
|
|
13
96
|
```bash
|
@@ -16,17 +99,31 @@ $ gem install transpec
|
|
16
99
|
|
17
100
|
## Basic Usage
|
18
101
|
|
19
|
-
|
102
|
+
Before converting your specs:
|
103
|
+
|
104
|
+
* Make sure your project has `rspec` gem dependency `2.14` or later. If not, change your `*.gemspec` or `Gemfile` to do so.
|
105
|
+
* Run `rspec` and check if all the specs pass.
|
106
|
+
|
107
|
+
Then, run `transpec` with no arguments in the project root directory:
|
20
108
|
|
21
109
|
```bash
|
110
|
+
$ cd some-project
|
22
111
|
$ transpec
|
112
|
+
Processing spec/spec_helper.rb
|
113
|
+
Processing spec/spec_spec.rb
|
114
|
+
Processing spec/support/file_helper.rb
|
115
|
+
Processing spec/support/shared_context.rb
|
116
|
+
Processing spec/transpec/ast/scanner_spec.rb
|
117
|
+
Processing spec/transpec/ast/scope_stack_spec.rb
|
23
118
|
```
|
24
119
|
|
25
|
-
This will
|
120
|
+
This will convert and overwrite all spec files in the `spec` directory.
|
121
|
+
|
122
|
+
After the conversion, run `rspec` again and check if all pass.
|
26
123
|
|
27
|
-
|
124
|
+
## Compatibility
|
28
125
|
|
29
|
-
|
126
|
+
Tested on MRI 1.9, MRI 2.0 and JRuby in 1.9 mode.
|
30
127
|
|
31
128
|
## Contributing
|
32
129
|
|
data/README.md.erb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
[](http://badge.fury.io/rb/transpec) [](https://gemnasium.com/yujinakayama/transpec) [](https://travis-ci.org/yujinakayama/transpec) [](https://coveralls.io/r/yujinakayama/transpec) [](https://codeclimate.com/github/yujinakayama/transpec)
|
2
|
+
|
3
|
+
# Transpec
|
4
|
+
|
5
|
+
**Transpec** automatically converts your specs into latest [RSpec](http://rspec.info/) syntax with static analysis.
|
6
|
+
|
7
|
+
This aims to facilitate smooth transition to RSpec 3.
|
8
|
+
|
9
|
+
See the following pages for the new RSpec syntax and the plan for RSpec 3:
|
10
|
+
|
11
|
+
* [Myron Marston » RSpec's New Expectation Syntax](http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax)
|
12
|
+
* [RSpec's new message expectation syntax - Tea is awesome.](http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/)
|
13
|
+
* [Myron Marston » The Plan for RSpec 3](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3)
|
14
|
+
|
15
|
+
Note that Transpec does not yet support all conversions for the RSpec changes,
|
16
|
+
and also the changes for RSpec 3 is not fixed and may vary in the future.
|
17
|
+
So it's recommended to follow updates of both RSpec and Transpec.
|
18
|
+
|
19
|
+
## Example
|
20
|
+
|
21
|
+
Here's an example spec:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
<%=
|
25
|
+
example = <<END
|
26
|
+
describe Account do
|
27
|
+
subject(:account) { Account.new(logger) }
|
28
|
+
let(:logger) { mock('logger') }
|
29
|
+
|
30
|
+
describe '#balance' do
|
31
|
+
context 'initially' do
|
32
|
+
it 'is zero' do
|
33
|
+
account.balance.should == 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#close' do
|
39
|
+
it 'logs an account closed message' do
|
40
|
+
logger.should_receive(:account_closed).with(account)
|
41
|
+
account.close
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#renew' do
|
46
|
+
context 'when the account is renewable and not closed' do
|
47
|
+
before do
|
48
|
+
account.stub(:renewable? => true, :closed? => false)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'does not raise error' do
|
52
|
+
lambda { account.renew }.should_not raise_error
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
END
|
58
|
+
-%>
|
59
|
+
```
|
60
|
+
|
61
|
+
Transpec would convert it to the following form:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
<%= Transpec::Rewriter.new.rewrite(example) -%>
|
65
|
+
```
|
66
|
+
|
67
|
+
## Installation
|
68
|
+
|
69
|
+
```bash
|
70
|
+
$ gem install transpec
|
71
|
+
```
|
72
|
+
|
73
|
+
## Basic Usage
|
74
|
+
|
75
|
+
Before converting your specs:
|
76
|
+
|
77
|
+
* Make sure your project has `rspec` gem dependency `<%= rspec_version %>` or later. If not, change your `*.gemspec` or `Gemfile` to do so.
|
78
|
+
* Run `rspec` and check if all the specs pass.
|
79
|
+
|
80
|
+
Then, run `transpec` with no arguments in the project root directory:
|
81
|
+
|
82
|
+
```bash
|
83
|
+
$ cd some-project
|
84
|
+
$ transpec
|
85
|
+
Processing spec/spec_helper.rb
|
86
|
+
Processing spec/spec_spec.rb
|
87
|
+
Processing spec/support/file_helper.rb
|
88
|
+
Processing spec/support/shared_context.rb
|
89
|
+
Processing spec/transpec/ast/scanner_spec.rb
|
90
|
+
Processing spec/transpec/ast/scope_stack_spec.rb
|
91
|
+
```
|
92
|
+
|
93
|
+
This will convert and overwrite all spec files in the `spec` directory.
|
94
|
+
|
95
|
+
After the conversion, run `rspec` again and check if all pass.
|
96
|
+
|
97
|
+
## Compatibility
|
98
|
+
|
99
|
+
Tested on MRI 1.9, MRI 2.0 and JRuby in 1.9 mode.
|
100
|
+
|
101
|
+
## Contributing
|
102
|
+
|
103
|
+
1. Fork it
|
104
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
105
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
106
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
107
|
+
5. Create new Pull Request
|
data/Rakefile
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
Rubocop::RakeTask.new(:style)
|
5
7
|
|
6
8
|
namespace :ci do
|
7
9
|
desc "#{Rake::Task['spec'].comment} for CI environment"
|
@@ -16,12 +18,31 @@ namespace :ci do
|
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
desc 'Check code style with RuboCop'
|
20
|
-
task :style do
|
21
|
-
sh('rubocop')
|
22
|
-
end
|
23
|
-
|
24
21
|
desc 'Run RSpec and RuboCop'
|
25
22
|
task all: [:spec, :style]
|
26
23
|
|
24
|
+
desc 'Generate README.md'
|
25
|
+
task :readme do
|
26
|
+
require 'erb'
|
27
|
+
require 'transpec'
|
28
|
+
|
29
|
+
gem_specification = Gem::Specification.load('transpec.gemspec')
|
30
|
+
rspec_dependency = gem_specification.dependencies.find { |d| d.name == 'rspec' }
|
31
|
+
rspec_requirement = rspec_dependency.requirement
|
32
|
+
rspec_version = rspec_requirement.requirements.first.find { |r| r.is_a?(Gem::Version) }
|
33
|
+
|
34
|
+
erb = ERB.new(File.read('README.md.erb'), nil, '-')
|
35
|
+
content = erb.result(binding)
|
36
|
+
File.write('README.md', content)
|
37
|
+
end
|
38
|
+
|
39
|
+
task :abort_unless_latest_readme_is_committed => :readme do
|
40
|
+
unless Transpec::Git.clean?
|
41
|
+
warn 'Commit README.md before release.'
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Rake::Task[:release].enhance([:abort_unless_latest_readme_is_committed])
|
47
|
+
|
27
48
|
task default: :all
|
data/bin/transpec
CHANGED
data/lib/transpec/ast/scanner.rb
CHANGED
data/lib/transpec/cli.rb
CHANGED
data/lib/transpec/rewriter.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'transpec/ast/scanner'
|
4
|
+
require 'transpec/configuration'
|
5
|
+
require 'transpec/syntax'
|
6
|
+
require 'transpec/syntax/be_close'
|
7
|
+
require 'transpec/syntax/double'
|
8
|
+
require 'transpec/syntax/matcher'
|
9
|
+
require 'transpec/syntax/method_stub'
|
10
|
+
require 'transpec/syntax/should'
|
11
|
+
require 'transpec/syntax/should_receive'
|
4
12
|
require 'parser/current'
|
5
13
|
|
6
14
|
module Transpec
|
@@ -95,7 +103,7 @@ module Transpec
|
|
95
103
|
end
|
96
104
|
|
97
105
|
def process_double(double)
|
98
|
-
double.
|
106
|
+
double.convert_to_double! if @configuration.replace_deprecated_method?
|
99
107
|
end
|
100
108
|
|
101
109
|
def process_method_stub(method_stub)
|
@@ -105,5 +113,9 @@ module Transpec
|
|
105
113
|
method_stub.replace_deprecated_method!
|
106
114
|
end
|
107
115
|
end
|
116
|
+
|
117
|
+
def process_be_close(be_close)
|
118
|
+
be_close.convert_to_be_within! if @configuration.replace_deprecated_method?
|
119
|
+
end
|
108
120
|
end
|
109
121
|
end
|
data/lib/transpec/syntax.rb
CHANGED
@@ -41,7 +41,10 @@ module Transpec
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.target_node?(node)
|
44
|
-
false
|
44
|
+
return false unless node.type == :send
|
45
|
+
receiver_node, method_name, *_ = *node
|
46
|
+
return false unless target_receiver_node?(receiver_node)
|
47
|
+
target_method_names.include?(method_name)
|
45
48
|
end
|
46
49
|
|
47
50
|
def initialize(node, ancestor_nodes, in_example_group_context, source_rewriter)
|
@@ -54,5 +57,37 @@ module Transpec
|
|
54
57
|
def parent_node
|
55
58
|
@ancestor_nodes.last
|
56
59
|
end
|
60
|
+
|
61
|
+
def expression_range
|
62
|
+
@node.loc.expression
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
def self.target_receiver_node?(node)
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.target_method_names
|
72
|
+
[]
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def remove(range)
|
78
|
+
@source_rewriter.remove(range)
|
79
|
+
end
|
80
|
+
|
81
|
+
def insert_before(range, content)
|
82
|
+
@source_rewriter.insert_before(range, content)
|
83
|
+
end
|
84
|
+
|
85
|
+
def insert_after(range, content)
|
86
|
+
@source_rewriter.insert_after(range, content)
|
87
|
+
end
|
88
|
+
|
89
|
+
def replace(range, content)
|
90
|
+
@source_rewriter.replace(range, content)
|
91
|
+
end
|
57
92
|
end
|
58
93
|
end
|