time_interval 0.1.1 → 0.1.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -1,9 +1,9 @@
1
1
  class TimeInterval
2
2
  # == Constants ============================================================
3
3
 
4
- MASK = (0..30).to_a.collect { |i| (1 << 31) - (1 << (30 - i)) }.freeze
4
+ MASK = (0..30).to_a.collect { |i| (1 << 31) - (1 << (31 - i)) }.freeze
5
5
 
6
- DEFAULT_SCALE = (0..30).to_a.collect { |i| [ i, MASK[i] ] }.freeze
6
+ DEFAULT_SCALE = (0..30).to_a.collect { |i| [ MASK[i], 2 ** i ] }.freeze
7
7
  DEFAULT_SCALE_NAME = (0..30).to_a.freeze
8
8
 
9
9
  # == Class Methods ========================================================
@@ -21,13 +21,18 @@ class TimeInterval
21
21
 
22
22
  scale_defn = { }
23
23
  scale_factor = 1
24
+ mask_offset = 0
24
25
 
25
26
  definition.each_with_index do |element, i|
26
27
  case (i % 2)
27
28
  when 0
28
29
  scale_factor *= element
29
30
  when 1
30
- scale_defn[element] = [ MASK[scale_defn.length], scale_factor ]
31
+ unless (scale_factor == 1)
32
+ mask_offset += 1
33
+ end
34
+
35
+ scale_defn[element] = [ MASK[mask_offset], scale_factor ]
31
36
  scale_name_defn << element
32
37
  end
33
38
  end
@@ -111,7 +116,11 @@ class TimeInterval
111
116
  else
112
117
  scale_details = self.class.scale[at_scale]
113
118
 
114
- -(scale_details[0] | (@time / scale_details[1]))
119
+ if (scale_details[1] == 1)
120
+ @time
121
+ else
122
+ -(scale_details[0] | (@time / scale_details[1]))
123
+ end
115
124
  end
116
125
  end
117
126
  end
@@ -9,6 +9,12 @@ class TestTimeInterval < Test::Unit::TestCase
9
9
  interval = TimeInterval.new
10
10
 
11
11
  assert_equal interval.to_i, Time.now.to_i
12
+
13
+ assert_equal interval.to_i, interval.to_i(0)
14
+ assert_equal -(TimeInterval::MASK[1] | interval.to_i / 2), interval.to_i(1)
15
+ assert_equal -(TimeInterval::MASK[2] | interval.to_i / 4), interval.to_i(2)
16
+ assert_equal -(TimeInterval::MASK[3] | interval.to_i / 8), interval.to_i(3)
17
+ assert_equal -(TimeInterval::MASK[4] | interval.to_i / 16), interval.to_i(4)
12
18
  end
13
19
 
14
20
  def test_custom_interval
@@ -47,7 +53,12 @@ class TestTimeInterval < Test::Unit::TestCase
47
53
 
48
54
  # Different interval slices can be obtained by passing in the name from
49
55
  # the definition.
50
- assert_equal -(TimeInterval::MASK[0] | seconds), interval.to_i(:second)
56
+
57
+ # A 1:1 scaling does not have a mask and is simply represented as-is
58
+ assert_equal seconds, interval.to_i(:second)
59
+
60
+ # All other scaling factors have a reduction, so they need to be masked
61
+ # to indicate which scale level is used.
51
62
  assert_equal -(TimeInterval::MASK[1] | minutes), interval.to_i(:minute)
52
63
  assert_equal -(TimeInterval::MASK[2] | hours), interval.to_i(:hour)
53
64
  assert_equal -(TimeInterval::MASK[3] | days), interval.to_i(:day)
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{time_interval}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["tadman"]
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - tadman