rspecify 0.1.1
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.
- data/Gemfile +3 -0
- data/Gemfile.lock +47 -0
- data/LICENSE +20 -0
- data/README.rdoc +9 -0
- data/lib/rspecify/runner.rb +21 -0
- data/lib/rspecify/transformer.rb +16 -0
- data/lib/rspecify/transformers/test_class_and_methods.rb +52 -0
- data/lib/rspecify/transformers/test_unit_assertions.rb +38 -0
- data/lib/rspecify/version.rb +3 -0
- data/lib/rspecify.rb +10 -0
- data/spec/matchers/should_transform_to.rb +25 -0
- data/spec/rspecify/transformer_spec.rb +5 -0
- data/spec/rspecify/transformers/test_class_and_methods_spec.rb +51 -0
- data/spec/rspecify/transformers/test_unit_assertions_spec.rb +21 -0
- data/spec/spec_helper.rb +10 -0
- metadata +137 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rspecify (0.1.1)
|
5
|
+
activesupport (~> 3.0.10)
|
6
|
+
i18n (~> 0.6.0)
|
7
|
+
ruby_parser (~> 2.3.1)
|
8
|
+
ruby_scribe (~> 0.1.0)
|
9
|
+
ruby_transform (~> 0.1.0)
|
10
|
+
thor (~> 0.13)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: http://rubygems.org/
|
14
|
+
specs:
|
15
|
+
activesupport (3.0.10)
|
16
|
+
diff-lcs (1.1.3)
|
17
|
+
i18n (0.6.0)
|
18
|
+
rspec (2.6.0)
|
19
|
+
rspec-core (~> 2.6.0)
|
20
|
+
rspec-expectations (~> 2.6.0)
|
21
|
+
rspec-mocks (~> 2.6.0)
|
22
|
+
rspec-core (2.6.4)
|
23
|
+
rspec-expectations (2.6.0)
|
24
|
+
diff-lcs (~> 1.1.2)
|
25
|
+
rspec-mocks (2.6.0)
|
26
|
+
ruby_parser (2.3.1)
|
27
|
+
sexp_processor (~> 3.0)
|
28
|
+
ruby_scribe (0.1.2)
|
29
|
+
activesupport (~> 3.0.10)
|
30
|
+
i18n (~> 0.6.0)
|
31
|
+
ruby_parser (~> 2.3.1)
|
32
|
+
thor (~> 0.13)
|
33
|
+
ruby_transform (0.1.1)
|
34
|
+
activesupport (~> 3.0.10)
|
35
|
+
i18n (~> 0.6.0)
|
36
|
+
ruby_parser (~> 2.3.1)
|
37
|
+
ruby_scribe (~> 0.1.0)
|
38
|
+
thor (~> 0.13)
|
39
|
+
sexp_processor (3.0.7)
|
40
|
+
thor (0.14.6)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
rspec (~> 2.0)
|
47
|
+
rspecify!
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Ben Hughes
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
= RSpecify
|
2
|
+
|
3
|
+
Converting your tests from Test::Unit to RSpec is a drag when done by hand. This utility intelligently converts them to get you (hopefully) 90% of the way there.
|
4
|
+
|
5
|
+
== In-Progress
|
6
|
+
|
7
|
+
This gem is not useable and is being continually worked on. Will be released as 0.1.0 once reasonably working and stable.
|
8
|
+
|
9
|
+
DO NOT USE!
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "rspecify"
|
3
|
+
|
4
|
+
module RSpecify
|
5
|
+
class Runner < Thor
|
6
|
+
desc :cat, "Takes a single ruby file, parses it, and outputs the scribed version."
|
7
|
+
def cat(path)
|
8
|
+
sexp = RubyParser.new.parse(File.read(path))
|
9
|
+
sexp = RSpecify::Transformer.new.transform(sexp)
|
10
|
+
puts RubyScribe::Emitter.new.emit(sexp)
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def expand_paths(paths = [])
|
16
|
+
paths.map do |path|
|
17
|
+
[path] + Dir[path + "**/*.rb"]
|
18
|
+
end.flatten.uniq.reject {|f| File.directory?(f) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RSpecify
|
2
|
+
class Transformer < RubyTransform::Transformer
|
3
|
+
def dependent_transformers
|
4
|
+
[
|
5
|
+
RSpecify::Transformers::TestClassAndMethods.new,
|
6
|
+
RSpecify::Transformers::TestUnitAssertions.new
|
7
|
+
]
|
8
|
+
end
|
9
|
+
|
10
|
+
def transform(e)
|
11
|
+
super(dependent_transformers.inject(e) {|result, transformer|
|
12
|
+
transformer.transform(result)
|
13
|
+
})
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module RSpecify
|
2
|
+
module Transformers
|
3
|
+
|
4
|
+
# = Test Class And Methods Transformer
|
5
|
+
# Catches instances where a class is being defined extending ActiveSupport::TestClass and converts it into
|
6
|
+
# an RSpec describe block, then converts all methods contained therein beginning with "test_" to
|
7
|
+
# rspec "it" blocks.
|
8
|
+
#
|
9
|
+
class TestClassAndMethods < RubyTransform::Transformer
|
10
|
+
def transform(e)
|
11
|
+
super sexp?(e) ? transform_test_class_and_methods(e) : e
|
12
|
+
end
|
13
|
+
|
14
|
+
def transform_test_class_and_methods(e)
|
15
|
+
if e.kind == :class && e.body[1] == s(:colon2, s(:const, :ActiveSupport), :TestCase)
|
16
|
+
transform_test_class(e)
|
17
|
+
else
|
18
|
+
e
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def transform_test_class(e)
|
23
|
+
s(:iter,
|
24
|
+
s(:call, nil, :describe, s(:arglist, s(:const, e.body[0]))),
|
25
|
+
nil,
|
26
|
+
transform_test_class_method_definitions(e.body[2].body[0])
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def transform_test_class_method_definitions(e)
|
31
|
+
Sexp.from_array([e.kind] + e.body.map do |child|
|
32
|
+
if child.kind == :defn && child.body[0].to_s.starts_with?("test_") && child.body[1].body.empty?
|
33
|
+
transform_test_class_method_definition(child)
|
34
|
+
else
|
35
|
+
child
|
36
|
+
end
|
37
|
+
end)
|
38
|
+
end
|
39
|
+
|
40
|
+
def transform_test_class_method_definition(e)
|
41
|
+
test_name = e.body[0].to_s.gsub(/^test_/, "").gsub("_", " ")
|
42
|
+
|
43
|
+
s(:iter,
|
44
|
+
s(:call, nil, :it, s(:arglist, s(:str, test_name))),
|
45
|
+
nil,
|
46
|
+
e.body[2].body[0]
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RSpecify
|
2
|
+
module Transformers
|
3
|
+
|
4
|
+
# = Test Unit Assertions Transformer
|
5
|
+
# Catches instances where Test::Unit assertions are being called (such as assert_equal) and morphs
|
6
|
+
# the calls to use the RSpec idiom.
|
7
|
+
#
|
8
|
+
class TestUnitAssertions < RubyTransform::Transformer
|
9
|
+
def transform(e)
|
10
|
+
super sexp?(e) ? transform_test_unit_assertions(e) : e
|
11
|
+
end
|
12
|
+
|
13
|
+
def transform_test_unit_assertions(e)
|
14
|
+
case
|
15
|
+
when assert_equals_call?(e)
|
16
|
+
transform_assert_equals_call(e)
|
17
|
+
else
|
18
|
+
e
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def assert_equals_call?(e)
|
23
|
+
e.kind == :call && e.body[0].nil? && e.body[1] == :assert_equals
|
24
|
+
end
|
25
|
+
|
26
|
+
def transform_assert_equals_call(e)
|
27
|
+
method_arguments = e.body[2].body
|
28
|
+
|
29
|
+
s(:call,
|
30
|
+
s(:call, method_arguments[0], :should, s(:arglist)),
|
31
|
+
:==,
|
32
|
+
s(:arglist, method_arguments[1])
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/rspecify.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
RSpec::Matchers.define :transform_to do |desc, expected|
|
2
|
+
match do |actual|
|
3
|
+
actual_as_sexp = actual.is_a?(String) ? RubyParser.new.parse(actual) : actual
|
4
|
+
expected_as_sexp = expected.is_a?(String) ? RubyParser.new.parse(expected) : expected
|
5
|
+
|
6
|
+
@transformed = described_class.transform(actual_as_sexp)
|
7
|
+
@transformed == expected_as_sexp
|
8
|
+
end
|
9
|
+
|
10
|
+
failure_message_for_should do |actual|
|
11
|
+
"expected that:\n\n#{RubyParser.new.parse(actual)}\n\nwould transform to:\n\n#{RubyParser.new.parse(expected)}\n\nbut instead was:\n\n#{@transformed}\n\n#{transformed_as_ruby}"
|
12
|
+
end
|
13
|
+
|
14
|
+
failure_message_for_should_not do |actual|
|
15
|
+
"expected that:\n\n#{RubyParser.new.parse(actual)}\n\nwould not transform to:\n\n#{RubyParser.new.parse(expected)}\n\nbut instead was:\n\n#{@transformed}\n\n#{transformed_as_ruby}"
|
16
|
+
end
|
17
|
+
|
18
|
+
description do
|
19
|
+
"transform with to #{desc}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def transformed_as_ruby
|
23
|
+
RubyScribe::Emitter.new.emit(@transformed) rescue nil
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RSpecify::Transformers::TestClassAndMethods.new do
|
4
|
+
|
5
|
+
describe "class extending ActiveSupport::TestCase" do
|
6
|
+
subject { %{
|
7
|
+
class MyClass < ActiveSupport::TestCase
|
8
|
+
do_something
|
9
|
+
something_else
|
10
|
+
end
|
11
|
+
} }
|
12
|
+
|
13
|
+
it { should transform_to("describe block", %{
|
14
|
+
describe MyClass do
|
15
|
+
do_something
|
16
|
+
something_else
|
17
|
+
end
|
18
|
+
}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "class extending ActiveSupport::TestCase with methods" do
|
22
|
+
subject { %{
|
23
|
+
class MyClass < ActiveSupport::TestCase
|
24
|
+
def test_should_be_valid
|
25
|
+
something
|
26
|
+
1
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_not_be_valid
|
30
|
+
something
|
31
|
+
1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
} }
|
35
|
+
|
36
|
+
it { should transform_to("describe block", %{
|
37
|
+
describe MyClass do
|
38
|
+
it "should be valid" do
|
39
|
+
something
|
40
|
+
1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not be valid" do
|
44
|
+
something
|
45
|
+
1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
}) }
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RSpecify::Transformers::TestUnitAssertions.new do
|
4
|
+
|
5
|
+
describe "short assert equals" do
|
6
|
+
subject { %{assert_equals @one, "One"} }
|
7
|
+
it { should transform_to("should ==", %{@one.should == "One"}) }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "long assert equals" do
|
11
|
+
subject { %{
|
12
|
+
assert_equals @organization.people.first, Person.find_by_name_and_organization(
|
13
|
+
"Ben, Hughes",
|
14
|
+
"RailsGarden"
|
15
|
+
)
|
16
|
+
} }
|
17
|
+
|
18
|
+
it { should transform_to("should == ", %{@organization.people.first.should == Person.find_by_name_and_organization("Ben, Hughes", "RailsGarden")}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), "../lib"))
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "rspec"
|
5
|
+
require "rspecify"
|
6
|
+
|
7
|
+
# Requires supporting files with custom matchers and macros, etc,
|
8
|
+
# in ./support/ and its subdirectories.
|
9
|
+
Dir["#{File.dirname(__FILE__)}/matchers/**/*.rb"].each {|f| require f}
|
10
|
+
|
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspecify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ben Hughes
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: &70326759787600 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.13'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70326759787600
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
requirement: &70326759786660 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.10
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70326759786660
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: i18n
|
38
|
+
requirement: &70326759785980 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.6.0
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70326759785980
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ruby_parser
|
49
|
+
requirement: &70326759785420 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.3.1
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70326759785420
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: ruby_scribe
|
60
|
+
requirement: &70326759784640 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.1.0
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70326759784640
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ruby_transform
|
71
|
+
requirement: &70326759783380 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.1.0
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70326759783380
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rspec
|
82
|
+
requirement: &70326759780280 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ~>
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '2.0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70326759780280
|
91
|
+
description: Provides some automation to attempt to convert your Ruby Test::Unit tests
|
92
|
+
into RSpec.
|
93
|
+
email: ben@railsgarden.com
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files: []
|
97
|
+
files:
|
98
|
+
- lib/rspecify/runner.rb
|
99
|
+
- lib/rspecify/transformer.rb
|
100
|
+
- lib/rspecify/transformers/test_class_and_methods.rb
|
101
|
+
- lib/rspecify/transformers/test_unit_assertions.rb
|
102
|
+
- lib/rspecify/version.rb
|
103
|
+
- lib/rspecify.rb
|
104
|
+
- spec/matchers/should_transform_to.rb
|
105
|
+
- spec/rspecify/transformer_spec.rb
|
106
|
+
- spec/rspecify/transformers/test_class_and_methods_spec.rb
|
107
|
+
- spec/rspecify/transformers/test_unit_assertions_spec.rb
|
108
|
+
- spec/spec_helper.rb
|
109
|
+
- Gemfile
|
110
|
+
- Gemfile.lock
|
111
|
+
- LICENSE
|
112
|
+
- README.rdoc
|
113
|
+
homepage: http://github.com/rubiety/rspecify
|
114
|
+
licenses: []
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- lib
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ! '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 1.3.4
|
131
|
+
requirements: []
|
132
|
+
rubyforge_project: rspecify
|
133
|
+
rubygems_version: 1.8.10
|
134
|
+
signing_key:
|
135
|
+
specification_version: 3
|
136
|
+
summary: Intelligently converts your Test::Unit tests into RSpec.
|
137
|
+
test_files: []
|