spec-converter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ Manifest.txt
2
+ README.txt
3
+ Rakefile
4
+ bin/spec_converter
5
+ lib/spec_converter.rb
6
+ test/spec_converter_test.rb
@@ -0,0 +1,47 @@
1
+ = spec_converter
2
+
3
+ == DESCRIPTION
4
+ Simple converter to go from test-unit or dust style tests to test-spec (http://rubyforge.org/projects/test-spec) specs.
5
+
6
+ == FEATURES/PROBLEMS
7
+ This will change all files in place!! Make sure you are properly backed up and/or committed to SVN before running.
8
+
9
+ == INSTALL
10
+ sudo gem install spec_converter
11
+
12
+ == USAGE
13
+ Assuming your project is at ~/work/project/:
14
+
15
+ cd ~/work/project
16
+ spec_converter
17
+
18
+ == URLS:
19
+ * test/spec: http://rubyforge.org/projects/test-spec
20
+ * trac: http://opensource.thinkrelevance.com/wiki/spec-converter
21
+ * svn trunk: https://opensource.thinkrelevance.com/svn/spec_converter/trunk
22
+ * rdoc: http://spec-converter.rubyforge.org/rdoc
23
+
24
+ == LICENSE:
25
+
26
+ (The MIT License)
27
+
28
+ Copyright (c) 2007 Relevance
29
+
30
+ Permission is hereby granted, free of charge, to any person obtaining
31
+ a copy of this software and associated documentation files (the
32
+ 'Software'), to deal in the Software without restriction, including
33
+ without limitation the rights to use, copy, modify, merge, publish,
34
+ distribute, sublicense, and/or sell copies of the Software, and to
35
+ permit persons to whom the Software is furnished to do so, subject to
36
+ the following conditions:
37
+
38
+ The above copyright notice and this permission notice shall be
39
+ included in all copies or substantial portions of the Software.
40
+
41
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
42
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
43
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
44
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
45
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
46
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
47
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require 'lib/spec_converter'
6
+ require 'rcov/rcovtask'
7
+
8
+ Hoe.new('SpecConverter', SpecConverter::VERSION) do |p|
9
+ p.rubyforge_name = "spec-converter"
10
+ p.name = 'spec-converter'
11
+ p.remote_rdoc_dir = 'rdoc'
12
+ p.summary = "Convert your tests to test/spec specs"
13
+ p.author = "Relevance"
14
+ p.email = "opensource@thinkrelevance.com"
15
+ p.url = "http://opensource.thinkrelevance.com"
16
+ end
17
+
18
+ desc 'Default: run unit tests.'
19
+ task :default => :test
20
+
21
+ desc 'Default for CruiseControl'
22
+ task :cruise => ['test', 'test:flog']
23
+
24
+ desc 'Test for flog failure'
25
+ namespace :test do
26
+ task :flog do
27
+ threshold = (ENV['FLOG_THRESHOLD'] || 120).to_i
28
+ dirs = %w(lib tasks test)
29
+ result = IO.popen("flog #{dirs.join(' ')} 2>/dev/null | grep \"(\" | grep -v \"main#none\" | head -n 1").readlines.join('')
30
+ result =~ /\((.*)\)/
31
+ flog = $1.to_i
32
+ result =~ /^(.*):/
33
+ method = $1
34
+ if flog > threshold
35
+ raise "FLOG failed for #{method} with score of #{flog} (threshold is #{threshold})."
36
+ end
37
+ puts "FLOG passed, with highest score being #{flog} for #{method}."
38
+ end
39
+ end
40
+
41
+ desc 'Test the relevance_tools plugin.'
42
+ Rake::TestTask.new(:test) do |t|
43
+ t.libs << 'lib'
44
+ t.pattern = 'test/**/*_test.rb'
45
+ t.verbose = true
46
+ end
47
+
48
+ Rcov::RcovTask.new("rcov") do |t|
49
+ rcov_output = "tmp/coverage"
50
+ FileUtils.mkdir_p rcov_output unless File.exist? rcov_output
51
+ t.libs << "lib"
52
+ t.test_files = FileList["test/**/*_test.rb"]
53
+ t.output_dir = "#{rcov_output}/"
54
+ t.verbose = true
55
+ t.rcov_opts = ["-x", "^/Library", "--sort coverage"]
56
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'spec_converter'
4
+
5
+ SpecConverter.start
@@ -0,0 +1,60 @@
1
+ # Simple converter to go to test/spec style
2
+ # This will change all files in place, so make sure you are properly backed up and/or committed to SVN!
3
+ class SpecConverter
4
+ VERSION = "0.0.1"
5
+
6
+ def self.start
7
+ spec_converter = SpecConverter.new
8
+ spec_converter.convert
9
+ end
10
+
11
+ # Convert tests from old spec style to new style -- assumes you are in your project root and globs all tests
12
+ # in your test directory.
13
+ def convert
14
+ raise "No test diretory - you must run this script from your project root, which should also contain a test directory." unless File.directory?("test")
15
+ tests = Dir.glob('test/**/*_test.rb')
16
+ tests.each do |test_file|
17
+ translate_file(test_file)
18
+ end
19
+ end
20
+
21
+ def translate_file(file)
22
+ translation = ""
23
+ File.open(file) do |io|
24
+ io.each_line do |line|
25
+ translation << convert_line(line)
26
+ end
27
+ end
28
+ File.open(file, "w") do |io|
29
+ io.write(translation)
30
+ end
31
+ end
32
+
33
+ def convert_line(line)
34
+ convert_rspec_old_style_names(line)
35
+ convert_dust_style(line)
36
+ convert_test_unit_class_name(line)
37
+ convert_test_unit_methods(line)
38
+ line
39
+ end
40
+
41
+ private
42
+
43
+ def convert_rspec_old_style_names(line)
44
+ line.gsub!(/(^\s*)context(\s.*do)/, '\1describe\2')
45
+ line.gsub!(/(^\s*)specify(\s.*do)/, '\1it\2')
46
+ end
47
+
48
+ def convert_test_unit_class_name(line)
49
+ line.gsub!(/^class\s*([\w:]+)Test\s*<\s*Test::Unit::TestCase/, 'describe "\1" do')
50
+ line.gsub!(/^class\s*([\w:]+)Test\s*<\s*ActionController::IntegrationTest/, 'describe "\1", ActionController::IntegrationTest do')
51
+ end
52
+
53
+ def convert_test_unit_methods(line)
54
+ line.gsub!(/(^\s*)def\s*test_([\w_!?,$]+)/) { %{#{$1}it "#{$2.split('_').join(' ')}" do} }
55
+ end
56
+
57
+ def convert_dust_style(line)
58
+ line.gsub!(/(^\s*)test(\s.*do)/, '\1it\2')
59
+ end
60
+ end
@@ -0,0 +1,146 @@
1
+ require 'rubygems'
2
+ require 'test/spec'
3
+ require 'mocha'
4
+ require 'tempfile'
5
+ require File.dirname(__FILE__) + '/../lib/spec_converter'
6
+
7
+ describe "converting from test/spec old style to new style names" do
8
+ setup do
9
+ @converter = SpecConverter.new
10
+ end
11
+
12
+ it "replaces spec context with describe" do
13
+ @converter.convert_line(%[context "should foo bar" do]).should == %[describe "should foo bar" do]
14
+ @converter.convert_line(%[ context "should foo bar" do]).should == %[ describe "should foo bar" do]
15
+ end
16
+
17
+ it "ignores unrelated uses of 'context'" do
18
+ @converter.convert_line(%[# here is a comment with context]).should == %[# here is a comment with context]
19
+ @converter.convert_line(%[contexts.each do |context|]).should == %[contexts.each do |context|]
20
+ end
21
+
22
+ it "replaces spec specify with it" do
23
+ @converter.convert_line(%[ specify "remember me saves the user" do]).should == %[ it "remember me saves the user" do]
24
+ end
25
+
26
+ it "ignores unrelated uses of 'specify'" do
27
+ @converter.convert_line(%[# I like to specify things]).should == %[# I like to specify things]
28
+ @converter.convert_line(%[ @user.should.specify.stuff]).should == %[ @user.should.specify.stuff]
29
+ end
30
+
31
+ end
32
+
33
+ describe "SpecConverter.start" do
34
+ it "creates an instance and calls convert" do
35
+ SpecConverter.expects(:new).returns(converter = stub)
36
+ converter.expects(:convert)
37
+ SpecConverter.start
38
+ end
39
+ end
40
+
41
+ describe "translate file overwrites old file with translated stuff" do
42
+ it "works" do
43
+ file = Tempfile.open("some_file.rb")
44
+ file << "Here is some stuff that is cool!"
45
+ file.close
46
+
47
+ converter = SpecConverter.new
48
+ converter.expects(:convert_line).with(anything).returns("Translated to be super awesome")
49
+ converter.translate_file(file.path)
50
+
51
+ File.open(file.path).read.should == "Translated to be super awesome"
52
+ end
53
+ end
54
+
55
+ describe "converting dust style to test/spec style" do
56
+ setup do
57
+ @converter = SpecConverter.new
58
+ end
59
+
60
+ it "changes test...do to it...do" do
61
+ @converter.convert_line(%[test "should do something cool and fun!!" do]).should == %[it "should do something cool and fun!!" do]
62
+ end
63
+
64
+ it "ignores unrelated lines" do
65
+ @converter.convert_line(%[# test that this class can do something right]).should == %[# test that this class can do something right]
66
+ end
67
+
68
+ end
69
+
70
+ describe "converting ActionController::IntegrationTest style to describe blocks" do
71
+ setup do
72
+ @converter = SpecConverter.new
73
+ end
74
+
75
+ it "replaces class FooTest < ActionController::IntegrationTest with describe foo do" do
76
+ @converter.convert_line(%[class ResearchTest < ActionController::IntegrationTest]).should == %[describe "Research", ActionController::IntegrationTest do]
77
+ end
78
+ end
79
+
80
+ describe "converting Test::Unit style to describe blocks" do
81
+ setup do
82
+ @converter = SpecConverter.new
83
+ end
84
+
85
+ it "replaces class FooTest < Test::Unit::TestCase with describe foo do" do
86
+ @converter.convert_line(%[class ResearchTest < Test::Unit::TestCase]).should == %[describe "Research" do]
87
+ end
88
+
89
+ it "replaces class FooTest < Test::Unit::TestCase with silly whitespacing with describe foo do" do
90
+ @converter.convert_line(%[class ResearchTest < Test::Unit::TestCase]).should == %[describe "Research" do]
91
+ end
92
+
93
+ it "converts namespaced test unit classes" do
94
+ @converter.convert_line(%[class Admin::DashboardControllerTest < Test::Unit::TestCase]).should == %[describe "Admin::DashboardController" do]
95
+ end
96
+
97
+ it "ignores unrelated classes" do
98
+ @converter.convert_line(%[class Foo]).should == %[class Foo]
99
+ @converter.convert_line(%[class Bar < ActiveRecord::Base]).should == %[class Bar < ActiveRecord::Base]
100
+ end
101
+
102
+ end
103
+
104
+ describe "converting Test::Unit methods to it blocks" do
105
+ setup do
106
+ @converter = SpecConverter.new
107
+ end
108
+
109
+ it "replaces class def test_something? with it something? do" do
110
+ @converter.convert_line(%[def test_something?]).should == %[it "something?" do]
111
+ end
112
+
113
+ it "replaces class def test_something with it something do" do
114
+ @converter.convert_line(%[def test_something]).should == %[it "something" do]
115
+ end
116
+
117
+ it "replaces class def test_something with it something do when it has leading whitespace" do
118
+ @converter.convert_line(%[ def test_something_here]).should == %[ it "something here" do]
119
+ end
120
+
121
+ it "ignores unrelated lines" do
122
+ @converter.convert_line(%[def foo]).should == %[def foo]
123
+ end
124
+
125
+ it "ignores unrelated lines with leading whitespace" do
126
+ @converter.convert_line(%[ def foo]).should == %[ def foo]
127
+ end
128
+
129
+ end
130
+
131
+ describe "converting things in batch" do
132
+ setup do
133
+ @converter = SpecConverter.new
134
+ end
135
+
136
+ it "takes convert all test files in the test subdirectory" do
137
+ @convert.expects(:convert_line).never
138
+ files = %w[test/foo_test.rb test/models/another_test.rb]
139
+ files.each do |file|
140
+ @converter.expects(:translate_file).with(file)
141
+ end
142
+ Dir.expects(:glob).with(anything()).returns(files)
143
+ File.stubs(:directory?).with("test").returns(true)
144
+ @converter.convert
145
+ end
146
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spec-converter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Relevance
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-01-04 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.0
23
+ version:
24
+ description: The author was too lazy to write a description
25
+ email: opensource@thinkrelevance.com
26
+ executables:
27
+ - spec_converter
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - Manifest.txt
32
+ - README.txt
33
+ files:
34
+ - Manifest.txt
35
+ - README.txt
36
+ - Rakefile
37
+ - bin/spec_converter
38
+ - lib/spec_converter.rb
39
+ - test/spec_converter_test.rb
40
+ has_rdoc: true
41
+ homepage: http://opensource.thinkrelevance.com
42
+ post_install_message:
43
+ rdoc_options:
44
+ - --main
45
+ - README.txt
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ requirements: []
61
+
62
+ rubyforge_project: spec-converter
63
+ rubygems_version: 1.0.1
64
+ signing_key:
65
+ specification_version: 2
66
+ summary: Convert your tests to test/spec specs
67
+ test_files: []
68
+