fat_core 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cf42c04e2df2a194b2c1443f37fa544e67dc4755
4
- data.tar.gz: 4479332da5870aad790def2b520cc0054dd66f30
3
+ metadata.gz: 13a129f290fef37db1a33846fa4fa6aa183ed530
4
+ data.tar.gz: bd5f34570185d9b556a5dcf6647c6dca13b21cd6
5
5
  SHA512:
6
- metadata.gz: ce1c348abc44daae141b687597ee12ce1da0415b2a7da3d5aedbf6ec83fc62f09626912296b5ff05cb188cd42e3622e03cf45c1c0d30b59da76bb0503ad1711a
7
- data.tar.gz: 527f34537f750dbcf71764c9e2bf5c80d3f22c2f282fc76b9aac62d4e79d599ca2136a4aaeb8e484d442863a3b4ccc807ab86608c3f8fe72635f0f73cf26bc2c
6
+ metadata.gz: 9c737d705f3b176ae808319cd7dbb0870bc2aafd2685b0bc5c11e4594990f5395b1d5ae1efd0b1b18ad723bc7357af9205cbcbdbe5b75ea0b610206f1cd62f6c
7
+ data.tar.gz: 0cc5d64d64bc821ffbcb5f7ef4e13390d32788c4170f4eba7183ddbeb1e6f9f612e908d75e40f8669d326343df6e50e9617e34b0fc4bcb42dc6eff1ba9884d12
@@ -252,17 +252,20 @@ class Period
252
252
  end
253
253
 
254
254
  def intersection(other)
255
- self.to_range.intersection(other.to_range)
255
+ result = self.to_range.intersection(other.to_range)
256
+ Period.new(result.first, result.last)
256
257
  end
257
258
  alias_method :&, :intersection
258
259
 
259
260
  def union(other)
260
- self.to_range.union(other.to_range)
261
+ result = self.to_range.union(other.to_range)
262
+ Period.new(result.first, result.last)
261
263
  end
262
264
  alias_method :+, :union
263
265
 
264
266
  def difference(other)
265
- self.to_range.difference(other.to_range)
267
+ ranges = self.to_range.difference(other.to_range)
268
+ ranges.each.map{ |r| Period.new(r.first, r.last) }
266
269
  end
267
270
  alias_method :-, :difference
268
271
 
@@ -61,7 +61,7 @@ class Range
61
61
  alias_method :&, :intersection
62
62
 
63
63
  def union(other)
64
- return nil unless self.overlaps?(other)
64
+ return nil unless self.overlaps?(other) || self.contiguous?(other)
65
65
  ([self.min, other.min].min..[self.max, other.max].max)
66
66
  end
67
67
  alias_method :+, :union
@@ -70,24 +70,27 @@ class Range
70
70
  # argument from self. Because in the case where self is a superset of the
71
71
  # other range, this will result in the difference being two non-contiguous
72
72
  # ranges, this returns an array of ranges. If there is no overlap or if
73
- # self is a subset of the other range, return an empty array
73
+ # self is a subset of the other range, return an array of self
74
74
  def difference(other)
75
75
  unless max.respond_to?(:succ) && min.respond_to?(:pred) &&
76
76
  other.max.respond_to?(:succ) && other.min.respond_to?(:pred)
77
77
  raise "Range difference operation requires objects have pred and succ methods"
78
78
  end
79
- # return [] unless self.overlaps?(other)
80
- if proper_superset_of?(other)
81
- [(min..other.min.pred),
82
- (other.max.succ..max)]
83
- elsif subset_of?(other)
79
+ # return [self] unless self.overlaps?(other)
80
+ if subset_of?(other)
81
+ # (4..7) - (0..10)
84
82
  []
83
+ elsif proper_superset_of?(other)
84
+ # (4..7) - (5..5) -> [(4..4), (6..7)]
85
+ [(min..other.min.pred), (other.max.succ..max)]
85
86
  elsif overlaps?(other) && other.min <= min
87
+ # (4..7) - (2..5) -> (6..7)
86
88
  [(other.max.succ .. max)]
87
89
  elsif overlaps?(other) && other.max >= max
90
+ # (4..7) - (6..10) -> (4..5)
88
91
  [(min .. other.min.pred)]
89
92
  else
90
- []
93
+ [ self ]
91
94
  end
92
95
  end
93
96
  alias_method :-, :difference
@@ -1,7 +1,7 @@
1
1
  module FatCore
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- PATCH = 3
4
+ PATCH = 4
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
7
7
  end
@@ -305,5 +305,42 @@ describe Period do
305
305
 
306
306
  expect(Period.new('2013-11-02', '2013-12-16').chunk_sym).to eq(:irregular)
307
307
  end
308
+
309
+ it "should know its intersection with other period" do
310
+ year = Period.parse_spec('this_year')
311
+ month = Period.parse_spec('this_month')
312
+ expect(year & month).to eq(month)
313
+ expect(month & year).to eq(month)
314
+ # It should return a Period, not a Range
315
+ expect((month & year).class).to eq(Period)
316
+ end
317
+
318
+ it "should know its union with other period" do
319
+ last_month = Period.parse_spec('last_month')
320
+ month = Period.parse_spec('this_month')
321
+ expect((last_month + month).first).to eq(last_month.first)
322
+ expect((last_month + month).last).to eq(month.last)
323
+ # It should return a Period, not a Range
324
+ expect((last_month + month).class).to eq(Period)
325
+ end
326
+
327
+ it "should know its differences with other period" do
328
+ year = Period.parse_spec('this_year')
329
+ month = Period.parse_spec('this_month')
330
+ # Note: the difference operator returns an Array of Periods resulting
331
+ # from removing other from self.
332
+ expect((year - month).first)
333
+ .to eq(Period.new(year.first, month.first - 1.day))
334
+ expect((year - month).last)
335
+ .to eq(Period.new(month.last + 1.day, year.last))
336
+ # It should return an Array of Periods, not a Ranges
337
+ (year - month).each do |p|
338
+ expect(p.class).to eq(Period)
339
+ end
340
+
341
+ last_year = Period.parse_spec('last_year')
342
+ month = Period.parse_spec('this_month')
343
+ expect(last_year - month).to eq([last_year])
344
+ end
308
345
  end
309
346
  end
@@ -60,6 +60,9 @@ describe Range do
60
60
  expect(((0..10) + (5..20))).to eq((0..20))
61
61
  expect(((0..10) + (5..20))).to eq((5..20) + (0..10))
62
62
  expect(((0..10) + (10..20))).to eq((0..20))
63
+
64
+ # For discrete values, union should work on contiguous ranges
65
+ expect(((0..5) + (6..20))).to eq((0..20))
63
66
  end
64
67
 
65
68
  it "union should return nil if there is no overlap" do
@@ -93,8 +96,8 @@ describe Range do
93
96
  expect(((4..10) - (7..10)).last).to eq((4..6))
94
97
 
95
98
  # Other does not overlap
96
- expect((4..10) - (13..20)).to be_empty
97
- expect((4..10) - (1..3)).to be_empty
99
+ expect((4..10) - (13..20)).to eq([(4..10)])
100
+ expect((4..10) - (1..3)).to eq([(4..10)])
98
101
  end
99
102
  end
100
103
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fat_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel E. Doherty