提交 69e55471 编写于 作者: K Kasper Timm Hansen

Extract line filtering to Railties.

The line filter parsing added to ActiveSupport::TestCase is only half the story
to enable line filtering. The other half, of adding the patterns to the options,
is done in the Minitest plugin that Railties has.

Thus it makes more sense to have the filter in Railties with the other half and
all the line filtering tests.

Move the filter and extend Active Support in an initializer, so that when users
or `rails/all.rb` require `rails/test_unit/railtie` we can still filter by line.
上级 b588653a
......@@ -9,7 +9,6 @@
require 'active_support/testing/constant_lookup'
require 'active_support/testing/time_helpers'
require 'active_support/testing/file_fixtures'
require 'active_support/testing/composite_filter'
require 'active_support/core_ext/kernel/reporting'
module ActiveSupport
......@@ -39,15 +38,6 @@ def test_order=(new_order)
def test_order
ActiveSupport.test_order ||= :random
end
def run(reporter, options = {})
if options[:patterns] && options[:patterns].any? { |p| p =~ /:\d+/ }
options[:filter] = \
Testing::CompositeFilter.new(self, options[:filter], options[:patterns])
end
super
end
end
alias_method :method_name, :name
......
require 'method_source'
module ActiveSupport
module Testing
class CompositeFilter # :nodoc:
def initialize(runnable, filter, patterns)
@runnable = runnable
@filters = [ derive_regexp(filter), *derive_line_filters(patterns) ].compact
end
def ===(method)
@filters.any? { |filter| filter === method }
end
private
def derive_regexp(filter)
filter =~ %r%/(.*)/% ? Regexp.new($1) : filter
end
def derive_line_filters(patterns)
patterns.map do |file_and_line|
file, line = file_and_line.split(':')
Filter.new(@runnable, file, line) if file
end
end
class Filter # :nodoc:
def initialize(runnable, file, line)
@runnable, @file = runnable, File.expand_path(file)
@line = line.to_i if line
end
def ===(method)
return unless @runnable.method_defined?(method)
if @line
test_file, test_range = definition_for(@runnable.instance_method(method))
test_file == @file && test_range.include?(@line)
else
@runnable.instance_method(method).source_location.first == @file
end
end
private
def definition_for(method)
file, start_line = method.source_location
end_line = method.source.count("\n") + start_line - 1
return file, start_line..end_line
end
end
end
end
end
require 'method_source'
module Rails
module LineFiltering # :nodoc:
def run(reporter, options = {})
if options[:patterns] && options[:patterns].any? { |p| p =~ /:\d+/ }
options[:filter] = \
CompositeFilter.new(self, options[:filter], options[:patterns])
end
super
end
end
class CompositeFilter # :nodoc:
def initialize(runnable, filter, patterns)
@runnable = runnable
@filters = [ derive_regexp(filter), *derive_line_filters(patterns) ].compact
end
def ===(method)
@filters.any? { |filter| filter === method }
end
private
def derive_regexp(filter)
filter =~ %r%/(.*)/% ? Regexp.new($1) : filter
end
def derive_line_filters(patterns)
patterns.map do |file_and_line|
file, line = file_and_line.split(':')
Filter.new(@runnable, file, line) if file
end
end
end
class Filter # :nodoc:
def initialize(runnable, file, line)
@runnable, @file = runnable, File.expand_path(file)
@line = line.to_i if line
end
def ===(method)
return unless @runnable.method_defined?(method)
if @line
test_file, test_range = definition_for(@runnable.instance_method(method))
test_file == @file && test_range.include?(@line)
else
@runnable.instance_method(method).source_location.first == @file
end
end
private
def definition_for(method)
file, start_line = method.source_location
end_line = method.source.count("\n") + start_line - 1
return file, start_line..end_line
end
end
end
require 'rails/test_unit/line_filtering'
if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any?
ENV['RAILS_ENV'] ||= 'test'
end
......@@ -11,6 +13,10 @@ class TestUnitRailtie < Rails::Railtie
c.integration_tool :test_unit
end
initializer "test_unit.line_filtering" do
ActiveSupport::TestCase.extend Rails::LineFiltering
end
rake_tasks do
load "rails/test_unit/testing.rake"
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册