Skip to content

Commit

Permalink
Extract line filtering to Railties.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kaspth committed Jan 9, 2016
1 parent b588653 commit 69e5547
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 64 deletions.
10 changes: 0 additions & 10 deletions activesupport/lib/active_support/test_case.rb
Expand Up @@ -9,7 +9,6 @@
require 'active_support/testing/constant_lookup' require 'active_support/testing/constant_lookup'
require 'active_support/testing/time_helpers' require 'active_support/testing/time_helpers'
require 'active_support/testing/file_fixtures' require 'active_support/testing/file_fixtures'
require 'active_support/testing/composite_filter'
require 'active_support/core_ext/kernel/reporting' require 'active_support/core_ext/kernel/reporting'


module ActiveSupport module ActiveSupport
Expand Down Expand Up @@ -39,15 +38,6 @@ def test_order=(new_order)
def test_order def test_order
ActiveSupport.test_order ||= :random ActiveSupport.test_order ||= :random
end 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 end


alias_method :method_name, :name alias_method :method_name, :name
Expand Down
54 changes: 0 additions & 54 deletions activesupport/lib/active_support/testing/composite_filter.rb

This file was deleted.

63 changes: 63 additions & 0 deletions railties/lib/rails/test_unit/line_filtering.rb
@@ -0,0 +1,63 @@
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
6 changes: 6 additions & 0 deletions railties/lib/rails/test_unit/railtie.rb
@@ -1,3 +1,5 @@
require 'rails/test_unit/line_filtering'

if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any? if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any?
ENV['RAILS_ENV'] ||= 'test' ENV['RAILS_ENV'] ||= 'test'
end end
Expand All @@ -11,6 +13,10 @@ class TestUnitRailtie < Rails::Railtie
c.integration_tool :test_unit c.integration_tool :test_unit
end end


initializer "test_unit.line_filtering" do
ActiveSupport::TestCase.extend Rails::LineFiltering
end

rake_tasks do rake_tasks do
load "rails/test_unit/testing.rake" load "rails/test_unit/testing.rake"
end end
Expand Down

0 comments on commit 69e5547

Please sign in to comment.