solve 0.8.2 → 1.0.0.rc1
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 +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +4 -0
- data/README.md +8 -11
- data/lib/solve.rb +3 -8
- data/lib/solve/artifact.rb +44 -80
- data/lib/solve/constraint.rb +62 -46
- data/lib/solve/demand.rb +6 -21
- data/lib/solve/dependency.rb +10 -22
- data/lib/solve/errors.rb +43 -17
- data/lib/solve/gem_version.rb +1 -1
- data/lib/solve/graph.rb +43 -123
- data/lib/solve/solver.rb +134 -262
- data/lib/solve/solver/serializer.rb +1 -1
- data/solve.gemspec +3 -1
- data/spec/acceptance/benchmark.rb +45 -0
- data/spec/acceptance/large_graph_no_solution.rb +18730 -0
- data/spec/acceptance/opscode_ci_graph.rb +18600 -0
- data/spec/acceptance/solutions_spec.rb +117 -76
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/solve/artifact_spec.rb +49 -64
- data/spec/unit/solve/demand_spec.rb +19 -56
- data/spec/unit/solve/dependency_spec.rb +7 -46
- data/spec/unit/solve/graph_spec.rb +72 -209
- data/spec/unit/solve/solver/serializer_spec.rb +3 -4
- data/spec/unit/solve/solver_spec.rb +103 -247
- metadata +43 -22
- data/.ruby-version +0 -1
- data/lib/solve/solver/constraint_row.rb +0 -25
- data/lib/solve/solver/constraint_table.rb +0 -31
- data/lib/solve/solver/variable_row.rb +0 -43
- data/lib/solve/solver/variable_table.rb +0 -55
- data/lib/solve/tracers.rb +0 -50
- data/lib/solve/tracers/human_readable.rb +0 -67
- data/lib/solve/tracers/silent.rb +0 -17
- data/lib/solve/version.rb +0 -140
- data/spec/unit/solve/constraint_spec.rb +0 -708
- data/spec/unit/solve/version_spec.rb +0 -355
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.0.0-p247
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Solve
|
4
|
-
class Solver
|
5
|
-
class ConstraintRow
|
6
|
-
extend Forwardable
|
7
|
-
|
8
|
-
attr_reader :source
|
9
|
-
|
10
|
-
def_delegator :dependency, :name
|
11
|
-
def_delegator :dependency, :constraint
|
12
|
-
|
13
|
-
# @param [Solve::Dependency] dependency
|
14
|
-
# @param [String, Symbol] source
|
15
|
-
def initialize(dependency, source)
|
16
|
-
@dependency = dependency
|
17
|
-
@source = source
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_reader :dependency
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
class Solver
|
3
|
-
class ConstraintTable
|
4
|
-
attr_reader :rows
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@rows = Array.new
|
8
|
-
end
|
9
|
-
|
10
|
-
# @param [Solve::Dependency] dependency
|
11
|
-
# @param [String, Symbol] source
|
12
|
-
#
|
13
|
-
# @return [Array<ConstraintRow>]
|
14
|
-
def add(dependency, source)
|
15
|
-
@rows << ConstraintRow.new(dependency, source)
|
16
|
-
end
|
17
|
-
|
18
|
-
def constraints_on_artifact(name)
|
19
|
-
@rows.select do |row|
|
20
|
-
row.name == name
|
21
|
-
end.map { |row| row.constraint }
|
22
|
-
end
|
23
|
-
|
24
|
-
def remove_constraints_from_source!(source)
|
25
|
-
from_source, others = @rows.partition { |row| row.source == source }
|
26
|
-
@rows = others
|
27
|
-
from_source
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
class Solver
|
3
|
-
class VariableRow
|
4
|
-
attr_reader :artifact
|
5
|
-
attr_reader :value
|
6
|
-
attr_reader :sources
|
7
|
-
|
8
|
-
# @param [String] artifact
|
9
|
-
# @param [String, Symbol] source
|
10
|
-
def initialize(artifact, source)
|
11
|
-
@artifact = artifact
|
12
|
-
@value = nil
|
13
|
-
@sources = Array(source)
|
14
|
-
end
|
15
|
-
|
16
|
-
# @param [String, Symbol] source
|
17
|
-
def add_source(source)
|
18
|
-
@sources << source
|
19
|
-
end
|
20
|
-
|
21
|
-
def last_source
|
22
|
-
@sources.last
|
23
|
-
end
|
24
|
-
|
25
|
-
def bind(value)
|
26
|
-
@value = value
|
27
|
-
end
|
28
|
-
|
29
|
-
def unbind
|
30
|
-
@value = nil
|
31
|
-
end
|
32
|
-
|
33
|
-
def bound?
|
34
|
-
!@value.nil?
|
35
|
-
end
|
36
|
-
|
37
|
-
# @param [String, Symbol] source
|
38
|
-
def remove_source(source)
|
39
|
-
@sources.delete(source)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
class Solver
|
3
|
-
class VariableTable
|
4
|
-
attr_reader :rows
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@rows = Array.new
|
8
|
-
end
|
9
|
-
|
10
|
-
# @param [String] artifact
|
11
|
-
# @param [String] source
|
12
|
-
def add(artifact, source)
|
13
|
-
row = rows.detect { |row| row.artifact == artifact }
|
14
|
-
if row.nil?
|
15
|
-
@rows << VariableRow.new(artifact, source)
|
16
|
-
else
|
17
|
-
row.add_source(source)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def first_unbound
|
22
|
-
@rows.detect { |row| row.bound? == false }
|
23
|
-
end
|
24
|
-
|
25
|
-
# @param [String] artifact
|
26
|
-
def find_artifact(artifact)
|
27
|
-
@rows.detect { |row| row.artifact == artifact }
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param [String] source
|
31
|
-
def remove_all_with_only_this_source!(source)
|
32
|
-
with_only_this_source, others = @rows.partition { |row| row.sources == [source] }
|
33
|
-
@rows = others
|
34
|
-
with_only_this_source
|
35
|
-
end
|
36
|
-
|
37
|
-
# @param [String] source
|
38
|
-
def all_from_source(source)
|
39
|
-
@rows.select { |row| row.sources.include?(source) }
|
40
|
-
end
|
41
|
-
|
42
|
-
# @param [String] artifact
|
43
|
-
def before(artifact)
|
44
|
-
artifact_index = @rows.index { |row| row.artifact == artifact }
|
45
|
-
(artifact_index == 0) ? nil : @rows[artifact_index - 1]
|
46
|
-
end
|
47
|
-
|
48
|
-
# @param [String] artifact
|
49
|
-
def all_after(artifact)
|
50
|
-
artifact_index = @rows.index { |row| row.artifact == artifact }
|
51
|
-
@rows[(artifact_index+1)..-1]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/lib/solve/tracers.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
module Tracers
|
3
|
-
class << self
|
4
|
-
# @param [#say] ui
|
5
|
-
#
|
6
|
-
# @returns [AbstractTracer]
|
7
|
-
def build(ui)
|
8
|
-
unless ui.respond_to?(:say)
|
9
|
-
Solve::Tracers::Silent.new
|
10
|
-
else
|
11
|
-
Solve::Tracers::HumanReadable.new(ui)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class AbstractTracer
|
17
|
-
class << self
|
18
|
-
private
|
19
|
-
|
20
|
-
def must_define(*args)
|
21
|
-
args.each do |method|
|
22
|
-
define_method(method.to_sym) do |*args|
|
23
|
-
raise AbstractFunction, "##{method} must be defined on #{self.class}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
TRACER_METHODS = [
|
30
|
-
:start,
|
31
|
-
:searching_for,
|
32
|
-
:add_constraint,
|
33
|
-
:possible_values,
|
34
|
-
:trying,
|
35
|
-
:backtrack,
|
36
|
-
:cannot_backtrack,
|
37
|
-
:solution,
|
38
|
-
:reset_domain,
|
39
|
-
:unbind,
|
40
|
-
:remove_variable,
|
41
|
-
:remove_constraint,
|
42
|
-
]
|
43
|
-
|
44
|
-
must_define *TRACER_METHODS
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
require_relative 'tracers/human_readable'
|
50
|
-
require_relative 'tracers/silent'
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
module Tracers
|
3
|
-
class HumanReadable < AbstractTracer
|
4
|
-
extend Forwardable
|
5
|
-
|
6
|
-
attr_reader :ui
|
7
|
-
|
8
|
-
def_delegator :ui, :say
|
9
|
-
|
10
|
-
# @param [#say] ui
|
11
|
-
def initialize(ui)
|
12
|
-
@ui = ui
|
13
|
-
end
|
14
|
-
|
15
|
-
def start
|
16
|
-
say("Attempting to find a solution")
|
17
|
-
end
|
18
|
-
|
19
|
-
def searching_for(unbound_variable, constraints, possible_values)
|
20
|
-
say("Searching for a value for #{unbound_variable.artifact}")
|
21
|
-
say("Constraints are #{constraints.join("\n\t")}")
|
22
|
-
possible_values(possible_values)
|
23
|
-
end
|
24
|
-
|
25
|
-
def possible_values(possible_values)
|
26
|
-
say("Possible values are #{possible_values.map(&:to_s).join("\n\t")}")
|
27
|
-
end
|
28
|
-
|
29
|
-
def trying(artifact)
|
30
|
-
say("Attempting to use #{artifact.to_s}")
|
31
|
-
end
|
32
|
-
|
33
|
-
def backtrack(unbound_variable)
|
34
|
-
say("Could not find an acceptable value for #{unbound_variable.artifact.to_s}")
|
35
|
-
end
|
36
|
-
|
37
|
-
def cannot_backtrack
|
38
|
-
say("Cannot backtrack any further")
|
39
|
-
end
|
40
|
-
|
41
|
-
def solution(solution)
|
42
|
-
say("Found Solution")
|
43
|
-
say(solution.inspect)
|
44
|
-
end
|
45
|
-
|
46
|
-
def add_constraint(dependency, source)
|
47
|
-
say("Adding constraint #{dependency.name} #{dependency.constraint} from #{source.to_s}")
|
48
|
-
end
|
49
|
-
|
50
|
-
def reset_domain(variable)
|
51
|
-
say("Resetting possible values for #{variable.artifact.to_s}")
|
52
|
-
end
|
53
|
-
|
54
|
-
def unbind(variable)
|
55
|
-
say("Unbinding #{variable.artifact.to_s}")
|
56
|
-
end
|
57
|
-
|
58
|
-
def remove_variable(variable)
|
59
|
-
say("Removed variable #{variable.artifact.to_s}")
|
60
|
-
end
|
61
|
-
|
62
|
-
def remove_constraint(constraint)
|
63
|
-
say("Removed constraint #{constraint.name} #{constraint.constraint}")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
data/lib/solve/tracers/silent.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
module Tracers
|
3
|
-
class Silent < AbstractTracer
|
4
|
-
class << self
|
5
|
-
def empty_method(*args)
|
6
|
-
args.each do |method|
|
7
|
-
define_method(method.to_sym) do |*args|
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
empty_method *AbstractTracer::TRACER_METHODS
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
data/lib/solve/version.rb
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
module Solve
|
2
|
-
class Version
|
3
|
-
class << self
|
4
|
-
# @param [#to_s] version_string
|
5
|
-
#
|
6
|
-
# @raise [InvalidVersionFormat]
|
7
|
-
#
|
8
|
-
# @return [Array]
|
9
|
-
def split(version_string)
|
10
|
-
case version_string.to_s
|
11
|
-
when /^(\d+)\.(\d+)\.(\d+)(-([0-9a-z\-\.]+))?(\+([0-9a-z\-\.]+))?$/i
|
12
|
-
[ $1.to_i, $2.to_i, $3.to_i, $5, $7 ]
|
13
|
-
when /^(\d+)\.(\d+)\.(\d+)?$/
|
14
|
-
[ $1.to_i, $2.to_i, $3.to_i ]
|
15
|
-
when /^(\d+)\.(\d+)?$/
|
16
|
-
[ $1.to_i, $2.to_i, 0 ]
|
17
|
-
when /^(\d+)$/
|
18
|
-
[ $1.to_i, 0, 0 ]
|
19
|
-
else
|
20
|
-
raise Errors::InvalidVersionFormat.new(version_string)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
include Comparable
|
26
|
-
|
27
|
-
attr_reader :major
|
28
|
-
attr_reader :minor
|
29
|
-
attr_reader :patch
|
30
|
-
attr_reader :pre_release
|
31
|
-
attr_reader :build
|
32
|
-
|
33
|
-
# @overload initialize(version_array)
|
34
|
-
# @param [Array] version_array
|
35
|
-
#
|
36
|
-
# @example
|
37
|
-
# Version.new([1, 2, 3, 'rc.1', 'build.1']) => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>
|
38
|
-
#
|
39
|
-
# @overload initialize(version_string)
|
40
|
-
# @param [#to_s] version_string
|
41
|
-
#
|
42
|
-
# @example
|
43
|
-
# Version.new("1.2.3-rc.1+build.1") => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>
|
44
|
-
#
|
45
|
-
# @overload initialize(version)
|
46
|
-
# @param [Solve::Version] version
|
47
|
-
#
|
48
|
-
# @example
|
49
|
-
# Version.new(Version.new("1.2.3-rc.1+build.1")) => #<Version: @major=1, @minor=2, @pre_release='rc.1', @build='build.1'>
|
50
|
-
#
|
51
|
-
def initialize(*args)
|
52
|
-
if args.first.is_a?(Array)
|
53
|
-
@major, @minor, @patch, @pre_release, @build = args.first
|
54
|
-
else
|
55
|
-
@major, @minor, @patch, @pre_release, @build = self.class.split(args.first.to_s)
|
56
|
-
end
|
57
|
-
|
58
|
-
@major ||= 0
|
59
|
-
@minor ||= 0
|
60
|
-
@patch ||= 0
|
61
|
-
@pre_release ||= nil
|
62
|
-
@build ||= nil
|
63
|
-
end
|
64
|
-
|
65
|
-
# @param [Solve::Version] other
|
66
|
-
#
|
67
|
-
# @return [Integer]
|
68
|
-
def <=>(other)
|
69
|
-
[:major, :minor, :patch].each do |release|
|
70
|
-
ans = self.send(release) <=> other.send(release)
|
71
|
-
return ans if ans != 0
|
72
|
-
end
|
73
|
-
ans = pre_release_and_build_presence_score <=> other.pre_release_and_build_presence_score
|
74
|
-
return ans if ans != 0
|
75
|
-
ans = identifiers_comparaison(other, :pre_release)
|
76
|
-
return ans if ans != 0
|
77
|
-
if build && other.build
|
78
|
-
return identifiers_comparaison(other, :build)
|
79
|
-
else
|
80
|
-
return build.to_s <=> other.build.to_s
|
81
|
-
end
|
82
|
-
0
|
83
|
-
end
|
84
|
-
|
85
|
-
# @return [Array]
|
86
|
-
def identifiers(release)
|
87
|
-
send(release).to_s.split('.').map do |str|
|
88
|
-
str.to_i.to_s == str ? str.to_i : str
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def pre_release?
|
93
|
-
!!pre_release
|
94
|
-
end
|
95
|
-
|
96
|
-
def zero?
|
97
|
-
[major, minor, patch].all? { |n| n == 0 }
|
98
|
-
end
|
99
|
-
|
100
|
-
# @return [Integer]
|
101
|
-
def pre_release_and_build_presence_score
|
102
|
-
pre_release ? 0 : (build.nil? ? 1 : 2)
|
103
|
-
end
|
104
|
-
|
105
|
-
# @param [Solve::Version] other
|
106
|
-
#
|
107
|
-
# @return [Integer]
|
108
|
-
def identifiers_comparaison(other, release)
|
109
|
-
[identifiers(release).length, other.identifiers(release).length].max.times do |i|
|
110
|
-
if identifiers(release)[i].class == other.identifiers(release)[i].class
|
111
|
-
ans = identifiers(release)[i] <=> other.identifiers(release)[i]
|
112
|
-
return ans if ans != 0
|
113
|
-
elsif identifiers(release)[i] && other.identifiers(release)[i]
|
114
|
-
return identifiers(release)[i].class.to_s <=> other.identifiers(release)[i].class.to_s
|
115
|
-
elsif identifiers(release)[i] || other.identifiers(release)[i]
|
116
|
-
return other.identifiers(release)[i].class.to_s <=> identifiers(release)[i].class.to_s
|
117
|
-
end
|
118
|
-
end
|
119
|
-
0
|
120
|
-
end
|
121
|
-
|
122
|
-
# @param [Solve::Version] other
|
123
|
-
#
|
124
|
-
# @return [Boolean]
|
125
|
-
def eql?(other)
|
126
|
-
other.is_a?(Version) && self == other
|
127
|
-
end
|
128
|
-
|
129
|
-
def inspect
|
130
|
-
"#<#{self.class.to_s} #{to_s}>"
|
131
|
-
end
|
132
|
-
|
133
|
-
def to_s
|
134
|
-
str = "#{major}.#{minor}.#{patch}"
|
135
|
-
str += "-#{pre_release}" if pre_release
|
136
|
-
str += "+#{build}" if build
|
137
|
-
str
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
@@ -1,708 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec::Matchers.define :satisfies do |*args|
|
4
|
-
match do |constraint|
|
5
|
-
constraint.satisfies?(*args).should be_true
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Solve::Constraint do
|
10
|
-
let(:valid_string) { ">= 0.0.0" }
|
11
|
-
let(:invalid_string) { "x23u7089213.*" }
|
12
|
-
|
13
|
-
describe "ClassMethods" do
|
14
|
-
subject { Solve::Constraint }
|
15
|
-
|
16
|
-
describe "::new" do
|
17
|
-
it "returns a new instance of Constraint" do
|
18
|
-
subject.new(valid_string).should be_a(Solve::Constraint)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "assigns the parsed operator to the operator attribute" do
|
22
|
-
subject.new(valid_string).operator.should eql(">=")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "assigns the parsed operator to the operator attribute with no separation between operator and version" do
|
26
|
-
subject.new(">=0.0.0").operator.should eql(">=")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "assigns the parsed version string as an instance of Version to the version attribute" do
|
30
|
-
result = subject.new(valid_string)
|
31
|
-
|
32
|
-
result.version.should be_a(Solve::Version)
|
33
|
-
result.version.to_s.should eql("0.0.0")
|
34
|
-
end
|
35
|
-
|
36
|
-
it "sets a default of '>= 0.0.0' if given a nil value" do
|
37
|
-
subject.new(nil).to_s.should eql(">= 0.0.0")
|
38
|
-
end
|
39
|
-
|
40
|
-
it "sets a default of '>= 0.0.0' if given a blank string" do
|
41
|
-
subject.new('').to_s.should eql(">= 0.0.0")
|
42
|
-
end
|
43
|
-
|
44
|
-
context "given a string that does not match the Constraint REGEXP" do
|
45
|
-
it "raises an InvalidConstraintFormat error" do
|
46
|
-
lambda {
|
47
|
-
subject.new(invalid_string)
|
48
|
-
}.should raise_error(Solve::Errors::InvalidConstraintFormat)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "given a constraint that does not include a minor version (~>)" do
|
53
|
-
it "has a nil value for minor" do
|
54
|
-
expect(subject.new("~> 1").minor).to be_nil
|
55
|
-
end
|
56
|
-
|
57
|
-
it "has a nil value for patch" do
|
58
|
-
expect(subject.new("~> 1").patch).to be_nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context "given a constraint that does not include a minor version (=)" do
|
63
|
-
it "has a 0 for minor" do
|
64
|
-
subject.new("= 1").minor.should eq(0)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context "given a constraint that does not include a patch version (~>)" do
|
69
|
-
it "has a nil value for patch" do
|
70
|
-
subject.new("~> 1.2").patch.should be_nil
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context "given a constraint that does not include a patch version (=)" do
|
75
|
-
it "has a 0 for patch" do
|
76
|
-
subject.new("= 1.2").patch.should eq(0)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "given a constraint that does not include a build version" do
|
81
|
-
it "has a nil value for build" do
|
82
|
-
subject.new(">= 1.2.3-alpha").build.should be_nil
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "given a constraint that does not include a pre release version" do
|
87
|
-
it "has a nil value for pre release" do
|
88
|
-
subject.new(">= 1.2.3+build").pre_release.should be_nil
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "::split" do
|
94
|
-
let(:constraint_string) { nil }
|
95
|
-
|
96
|
-
subject { described_class.split(constraint_string) }
|
97
|
-
|
98
|
-
context "given a constraint containing the elements (operator, major, minor, patch, pre_release, build)" do
|
99
|
-
let(:constraint_string) { ">= 1.2.3-alpha+build" }
|
100
|
-
|
101
|
-
it "returns an array with the constraint operator at index 0" do
|
102
|
-
subject[0].should eql(">=")
|
103
|
-
end
|
104
|
-
|
105
|
-
it "returns an array with the major version in index 1" do
|
106
|
-
subject[1].should eql(1)
|
107
|
-
end
|
108
|
-
|
109
|
-
it "returns an array with the minor version at index 2" do
|
110
|
-
subject[2].should eql(2)
|
111
|
-
end
|
112
|
-
|
113
|
-
it "returns an array with the patch version at index 3" do
|
114
|
-
subject[3].should eql(3)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "returns an array with the pre release version at index 4" do
|
118
|
-
subject[4].should eql("alpha")
|
119
|
-
end
|
120
|
-
|
121
|
-
it "returns an array with the build version at index 5" do
|
122
|
-
subject[5].should eql("build")
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context "given a constraint containing the elements (operator, major, minor, patch, pre_release)" do
|
127
|
-
let(:constraint_string) { ">= 1.2.3-alpha" }
|
128
|
-
|
129
|
-
it "returns an array with the constraint operator at index 0" do
|
130
|
-
subject[0].should eql(">=")
|
131
|
-
end
|
132
|
-
|
133
|
-
it "returns an array with the major version in index 1" do
|
134
|
-
subject[1].should eql(1)
|
135
|
-
end
|
136
|
-
|
137
|
-
it "returns an array with the minor version at index 2" do
|
138
|
-
subject[2].should eql(2)
|
139
|
-
end
|
140
|
-
|
141
|
-
it "returns an array with the patch version at index 3" do
|
142
|
-
subject[3].should eql(3)
|
143
|
-
end
|
144
|
-
|
145
|
-
it "returns an array with the pre release version at index 4" do
|
146
|
-
subject[4].should eql("alpha")
|
147
|
-
end
|
148
|
-
|
149
|
-
it "returns an array with a nil value at index 5" do
|
150
|
-
subject[5].should be_nil
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
context "given a constraint containing the elements (operator, major, minor, patch)" do
|
155
|
-
let(:constraint_string) { ">= 1.2.3" }
|
156
|
-
|
157
|
-
it "returns an array with the constraint operator at index 0" do
|
158
|
-
subject[0].should eql(">=")
|
159
|
-
end
|
160
|
-
|
161
|
-
it "returns an array with the major version in index 1" do
|
162
|
-
subject[1].should eql(1)
|
163
|
-
end
|
164
|
-
|
165
|
-
it "returns an array with the minor version at index 2" do
|
166
|
-
subject[2].should eql(2)
|
167
|
-
end
|
168
|
-
|
169
|
-
it "returns an array with the patch version at index 3" do
|
170
|
-
subject[3].should eql(3)
|
171
|
-
end
|
172
|
-
|
173
|
-
it "returns an array with a nil value at index 4" do
|
174
|
-
subject[4].should be_nil
|
175
|
-
end
|
176
|
-
|
177
|
-
it "returns an array with a nil value at index 5" do
|
178
|
-
subject[5].should be_nil
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
context "given a constraint containing the elements (operator, major, minor)" do
|
183
|
-
let(:constraint_string) { ">= 1.2" }
|
184
|
-
|
185
|
-
it "returns an array with the constraint operator at index 0" do
|
186
|
-
subject[0].should eql(">=")
|
187
|
-
end
|
188
|
-
|
189
|
-
it "returns an array with the major version in index 1" do
|
190
|
-
subject[1].should eql(1)
|
191
|
-
end
|
192
|
-
|
193
|
-
it "returns an array with the minor version at index 2" do
|
194
|
-
subject[2].should eql(2)
|
195
|
-
end
|
196
|
-
|
197
|
-
it "returns an array with a nil value at index 3" do
|
198
|
-
subject[3].should be_nil
|
199
|
-
end
|
200
|
-
|
201
|
-
it "returns an array with a nil value at index 4" do
|
202
|
-
subject[4].should be_nil
|
203
|
-
end
|
204
|
-
|
205
|
-
it "returns an array with a nil value at index 5" do
|
206
|
-
subject[5].should be_nil
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
context "given a constraint containing the elements (operator, major)" do
|
211
|
-
let(:constraint_string) { ">= 1" }
|
212
|
-
|
213
|
-
it "returns an array with the constraint operator at index 0" do
|
214
|
-
subject[0].should eql(">=")
|
215
|
-
end
|
216
|
-
|
217
|
-
it "returns an array with the major version in index 1" do
|
218
|
-
subject[1].should eql(1)
|
219
|
-
end
|
220
|
-
|
221
|
-
it "returns an array with a nil value at index 2" do
|
222
|
-
subject[2].should be_nil
|
223
|
-
end
|
224
|
-
|
225
|
-
it "returns an array with a nil value at index 3" do
|
226
|
-
subject[3].should be_nil
|
227
|
-
end
|
228
|
-
|
229
|
-
it "returns an array with a nil value at index 4" do
|
230
|
-
subject[4].should be_nil
|
231
|
-
end
|
232
|
-
|
233
|
-
it "returns an array with a nil value at index 5" do
|
234
|
-
subject[5].should be_nil
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
context "given a constraint which is missing an operator" do
|
239
|
-
let(:constraint_string) { "1.2.3" }
|
240
|
-
|
241
|
-
it "returns an equality operator at index 0" do
|
242
|
-
subject[0].should eql("=")
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
context "given a string that does not match the Constraint REGEXP" do
|
247
|
-
let(:constraint_string) { "x23u7089213.*" }
|
248
|
-
|
249
|
-
it "raises an InvalidConstraintFormat error" do
|
250
|
-
expect {
|
251
|
-
subject.split(invalid_string)
|
252
|
-
}.to raise_error(Solve::Errors::InvalidConstraintFormat)
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
context "given a string that does not contain an operator" do
|
257
|
-
let(:constraint_string) { "1.2.3" }
|
258
|
-
|
259
|
-
it "returns a constraint constraint with a default operator (=)" do
|
260
|
-
subject[0].should eql("=")
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
describe "#satisfies?" do
|
267
|
-
subject { Solve::Constraint.new("= 1.0.0") }
|
268
|
-
|
269
|
-
it { should satisfies("1.0.0") }
|
270
|
-
|
271
|
-
it "accepts a Version for version" do
|
272
|
-
should satisfies(Solve::Version.new("1.0.0"))
|
273
|
-
end
|
274
|
-
|
275
|
-
context "strictly greater than (>) pre-release constraint" do
|
276
|
-
subject { Solve::Constraint.new("> 1.0.0-alpha") }
|
277
|
-
|
278
|
-
it { should_not satisfies("0.9.9+build") }
|
279
|
-
it { should_not satisfies("1.0.0-alpha") }
|
280
|
-
it { should satisfies("1.0.0-alpha.2") }
|
281
|
-
it { should satisfies("1.0.0") }
|
282
|
-
it { should satisfies("1.0.0+build") }
|
283
|
-
it { should satisfies("1.0.1-beta") }
|
284
|
-
it { should satisfies("1.0.1") }
|
285
|
-
it { should satisfies("1.0.1+build.2") }
|
286
|
-
it { should satisfies("2.0.0") }
|
287
|
-
end
|
288
|
-
|
289
|
-
context "strictly greater than (>)" do
|
290
|
-
subject { Solve::Constraint.new("> 1.0.0") }
|
291
|
-
|
292
|
-
it { should_not satisfies("0.9.9+build") }
|
293
|
-
it { should_not satisfies("1.0.0-alpha") }
|
294
|
-
it { should_not satisfies("1.0.0-alpha.2") }
|
295
|
-
it { should_not satisfies("1.0.0") }
|
296
|
-
it { should satisfies("1.0.0+build") }
|
297
|
-
it { should_not satisfies("1.0.1-beta") }
|
298
|
-
it { should satisfies("1.0.1") }
|
299
|
-
it { should satisfies("1.0.1+build.2") }
|
300
|
-
it { should satisfies("2.0.0") }
|
301
|
-
end
|
302
|
-
|
303
|
-
context "strictly greater than (>) build constraint" do
|
304
|
-
subject { Solve::Constraint.new("> 1.0.0+build") }
|
305
|
-
|
306
|
-
it { should_not satisfies("0.9.9+build") }
|
307
|
-
it { should_not satisfies("1.0.0-alpha") }
|
308
|
-
it { should_not satisfies("1.0.0-alpha.2") }
|
309
|
-
it { should_not satisfies("1.0.0") }
|
310
|
-
it { should_not satisfies("1.0.0+build") }
|
311
|
-
it { should_not satisfies("1.0.1-beta") }
|
312
|
-
it { should satisfies("1.0.1") }
|
313
|
-
it { should satisfies("1.0.1+build.2") }
|
314
|
-
it { should satisfies("2.0.0") }
|
315
|
-
end
|
316
|
-
|
317
|
-
context "greater than or equal to (>) zero pre-release constraint" do
|
318
|
-
subject { Solve::Constraint.new("> 0.0.0-alpha") }
|
319
|
-
|
320
|
-
it { should satisfies("0.9.9+build") }
|
321
|
-
it { should satisfies("1.0.0-alpha") }
|
322
|
-
it { should satisfies("1.0.0-alpha.2") }
|
323
|
-
it { should satisfies("1.0.0") }
|
324
|
-
it { should satisfies("1.0.0+build") }
|
325
|
-
it { should satisfies("1.0.1-beta") }
|
326
|
-
it { should satisfies("1.0.1") }
|
327
|
-
it { should satisfies("1.0.1+build.2") }
|
328
|
-
it { should satisfies("2.0.0") }
|
329
|
-
end
|
330
|
-
|
331
|
-
context "greater than or equal to (>) zero constraint" do
|
332
|
-
subject { Solve::Constraint.new("> 0.0.0") }
|
333
|
-
|
334
|
-
it { should satisfies("0.9.9+build") }
|
335
|
-
it { should satisfies("1.0.0-alpha") }
|
336
|
-
it { should satisfies("1.0.0-alpha.2") }
|
337
|
-
it { should satisfies("1.0.0") }
|
338
|
-
it { should satisfies("1.0.0+build") }
|
339
|
-
it { should satisfies("1.0.1-beta") }
|
340
|
-
it { should satisfies("1.0.1") }
|
341
|
-
it { should satisfies("1.0.1+build.2") }
|
342
|
-
it { should satisfies("2.0.0") }
|
343
|
-
end
|
344
|
-
|
345
|
-
context "greater than or equal to (>) zero build constraint" do
|
346
|
-
subject { Solve::Constraint.new("> 0.0.0+build") }
|
347
|
-
|
348
|
-
it { should satisfies("0.9.9+build") }
|
349
|
-
it { should satisfies("1.0.0-alpha") }
|
350
|
-
it { should satisfies("1.0.0-alpha.2") }
|
351
|
-
it { should satisfies("1.0.0") }
|
352
|
-
it { should satisfies("1.0.0+build") }
|
353
|
-
it { should satisfies("1.0.1-beta") }
|
354
|
-
it { should satisfies("1.0.1") }
|
355
|
-
it { should satisfies("1.0.1+build.2") }
|
356
|
-
it { should satisfies("2.0.0") }
|
357
|
-
end
|
358
|
-
|
359
|
-
context "strictly less than (<) pre-release constraint" do
|
360
|
-
subject { Solve::Constraint.new("< 1.0.0-alpha.3") }
|
361
|
-
|
362
|
-
it { should satisfies("0.9.9+build") }
|
363
|
-
it { should satisfies("1.0.0-alpha") }
|
364
|
-
it { should satisfies("1.0.0-alpha.2") }
|
365
|
-
it { should_not satisfies("1.0.0") }
|
366
|
-
it { should_not satisfies("1.0.0+build") }
|
367
|
-
it { should_not satisfies("1.0.1-beta") }
|
368
|
-
it { should_not satisfies("1.0.1") }
|
369
|
-
it { should_not satisfies("1.0.1+build.2") }
|
370
|
-
it { should_not satisfies("2.0.0") }
|
371
|
-
end
|
372
|
-
|
373
|
-
context "strictly less than (<)" do
|
374
|
-
subject { Solve::Constraint.new("< 1.0.0") }
|
375
|
-
|
376
|
-
it { should satisfies("0.9.9+build") }
|
377
|
-
it { should satisfies("1.0.0-alpha") }
|
378
|
-
it { should satisfies("1.0.0-alpha.2") }
|
379
|
-
it { should_not satisfies("1.0.0") }
|
380
|
-
it { should_not satisfies("1.0.0+build") }
|
381
|
-
it { should_not satisfies("1.0.1-beta") }
|
382
|
-
it { should_not satisfies("1.0.1") }
|
383
|
-
it { should_not satisfies("1.0.1+build.2") }
|
384
|
-
it { should_not satisfies("2.0.0") }
|
385
|
-
end
|
386
|
-
|
387
|
-
context "strictly less than (<) build constraint" do
|
388
|
-
subject { Solve::Constraint.new("< 1.0.0+build.20") }
|
389
|
-
|
390
|
-
it { should satisfies("0.9.9+build") }
|
391
|
-
it { should satisfies("1.0.0-alpha") }
|
392
|
-
it { should satisfies("1.0.0-alpha.2") }
|
393
|
-
it { should satisfies("1.0.0") }
|
394
|
-
it { should satisfies("1.0.0+build") }
|
395
|
-
it { should_not satisfies("1.0.1-beta") }
|
396
|
-
it { should_not satisfies("1.0.1") }
|
397
|
-
it { should_not satisfies("1.0.1+build.2") }
|
398
|
-
it { should_not satisfies("2.0.0") }
|
399
|
-
end
|
400
|
-
|
401
|
-
context "strictly equal to (=)" do
|
402
|
-
subject { Solve::Constraint.new("= 1.0.0") }
|
403
|
-
|
404
|
-
it { should_not satisfies("0.9.9+build") }
|
405
|
-
it { should satisfies("1.0.0") }
|
406
|
-
it { should_not satisfies("1.0.1") }
|
407
|
-
it { should_not satisfies("1.0.0-alpha") }
|
408
|
-
end
|
409
|
-
|
410
|
-
context "greater than or equal to (>=) pre-release constraint" do
|
411
|
-
subject { Solve::Constraint.new(">= 1.0.0-alpha") }
|
412
|
-
|
413
|
-
it { should_not satisfies("0.9.9+build") }
|
414
|
-
it { should satisfies("1.0.0-alpha") }
|
415
|
-
it { should satisfies("1.0.0-alpha.2") }
|
416
|
-
it { should satisfies("1.0.0") }
|
417
|
-
it { should satisfies("1.0.0+build") }
|
418
|
-
it { should satisfies("1.0.1-beta") }
|
419
|
-
it { should satisfies("1.0.1") }
|
420
|
-
it { should satisfies("1.0.1+build.2") }
|
421
|
-
it { should satisfies("2.0.0") }
|
422
|
-
end
|
423
|
-
|
424
|
-
context "greater than or equal to (>=)" do
|
425
|
-
subject { Solve::Constraint.new(">= 1.0.0") }
|
426
|
-
|
427
|
-
it { should_not satisfies("0.9.9+build") }
|
428
|
-
it { should_not satisfies("1.0.0-alpha") }
|
429
|
-
it { should_not satisfies("1.0.0-alpha.2") }
|
430
|
-
it { should satisfies("1.0.0") }
|
431
|
-
it { should satisfies("1.0.0+build") }
|
432
|
-
it { should_not satisfies("1.0.1-beta") }
|
433
|
-
it { should satisfies("1.0.1") }
|
434
|
-
it { should satisfies("1.0.1+build.2") }
|
435
|
-
it { should satisfies("2.0.0") }
|
436
|
-
end
|
437
|
-
|
438
|
-
context "greater than or equal to (>=) build constraint" do
|
439
|
-
subject { Solve::Constraint.new(">= 1.0.0+build") }
|
440
|
-
|
441
|
-
it { should_not satisfies("0.9.9+build") }
|
442
|
-
it { should_not satisfies("1.0.0-alpha") }
|
443
|
-
it { should_not satisfies("1.0.0-alpha.2") }
|
444
|
-
it { should_not satisfies("1.0.0") }
|
445
|
-
it { should satisfies("1.0.0+build") }
|
446
|
-
it { should_not satisfies("1.0.1-beta") }
|
447
|
-
it { should satisfies("1.0.1") }
|
448
|
-
it { should satisfies("1.0.1+build.2") }
|
449
|
-
it { should satisfies("2.0.0") }
|
450
|
-
end
|
451
|
-
|
452
|
-
context "greater than or equal to (>=) zero pre-release constraint" do
|
453
|
-
subject { Solve::Constraint.new(">= 0.0.0-alpha") }
|
454
|
-
|
455
|
-
it { should satisfies("0.9.9+build") }
|
456
|
-
it { should satisfies("1.0.0-alpha") }
|
457
|
-
it { should satisfies("1.0.0-alpha.2") }
|
458
|
-
it { should satisfies("1.0.0") }
|
459
|
-
it { should satisfies("1.0.0+build") }
|
460
|
-
it { should satisfies("1.0.1-beta") }
|
461
|
-
it { should satisfies("1.0.1") }
|
462
|
-
it { should satisfies("1.0.1+build.2") }
|
463
|
-
it { should satisfies("2.0.0") }
|
464
|
-
end
|
465
|
-
|
466
|
-
context "greater than or equal to (>=) zero constraint" do
|
467
|
-
subject { Solve::Constraint.new(">= 0.0.0") }
|
468
|
-
|
469
|
-
it { should satisfies("0.9.9+build") }
|
470
|
-
it { should satisfies("1.0.0-alpha") }
|
471
|
-
it { should satisfies("1.0.0-alpha.2") }
|
472
|
-
it { should satisfies("1.0.0") }
|
473
|
-
it { should satisfies("1.0.0+build") }
|
474
|
-
it { should satisfies("1.0.1-beta") }
|
475
|
-
it { should satisfies("1.0.1") }
|
476
|
-
it { should satisfies("1.0.1+build.2") }
|
477
|
-
it { should satisfies("2.0.0") }
|
478
|
-
end
|
479
|
-
|
480
|
-
context "greater than or equal to (>=) zero build constraint" do
|
481
|
-
subject { Solve::Constraint.new(">= 0.0.0+build") }
|
482
|
-
|
483
|
-
it { should satisfies("0.9.9+build") }
|
484
|
-
it { should satisfies("1.0.0-alpha") }
|
485
|
-
it { should satisfies("1.0.0-alpha.2") }
|
486
|
-
it { should satisfies("1.0.0") }
|
487
|
-
it { should satisfies("1.0.0+build") }
|
488
|
-
it { should satisfies("1.0.1-beta") }
|
489
|
-
it { should satisfies("1.0.1") }
|
490
|
-
it { should satisfies("1.0.1+build.2") }
|
491
|
-
it { should satisfies("2.0.0") }
|
492
|
-
end
|
493
|
-
|
494
|
-
context "lower than or equal to (<=) pre-release constraint" do
|
495
|
-
subject { Solve::Constraint.new("<= 1.0.0") }
|
496
|
-
|
497
|
-
it { should satisfies("0.9.9+build") }
|
498
|
-
it { should satisfies("1.0.0-alpha") }
|
499
|
-
it { should satisfies("1.0.0-alpha.2") }
|
500
|
-
it { should satisfies("1.0.0") }
|
501
|
-
it { should_not satisfies("1.0.0+build") }
|
502
|
-
it { should_not satisfies("1.0.1-beta") }
|
503
|
-
it { should_not satisfies("1.0.1") }
|
504
|
-
it { should_not satisfies("1.0.1+build.2") }
|
505
|
-
it { should_not satisfies("2.0.0") }
|
506
|
-
end
|
507
|
-
|
508
|
-
context "lower than or equal to (<=)" do
|
509
|
-
subject { Solve::Constraint.new("<= 1.0.0-alpha") }
|
510
|
-
|
511
|
-
it { should satisfies("0.9.9+build") }
|
512
|
-
it { should satisfies("1.0.0-alpha") }
|
513
|
-
it { should_not satisfies("1.0.0-alpha.2") }
|
514
|
-
it { should_not satisfies("1.0.0") }
|
515
|
-
it { should_not satisfies("1.0.0+build") }
|
516
|
-
it { should_not satisfies("1.0.1-beta") }
|
517
|
-
it { should_not satisfies("1.0.1") }
|
518
|
-
it { should_not satisfies("1.0.1+build.2") }
|
519
|
-
it { should_not satisfies("2.0.0") }
|
520
|
-
end
|
521
|
-
|
522
|
-
context "lower than or equal to (<=) build constraint" do
|
523
|
-
subject { Solve::Constraint.new("<= 1.0.0+build") }
|
524
|
-
|
525
|
-
it { should satisfies("0.9.9+build") }
|
526
|
-
it { should satisfies("1.0.0-alpha") }
|
527
|
-
it { should satisfies("1.0.0-alpha.2") }
|
528
|
-
it { should satisfies("1.0.0") }
|
529
|
-
it { should satisfies("1.0.0+build") }
|
530
|
-
it { should_not satisfies("1.0.1-beta") }
|
531
|
-
it { should_not satisfies("1.0.1") }
|
532
|
-
it { should_not satisfies("1.0.1+build.2") }
|
533
|
-
it { should_not satisfies("2.0.0") }
|
534
|
-
end
|
535
|
-
|
536
|
-
%w[~> ~].each do |operator|
|
537
|
-
describe "aproximately (#{operator})" do
|
538
|
-
context "when the last value in the constraint is for minor" do
|
539
|
-
subject { Solve::Constraint.new("#{operator} 1.2") }
|
540
|
-
|
541
|
-
it { should_not satisfies("1.1.0") }
|
542
|
-
it { should_not satisfies("1.2.0-alpha") }
|
543
|
-
it { should satisfies("1.2.0") }
|
544
|
-
it { should satisfies("1.2.3") }
|
545
|
-
it { should satisfies("1.2.3+build") }
|
546
|
-
it { should satisfies("1.3") }
|
547
|
-
it { should satisfies("1.3.0") }
|
548
|
-
it { should_not satisfies("2.0.0-0") }
|
549
|
-
it { should_not satisfies("2.0.0") }
|
550
|
-
end
|
551
|
-
|
552
|
-
context "when the last value in the constraint is for patch" do
|
553
|
-
subject { Solve::Constraint.new("#{operator} 1.2.0") }
|
554
|
-
|
555
|
-
it { should_not satisfies("1.1.0") }
|
556
|
-
it { should_not satisfies("1.2.3-alpha") }
|
557
|
-
it { should satisfies("1.2.2") }
|
558
|
-
it { should satisfies("1.2.3") }
|
559
|
-
it { should satisfies("1.2.5+build") }
|
560
|
-
it { should_not satisfies("1.3.0-0") }
|
561
|
-
it { should_not satisfies("1.3.0") }
|
562
|
-
end
|
563
|
-
|
564
|
-
context "when the last value in the constraint is for pre_release with a last numeric identifier" do
|
565
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3-4") }
|
566
|
-
|
567
|
-
it { should_not satisfies("1.2.3") }
|
568
|
-
it { should satisfies("1.2.3-4") }
|
569
|
-
it { should satisfies("1.2.3-10") }
|
570
|
-
it { should satisfies("1.2.3-10.5+build.33") }
|
571
|
-
it { should_not satisfies("1.2.3--") }
|
572
|
-
it { should_not satisfies("1.2.3-alpha") }
|
573
|
-
it { should_not satisfies("1.2.3") }
|
574
|
-
it { should_not satisfies("1.2.4") }
|
575
|
-
it { should_not satisfies("1.3.0") }
|
576
|
-
end
|
577
|
-
|
578
|
-
context "when the last value in the constraint is for pre_release with a last non-numeric identifier" do
|
579
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3-alpha") }
|
580
|
-
|
581
|
-
it { should_not satisfies("1.2.3-4") }
|
582
|
-
it { should_not satisfies("1.2.3--") }
|
583
|
-
it { should satisfies("1.2.3-alpha") }
|
584
|
-
it { should satisfies("1.2.3-alpha.0") }
|
585
|
-
it { should satisfies("1.2.3-beta") }
|
586
|
-
it { should satisfies("1.2.3-omega") }
|
587
|
-
it { should satisfies("1.2.3-omega.4") }
|
588
|
-
it { should_not satisfies("1.2.3") }
|
589
|
-
it { should_not satisfies("1.3.0") }
|
590
|
-
end
|
591
|
-
|
592
|
-
context "when the last value in the constraint is for build with a last numeric identifier and a pre-release" do
|
593
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3-alpha+5") }
|
594
|
-
|
595
|
-
it { should_not satisfies("1.2.3-alpha") }
|
596
|
-
it { should_not satisfies("1.2.3-alpha.4") }
|
597
|
-
it { should_not satisfies("1.2.3-alpha.4+4") }
|
598
|
-
it { should satisfies("1.2.3-alpha+5") }
|
599
|
-
it { should satisfies("1.2.3-alpha+5.5") }
|
600
|
-
it { should satisfies("1.2.3-alpha+10") }
|
601
|
-
it { should_not satisfies("1.2.3-alpha+-") }
|
602
|
-
it { should_not satisfies("1.2.3-alpha+build") }
|
603
|
-
it { should_not satisfies("1.2.3-beta") }
|
604
|
-
it { should_not satisfies("1.2.3") }
|
605
|
-
it { should_not satisfies("1.3.0") }
|
606
|
-
end
|
607
|
-
|
608
|
-
context "when the last value in the constraint is for build with a last non-numeric identifier and a pre-release" do
|
609
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3-alpha+build") }
|
610
|
-
|
611
|
-
it { should_not satisfies("1.2.3-alpha") }
|
612
|
-
it { should_not satisfies("1.2.3-alpha.4") }
|
613
|
-
it { should_not satisfies("1.2.3-alpha.4+4") }
|
614
|
-
it { should satisfies("1.2.3-alpha+build") }
|
615
|
-
it { should satisfies("1.2.3-alpha+build.5") }
|
616
|
-
it { should satisfies("1.2.3-alpha+preview") }
|
617
|
-
it { should satisfies("1.2.3-alpha+zzz") }
|
618
|
-
it { should_not satisfies("1.2.3-alphb") }
|
619
|
-
it { should_not satisfies("1.2.3-beta") }
|
620
|
-
it { should_not satisfies("1.2.3") }
|
621
|
-
it { should_not satisfies("1.3.0") }
|
622
|
-
end
|
623
|
-
|
624
|
-
context "when the last value in the constraint is for build with a last numeric identifier" do
|
625
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3+5") }
|
626
|
-
|
627
|
-
it { should_not satisfies("1.2.3") }
|
628
|
-
it { should_not satisfies("1.2.3-alpha") }
|
629
|
-
it { should_not satisfies("1.2.3+4") }
|
630
|
-
it { should satisfies("1.2.3+5") }
|
631
|
-
it { should satisfies("1.2.3+99") }
|
632
|
-
it { should_not satisfies("1.2.3+5.build") }
|
633
|
-
it { should_not satisfies("1.2.3+-") }
|
634
|
-
it { should_not satisfies("1.2.3+build") }
|
635
|
-
it { should_not satisfies("1.2.4") }
|
636
|
-
it { should_not satisfies("1.3.0") }
|
637
|
-
end
|
638
|
-
|
639
|
-
context "when the last value in the constraint is for build with a last non-numeric identifier" do
|
640
|
-
subject { Solve::Constraint.new("#{operator} 1.2.3+build") }
|
641
|
-
|
642
|
-
it { should_not satisfies("1.2.3-alpha") }
|
643
|
-
it { should_not satisfies("1.2.3") }
|
644
|
-
it { should_not satisfies("1.2.3+5") }
|
645
|
-
it { should satisfies("1.2.3+build") }
|
646
|
-
it { should satisfies("1.2.3+build.5") }
|
647
|
-
it { should satisfies("1.2.3+preview") }
|
648
|
-
it { should satisfies("1.2.3+zzz") }
|
649
|
-
it { should_not satisfies("1.2.4-0") }
|
650
|
-
it { should_not satisfies("1.2.4") }
|
651
|
-
it { should_not satisfies("1.2.5") }
|
652
|
-
it { should_not satisfies("1.3.0") }
|
653
|
-
end
|
654
|
-
end
|
655
|
-
end
|
656
|
-
end
|
657
|
-
|
658
|
-
describe "#eql?" do
|
659
|
-
subject { Solve::Constraint.new("= 1.0.0") }
|
660
|
-
|
661
|
-
it "returns true if the other object is a Solve::Constraint with the same operator and version" do
|
662
|
-
other = Solve::Constraint.new("= 1.0.0")
|
663
|
-
subject.should eql(other)
|
664
|
-
end
|
665
|
-
|
666
|
-
it "returns false if the other object is a Solve::Constraint with the same operator and different version" do
|
667
|
-
other = Solve::Constraint.new("= 9.9.9")
|
668
|
-
subject.should_not eql(other)
|
669
|
-
end
|
670
|
-
|
671
|
-
it "returns false if the other object is a Solve::Constraint with the same version and different operator" do
|
672
|
-
other = Solve::Constraint.new("> 1.0.0")
|
673
|
-
subject.should_not eql(other)
|
674
|
-
end
|
675
|
-
|
676
|
-
it "returns false if the other object is not a Solve::Constraint" do
|
677
|
-
other = "chicken"
|
678
|
-
subject.should_not eql(other)
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
describe "#to_s" do
|
683
|
-
let(:constraint_string) { ">= 1.2.3-alpha+123" }
|
684
|
-
subject { described_class.new(constraint_string).to_s }
|
685
|
-
|
686
|
-
it { should eq(constraint_string) }
|
687
|
-
|
688
|
-
context "when the constraint does not contain a minor or patch value" do
|
689
|
-
let(:constraint_string) { "~> 1" }
|
690
|
-
it { should eq(constraint_string) }
|
691
|
-
end
|
692
|
-
|
693
|
-
context "when the constraint does not contain a patch value" do
|
694
|
-
let(:constraint_string) { "~> 1.2" }
|
695
|
-
it { should eq(constraint_string) }
|
696
|
-
end
|
697
|
-
|
698
|
-
context "when the constraint does not contain a build value" do
|
699
|
-
let(:constraint_string) { ">= 1.2.0-alpha"}
|
700
|
-
it { should eq(constraint_string) }
|
701
|
-
end
|
702
|
-
|
703
|
-
context "when the constraint contains a pre_release value" do
|
704
|
-
let(:constraint_string) { ">= 1.2.0+123"}
|
705
|
-
it { should eq(constraint_string) }
|
706
|
-
end
|
707
|
-
end
|
708
|
-
end
|