test_parser 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rvmrc.example +47 -0
- data/bin/test_parser +2 -3
- data/lib/test_parser.rb +24 -16
- data/lib/test_parser/command_line.rb +101 -0
- data/lib/test_parser/parser/common.rb +17 -0
- data/lib/test_parser/parser/minitest.rb +51 -0
- data/lib/test_parser/parser/rspec.rb +78 -0
- data/lib/test_parser/snippet.rb +9 -2
- data/lib/test_parser/snippet_source/common.rb +13 -0
- data/lib/test_parser/snippet_source/line_number.rb +23 -0
- data/lib/test_parser/snippet_source/method.rb +22 -0
- data/lib/test_parser/source_code.rb +27 -2
- data/lib/test_parser/test_formatter/yaml.rb +11 -0
- data/lib/test_parser/test_information.rb +14 -8
- data/lib/test_parser/version.rb +1 -1
- data/spec/source_code_spec.rb +15 -4
- data/spec/spec_helper.rb +2 -1
- data/spec/support/matchers/match_code.rb +7 -4
- data/spec/test_parser/minitest_spec.rb +52 -0
- data/spec/test_parser/rspec_spec.rb +46 -0
- data/spec/test_parser_spec.rb +12 -40
- data/test/rspec_test.rb +1 -2
- metadata +15 -9
- data/lib/test_parser/common.rb +0 -17
- data/lib/test_parser/minitest.rb +0 -48
- data/lib/test_parser/rspec.rb +0 -68
- data/spec/minitest_spec.rb +0 -39
- data/spec/rspec_spec.rb +0 -35
data/.rvmrc.example
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ruby-1.9.2-p180@test_parser"
|
8
|
+
|
9
|
+
#
|
10
|
+
# First we attempt to load the desired environment directly from the environment
|
11
|
+
# file. This is very fast and efficicent compared to running through the entire
|
12
|
+
# CLI and selector. If you want feedback on which environment was used then
|
13
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
14
|
+
#
|
15
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
16
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
|
17
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
18
|
+
else
|
19
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
20
|
+
rvm --create use "$environment_id"
|
21
|
+
fi
|
22
|
+
|
23
|
+
#
|
24
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
25
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
26
|
+
# necessary.
|
27
|
+
#
|
28
|
+
# filename=".gems"
|
29
|
+
# if [[ -s "$filename" ]] ; then
|
30
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
31
|
+
# fi
|
32
|
+
|
33
|
+
#
|
34
|
+
# If you use bundler and would like to run bundle each time you enter the
|
35
|
+
# directory, you can uncomment the following code.
|
36
|
+
#
|
37
|
+
# # Ensure that Bundler is installed. Install it if it is not.
|
38
|
+
# if ! command -v bundle >/dev/null; then
|
39
|
+
# printf "The rubygem 'bundler' is not installed. Installing it now.\n"
|
40
|
+
# gem install bundler
|
41
|
+
# fi
|
42
|
+
#
|
43
|
+
# # Bundle while reducing excess noise.
|
44
|
+
# printf "Bundling your gems. This may take a few minutes on a fresh clone.\n"
|
45
|
+
# bundle | grep -v '^Using ' | grep -v ' is complete' | sed '/^$/d'
|
46
|
+
#
|
47
|
+
|
data/bin/test_parser
CHANGED
data/lib/test_parser.rb
CHANGED
@@ -1,25 +1,22 @@
|
|
1
|
-
require 'test_parser/common'
|
2
|
-
require 'test_parser/minitest'
|
3
|
-
require 'test_parser/rspec'
|
1
|
+
require 'test_parser/parser/common'
|
2
|
+
require 'test_parser/parser/minitest'
|
3
|
+
require 'test_parser/parser/rspec'
|
4
4
|
|
5
5
|
module TestParser
|
6
6
|
|
7
|
+
DEFAULT_PARSERS = [Parser::MiniTest, Parser::RSpec]
|
8
|
+
|
7
9
|
def all_tests(path, options = {})
|
8
|
-
|
9
|
-
path
|
10
|
-
|
11
|
-
send "#{framework}_tests", path, options[framework]
|
12
|
-
end
|
13
|
-
end
|
10
|
+
parsers = options[:parsers] ||= DEFAULT_PARSERS
|
11
|
+
path = sanitize_path(path)
|
12
|
+
libs = options[:libs] || []
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
MiniTest.find_tests!(path, options)
|
18
|
-
end
|
14
|
+
libs << 'spec'
|
15
|
+
add_libs_to_load_path(path, libs)
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
parsers.collect_concat do |parser|
|
18
|
+
parser.find_tests(path, options[parser.type] || {})
|
19
|
+
end
|
23
20
|
end
|
24
21
|
|
25
22
|
def require_all(path, glob)
|
@@ -28,8 +25,19 @@ module TestParser
|
|
28
25
|
|
29
26
|
def sanitize_path(path)
|
30
27
|
return path if path.is_a? Pathname
|
28
|
+
|
31
29
|
Pathname.new(path).expand_path
|
32
30
|
end
|
33
31
|
|
34
32
|
extend self
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def add_libs_to_load_path(path, libs)
|
37
|
+
libs.each do |lib|
|
38
|
+
dir = (path + lib).expand_path.to_s
|
39
|
+
$LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
35
43
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'test_parser'
|
3
|
+
|
4
|
+
require 'test_parser/test_formatter/yaml'
|
5
|
+
|
6
|
+
module TestParser
|
7
|
+
class CommandLine
|
8
|
+
|
9
|
+
attr_reader :stdout, :stderr
|
10
|
+
|
11
|
+
def initialize(options, stdout = $stdout, stderr = $stderr)
|
12
|
+
@stdout, @stderr = stdout, stderr
|
13
|
+
@registered_values = []
|
14
|
+
@libs = []
|
15
|
+
configure_options(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
tests = TestParser.all_tests(test_suite_path, parse_options)
|
20
|
+
output_stream << format_tests(tests)
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_options
|
24
|
+
{
|
25
|
+
:libs => @libs
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_suite_path
|
30
|
+
@test_suite_path || '.'
|
31
|
+
end
|
32
|
+
|
33
|
+
def output_stream
|
34
|
+
$stdout
|
35
|
+
end
|
36
|
+
|
37
|
+
def format_tests(tests)
|
38
|
+
@formater ||= yaml_formatter
|
39
|
+
@formater.format(tests)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def yaml_formatter
|
45
|
+
TestFormatter::YAML
|
46
|
+
end
|
47
|
+
|
48
|
+
def configure_options(options)
|
49
|
+
OptionParser.new do |parser|
|
50
|
+
parser.banner = "Usage: test_parser [options] [directory]"
|
51
|
+
|
52
|
+
parser.on('-I DIRECTORY', 'specify $LOAD_PATH directory (may be used more than once)') do |dir|
|
53
|
+
append_libs(dir)
|
54
|
+
end
|
55
|
+
|
56
|
+
parser.on('-f', '--format FORMATTER', 'Choose a formatter',
|
57
|
+
' y[aml] - YAML format') do |o|
|
58
|
+
set_formater(o)
|
59
|
+
end
|
60
|
+
|
61
|
+
parser.on_tail('-h', '--help', "This is it!") do
|
62
|
+
puts parser
|
63
|
+
exit
|
64
|
+
end
|
65
|
+
|
66
|
+
end.parse!(options)
|
67
|
+
|
68
|
+
extract_test_suite_path(options)
|
69
|
+
end
|
70
|
+
|
71
|
+
def append_libs(libs)
|
72
|
+
@libs += libs.split(':')
|
73
|
+
end
|
74
|
+
|
75
|
+
def extract_test_suite_path(args)
|
76
|
+
@test_suite_path = args.pop
|
77
|
+
|
78
|
+
unless args.empty?
|
79
|
+
log_err "Unknown use for values: #{args.inspect}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def puts(*args)
|
84
|
+
stdout.puts *args
|
85
|
+
end
|
86
|
+
|
87
|
+
def log_err(*args)
|
88
|
+
stderr.puts *args
|
89
|
+
end
|
90
|
+
|
91
|
+
def set_formater(format)
|
92
|
+
case format
|
93
|
+
when /y(aml)?/i
|
94
|
+
@formatter = yaml_formatter
|
95
|
+
else
|
96
|
+
log_err "Unknown formatter #{format}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test_parser/test_information'
|
2
|
+
|
3
|
+
module TestParser
|
4
|
+
module Parser
|
5
|
+
module Common
|
6
|
+
|
7
|
+
def build_test
|
8
|
+
TestInformation.new(parser_type, identification, snippet_source)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parser_type
|
12
|
+
self.class.type
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
|
3
|
+
require 'test_parser/parser/common'
|
4
|
+
require 'test_parser/extensions/minitest'
|
5
|
+
require 'test_parser/snippet_source/method'
|
6
|
+
|
7
|
+
module TestParser
|
8
|
+
module Parser
|
9
|
+
class MiniTest
|
10
|
+
|
11
|
+
attr_reader :klass, :test_method
|
12
|
+
|
13
|
+
def self.type
|
14
|
+
:minitest
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.find_tests(path, options = {})
|
18
|
+
glob = options[:glob] || 'test/**/*_test.rb'
|
19
|
+
|
20
|
+
::MiniTest::Unit.dont_install_at_exit!
|
21
|
+
|
22
|
+
TestParser.require_all(path, glob)
|
23
|
+
|
24
|
+
::MiniTest::Unit::TestCase.test_suites.collect_concat do |klass|
|
25
|
+
klass.test_methods.map do |test|
|
26
|
+
new(klass, test).build_test
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
include Common
|
32
|
+
|
33
|
+
def initialize(klass, test_method)
|
34
|
+
@klass, @test_method = klass, test_method
|
35
|
+
end
|
36
|
+
|
37
|
+
def identification
|
38
|
+
"#{klass.name}##{test_method}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def file_name
|
42
|
+
klass.instance_method(test_method).source_location.first
|
43
|
+
end
|
44
|
+
|
45
|
+
def snippet_source
|
46
|
+
@snippet_source ||= SnippetSource::Method.new(file_name, test_method)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'rspec/core'
|
2
|
+
|
3
|
+
require 'test_parser/parser/common'
|
4
|
+
require 'test_parser/extensions/rspec'
|
5
|
+
require 'test_parser/snippet_source/line_number'
|
6
|
+
|
7
|
+
module TestParser
|
8
|
+
module Parser
|
9
|
+
class RSpec
|
10
|
+
|
11
|
+
attr_reader :example
|
12
|
+
|
13
|
+
def self.type
|
14
|
+
:rspec2
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.find_tests(path, options = {})
|
18
|
+
glob = options[:glob] || 'spec/**/*_spec.rb'
|
19
|
+
|
20
|
+
::RSpec.with_world ::RSpec::Core::World.new do |world|
|
21
|
+
|
22
|
+
TestParser.require_all(path, glob)
|
23
|
+
|
24
|
+
groups = world.example_groups
|
25
|
+
examples = groups.collect_concat(&:descendant_filtered_examples)
|
26
|
+
examples.map do |example|
|
27
|
+
new(example).build_test
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
include Common
|
33
|
+
|
34
|
+
def initialize(example)
|
35
|
+
@example = example
|
36
|
+
end
|
37
|
+
|
38
|
+
def identification
|
39
|
+
@identification ||= path_to_example.join('/')
|
40
|
+
end
|
41
|
+
|
42
|
+
def snippet_source
|
43
|
+
@snippet_source ||= SnippetSource::LineNumber.new(file_name, line_number)
|
44
|
+
end
|
45
|
+
|
46
|
+
def snippet
|
47
|
+
@snippet ||= snippet_source.snippet
|
48
|
+
end
|
49
|
+
|
50
|
+
def file_name
|
51
|
+
example.file_path
|
52
|
+
end
|
53
|
+
|
54
|
+
def line_number
|
55
|
+
example.metadata[:line_number]
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def path_to_example
|
61
|
+
example_groups_names + [example_description]
|
62
|
+
end
|
63
|
+
|
64
|
+
def example_groups_names
|
65
|
+
example.example_group.ancestors.map(&:display_name).reverse
|
66
|
+
end
|
67
|
+
|
68
|
+
def example_description
|
69
|
+
unless example.description.empty?
|
70
|
+
example.description
|
71
|
+
else
|
72
|
+
snippet.get_block.to_code
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/test_parser/snippet.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
require 'ruby2ruby'
|
2
2
|
|
3
3
|
module TestParser
|
4
|
-
class Snippet
|
4
|
+
class Snippet
|
5
|
+
|
6
|
+
attr_reader :sexp
|
7
|
+
|
8
|
+
def initialize(sexp)
|
9
|
+
raise ArgumentError unless sexp
|
10
|
+
@sexp = sexp
|
11
|
+
end
|
5
12
|
|
6
13
|
def to_code
|
7
|
-
@to_code ||= Ruby2Ruby.new.process(
|
14
|
+
@to_code ||= Ruby2Ruby.new.process(sexp.deep_clone)
|
8
15
|
end
|
9
16
|
|
10
17
|
def get_block
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
module TestParser
|
4
|
+
module SnippetSource
|
5
|
+
class LineNumber
|
6
|
+
|
7
|
+
attr_reader :file, :line_number
|
8
|
+
|
9
|
+
include Common
|
10
|
+
|
11
|
+
def initialize(file, line_number)
|
12
|
+
@file, @line_number = file, line_number
|
13
|
+
end
|
14
|
+
|
15
|
+
def snippet
|
16
|
+
source_code.extract_code_from_line(line_number)
|
17
|
+
rescue NoCodeInLineError
|
18
|
+
raise "File: #{@file}:#{@line_number}"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
module TestParser
|
4
|
+
module SnippetSource
|
5
|
+
class Method
|
6
|
+
|
7
|
+
attr_reader :file, :method_name
|
8
|
+
|
9
|
+
include Common
|
10
|
+
|
11
|
+
def initialize(file, method_name)
|
12
|
+
@file, @method_name = file, method_name
|
13
|
+
end
|
14
|
+
|
15
|
+
def snippet
|
16
|
+
source_code.extract_method(method_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -3,6 +3,10 @@ require 'test_parser/snippet'
|
|
3
3
|
|
4
4
|
module TestParser
|
5
5
|
|
6
|
+
SourceCodeError = Class.new(StandardError)
|
7
|
+
NoMethodFoundError = Class.new(SourceCodeError)
|
8
|
+
NoCodeInLineError = Class.new(SourceCodeError)
|
9
|
+
|
6
10
|
class SourceCode < Snippet
|
7
11
|
|
8
12
|
def self.source_codes
|
@@ -26,15 +30,36 @@ module TestParser
|
|
26
30
|
name = name.to_sym
|
27
31
|
definitions = sexp.enum_for(:each_of_type, :defn)
|
28
32
|
method_sexp = definitions.find {|def_sexp| def_sexp[1] == name }
|
33
|
+
|
34
|
+
raise NoMethodFoundError unless method_sexp
|
35
|
+
|
29
36
|
Snippet.new(method_sexp)
|
30
37
|
end
|
31
38
|
|
32
39
|
def extract_code_from_line(line_number)
|
33
|
-
|
34
|
-
code_sexp
|
40
|
+
|
41
|
+
code_sexp = find_method_call_with_block(line_number)
|
42
|
+
code_sexp ||= find_method_call_without_block(line_number)
|
43
|
+
|
44
|
+
raise NoCodeInLineError unless code_sexp
|
45
|
+
|
35
46
|
Snippet.new(code_sexp)
|
36
47
|
end
|
37
48
|
|
49
|
+
private
|
50
|
+
|
51
|
+
def find_method_call_with_block(line_number)
|
52
|
+
method_calls = sexp.enum_for(:each_of_type, :iter)
|
53
|
+
method_calls.find {|sexp| sexp[1].line == line_number }
|
54
|
+
end
|
55
|
+
|
56
|
+
def find_method_call_without_block(line_number)
|
57
|
+
method_calls = sexp.enum_for(:each_of_type, :call)
|
58
|
+
method_calls.find do |sexp|
|
59
|
+
sexp[3][1] && sexp[3][1].line == line_number
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
38
63
|
end
|
39
64
|
|
40
65
|
end
|
@@ -1,14 +1,20 @@
|
|
1
1
|
module TestParser
|
2
|
-
class TestInformation
|
2
|
+
class TestInformation
|
3
|
+
|
4
|
+
attr_reader :type, :identification, :snippet_source
|
5
|
+
|
6
|
+
def initialize(type, identification, snippet_source)
|
7
|
+
@type = type
|
8
|
+
@identification = identification
|
9
|
+
@snippet_source = snippet_source
|
10
|
+
end
|
3
11
|
|
4
12
|
def snippet
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
source_code.extract_method(extras[:method_name])
|
11
|
-
end
|
13
|
+
snippet_source.snippet
|
14
|
+
end
|
15
|
+
|
16
|
+
def file
|
17
|
+
snippet_source.file
|
12
18
|
end
|
13
19
|
|
14
20
|
end
|
data/lib/test_parser/version.rb
CHANGED
data/spec/source_code_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'test_parser/source_code'
|
3
3
|
|
4
4
|
describe TestParser::SourceCode do
|
5
|
+
|
5
6
|
include FakeFS::SpecHelpers
|
6
7
|
|
7
8
|
before(:each) do
|
@@ -18,13 +19,16 @@ describe TestParser::SourceCode do
|
|
18
19
|
end
|
19
20
|
|
20
21
|
it 'has the sexp of the original file' do
|
21
|
-
sexp
|
22
|
-
TestParser::SourceCode.for('standard_class_source.rb')
|
22
|
+
sexp = RubyParser.new.parse standard_class_source
|
23
|
+
source_code = TestParser::SourceCode.for('standard_class_source.rb')
|
24
|
+
|
25
|
+
source_code.sexp.should == sexp
|
23
26
|
end
|
24
27
|
|
25
28
|
describe '.extract_method' do
|
26
29
|
it 'finds the method definition from the method name' do
|
27
|
-
|
30
|
+
source_code = TestParser::SourceCode.for('standard_class_source.rb')
|
31
|
+
snippet = source_code.extract_method('method')
|
28
32
|
snippet.to_code.should match_code(<<-METHOD)
|
29
33
|
def method(some)
|
30
34
|
puts some
|
@@ -35,13 +39,19 @@ describe TestParser::SourceCode do
|
|
35
39
|
|
36
40
|
describe '.extract_code_from_line' do
|
37
41
|
it 'finds the line with its block' do
|
38
|
-
|
42
|
+
source_code = TestParser::SourceCode.for('dsl_source.rb')
|
43
|
+
snippet = source_code.extract_code_from_line(2)
|
39
44
|
snippet.to_code.should match_code(<<-METHOD)
|
40
45
|
method 'ble' do
|
41
46
|
testing_something
|
42
47
|
end
|
43
48
|
METHOD
|
44
49
|
end
|
50
|
+
it 'finds the line without its block' do
|
51
|
+
source_code = TestParser::SourceCode.for('dsl_source.rb')
|
52
|
+
snippet = source_code.extract_code_from_line(5)
|
53
|
+
snippet.to_code.should match_code(%{pending 'ble'})
|
54
|
+
end
|
45
55
|
end
|
46
56
|
|
47
57
|
def standard_class_source
|
@@ -60,6 +70,7 @@ describe TestParser::SourceCode do
|
|
60
70
|
method 'ble' do
|
61
71
|
testing_something
|
62
72
|
end
|
73
|
+
pending "ble"
|
63
74
|
end
|
64
75
|
SOURCE
|
65
76
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,8 @@ require 'bundler'
|
|
2
2
|
Bundler.setup
|
3
3
|
Bundler.require :default, :test
|
4
4
|
|
5
|
-
|
5
|
+
support_glob = File.join(File.dirname(__FILE__), 'support', '**', '*.rb')
|
6
|
+
Dir[support_glob].each {|f| require f }
|
6
7
|
|
7
8
|
require 'fakefs/spec_helpers'
|
8
9
|
|
@@ -1,10 +1,13 @@
|
|
1
1
|
RSpec::Matchers.define :match_code do |expected|
|
2
|
-
expected_sexp = RubyParser.new.parse(expected)
|
3
2
|
|
4
3
|
match do |actual|
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
sexp_from(expected) == sexp_from(actual)
|
5
|
+
end
|
6
|
+
|
7
|
+
def sexp_from(obj)
|
8
|
+
return obj.sexp if obj.respond_to? :sexp
|
9
|
+
|
10
|
+
RubyParser.new.parse(obj)
|
8
11
|
end
|
9
12
|
|
10
13
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'test_parser/parser/minitest'
|
4
|
+
|
5
|
+
describe TestParser::Parser::MiniTest do
|
6
|
+
|
7
|
+
include TestParser::Parser
|
8
|
+
|
9
|
+
describe '.find_tests!' do
|
10
|
+
|
11
|
+
context 'within test_project' do
|
12
|
+
|
13
|
+
before(:all) do
|
14
|
+
@tests = MiniTest.find_tests path_for_test_project
|
15
|
+
@test_identifications = @tests.map(&:identification)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'finds all the tests' do
|
19
|
+
@tests.should have(2).tests
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'finds normally declared test' do
|
23
|
+
@test_identifications.should include('TestSomething#test_foo')
|
24
|
+
test = @tests[@test_identifications.index('TestSomething#test_foo')]
|
25
|
+
|
26
|
+
expected_file = 'test/example_test.rb'
|
27
|
+
|
28
|
+
test.file.should == path_for(expected_file)
|
29
|
+
test.snippet.should match_code(snippet_for(expected_file, 'test_foo'))
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'finds module shared tests' do
|
33
|
+
@test_identifications.should include('TestSomething#test_truth')
|
34
|
+
test = @tests[@test_identifications.index('TestSomething#test_truth')]
|
35
|
+
|
36
|
+
expected_file = 'test/test_helper.rb'
|
37
|
+
|
38
|
+
test.file.should == path_for(expected_file)
|
39
|
+
test.snippet.should match_code(snippet_for(expected_file, 'test_truth'))
|
40
|
+
end
|
41
|
+
|
42
|
+
def path_for(file)
|
43
|
+
path_for_test_project(file).to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def snippet_for(file, method_name)
|
47
|
+
TestParser::SourceCode.for(path_for(file)).extract_method(method_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'test_parser/parser/rspec'
|
4
|
+
|
5
|
+
describe TestParser::Parser::RSpec do
|
6
|
+
describe '.find_tests' do
|
7
|
+
context 'within test_project' do
|
8
|
+
|
9
|
+
include TestParser::Parser
|
10
|
+
|
11
|
+
before(:all) do
|
12
|
+
@test_suite = RSpec.find_tests(path_for_test_project)
|
13
|
+
@test_names = @test_suite.map(&:identification)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'finds all the test_suite' do
|
17
|
+
@test_suite.should have(2).test_suite
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'finds nested test_suite' do
|
21
|
+
@test_names.should include('Life/with death sentence/should(be_alive)')
|
22
|
+
test = @test_suite[@test_names.index('Life/with death sentence/should(be_alive)')]
|
23
|
+
|
24
|
+
test.file.should == path_for('spec/example_spec.rb')
|
25
|
+
test.snippet.should match_code(snippet_for('spec/example_spec.rb', 11))
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'finds not nested test_suite' do
|
29
|
+
@test_names.should include('Life/actually lives')
|
30
|
+
test = @test_suite[@test_names.index('Life/actually lives')]
|
31
|
+
|
32
|
+
test.file.should == path_for('spec/example_spec.rb')
|
33
|
+
test.snippet.should match_code(snippet_for('spec/example_spec.rb', 5))
|
34
|
+
end
|
35
|
+
|
36
|
+
def path_for(file)
|
37
|
+
path_for_test_project(file).to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def snippet_for(file, line_number)
|
41
|
+
TestParser::SourceCode.for(path_for(file)).extract_code_from_line(line_number)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/spec/test_parser_spec.rb
CHANGED
@@ -3,58 +3,30 @@ require 'spec_helper'
|
|
3
3
|
require 'test_parser'
|
4
4
|
|
5
5
|
describe TestParser do
|
6
|
-
|
7
|
-
describe ".minitest_tests" do
|
8
|
-
it 'delegates test finding to TestParser::MiniTest' do
|
9
|
-
TestParser::MiniTest.should_receive(:find_tests!).
|
10
|
-
with(path_for_test_project, {}).and_return []
|
11
|
-
|
12
|
-
TestParser.minitest_tests(path_for_test_project)
|
13
|
-
end
|
14
|
-
it 'passes extra options to TestParser::Minitest' do
|
15
|
-
TestParser::MiniTest.should_receive(:find_tests!).
|
16
|
-
with(path_for_test_project, {:some_option => true}).and_return []
|
17
|
-
|
18
|
-
TestParser.minitest_tests(path_for_test_project, {:some_option => true})
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe ".rspec_tests" do
|
23
|
-
it 'delegates test finding to TestParser::RSpec' do
|
24
|
-
TestParser::RSpec.should_receive(:find_tests!).
|
25
|
-
with(path_for_test_project, {}).and_return []
|
26
|
-
|
27
|
-
TestParser.rspec_tests(path_for_test_project)
|
28
|
-
end
|
29
|
-
it 'passes extra options to TestParser::RSpec' do
|
30
|
-
TestParser::RSpec.should_receive(:find_tests!).
|
31
|
-
with(path_for_test_project, {:some_option => true}).and_return []
|
32
|
-
|
33
|
-
TestParser.rspec_tests(path_for_test_project, {:some_option => true})
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
6
|
+
|
37
7
|
describe ".all_tests" do
|
8
|
+
|
38
9
|
it "collects all the test from the default frameworks" do
|
39
|
-
stub_frameworks
|
10
|
+
stub_frameworks!
|
40
11
|
|
41
12
|
tests = TestParser.all_tests(path_for_test_project)
|
42
|
-
tests.should
|
13
|
+
tests.should =~ [:rspec, :minitest]
|
43
14
|
end
|
44
15
|
|
45
|
-
context "when :
|
46
|
-
it 'collects only for the given
|
47
|
-
stub_frameworks
|
16
|
+
context "when :parsers are specified" do
|
17
|
+
it 'collects only for the given parsers' do
|
18
|
+
stub_frameworks!
|
48
19
|
|
49
|
-
options = {:
|
20
|
+
options = {:parsers => [TestParser::Parser::RSpec]}
|
50
21
|
tests = TestParser.all_tests(path_for_test_project, options)
|
51
22
|
tests.should == [:rspec]
|
52
23
|
end
|
53
24
|
end
|
54
25
|
|
55
|
-
def stub_frameworks
|
56
|
-
TestParser::RSpec.stub(:find_tests
|
57
|
-
TestParser::MiniTest.stub(:find_tests
|
26
|
+
def stub_frameworks!
|
27
|
+
TestParser::Parser::RSpec.stub(:find_tests) { [:rspec]}
|
28
|
+
TestParser::Parser::MiniTest.stub(:find_tests) {[:minitest]}
|
58
29
|
end
|
30
|
+
|
59
31
|
end
|
60
32
|
end
|
data/test/rspec_test.rb
CHANGED
@@ -14,11 +14,10 @@ class RSpecTest < MiniTest::Unit::TestCase
|
|
14
14
|
include ProjectsPaths
|
15
15
|
|
16
16
|
def test_rspec_parsing
|
17
|
-
tests = TestParser::RSpec.find_tests
|
17
|
+
tests = TestParser::Parser::RSpec.find_tests(path_for_test_project)
|
18
18
|
test = tests.first
|
19
19
|
assert_equal 'Life/actually lives', test.identification
|
20
20
|
assert_equal path_for_test_project('spec/example_spec.rb').to_s, test.file
|
21
|
-
assert_equal 5, test.extras[:line_number]
|
22
21
|
end
|
23
22
|
|
24
23
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: test_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Juan Manuel Barreneche
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-02-
|
13
|
+
date: 2011-02-27 00:00:00 -03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -69,25 +69,31 @@ extra_rdoc_files: []
|
|
69
69
|
files:
|
70
70
|
- .gitignore
|
71
71
|
- .rvmrc
|
72
|
+
- .rvmrc.example
|
72
73
|
- Gemfile
|
73
74
|
- Rakefile
|
74
75
|
- bin/test_parser
|
75
76
|
- lib/test_parser.rb
|
76
|
-
- lib/test_parser/
|
77
|
+
- lib/test_parser/command_line.rb
|
77
78
|
- lib/test_parser/extensions/minitest.rb
|
78
79
|
- lib/test_parser/extensions/rspec.rb
|
79
|
-
- lib/test_parser/
|
80
|
-
- lib/test_parser/
|
80
|
+
- lib/test_parser/parser/common.rb
|
81
|
+
- lib/test_parser/parser/minitest.rb
|
82
|
+
- lib/test_parser/parser/rspec.rb
|
81
83
|
- lib/test_parser/snippet.rb
|
84
|
+
- lib/test_parser/snippet_source/common.rb
|
85
|
+
- lib/test_parser/snippet_source/line_number.rb
|
86
|
+
- lib/test_parser/snippet_source/method.rb
|
82
87
|
- lib/test_parser/source_code.rb
|
88
|
+
- lib/test_parser/test_formatter/yaml.rb
|
83
89
|
- lib/test_parser/test_information.rb
|
84
90
|
- lib/test_parser/version.rb
|
85
|
-
- spec/minitest_spec.rb
|
86
|
-
- spec/rspec_spec.rb
|
87
91
|
- spec/source_code_spec.rb
|
88
92
|
- spec/spec_helper.rb
|
89
93
|
- spec/support/matchers/match_code.rb
|
90
94
|
- spec/support/projects_paths.rb
|
95
|
+
- spec/test_parser/minitest_spec.rb
|
96
|
+
- spec/test_parser/rspec_spec.rb
|
91
97
|
- spec/test_parser_spec.rb
|
92
98
|
- test/rspec_test.rb
|
93
99
|
- test_parser.gemspec
|
@@ -126,11 +132,11 @@ signing_key:
|
|
126
132
|
specification_version: 3
|
127
133
|
summary: Retrieves information of your test suite
|
128
134
|
test_files:
|
129
|
-
- spec/minitest_spec.rb
|
130
|
-
- spec/rspec_spec.rb
|
131
135
|
- spec/source_code_spec.rb
|
132
136
|
- spec/spec_helper.rb
|
133
137
|
- spec/support/matchers/match_code.rb
|
134
138
|
- spec/support/projects_paths.rb
|
139
|
+
- spec/test_parser/minitest_spec.rb
|
140
|
+
- spec/test_parser/rspec_spec.rb
|
135
141
|
- spec/test_parser_spec.rb
|
136
142
|
- test/rspec_test.rb
|
data/lib/test_parser/common.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'test_parser/source_code'
|
2
|
-
require 'test_parser/test_information'
|
3
|
-
|
4
|
-
module TestParser
|
5
|
-
|
6
|
-
module Common
|
7
|
-
|
8
|
-
def build_test(extras = {})
|
9
|
-
TestInformation.new(parser_type, test_identification, test_file_name, extras)
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_source_code
|
13
|
-
SourceCode.for(test_file_name)
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
data/lib/test_parser/minitest.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'minitest/unit'
|
2
|
-
require_relative 'extensions/minitest'
|
3
|
-
|
4
|
-
require 'test_parser'
|
5
|
-
|
6
|
-
module TestParser
|
7
|
-
class MiniTest
|
8
|
-
attr_reader :klass, :test_method
|
9
|
-
|
10
|
-
def self.find_tests!(path, options = {})
|
11
|
-
glob = options[:glob] || 'test/**/*_test.rb'
|
12
|
-
|
13
|
-
::MiniTest::Unit.dont_install_at_exit!
|
14
|
-
|
15
|
-
TestParser.require_all(path, glob)
|
16
|
-
|
17
|
-
::MiniTest::Unit::TestCase.test_suites.collect_concat do |klass|
|
18
|
-
klass.test_methods.map do |test|
|
19
|
-
new(klass, test).test_info
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
include Common
|
25
|
-
|
26
|
-
def parser_type
|
27
|
-
:minitest
|
28
|
-
end
|
29
|
-
|
30
|
-
def initialize(klass, test_method)
|
31
|
-
@klass, @test_method = klass, test_method
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_info
|
35
|
-
build_test(:method_name => test_method)
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_identification
|
39
|
-
"#{klass.name}##{test_method}"
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_file_name
|
43
|
-
klass.instance_method(test_method).source_location.first
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
data/lib/test_parser/rspec.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'rspec/core'
|
2
|
-
require_relative 'extensions/rspec'
|
3
|
-
|
4
|
-
require 'test_parser'
|
5
|
-
|
6
|
-
module TestParser
|
7
|
-
class RSpec
|
8
|
-
attr_reader :example
|
9
|
-
|
10
|
-
def self.find_tests!(path, options = {})
|
11
|
-
glob = options[:glob] || 'spec/**/*_spec.rb'
|
12
|
-
|
13
|
-
::RSpec.with_world ::RSpec::Core::World.new do |world|
|
14
|
-
|
15
|
-
TestParser.require_all(path, glob)
|
16
|
-
|
17
|
-
groups = world.example_groups
|
18
|
-
examples = groups.collect_concat(&:descendant_filtered_examples)
|
19
|
-
examples.map do |example|
|
20
|
-
new(example).test_info
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
include Common
|
26
|
-
|
27
|
-
def initialize(example)
|
28
|
-
@example = example
|
29
|
-
end
|
30
|
-
|
31
|
-
def parser_type
|
32
|
-
:rspec2
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_info
|
36
|
-
build_test(:line_number => line_number)
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_snippet
|
40
|
-
@test_snippet ||= test_source_code.extract_code_from_line(line_number)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_file_name
|
44
|
-
example.file_path
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_identification
|
48
|
-
(example_group_names.reverse + [example_description]).join('/')
|
49
|
-
end
|
50
|
-
|
51
|
-
def line_number
|
52
|
-
example.metadata[:line_number]
|
53
|
-
end
|
54
|
-
|
55
|
-
def example_group_names
|
56
|
-
example.example_group.ancestors.map(&:display_name)
|
57
|
-
end
|
58
|
-
|
59
|
-
def example_description
|
60
|
-
unless example.description.empty?
|
61
|
-
example.description
|
62
|
-
else
|
63
|
-
test_snippet.get_block.to_code
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
data/spec/minitest_spec.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'test_parser'
|
4
|
-
describe TestParser::MiniTest do
|
5
|
-
before(:all) do
|
6
|
-
MiniTest::Unit::TestCase.reset
|
7
|
-
end
|
8
|
-
after(:all) do
|
9
|
-
MiniTest::Unit::TestCase.reset
|
10
|
-
end
|
11
|
-
|
12
|
-
describe '.find_tests!' do
|
13
|
-
|
14
|
-
context 'within test_project' do
|
15
|
-
before(:all) do
|
16
|
-
@tests = TestParser::MiniTest.find_tests! path_for_test_project
|
17
|
-
@test_identifications = @tests.map(&:identification)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'finds all the tests' do
|
21
|
-
@tests.should have(2).tests
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'finds normally declared test' do
|
25
|
-
@test_identifications.should include('TestSomething#test_foo')
|
26
|
-
test = @tests[@test_identifications.index('TestSomething#test_foo')]
|
27
|
-
test.file.should == (path_for_test_project('test/example_test.rb')).to_s
|
28
|
-
test.extras[:method_name].should == 'test_foo'
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'finds module shared tests' do
|
32
|
-
@test_identifications.should include('TestSomething#test_truth')
|
33
|
-
test = @tests[@test_identifications.index('TestSomething#test_truth')]
|
34
|
-
test.file.should == (path_for_test_project('test/test_helper.rb')).to_s
|
35
|
-
test.extras[:method_name].should == 'test_truth'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/rspec_spec.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'test_parser/rspec'
|
4
|
-
|
5
|
-
describe TestParser::RSpec do
|
6
|
-
describe '.find_test_suite!' do
|
7
|
-
context 'within test_project' do
|
8
|
-
|
9
|
-
before(:all) do
|
10
|
-
@test_suite = TestParser::RSpec.find_tests!(path_for_test_project)
|
11
|
-
@test_names = @test_suite.map(&:identification)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'finds all the test_suite' do
|
15
|
-
@test_suite.should have(2).test_suite
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'finds nested test_suite' do
|
19
|
-
@test_names.should include('Life/with death sentence/should(be_alive)')
|
20
|
-
test = @test_suite[@test_names.index('Life/with death sentence/should(be_alive)')]
|
21
|
-
test.file.should == (path_for_test_project('spec/example_spec.rb')).to_s
|
22
|
-
test.extras[:line_number].should == 11
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'finds not nested test_suite' do
|
26
|
-
@test_names.should include('Life/actually lives')
|
27
|
-
test = @test_suite[@test_names.index('Life/actually lives')]
|
28
|
-
|
29
|
-
test.file.should == (path_for_test_project('spec/example_spec.rb')).to_s
|
30
|
-
test.extras[:line_number].should == 5
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|