rspec-teamcity 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +674 -0
- data/README.md +30 -0
- data/Rakefile +2 -0
- data/lib/rspec/teamcity.rb +693 -0
- data/lib/rspec/teamcity/formatter_initializer.rb +50 -0
- data/lib/rspec/teamcity/rake_exceptions.rb +25 -0
- data/lib/rspec/teamcity/rakerunner_consts.rb +131 -0
- data/lib/rspec/teamcity/runner_common.rb +62 -0
- data/lib/rspec/teamcity/utils/logger_util.rb +90 -0
- data/lib/rspec/teamcity/utils/runner_utils.rb +182 -0
- data/lib/rspec/teamcity/utils/service_message_factory.rb +279 -0
- data/lib/rspec/teamcity/utils/std_capture_helper.rb +103 -0
- data/lib/rspec/teamcity/utils/string_ext.rb +28 -0
- data/lib/rspec/teamcity/utils/url_formatter.rb +35 -0
- data/lib/rspec/teamcity/version.rb +5 -0
- data/lib/rspec/teamcity_rspec3.rb +448 -0
- data/rspec-teamcity.gemspec +28 -0
- metadata +119 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright 2000-2014 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# @author Roman.Chernyatchik
|
16
|
+
|
17
|
+
module Spec
|
18
|
+
module Runner
|
19
|
+
module Formatter
|
20
|
+
# Let's determine current RSpec gem version
|
21
|
+
# Formatter is required from some other RSpec code, so let's check some
|
22
|
+
# marker classed in object space
|
23
|
+
|
24
|
+
if defined? ::RSpec::Core::Version::STRING
|
25
|
+
if ::RSpec::Core::Version::STRING.split('.')[0] == '2'
|
26
|
+
# rspec >= 2.x
|
27
|
+
require 'rspec/core/formatters/base_formatter'
|
28
|
+
RSPEC_VERSION_2 = true
|
29
|
+
RSPEC_VERSION_3 = false
|
30
|
+
else
|
31
|
+
# rspec >= 3.x
|
32
|
+
require 'rspec/core/formatters/base_formatter'
|
33
|
+
RSPEC_VERSION_2 = false
|
34
|
+
RSPEC_VERSION_3 = true
|
35
|
+
end
|
36
|
+
elsif defined? ::Spec::VERSION::STRING
|
37
|
+
# rspec 1.x
|
38
|
+
require 'spec/runner/formatter/base_formatter'
|
39
|
+
RSPEC_VERSION_2 = false
|
40
|
+
RSPEC_VERSION_3 = false
|
41
|
+
else
|
42
|
+
# some unsupported version. Let's assume that it is something like rspec 2.x
|
43
|
+
# such require may force gem activation
|
44
|
+
require 'rspec/core/formatters/base_formatter'
|
45
|
+
RSPEC_VERSION_2 = true
|
46
|
+
RSPEC_VERSION_3 = false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Copyright 2000-2012 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Created by IntelliJ IDEA.
|
16
|
+
#
|
17
|
+
# @author: Roman.Chernyatchik
|
18
|
+
# @date: 21:40:05
|
19
|
+
|
20
|
+
module Rake
|
21
|
+
module TeamCity
|
22
|
+
class InnerException < Exception
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# Copyright 2000-2012 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Created by IntelliJ IDEA.
|
16
|
+
#
|
17
|
+
# @author: Roman.Chernyatchik
|
18
|
+
# @date: 29.01.2008
|
19
|
+
|
20
|
+
#TODO move all to TeamCity module
|
21
|
+
|
22
|
+
# Behaviour properties
|
23
|
+
# Debug
|
24
|
+
TEAMCITY_RAKERUNNER_LOG_RSPEC_XML_MSFS_KEY = 'TEAMCITY_RAKE_RUNNER_DEBUG_LOG_RSPEC_XML_MSGS'
|
25
|
+
TEAMCITY_RAKERUNNER_LOG_PATH_KEY = 'TEAMCITY_RAKE_RUNNER_DEBUG_LOG_PATH'
|
26
|
+
TEAMCITY_RAKERUNNER_LOG_OUTPUT_HACK_DISABLED_KEY = 'TEAMCITY_RAKE_RUNNER_DEBUG_OUTPUT_HACK_DISABLED'
|
27
|
+
TEAMCITY_RAKERUNNER_LOG_OUTPUT_CAPTURER_ENABLED_KEY = 'TEAMCITY_RAKE_RUNNER_DEBUG_OUTPUT_CAPTURER_ENABLED'
|
28
|
+
# Log files
|
29
|
+
TEAMCITY_RAKERUNNER_LOG_FILENAME_SUFFIX = '/rakeRunner_rake.log'
|
30
|
+
TEAMCITY_RAKERUNNER_RPC_LOG_FILENAME_SUFFIX = '/rakeRunner_xmlrpc.log'
|
31
|
+
TEAMCITY_RAKERUNNER_SPEC_LOG_FILENAME_SUFFIX = '/rakeRunner_rspec.log'
|
32
|
+
TEAMCITY_RAKERUNNER_TESTUNIT_LOG_FILENAME_SUFFIX = '/rakeRunner_testUnit.log'
|
33
|
+
TEAMCITY_RAKERUNNER_TESTUNIT_EVENTS_LOG_FILENAME_SUFFIX = '/rakeRunner_testUnit_events.log'
|
34
|
+
|
35
|
+
# Teamcity connection properties
|
36
|
+
#TODO it seems this section is deprecated!
|
37
|
+
IDEA_BUILDSERVER_BUILD_ID_KEY = 'IDEA_BUILD_SERVER_BUILD_ID'
|
38
|
+
IDEA_BUILDSERVER_AGENT_PORT_KEY = 'IDEA_BUILD_AGENT_PORT'
|
39
|
+
IDEA_BUILDSERVER_HOST_ID_KEY = 'IDEA_BUILD_SERVER_HOST'
|
40
|
+
|
41
|
+
# Name of Teamcity RPC logger method
|
42
|
+
TEAMCITY_LOGGER_RPC_NAME = "testRunnerLogger.log"
|
43
|
+
#TEAMCITY_LOGGER_RPC_NAME = "buildAgent.log"
|
44
|
+
|
45
|
+
# Rake runner dispatcher settings
|
46
|
+
TEAMCITY_RAKERUNNER_DISPATCHER_MAX_ATTEMPTS = 100
|
47
|
+
TEAMCITY_RAKERUNNER_DISPATCHER_RETRY_DELAY = 0.25
|
48
|
+
|
49
|
+
# Rakerunner system properties
|
50
|
+
ORIGINAL_SDK_AUTORUNNER_PATH_KEY = 'TEAMCIY_RAKE_TU_AUTORUNNER_PATH'
|
51
|
+
ORIGINAL_SDK_TESTRUNNERMEDIATOR_PATH_KEY = 'TEAMCITY_RAKE_TU_TESTRUNNERMADIATOR_PATH'
|
52
|
+
TEAMCITY_RAKERUNNER_RAKE_TRACE_INVOKE_EXEC_STAGES_ENABLED = 'TEAMCITY_RAKE_TRACE'
|
53
|
+
|
54
|
+
module Rake
|
55
|
+
module TeamCity
|
56
|
+
# Mode
|
57
|
+
TEAMCITY_VERSION_KEY ='TEAMCITY_VERSION'
|
58
|
+
|
59
|
+
|
60
|
+
# Test::Unit
|
61
|
+
RUBY19_SDK_MINITEST_RUNNER_PATH_KEY = "TC_RUBY19_SDK_MINITEST_RUNNER_PATH_KEY"
|
62
|
+
|
63
|
+
# TODO: remove TEAMCITY_* prefix
|
64
|
+
TEAMCITY_RAKERUNNER_USED_FRAMEWORKS_KEY ='TEAMCITY_RAKE_RUNNER_USED_FRAMEWORKS'
|
65
|
+
TEAMCITY_RAKERUNNER_DEBUG_OPTIONS_KEY ='TEAMCITY_RAKERUNNER_DEBUG_OPTIONS'
|
66
|
+
|
67
|
+
TEAMCITY_RAKERUNNER_SUPPORTED_FRAMEWORKS =[:rspec, :test_spec, :test_unit, :cucumber, :shoulda]
|
68
|
+
|
69
|
+
TC_EXCLUDED_DEFAULT_TEST_CASES = [
|
70
|
+
"ActionController::IntegrationTest",
|
71
|
+
"ActionController::TestCase",
|
72
|
+
"ActionView::TestCase",
|
73
|
+
"ActionMailer::TestCase",
|
74
|
+
"ActiveRecord::TestCase",
|
75
|
+
"ActiveSupport::TestCase",
|
76
|
+
# Rails 3.0
|
77
|
+
"ActionDispatch::IntegrationTest",
|
78
|
+
"ActionDispatch::PerformanceTest"
|
79
|
+
]
|
80
|
+
|
81
|
+
def self.is_in_idea_mode
|
82
|
+
!is_in_buildserver_mode
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.is_in_buildserver_mode
|
86
|
+
version = ENV[TEAMCITY_VERSION_KEY]
|
87
|
+
# version must be set and not empty
|
88
|
+
if !version.nil? && !version.empty?
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Supported frameworks
|
94
|
+
# :rspec
|
95
|
+
# :test_spec
|
96
|
+
# :test_unit
|
97
|
+
def self.is_framework_used(symbol)
|
98
|
+
value = ENV[TEAMCITY_RAKERUNNER_USED_FRAMEWORKS_KEY]
|
99
|
+
# check that symbol is name of supported framework
|
100
|
+
# and that supported frameworks env variable is set
|
101
|
+
return false if value.nil?
|
102
|
+
if TEAMCITY_RAKERUNNER_SUPPORTED_FRAMEWORKS.index(symbol).nil?
|
103
|
+
raise ArgumentError, "Unsupported framework: #{symbol}", caller
|
104
|
+
end
|
105
|
+
|
106
|
+
return !value.index(":#{symbol.to_s}").nil?
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.is_fake_time_enabled?
|
110
|
+
self.is_enabled_in_debug_options(:fake_time)
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.is_fake_stacktrace_enabled?
|
114
|
+
self.is_enabled_in_debug_options(:fake_stacktrace)
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.is_fake_error_msg_enabled?
|
118
|
+
self.is_enabled_in_debug_options(:fake_error_msg)
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.is_fake_location_url_enabled?
|
122
|
+
self.is_enabled_in_debug_options(:fake_location_url)
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
def self.is_enabled_in_debug_options(symbol)
|
127
|
+
debug_options = ENV[TEAMCITY_RAKERUNNER_DEBUG_OPTIONS_KEY]
|
128
|
+
!debug_options.nil? && !debug_options[symbol.to_s].nil?
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright 2000-2012 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
#
|
15
|
+
# @author: Roman Chernyatchik
|
16
|
+
|
17
|
+
module Rake
|
18
|
+
module TeamCity
|
19
|
+
module RunnerCommon
|
20
|
+
# Let's keep STDOUT, our users likes to capture it and block our events
|
21
|
+
@@original_stdout = STDOUT
|
22
|
+
|
23
|
+
# Current time in ms
|
24
|
+
def get_current_time_in_ms
|
25
|
+
get_time_in_ms(Time.now)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_time_in_ms(time)
|
29
|
+
((time.to_f) * 1000 ).to_i
|
30
|
+
end
|
31
|
+
|
32
|
+
# Sends msg to runner
|
33
|
+
def send_msg(msg)
|
34
|
+
@@original_stdout.flush
|
35
|
+
@@original_stdout.puts("\n#{msg}")
|
36
|
+
@@original_stdout.flush
|
37
|
+
end
|
38
|
+
|
39
|
+
# Sets factory for creating messages
|
40
|
+
def set_message_factory(factory)
|
41
|
+
@message_factory = factory
|
42
|
+
end
|
43
|
+
|
44
|
+
def log_test_reporter_attached
|
45
|
+
if ::Rake::TeamCity.is_in_idea_mode
|
46
|
+
# log method is be defined in target class
|
47
|
+
log(@message_factory.create_test_reported_attached)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Is from base_text_formatter.rb of rspec 1.1.4
|
52
|
+
def self.backtrace_line(line)
|
53
|
+
line.sub(/\A([^:]+:\d+)$/, '\\1:')
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.format_backtrace(backtrace)
|
57
|
+
return "" if backtrace.nil?
|
58
|
+
backtrace.map { |line| backtrace_line(line) }.join("\n")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# Copyright 2000-2012 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Created by IntelliJ IDEA.
|
16
|
+
#
|
17
|
+
# @author: Roman.Chernyatchik
|
18
|
+
# @date: 18:04:35
|
19
|
+
|
20
|
+
require_relative '../rakerunner_consts'
|
21
|
+
|
22
|
+
module Rake
|
23
|
+
module TeamCity
|
24
|
+
module Utils
|
25
|
+
class FileLogger
|
26
|
+
def initialize(logs_dir, file_suffix)
|
27
|
+
@enabled = ENV[logs_dir]
|
28
|
+
|
29
|
+
@log_file = @enabled ? File.new(ENV[logs_dir] + file_suffix, "a+") : nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def current_proc_thread_info
|
33
|
+
"[pid:#{Process.pid}x#{Thread.current}]"
|
34
|
+
end
|
35
|
+
|
36
|
+
def log_msg(msg, add_proc_thread_info=false)
|
37
|
+
if @enabled
|
38
|
+
@log_file << "[#{Time.now}] : #{(add_proc_thread_info ? current_proc_thread_info : "") + " " + msg}\n"
|
39
|
+
@log_file.flush
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def log_block(id, data = nil, add_proc_thread_info=false)
|
44
|
+
log_msg("Start [#{id}]" + (data ? " data=[#{data}]" : ""), add_proc_thread_info);
|
45
|
+
begin
|
46
|
+
yield
|
47
|
+
rescue Exception => e
|
48
|
+
log_msg("Exception [#{id}], type=#{e.class.name}, msg=#{e.message}", add_proc_thread_info)
|
49
|
+
raise
|
50
|
+
end
|
51
|
+
log_msg("End [#{id}]", add_proc_thread_info)
|
52
|
+
end
|
53
|
+
|
54
|
+
def close
|
55
|
+
@log_file.close if @enabled
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class RakeFileLogger < FileLogger
|
60
|
+
def initialize
|
61
|
+
super(TEAMCITY_RAKERUNNER_LOG_PATH_KEY, TEAMCITY_RAKERUNNER_LOG_FILENAME_SUFFIX)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class RPCMessagesLogger < FileLogger
|
66
|
+
def initialize
|
67
|
+
super(TEAMCITY_RAKERUNNER_LOG_PATH_KEY, TEAMCITY_RAKERUNNER_RPC_LOG_FILENAME_SUFFIX)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class RSpecFileLogger < FileLogger
|
72
|
+
def initialize
|
73
|
+
super(TEAMCITY_RAKERUNNER_LOG_PATH_KEY, TEAMCITY_RAKERUNNER_SPEC_LOG_FILENAME_SUFFIX)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class TestUnitFileLogger < FileLogger
|
78
|
+
def initialize
|
79
|
+
super(TEAMCITY_RAKERUNNER_LOG_PATH_KEY, TEAMCITY_RAKERUNNER_TESTUNIT_LOG_FILENAME_SUFFIX)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class TestUnitEventsFileLogger < FileLogger
|
84
|
+
def initialize
|
85
|
+
super(TEAMCITY_RAKERUNNER_LOG_PATH_KEY, TEAMCITY_RAKERUNNER_TESTUNIT_EVENTS_LOG_FILENAME_SUFFIX)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# Copyright 2000-2012 JetBrains s.r.o.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Created by IntelliJ IDEA.
|
16
|
+
#
|
17
|
+
# @author: Roman.Chernyatchik
|
18
|
+
# @date: 02.06.2007
|
19
|
+
|
20
|
+
require_relative '../rakerunner_consts'
|
21
|
+
|
22
|
+
module Rake
|
23
|
+
module TeamCity
|
24
|
+
module RunnerUtils
|
25
|
+
|
26
|
+
###########################################################################
|
27
|
+
#### Test::Unit
|
28
|
+
###########################################################################
|
29
|
+
|
30
|
+
# Converts Ruby Test Names : $TEST_METHOD_NAME($TEST_CASE_QUALIFIED_NAME)
|
31
|
+
# to Qualified name format : $TEST_CASE_QUALIFIED_NAME.$TEST_METHOD_NAME
|
32
|
+
def convert_ruby_test_name_to_qualified(ruby_name)
|
33
|
+
if ruby_name && (ruby_name.strip =~ /(\S+)\(([\w:]*)\)/)
|
34
|
+
# p [$1, $2]
|
35
|
+
method_name = $1
|
36
|
+
qualified_name = $2
|
37
|
+
return convert_test_unit_to_qualified(qualified_name, method_name)
|
38
|
+
end
|
39
|
+
ruby_name
|
40
|
+
end
|
41
|
+
|
42
|
+
def convert_test_unit_to_qualified(class_qualified_name, method_name)
|
43
|
+
if class_qualified_name.empty?
|
44
|
+
"#{method_name}"
|
45
|
+
else
|
46
|
+
"#{class_qualified_name}.#{method_name}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.use_minitest?
|
51
|
+
defined? ::MiniTest::Unit::TestCase
|
52
|
+
end
|
53
|
+
|
54
|
+
###########################################################################
|
55
|
+
#### RSpec
|
56
|
+
###########################################################################
|
57
|
+
|
58
|
+
#@Nullable
|
59
|
+
#@returns pair of two strings: [source file path, line in source file] or [nil, nil]
|
60
|
+
def extract_source_location_from_example(example)
|
61
|
+
#example.instance_variable_hash['@_implementation'].to_s.gsub(/#<Proc:.+@/, "")
|
62
|
+
|
63
|
+
#TODO - replace with example full name!!!!!
|
64
|
+
|
65
|
+
if example.respond_to?(:location)
|
66
|
+
# rspec 1.2.1 API
|
67
|
+
return extract_rspec_proxy_location(example)
|
68
|
+
elsif (example.respond_to?(:metadata))
|
69
|
+
# rspec 2.0 beta API
|
70
|
+
return parse_rspec_proxy_location(example.metadata[:location])
|
71
|
+
end
|
72
|
+
|
73
|
+
proc = (example.respond_to?(:instance_variable_hash)) ? example.instance_variable_hash['@_implementation'] : nil
|
74
|
+
|
75
|
+
if !proc.nil? && proc.is_a?(Proc)
|
76
|
+
return extract_source_location_from_closure(proc.to_s)
|
77
|
+
end
|
78
|
+
|
79
|
+
return nil, nil
|
80
|
+
end
|
81
|
+
|
82
|
+
#[@Nullable, @Nullable]
|
83
|
+
def get_pair_by(src_file_path_str, src_file_line_str)
|
84
|
+
if src_file_path_str && src_file_line_str
|
85
|
+
return File.expand_path(src_file_path_str), src_file_line_str
|
86
|
+
end
|
87
|
+
|
88
|
+
return nil, nil
|
89
|
+
end
|
90
|
+
|
91
|
+
#@Nullable
|
92
|
+
#@returns pair of two strings: [source file path, line in source file] or [nil, nil]
|
93
|
+
def extract_source_location_from_path_info(spec_path_info)
|
94
|
+
# E.g.: "/Users/romeo/IdeaProjects/dianaplugin/rails/spec/my_example_spec.rb:4"
|
95
|
+
if spec_path_info =~ /(^)([^:]+)(:)(\d+)(\D*)($)/
|
96
|
+
src_file_path_str = $2
|
97
|
+
src_file_line_str = $4
|
98
|
+
if src_file_path_str && src_file_line_str
|
99
|
+
return src_file_path_str, src_file_line_str
|
100
|
+
end
|
101
|
+
elsif spec_path_info =~ /(^)([^:]+)($)/
|
102
|
+
return spec_path_info, "0"
|
103
|
+
end
|
104
|
+
|
105
|
+
return nil, nil
|
106
|
+
end
|
107
|
+
|
108
|
+
@@ignore_root_test_case = true
|
109
|
+
|
110
|
+
# usually we should ignore root test case that is test file
|
111
|
+
# but in run_all_in_folder case we shouldn't ignore it!
|
112
|
+
def self.ignore_root_test_case?
|
113
|
+
@@ignore_root_test_case
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.ignore_root_test_case=(value)
|
117
|
+
@@ignore_root_test_case = value
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
def self.excluded_default_testcase_name?(suite_or_test_name)
|
122
|
+
::Rake::TeamCity::TC_EXCLUDED_DEFAULT_TEST_CASES.index(suite_or_test_name) != nil
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.excluded_default_testcase?(suite_or_test)
|
126
|
+
excluded_default_testcase_name?(suite_or_test.name) && (suite_or_test.size == 1)
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.fake_default_test_for_empty_suite?(suite_or_test)
|
130
|
+
!(defined? suite_or_test.tests) && ("default_test" == suite_or_test.method_name)
|
131
|
+
end
|
132
|
+
|
133
|
+
############################################################
|
134
|
+
############################################################
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
#[@Nullable, @Nullable]
|
139
|
+
#Exctracting location using new RSpec 1.2.1 API
|
140
|
+
#@returns pair of two stings [source file path, line in source file] or [nil, nil]
|
141
|
+
def extract_rspec_proxy_location(proxy_object)
|
142
|
+
parse_rspec_proxy_location proxy_object.location
|
143
|
+
end
|
144
|
+
|
145
|
+
def parse_rspec_proxy_location(location)
|
146
|
+
#TODO Add test for it!!!!!
|
147
|
+
if location =~ /(.+):(\d+)/
|
148
|
+
return get_pair_by($1, $2)
|
149
|
+
end
|
150
|
+
return nil, nil
|
151
|
+
end
|
152
|
+
|
153
|
+
#@Nullable
|
154
|
+
#@returns pair of two strings: [source file path, line in source file] or [nil, nil]
|
155
|
+
def extract_source_location_from_group(example_group)
|
156
|
+
if example_group
|
157
|
+
if example_group.respond_to?(:location)
|
158
|
+
# rspec 1.2.1 API
|
159
|
+
return extract_rspec_proxy_location(example_group)
|
160
|
+
elsif (example_group.respond_to?(:metadata))
|
161
|
+
# rspec 2.0 beta API
|
162
|
+
return parse_rspec_proxy_location(example_group.metadata[:example_group][:location])
|
163
|
+
elsif (example_group.respond_to?(:spec_path))
|
164
|
+
return extract_source_location_from_path_info(example_group.spec_path)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
return nil, nil
|
168
|
+
end
|
169
|
+
|
170
|
+
#[@Nullable, @Nullable]
|
171
|
+
#@returns pair of two strings: [source file path, line in source file] or [nil, nil]
|
172
|
+
def extract_source_location_from_closure(closure_id)
|
173
|
+
# E.g.: "#<Proc:0xaa3e9a@/Users/romeo/IdeaProjects/dianaplugin/rails/spec/my_example_spec.rb:16>"
|
174
|
+
if closure_id =~ /(#<[^:]+:[^@]+@)([^:]+)(:)(\d+)(>)/
|
175
|
+
return get_pair_by($2, $4)
|
176
|
+
end
|
177
|
+
|
178
|
+
return nil, nil
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|