timespan 0.5.5 → 0.5.6

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.
data/README.md CHANGED
@@ -324,6 +324,13 @@ dr.between?(4.days) # => true
324
324
 
325
325
  You can also use Range#intersect from *sugar-high* gem to test intersection of time ranges ;)
326
326
 
327
+ See https://github.com/kristianmandrup/sugar-high/blob/master/spec/sugar-high/range_spec.rb
328
+
329
+ ```ruby
330
+ date_range.intersect(other_date_range).should == intersecting_range
331
+ subject.intersect(other).should == nil # if no intersection
332
+ ```
333
+
327
334
  The duration range by default supports the following units: [seconds, minutes, hours, days, weeks, months, years]
328
335
 
329
336
  You can subclass the DurationRange to supply your own list of time units to fit your particular scenario.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.5
1
+ 0.5.6
@@ -8,6 +8,16 @@ class Hash
8
8
 
9
9
  def __evolve_to_duration_range__
10
10
  range = Range.new (self['from'] || self[:from]), (self['to'] || self[:to])
11
- ::DurationRange.new range, :seconds
11
+ length = self['length'] || self[:length]
12
+ clazz = case length.to_sym
13
+ when :long
14
+ ::LongDurationRange
15
+ when :short
16
+ ::ShortDurationRange
17
+ else
18
+ ::DurationRange
19
+ end
20
+
21
+ clazz.new range, (self['unit'] || self[:unit] || :seconds)
12
22
  end
13
23
  end
@@ -18,6 +18,8 @@ class TimespanRange < DelegateDecorator
18
18
  end
19
19
 
20
20
  class DurationRange < DelegateDecorator
21
+ include Comparable
22
+
21
23
  attr_accessor :unit, :range
22
24
 
23
25
  def initialize range, unit = :minutes
@@ -34,6 +36,30 @@ class DurationRange < DelegateDecorator
34
36
  @range = range
35
37
  end
36
38
 
39
+ alias_method :units, :unit
40
+
41
+ def <=> other_dur_range
42
+ min_secs = self.min
43
+ max_secs = self.max
44
+ omin_secs = other_dur_range.min
45
+ omax_secs = other_dur_range.max
46
+
47
+ # puts "self: #{self.inspect} vs #{other_dur_range.inspect} #{other_dur_range.class}"
48
+
49
+ if min_secs == omin_secs && max_secs == omax_secs
50
+ return 0
51
+ end
52
+
53
+ if min_secs < omin_secs || (min_secs == omin_secs && max_secs < omax_secs)
54
+ -1
55
+ else
56
+ 1
57
+ end
58
+ end
59
+
60
+ def length
61
+ :default
62
+ end
37
63
 
38
64
  def self.allowed_unit? unit
39
65
  allowed_units.include? unit.to_sym
@@ -55,12 +81,8 @@ class DurationRange < DelegateDecorator
55
81
  range.min.nil? ? 'no duration range' : "#{range.min} to #{range.max} #{unit}"
56
82
  end
57
83
 
58
- def __evolve_to_duration_range__
59
- self
60
- end
61
-
62
- def mongoize
63
- {:from => range.min.to_i, :to => range.max.to_i}
84
+ def time
85
+ "#{min + max} #{unit}"
64
86
  end
65
87
 
66
88
  def between? duration
@@ -73,6 +95,20 @@ class DurationRange < DelegateDecorator
73
95
  obj.total >= min && obj.total <= max
74
96
  end
75
97
 
98
+ def to_hash
99
+ {:from => range.min.to_i, :to => range.max.to_i, unit: unit.to_s, length: length.to_s}
100
+ end
101
+
102
+ def mongoize
103
+ to_hash
104
+ end
105
+
106
+ protected
107
+
108
+ def __evolve_to_duration_range__
109
+ self
110
+ end
111
+
76
112
  class << self
77
113
  # See http://mongoid.org/en/mongoid/docs/upgrading.html
78
114
 
@@ -105,6 +141,8 @@ class DurationRange < DelegateDecorator
105
141
  demongoized = case object
106
142
  when Hash
107
143
  object.__evolve_to_duration_range__
144
+ when Range
145
+ object.__evolve_to_duration_range__
108
146
  else
109
147
  raise "Unable to demongoize DurationRange from: #{object}"
110
148
  end
@@ -146,6 +184,16 @@ class DurationRange < DelegateDecorator
146
184
  end
147
185
 
148
186
  class LongDurationRange < DurationRange
187
+ # include Comparable
188
+
189
+ # def <=> other_dur_range
190
+ # super
191
+ # end
192
+
193
+ def length
194
+ :long
195
+ end
196
+
149
197
  def self.allowed_units
150
198
  [:days, :weeks, :months, :years]
151
199
  end
@@ -156,6 +204,16 @@ class LongDurationRange < DurationRange
156
204
  end
157
205
 
158
206
  class ShortDurationRange < DurationRange
207
+ # include Comparable
208
+
209
+ # def <=> other_dur_range
210
+ # super
211
+ # end
212
+
213
+ def length
214
+ :short
215
+ end
216
+
159
217
  def self.allowed_units
160
218
  [:seconds, :minutes, :hours]
161
219
  end
@@ -163,10 +221,13 @@ class ShortDurationRange < DurationRange
163
221
  def allowed_units
164
222
  ShortDurationRange.allowed_units
165
223
  end
166
- end
167
-
224
+ end
168
225
 
169
226
  class Range
227
+ def __evolve_to_duration_range__
228
+ ::DurationRange.new self, :seconds
229
+ end
230
+
170
231
  [:seconds, :minutes, :hours, :days, :weeks, :months, :years].each do |unit|
171
232
  define_method "#{unit}!" do
172
233
  time_length = ::ShortDurationRange.allowed_unit?(unit.to_sym) ? :short : :long
@@ -4,52 +4,56 @@ describe Range do
4
4
  subject { timerange }
5
5
 
6
6
  describe 'create DurationRange' do
7
- let(:range) { (1..5) }
8
- let (:timerange) { range.days }
7
+ let(:range) { (1..5) }
8
+ let (:timerange) { range.days }
9
9
 
10
10
  specify { subject.should be_a DurationRange }
11
11
 
12
- its(:min) { should be_a Fixnum }
13
- its(:max) { should be_a Fixnum }
12
+ its(:min) { should be_a Fixnum }
13
+ its(:max) { should be_a Fixnum }
14
+ its(:unit) { should == :days }
14
15
 
15
16
  specify { subject.min.should == 1.day }
16
17
  specify { subject.max.should == 5.days }
17
18
  end
18
19
 
19
20
  describe 'create ShortDurationRange with hours(:short)' do
20
- let(:range) { (1..5) }
21
- let (:timerange) { range.hours(:short) }
21
+ let(:range) { (1..5) }
22
+ let (:timerange) { range.hours(:short) }
22
23
 
23
24
  specify { subject.should be_a ShortDurationRange }
24
25
 
25
- its(:min) { should be_a Fixnum }
26
- its(:max) { should be_a Fixnum }
26
+ its(:min) { should be_a Fixnum }
27
+ its(:max) { should be_a Fixnum }
28
+ its(:unit) { should == :hours }
27
29
 
28
30
  specify { subject.min.should == 1.hour }
29
31
  specify { subject.max.should == 5.hours }
30
32
  end
31
33
 
32
34
  describe 'create LongDurationRange with weeks(:long)' do
33
- let(:range) { (1..5) }
34
- let (:timerange) { range.weeks(:long) }
35
+ let(:range) { (1..5) }
36
+ let (:timerange) { range.weeks(:long) }
35
37
 
36
38
  specify { subject.should be_a LongDurationRange }
37
39
 
38
- its(:min) { should be_a Fixnum }
39
- its(:max) { should be_a Fixnum }
40
+ its(:min) { should be_a Fixnum }
41
+ its(:max) { should be_a Fixnum }
42
+ its(:unit) { should == :weeks }
40
43
 
41
44
  specify { subject.min.should == 1.weeks }
42
45
  specify { subject.max.should == 5.weeks }
43
46
  end
44
47
 
45
48
  describe 'create LongDurationRange with weeks!' do
46
- let(:range) { (1..5) }
47
- let (:timerange) { range.weeks! }
49
+ let(:range) { (1..5) }
50
+ let (:timerange) { range.weeks! }
48
51
 
49
52
  specify { subject.should be_a LongDurationRange }
50
53
 
51
- its(:min) { should be_a Fixnum }
52
- its(:max) { should be_a Fixnum }
54
+ its(:min) { should be_a Fixnum }
55
+ its(:max) { should be_a Fixnum }
56
+ its(:unit) { should == :weeks }
53
57
 
54
58
  specify { subject.min.should == 1.weeks }
55
59
  specify { subject.max.should == 5.weeks }
@@ -18,33 +18,139 @@ describe TimeSpan do
18
18
  let(:to) { Time.now }
19
19
 
20
20
  context 'Mongoid' do
21
- describe 'DurationRange'
21
+ describe 'DurationRange' do
22
22
 
23
- let(:account) do
24
- Account.create_it! 2.days, (0..3).minutes
23
+ let(:account) do
24
+ Account.create_it! 2.days, (0..3).minutes
25
+ end
26
+
27
+ # subject.time_period.dates_end = tomorrow + 3.days
28
+ # subject.end_date = tomorrow + 3.days
29
+
30
+ context 'set start of period to tomorrow' do
31
+ before do
32
+ subject.period_start = tomorrow
33
+
34
+ puts "period: #{subject.period}"
35
+ end
36
+
37
+ it 'should set start_date to tomorrow' do
38
+ format_date(subject.period.start_date).should == format_date(tomorrow)
39
+ end
40
+ end
41
+
42
+ context 'set end of period to tomorrow + 5 days' do
43
+ before do
44
+ subject.period_end = tomorrow + 5.days
45
+ end
46
+
47
+ it 'should set start_date to tomorrow' do
48
+ format_date(subject.period.end_date).should == format_date(tomorrow + 5.days)
49
+ end
50
+ end
51
+
52
+ context 'set flex to 1-3 days' do
53
+ before do
54
+ subject.time_period.flex = (1..3).days
55
+ end
56
+
57
+ it 'should set flex duration range to a DurationRange' do
58
+ expect(subject.time_period.flex).to be_a ::DurationRange
59
+ end
60
+
61
+ it 'should set flex duration range to days' do
62
+ expect(subject.time_period.flex.unit).to eq :days
63
+ end
64
+
65
+ it 'should set flex duration to min 1 days' do
66
+ expect(subject.time_period.flex.min).to eq 1.days
67
+ end
68
+
69
+ it 'should set flex duration to max 3 days' do
70
+ expect(subject.time_period.flex.max).to eq 3.days
71
+ end
72
+ end
73
+ end
74
+
75
+ describe 'LongDurationRange' do
76
+ let(:account) do
77
+ Account.create_it! 2.days
78
+ end
79
+
80
+ before do
81
+ subject.time_period.flex = (2..3).weeks!
82
+ end
83
+
84
+ it 'should set flex duration range to a LongDurationRange' do
85
+ expect(subject.time_period.flex).to be_a ::LongDurationRange
86
+ end
87
+
88
+ it 'should set flex duration range to 2-3 weeks' do
89
+ expect(subject.time_period.flex.unit).to eq :weeks
90
+ end
91
+
92
+ it 'should set flex duration to min 2 week' do
93
+ expect(subject.time_period.flex.min).to eq 2.weeks
94
+ end
95
+
96
+ it 'should set flex duration to max 3 weeks' do
97
+ expect(subject.time_period.flex.max).to eq 3.weeks
98
+ end
25
99
  end
26
100
 
27
- describe 'set new start_date' do
101
+ describe 'ShortDurationRange' do
102
+ context 'preset to 2-4 days' do
103
+ let(:account) do
104
+ Account.create_it! 2.days, (2..4).days!
105
+ end
106
+
107
+ specify do
108
+ ((2..5).days! == (2..4).days!).should be_false
109
+ end
110
+
111
+ specify do
112
+ ((2..5).days! > (2..4).days!).should be_true
113
+ end
114
+
115
+ specify do
116
+ ((1..3).days! < (2..4).days!).should be_true
117
+ end
118
+
119
+ specify do
120
+ subject.time_period.flex.should be_a ::LongDurationRange
121
+ end
28
122
 
29
- specify do
30
- subject.period_start = tomorrow
31
- subject.period_end = tomorrow + 5.days
123
+ it 'should be set to 2-4 days time' do
124
+ expect(subject.time_period.flex.time).to eq (2..4).days!.time
125
+ end
32
126
 
33
- subject.time_period.dates_end = tomorrow + 3.days
34
- subject.end_date = tomorrow + 3.days
127
+ it 'should be set to 2-4 days' do
128
+ expect(subject.time_period.flex.to_s).to eq (2..4).days!.to_s
129
+ end
35
130
 
36
- subject.time_period.flex = (0..3).minutes
131
+ it 'should be set to min 2 days' do
132
+ expect(subject.time_period.flex.min).to eq 2.days
133
+ end
37
134
 
135
+ it 'should be set to max 4 days' do
136
+ expect(subject.time_period.flex.max).to eq 4.days
137
+ end
38
138
 
39
- # puts "time period: #{subject.time_period}"
40
-
41
- # puts "period: #{subject.period}"
139
+ context 'set to 1-4 minutes' do
140
+ before do
141
+ subject.time_period.flex = (2..3).minutes!
142
+ end
42
143
 
43
- # puts "time period"
44
- # puts "dates: #{subject.time_period.dates}"
45
- # puts "flex: #{subject.time_period.flex}"
144
+ it 'should set flex duration range to a LongDurationRange' do
145
+ expect(subject.time_period.flex).to be_a ::ShortDurationRange
146
+ end
46
147
 
47
- format_date(subject.period.start_date).should == format_date(tomorrow)
148
+ it 'should set flex duration range to 2-3 minutes' do
149
+ expect(subject.time_period.flex.unit).to eq :minutes
150
+ expect(subject.time_period.flex.min).to eq 2.minutes
151
+ expect(subject.time_period.flex.max).to eq 3.minutes
152
+ end
153
+ end
48
154
  end
49
155
  end
50
156
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "timespan"
8
- s.version = "0.5.5"
8
+ s.version = "0.5.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kristian Mandrup"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timespan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -293,7 +293,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
293
293
  version: '0'
294
294
  segments:
295
295
  - 0
296
- hash: -910273826810424952
296
+ hash: -3092894469197231264
297
297
  required_rubygems_version: !ruby/object:Gem::Requirement
298
298
  none: false
299
299
  requirements: