Replace ComparableSet with a Requirements collection

This commit is contained in:
Jack Nagel 2014-07-03 14:50:57 -05:00
parent 3ad6fc6636
commit 618b894c3e
9 changed files with 58 additions and 72 deletions

View File

@ -52,3 +52,28 @@ class Dependencies
end
alias_method :eql?, :==
end
class Requirements
include Enumerable
def initialize(*args)
@reqs = Set.new(*args)
end
def each(*args, &block)
@reqs.each(*args, &block)
end
def <<(other)
if Comparable === other
@reqs.grep(other.class) do |req|
return self if req > other
@reqs.delete(req)
end
end
@reqs << other
self
end
alias_method :to_ary, :to_a
end

View File

@ -31,7 +31,7 @@ class DependencyCollector
def initialize
@deps = Dependencies.new
@requirements = ComparableSet.new
@requirements = Requirements.new
end
def add(spec)

View File

@ -1,24 +0,0 @@
require 'set'
class ComparableSet < Set
def add new
# smileys only
return super new unless new.respond_to? :>
grep(new.class) do |o|
return self if o > new
delete o
end
super new
end
alias_method :<<, :add
# Set#merge bypasses enumerating the set's contents,
# so the subclassed #add would never be called
def merge enum
enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
enum.each { |o| add(o) }
self
end
end

View File

@ -1,5 +1,6 @@
require 'dependable'
require 'dependency'
require 'dependencies'
require 'build_environment'
# A base class for non-formula requirements needed by formulae.
@ -141,7 +142,7 @@ class Requirement
# The default filter, which is applied when a block is not given, omits
# optionals and recommendeds based on what the dependent has asked for.
def expand(dependent, &block)
reqs = ComparableSet.new
reqs = Requirements.new
formulae = dependent.recursive_dependencies.map(&:to_formula)
formulae.unshift(dependent)

View File

@ -1,5 +1,4 @@
require 'requirement'
require 'extend/set'
require "requirement"
class X11Dependency < Requirement
include Comparable

View File

@ -1,41 +0,0 @@
require 'testing_env'
require 'extend/set'
require 'requirements'
class ComparableSetTests < Homebrew::TestCase
def setup
@set = ComparableSet.new
end
def test_merging_multiple_dependencies
@set << X11Dependency.new
@set << X11Dependency.new
assert_equal 1, @set.count
@set << Requirement.new
assert_equal 2, @set.count
end
def test_comparison_prefers_larger
@set << X11Dependency.new
@set << X11Dependency.new('x11', %w{2.6})
assert_equal 1, @set.count
assert_equal [X11Dependency.new('x11', %w{2.6})], @set.to_a
end
def test_comparison_does_not_merge_smaller
@set << X11Dependency.new('x11', %w{2.6})
@set << X11Dependency.new
assert_equal 1, @set.count
assert_equal [X11Dependency.new('x11', %w{2.6})], @set.to_a
end
def test_merging_sets
@set << X11Dependency.new
@set << Requirement.new
reqs = Set.new [X11Dependency.new('x11', %w{2.6}), Requirement.new]
assert_same @set, @set.merge(reqs)
assert_equal 2, @set.count
assert_equal X11Dependency.new('x11', %w{2.6}), @set.find {|r| r.is_a? X11Dependency}
end
end

View File

@ -1,6 +1,7 @@
require 'testing_env'
require 'dependencies'
require 'dependency'
require 'requirements'
class DependenciesTests < Homebrew::TestCase
def setup
@ -78,3 +79,30 @@ class DependenciesTests < Homebrew::TestCase
assert !a.eql?(b)
end
end
class RequirementsTests < Homebrew::TestCase
def setup
@reqs = Requirements.new
end
def test_shovel_returns_self
assert_same @reqs, (@reqs << Object.new)
end
def test_merging_multiple_dependencies
@reqs << X11Dependency.new << X11Dependency.new
assert_equal 1, @reqs.count
@reqs << Requirement.new
assert_equal 2, @reqs.count
end
def test_comparison_prefers_larger
@reqs << X11Dependency.new << X11Dependency.new("x11", %w[2.6])
assert_equal [X11Dependency.new("x11", %w[2.6])], @reqs.to_a
end
def test_comparison_does_not_merge_smaller
@reqs << X11Dependency.new("x11", %w{2.6}) << X11Dependency.new
assert_equal [X11Dependency.new("x11", %w[2.6])], @reqs.to_a
end
end

View File

@ -1,6 +1,5 @@
require 'testing_env'
require 'dependency_collector'
require 'extend/set'
class DependencyCollectorTests < Homebrew::TestCase
def find_dependency(name)
@ -52,7 +51,7 @@ class DependencyCollectorTests < Homebrew::TestCase
def test_no_duplicate_requirements
2.times { @d.add :x11 }
assert_equal 1, @d.requirements.length
assert_equal 1, @d.requirements.count
end
def test_requirement_tags

View File

@ -1,5 +1,4 @@
require 'testing_env'
require 'extend/set'
require 'requirements/x11_dependency'
class X11DependencyTests < Homebrew::TestCase