pub_grub 0.5.0.alpha1 → 0.5.0.alpha2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40eaa44c58fc07be35463658fd5e546ecb100c7a9f7222727f6139fcde705255
4
- data.tar.gz: 46b6c0d957a206c2c31e7f600c752b3922faeba47c8e178b4be937871f539e59
3
+ metadata.gz: e5d938331a11c5c808f24935dbecaba4ddebf099c5b511fe9d4308eedbafcf9c
4
+ data.tar.gz: 1c728638783ac576a475b29269b05d486c049b0d4725dd5fd030f95045f61390
5
5
  SHA512:
6
- metadata.gz: 3eb6abe0326f02d43cf493520df863c542037f151a993f258094353c06fe80a27f8b14122850d9f595690213394bfec45cd14a55bc74e6c320c29eb16d77fef6
7
- data.tar.gz: e300cec6c86b56eec0fe94030ea1cf7b59c150789a1e8b0dce22851fbd0f0dfb3f2713a364d7238661926efd335b8a67c47680d00bad42ca2308333d3d98542a
6
+ metadata.gz: 4ec023a28a5981e6835d5f20cee1534c05b98494c0f97638e161049f18bd9e11ee353563f0b705b119af52c318da829fe2056c773db200c09db077e674ee22eb
7
+ data.tar.gz: 88f857cbe30f1e30426fa68be1d3d293ea269e05fac2fdbcdadc83d6c928b9c9e360322da55e2ba5d0ccf512659010260cbc713787b42a0d39541db2f83e8f4e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pub_grub (0.4.3)
4
+ pub_grub (0.5.0.alpha2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -25,4 +25,4 @@ DEPENDENCIES
25
25
  stackprof (~> 0.2.12)
26
26
 
27
27
  BUNDLED WITH
28
- 1.16.4
28
+ 1.17.3
@@ -22,6 +22,15 @@ module PubGrub
22
22
  end
23
23
  end
24
24
 
25
+ def hash
26
+ cause.hash ^ terms.hash
27
+ end
28
+
29
+ def eql?(other)
30
+ cause.eql?(other.cause) &&
31
+ terms.eql?(other.terms)
32
+ end
33
+
25
34
  def failure?
26
35
  terms.empty? || (terms.length == 1 && terms[0].package == Package.root && terms[0].positive?)
27
36
  end
@@ -6,8 +6,9 @@ module PubGrub
6
6
  ranges = requirement.requirements.map do |(op, ver)|
7
7
  case op
8
8
  when "~>"
9
+ name = "~> #{ver}"
9
10
  bump = ver.class.new(ver.bump.to_s + ".A")
10
- VersionRange.new(min: ver, max: bump, include_min: true)
11
+ VersionRange.new(name: name, min: ver, max: bump, include_min: true)
11
12
  when ">"
12
13
  VersionRange.new(min: ver)
13
14
  when ">="
data/lib/pub_grub/term.rb CHANGED
@@ -18,6 +18,15 @@ module PubGrub
18
18
  end
19
19
  end
20
20
 
21
+ def hash
22
+ constraint.hash ^ positive.hash
23
+ end
24
+
25
+ def eql?(other)
26
+ positive == other.positive &&
27
+ constraint.eql?(other.constraint)
28
+ end
29
+
21
30
  def invert
22
31
  self.class.new(@constraint, !@positive)
23
32
  end
@@ -1,3 +1,3 @@
1
1
  module PubGrub
2
- VERSION = "0.5.0.alpha1"
2
+ VERSION = "0.5.0.alpha2"
3
3
  end
@@ -11,6 +11,15 @@ module PubGrub
11
11
  @range = range
12
12
  end
13
13
 
14
+ def hash
15
+ package.hash ^ range.hash
16
+ end
17
+
18
+ def eql?(other)
19
+ package.eql?(other.package) &&
20
+ range.eql?(other.range)
21
+ end
22
+
14
23
  class << self
15
24
  def exact(package, version)
16
25
  range = VersionRange.new(min: version, max: version, include_min: true, include_max: true)
@@ -19,10 +19,18 @@ module PubGrub
19
19
  true
20
20
  end
21
21
 
22
+ def eql?
23
+ other.empty?
24
+ end
25
+
22
26
  def intersects?(_)
23
27
  false
24
28
  end
25
29
 
30
+ def intersect(other)
31
+ self
32
+ end
33
+
26
34
  def allows_all?(other)
27
35
  other.empty?
28
36
  end
@@ -35,8 +43,8 @@ module PubGrub
35
43
  false
36
44
  end
37
45
 
38
- def constraints
39
- ["(no versions)"]
46
+ def to_s
47
+ "(no versions)"
40
48
  end
41
49
 
42
50
  def ==(other)
@@ -52,27 +60,33 @@ module PubGrub
52
60
  end
53
61
  end
54
62
 
63
+ EMPTY = Empty.new
64
+
55
65
  def self.empty
56
- Empty.new
66
+ EMPTY
57
67
  end
58
68
 
59
69
  def self.any
60
70
  new
61
71
  end
62
72
 
63
- def initialize(min: nil, max: nil, include_min: false, include_max: false)
73
+ def initialize(min: nil, max: nil, include_min: false, include_max: false, name: nil)
64
74
  @min = min
65
75
  @max = max
66
76
  @include_min = include_min
67
77
  @include_max = include_max
78
+ @name = name
79
+ end
68
80
 
69
- if min && max
70
- if min > max
71
- raise ArgumentError, "min version #{min} must be less than max #{max}"
72
- elsif min == max && (!include_min || !include_max)
73
- raise ArgumentError, "include_min and include_max must be true when min == max"
74
- end
75
- end
81
+ def hash
82
+ min.hash ^ max.hash ^ include_min.hash ^ include_max.hash
83
+ end
84
+
85
+ def eql?(other)
86
+ min.eql?(other.min) &&
87
+ max.eql?(other.max) &&
88
+ include_min.eql?(other.include_min) &&
89
+ include_max.eql?(other.include_max)
76
90
  end
77
91
 
78
92
  def ranges
@@ -173,7 +187,7 @@ module PubGrub
173
187
  alias_method :allows_any?, :intersects?
174
188
 
175
189
  def intersect(other)
176
- return self.class.empty unless intersects?(other)
190
+ return other if other.empty?
177
191
  return other.intersect(self) if other.is_a?(VersionUnion)
178
192
 
179
193
  min_range =
@@ -208,7 +222,19 @@ module PubGrub
208
222
  end
209
223
  end
210
224
 
211
- self.class.new(
225
+ if !min_range.equal?(max_range) && min_range.min && max_range.max
226
+ case min_range.min <=> max_range.max
227
+ when -1
228
+ when 0
229
+ if !min_range.include_min || !max_range.include_max
230
+ return EMPTY
231
+ end
232
+ when 1
233
+ return EMPTY
234
+ end
235
+ end
236
+
237
+ VersionRange.new(
212
238
  min: min_range.min,
213
239
  include_min: min_range.include_min,
214
240
  max: max_range.max,
@@ -255,7 +281,7 @@ module PubGrub
255
281
  end
256
282
  end
257
283
 
258
- self.class.new(
284
+ VersionRange.new(
259
285
  min: min_range.min,
260
286
  include_min: min_range.include_min,
261
287
  max: max_range.max,
@@ -285,7 +311,7 @@ module PubGrub
285
311
  return true if other.empty?
286
312
 
287
313
  if other.is_a?(VersionUnion)
288
- return other.ranges.all? { |r| allows_all?(r) }
314
+ return VersionUnion.new([self]).allows_all?(other)
289
315
  end
290
316
 
291
317
  return false if max && !other.max
@@ -314,21 +340,6 @@ module PubGrub
314
340
  true
315
341
  end
316
342
 
317
- def constraints
318
- return ["any"] if any?
319
- return ["#{min}"] if min == max
320
-
321
- # FIXME: remove this
322
- if min && max && include_min && !include_max && min.respond_to?(:bump) && (min.bump.to_s + ".A") == max.to_s
323
- return ["~> #{min}"]
324
- end
325
-
326
- c = []
327
- c << "#{include_min ? ">=" : ">"} #{min}" if min
328
- c << "#{include_max ? "<=" : "<"} #{max}" if max
329
- c
330
- end
331
-
332
343
  def any?
333
344
  !min && !max
334
345
  end
@@ -338,7 +349,7 @@ module PubGrub
338
349
  end
339
350
 
340
351
  def to_s
341
- constraints.join(", ")
352
+ @name ||= constraints.join(", ")
342
353
  end
343
354
 
344
355
  def inspect
@@ -367,5 +378,18 @@ module PubGrub
367
378
  include_min == other.include_min &&
368
379
  include_max == other.include_max
369
380
  end
381
+
382
+ private
383
+
384
+ def constraints
385
+ return ["any"] if any?
386
+ return ["= #{min}"] if min == max
387
+
388
+ c = []
389
+ c << "#{include_min ? ">=" : ">"} #{min}" if min
390
+ c << "#{include_max ? "<=" : "<"} #{max}" if max
391
+ c
392
+ end
393
+
370
394
  end
371
395
  end
@@ -16,6 +16,8 @@ module PubGrub
16
16
  h[k] = []
17
17
  end
18
18
 
19
+ @seen_incompatibilities = Set.new
20
+
19
21
  @solution = PartialSolution.new
20
22
 
21
23
  @package_depth = { root => 0 }
@@ -130,6 +132,12 @@ module PubGrub
130
132
  conflict = false
131
133
 
132
134
  source.incompatibilities_for(package, version).each do |incompatibility|
135
+ if @seen_incompatibilities.include?(incompatibility)
136
+ logger.debug { "knew: #{incompatibility}" }
137
+ next
138
+ end
139
+ @seen_incompatibilities.add(incompatibility)
140
+
133
141
  add_incompatibility incompatibility
134
142
 
135
143
  conflict ||= incompatibility.terms.all? do |term|
@@ -44,6 +44,14 @@ module PubGrub
44
44
  @ranges = ranges
45
45
  end
46
46
 
47
+ def hash
48
+ ranges.hash
49
+ end
50
+
51
+ def eql?(other)
52
+ ranges.eql?(other.ranges)
53
+ end
54
+
47
55
  def include?(version)
48
56
  !!ranges.bsearch {|r| r.compare_version(version) }
49
57
  end
@@ -79,12 +87,17 @@ module PubGrub
79
87
  alias_method :allows_any?, :intersects?
80
88
 
81
89
  def allows_all?(other)
82
- other_ranges = other.ranges
90
+ my_ranges = ranges.dup
91
+
92
+ my_range = my_ranges.shift
83
93
 
84
- other_ranges.all? do |other_range|
85
- ranges.any? do |range|
86
- range.allows_all?(other_range)
94
+ other.ranges.all? do |other_range|
95
+ while my_range
96
+ break if my_range.allows_all?(other_range)
97
+ my_range = my_ranges.shift
87
98
  end
99
+
100
+ !!my_range
88
101
  end
89
102
  end
90
103
 
@@ -97,10 +110,22 @@ module PubGrub
97
110
  end
98
111
 
99
112
  def intersect(other)
100
- new_ranges = ranges.map{ |r| r.intersect(other) }
101
- new_ranges = new_ranges.flat_map { |r| r.ranges }
102
- new_ranges.reject!(&:empty?)
113
+ my_ranges = ranges.dup
114
+ other_ranges = other.ranges.dup
115
+ new_ranges = []
103
116
 
117
+ my_range = my_ranges.shift
118
+ other_range = other_ranges.shift
119
+ while my_range && other_range
120
+ new_ranges << my_range.intersect(other_range)
121
+
122
+ if !my_range.max || (other_range.max && other_range.max < my_range.max)
123
+ other_range = other_ranges.shift
124
+ else
125
+ my_range = my_ranges.shift
126
+ end
127
+ end
128
+ new_ranges.reject!(&:empty?)
104
129
  VersionUnion.union(new_ranges, normalize: false)
105
130
  end
106
131
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pub_grub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0.alpha1
4
+ version: 0.5.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hawthorn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-04 00:00:00.000000000 Z
11
+ date: 2019-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  version: 1.3.1
136
136
  requirements: []
137
137
  rubyforge_project:
138
- rubygems_version: 2.7.7
138
+ rubygems_version: 2.7.6
139
139
  signing_key:
140
140
  specification_version: 4
141
141
  summary: A version solver based on dart's PubGrub