relativity 0.0.2 → 0.0.3
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/Changelog.rdoc +5 -0
- data/Guardfile +7 -0
- data/README.rdoc +11 -11
- data/TODO +16 -0
- data/lib/relativity/{relative_time.rb → day_time.rb} +8 -8
- data/lib/relativity/day_time_range.rb +6 -0
- data/lib/relativity/version.rb +1 -1
- data/lib/relativity.rb +2 -1
- data/relativity.gemspec +5 -1
- data/spec/day_time/day_time_spec.rb +79 -0
- data/spec/day_time/output_spec.rb +17 -0
- data/spec/day_time/overflow_spec.rb +56 -0
- data/spec/day_time_range/day_time_range_spec.rb +9 -0
- metadata +39 -11
- data/spec/relative_time_spec.rb +0 -147
data/Changelog.rdoc
CHANGED
data/Guardfile
ADDED
data/README.rdoc
CHANGED
@@ -3,19 +3,19 @@
|
|
3
3
|
Time, Date and DateTime classes don't have a mode for working with relative
|
4
4
|
time inside 1 day (or 1 week, 1 month, 1 quarter, etc.).
|
5
5
|
|
6
|
-
A
|
7
|
-
e.g. opening hours of a business. In a next phase,
|
8
|
-
|
6
|
+
A relative time object, relative to a day or a week, is useful to describe
|
7
|
+
e.g. opening hours of a business. In a next phase, time ranges will
|
8
|
+
be built on top, so the ranges of opening hours can be represented.
|
9
9
|
|
10
10
|
== Example
|
11
11
|
|
12
12
|
require 'relativity'
|
13
|
-
opens_at =
|
14
|
-
closes_at =
|
13
|
+
opens_at = DayTime.new(9) #=> 09:00:00
|
14
|
+
closes_at = DayTime.new(18,30) #=> 18:30:00
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
dt = DayTime.new #=> 21:17:40
|
17
|
+
dt.seconds_since_start #=> #<BigDecimal:9d35d48,'0.7666056825 7238E5',18(45)>
|
18
|
+
dt.hours #=> 21
|
19
|
+
dt.minutes #=> 17
|
20
|
+
dt.seconds #=> 40
|
21
|
+
dt.nano_seconds #=> 568257238
|
data/TODO
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Refactoring:
|
2
|
+
|
3
|
+
* make an Exception class
|
4
|
+
|
5
|
+
Features to be implemented:
|
6
|
+
|
7
|
+
week_time = WeekTime.new
|
8
|
+
week_day = WeekDay.new
|
9
|
+
|
10
|
+
day_times (array of day_time entries)
|
11
|
+
|
12
|
+
day_time_range (range of days_time entries)
|
13
|
+
week_time_range
|
14
|
+
week_day_range
|
15
|
+
|
16
|
+
ActiveRecord coupling (Aggregation ?)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
class
|
1
|
+
class DayTime
|
2
2
|
|
3
3
|
require 'bigdecimal'
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :seconds_since_start
|
6
6
|
|
7
7
|
def initialize(hours = nil, minutes = nil, seconds = nil, nano_seconds = nil)
|
8
8
|
super()
|
@@ -18,25 +18,25 @@ class RelativeTime
|
|
18
18
|
ss = t.sec
|
19
19
|
nn = t.nsec
|
20
20
|
end
|
21
|
-
@
|
21
|
+
@seconds_since_start = ((hh * 3600) + (mm * 60) + ss + BigDecimal(nn)/BigDecimal(1000000000))%(24*3600)
|
22
22
|
end
|
23
23
|
|
24
24
|
def hours
|
25
|
-
hours = Integer(@
|
26
|
-
raise "Internal ERROR in
|
25
|
+
hours = Integer(@seconds_since_start/(3600)).tap do |h|
|
26
|
+
raise "Internal ERROR in DayTime; hours is #{h}" if (h < 0 || h > 23)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def minutes
|
31
|
-
Integer(@
|
31
|
+
Integer(@seconds_since_start / 60) % 60
|
32
32
|
end
|
33
33
|
|
34
34
|
def seconds
|
35
|
-
Integer(@
|
35
|
+
Integer(@seconds_since_start) % 60
|
36
36
|
end
|
37
37
|
|
38
38
|
def nano_seconds
|
39
|
-
Integer((@
|
39
|
+
Integer((@seconds_since_start % 1) * 1000000000)
|
40
40
|
end
|
41
41
|
|
42
42
|
def to_s
|
data/lib/relativity/version.rb
CHANGED
data/lib/relativity.rb
CHANGED
data/relativity.gemspec
CHANGED
@@ -18,5 +18,9 @@ Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
# specify any dependencies here; for example:
|
20
20
|
s.add_development_dependency 'rspec', '>= 2.7'
|
21
|
-
s.
|
21
|
+
s.add_development_dependency 'guard-rspec', '>= 0.5'
|
22
|
+
if RUBY_PLATFORM.match(/linux/)
|
23
|
+
s.add_development_dependency 'rb-inotify'
|
24
|
+
s.add_development_dependency 'libnotify'
|
25
|
+
end
|
22
26
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DayTime do
|
4
|
+
|
5
|
+
it "new build a DayTime" do
|
6
|
+
lambda { subject }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
it "seconds_since_start" do
|
10
|
+
lambda { subject.seconds_since_start }.should_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it "new creates a DayTime close to now" do
|
14
|
+
rt_s = subject.seconds_since_start
|
15
|
+
t = Time.new
|
16
|
+
t_s = (t.hour*60 + t.min)*60 + t.sec + t.nsec/1E9 # seconds_since_start from Time
|
17
|
+
(((t_s-rt_s).abs+2)%(24*60*60)).should be <= 4
|
18
|
+
end
|
19
|
+
|
20
|
+
it "hours" do
|
21
|
+
(((subject.hours - Time.new.hour).abs+1)%24).should be <= 2
|
22
|
+
end
|
23
|
+
|
24
|
+
it "minutes" do
|
25
|
+
(((subject.minutes - Time.new.min).abs+1)%60).should be <= 2
|
26
|
+
end
|
27
|
+
|
28
|
+
it "seconds" do
|
29
|
+
(((subject.seconds - Time.new.sec).abs+2)%60).should be <= 4
|
30
|
+
end
|
31
|
+
|
32
|
+
it "seconds_since_start should be BigDecimal" do
|
33
|
+
subject.seconds_since_start.should be_kind_of(BigDecimal)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "hours should be Integer" do
|
37
|
+
subject.hours.should be_kind_of(Integer)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "minutes should be Integer" do
|
41
|
+
subject.minutes.should be_kind_of(Integer)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "seconds should be Integer" do
|
45
|
+
subject.seconds.should be_kind_of(Integer)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "nano_seconds should be Integer" do
|
49
|
+
subject.nano_seconds.should be_kind_of(Integer)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "new with argument hours" do
|
53
|
+
DayTime.new(10).hours.should == 10
|
54
|
+
rt = DayTime.new(20)
|
55
|
+
rt.hours.should == 20
|
56
|
+
rt.minutes.should == 0
|
57
|
+
rt.seconds.should == 0
|
58
|
+
rt.nano_seconds.should == 0
|
59
|
+
end
|
60
|
+
|
61
|
+
it "new with argument minutes" do
|
62
|
+
rt = DayTime.new(10,25)
|
63
|
+
rt.minutes.should == 25
|
64
|
+
rt.seconds.should == 0
|
65
|
+
rt.nano_seconds.should == 0
|
66
|
+
end
|
67
|
+
|
68
|
+
it "new with argument seconds" do
|
69
|
+
rt = DayTime.new(10,37,45)
|
70
|
+
rt.seconds.should == 45
|
71
|
+
rt.nano_seconds.should == 0
|
72
|
+
end
|
73
|
+
|
74
|
+
it "new with argument nano_seconds" do
|
75
|
+
rt = DayTime.new(0,23,45,457834889)
|
76
|
+
rt.nano_seconds.should == 457834889
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DayTime do
|
4
|
+
|
5
|
+
context "output" do
|
6
|
+
|
7
|
+
it "does HH:MM:SS for to_s" do
|
8
|
+
subject.to_s.should match(/\d{2}:\d{2}:\d{2}/)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "does correct hours, minutes, seconds for to_s" do
|
12
|
+
rt = DayTime.new(0,23,45,457834889)
|
13
|
+
rt.to_s.should == "00:23:45"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DayTime do
|
4
|
+
|
5
|
+
context "overflow / underflow " do
|
6
|
+
|
7
|
+
it "normalizes on overflow of hours" do
|
8
|
+
rt = DayTime.new(24,1,2,3)
|
9
|
+
rt.hours.should == 0
|
10
|
+
rt.minutes.should == 1
|
11
|
+
rt.seconds.should == 2
|
12
|
+
rt.nano_seconds.should == 3
|
13
|
+
end
|
14
|
+
|
15
|
+
it "normalizes on underflow of hours" do
|
16
|
+
rt = DayTime.new(-3,1,2,3)
|
17
|
+
rt.hours.should == 21
|
18
|
+
rt.minutes.should == 1
|
19
|
+
rt.seconds.should == 2
|
20
|
+
rt.nano_seconds.should == 3
|
21
|
+
end
|
22
|
+
|
23
|
+
it "normalizes on overflow of minutes" do
|
24
|
+
rt = DayTime.new(23,65,2,3)
|
25
|
+
rt.hours.should == 0
|
26
|
+
rt.minutes.should == 5
|
27
|
+
rt.seconds.should == 2
|
28
|
+
rt.nano_seconds.should == 3
|
29
|
+
end
|
30
|
+
|
31
|
+
it "normalizes on underflow of minutes" do
|
32
|
+
rt = DayTime.new(1,-100,2,3)
|
33
|
+
rt.hours.should == 23
|
34
|
+
rt.minutes.should == 20
|
35
|
+
rt.seconds.should == 2
|
36
|
+
rt.nano_seconds.should == 3
|
37
|
+
end
|
38
|
+
|
39
|
+
it "normalizes on overflow of nano_seconds" do
|
40
|
+
rt = DayTime.new(22,55,2,3600000000)
|
41
|
+
rt.hours.should == 22
|
42
|
+
rt.minutes.should == 55
|
43
|
+
rt.seconds.should == 5
|
44
|
+
rt.nano_seconds.should == 600000000
|
45
|
+
end
|
46
|
+
|
47
|
+
it "normalizes on underflow of nano_seconds" do
|
48
|
+
rt = DayTime.new(22,55,2,-3600000000)
|
49
|
+
rt.hours.should == 22
|
50
|
+
rt.minutes.should == 54
|
51
|
+
rt.seconds.should == 58
|
52
|
+
rt.nano_seconds.should == 400000000
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relativity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &68449760 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,18 +21,40 @@ dependencies:
|
|
21
21
|
version: '2.7'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *68449760
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: guard-rspec
|
27
|
+
requirement: &68449150 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
33
|
-
type: :
|
32
|
+
version: '0.5'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *68449150
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rb-inotify
|
38
|
+
requirement: &68448230 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *68448230
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: libnotify
|
49
|
+
requirement: &68447520 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
34
56
|
prerelease: false
|
35
|
-
version_requirements: *
|
57
|
+
version_requirements: *68447520
|
36
58
|
description: time and time_ranges relative to day, week, month, quarter etc.
|
37
59
|
email:
|
38
60
|
- peter@vandenabeele.com
|
@@ -44,14 +66,20 @@ files:
|
|
44
66
|
- .rvmrc
|
45
67
|
- Changelog.rdoc
|
46
68
|
- Gemfile
|
69
|
+
- Guardfile
|
47
70
|
- MIT-LICENSE
|
48
71
|
- README.rdoc
|
49
72
|
- Rakefile
|
73
|
+
- TODO
|
50
74
|
- lib/relativity.rb
|
51
|
-
- lib/relativity/
|
75
|
+
- lib/relativity/day_time.rb
|
76
|
+
- lib/relativity/day_time_range.rb
|
52
77
|
- lib/relativity/version.rb
|
53
78
|
- relativity.gemspec
|
54
|
-
- spec/
|
79
|
+
- spec/day_time/day_time_spec.rb
|
80
|
+
- spec/day_time/output_spec.rb
|
81
|
+
- spec/day_time/overflow_spec.rb
|
82
|
+
- spec/day_time_range/day_time_range_spec.rb
|
55
83
|
- spec/spec_helper.rb
|
56
84
|
homepage: https://github.com/petervandenabeele/relativity
|
57
85
|
licenses: []
|
data/spec/relative_time_spec.rb
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe RelativeTime do
|
4
|
-
|
5
|
-
it "new creates a RelativeTime" do
|
6
|
-
lambda { subject }.should_not raise_error
|
7
|
-
end
|
8
|
-
|
9
|
-
context "time in a day" do
|
10
|
-
|
11
|
-
it "seconds_since_midnight" do
|
12
|
-
lambda { subject.seconds_since_midnight }.should_not raise_error
|
13
|
-
end
|
14
|
-
|
15
|
-
it "new creates a RelativeTime close to now" do
|
16
|
-
rt_s = subject.seconds_since_midnight
|
17
|
-
t = Time.new
|
18
|
-
t_s = (t.hour*60 + t.min)*60 + t.sec # seconds_since_midnight from Time
|
19
|
-
(((t_s-rt_s).abs+2)%(24*60*60)).should be <= 4
|
20
|
-
end
|
21
|
-
|
22
|
-
it "hours" do
|
23
|
-
(((subject.hours - Time.new.hour).abs+1)%24).should be <= 2
|
24
|
-
end
|
25
|
-
|
26
|
-
it "minutes" do
|
27
|
-
(((subject.minutes - Time.new.min).abs+1)%60).should be <= 2
|
28
|
-
end
|
29
|
-
|
30
|
-
it "seconds" do
|
31
|
-
(((subject.seconds - Time.new.sec).abs+2)%60).should be <= 4
|
32
|
-
end
|
33
|
-
|
34
|
-
it "seconds_since_midnight should be BigDecimal" do
|
35
|
-
subject.seconds_since_midnight.should be_kind_of(BigDecimal)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "hours should be Integer" do
|
39
|
-
subject.hours.should be_kind_of(Integer)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "minutes should be Integer" do
|
43
|
-
subject.minutes.should be_kind_of(Integer)
|
44
|
-
end
|
45
|
-
|
46
|
-
it "seconds should be Integer" do
|
47
|
-
subject.seconds.should be_kind_of(Integer)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "nano_seconds should be Integer" do
|
51
|
-
subject.nano_seconds.should be_kind_of(Integer)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "new with argument hours" do
|
55
|
-
RelativeTime.new(10).hours.should == 10
|
56
|
-
rt = RelativeTime.new(20)
|
57
|
-
rt.hours.should == 20
|
58
|
-
rt.minutes.should == 0
|
59
|
-
rt.seconds.should == 0
|
60
|
-
rt.nano_seconds.should == 0
|
61
|
-
end
|
62
|
-
|
63
|
-
it "new with argument minutes" do
|
64
|
-
rt = RelativeTime.new(10,25)
|
65
|
-
rt.minutes.should == 25
|
66
|
-
rt.seconds.should == 0
|
67
|
-
rt.nano_seconds.should == 0
|
68
|
-
end
|
69
|
-
|
70
|
-
it "new with argument seconds" do
|
71
|
-
rt = RelativeTime.new(10,37,45)
|
72
|
-
rt.seconds.should == 45
|
73
|
-
rt.nano_seconds.should == 0
|
74
|
-
end
|
75
|
-
|
76
|
-
it "new with argument nano_seconds" do
|
77
|
-
rt = RelativeTime.new(0,23,45,457834889)
|
78
|
-
rt.nano_seconds.should == 457834889
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
context "overflow / underflow " do
|
84
|
-
|
85
|
-
it "normalizes on overflow of hours" do
|
86
|
-
rt = RelativeTime.new(24,1,2,3)
|
87
|
-
rt.hours.should == 0
|
88
|
-
rt.minutes.should == 1
|
89
|
-
rt.seconds.should == 2
|
90
|
-
rt.nano_seconds.should == 3
|
91
|
-
end
|
92
|
-
|
93
|
-
it "normalizes on underflow of hours" do
|
94
|
-
rt = RelativeTime.new(-3,1,2,3)
|
95
|
-
rt.hours.should == 21
|
96
|
-
rt.minutes.should == 1
|
97
|
-
rt.seconds.should == 2
|
98
|
-
rt.nano_seconds.should == 3
|
99
|
-
end
|
100
|
-
|
101
|
-
it "normalizes on overflow of minutes" do
|
102
|
-
rt = RelativeTime.new(23,65,2,3)
|
103
|
-
rt.hours.should == 0
|
104
|
-
rt.minutes.should == 5
|
105
|
-
rt.seconds.should == 2
|
106
|
-
rt.nano_seconds.should == 3
|
107
|
-
end
|
108
|
-
|
109
|
-
it "normalizes on underflow of minutes" do
|
110
|
-
rt = RelativeTime.new(1,-100,2,3)
|
111
|
-
rt.hours.should == 23
|
112
|
-
rt.minutes.should == 20
|
113
|
-
rt.seconds.should == 2
|
114
|
-
rt.nano_seconds.should == 3
|
115
|
-
end
|
116
|
-
|
117
|
-
it "normalizes on overflow of nano_seconds" do
|
118
|
-
rt = RelativeTime.new(22,55,2,3600000000)
|
119
|
-
rt.hours.should == 22
|
120
|
-
rt.minutes.should == 55
|
121
|
-
rt.seconds.should == 5
|
122
|
-
rt.nano_seconds.should == 600000000
|
123
|
-
end
|
124
|
-
|
125
|
-
it "normalizes on underflow of nano_seconds" do
|
126
|
-
rt = RelativeTime.new(22,55,2,-3600000000)
|
127
|
-
rt.hours.should == 22
|
128
|
-
rt.minutes.should == 54
|
129
|
-
rt.seconds.should == 58
|
130
|
-
rt.nano_seconds.should == 400000000
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
context "output" do
|
136
|
-
|
137
|
-
it "does HH:MM:SS for to_s" do
|
138
|
-
subject.to_s.should match(/\d{2}:\d{2}:\d{2}/)
|
139
|
-
end
|
140
|
-
|
141
|
-
it "does correct hours, minutes, seconds for to_s" do
|
142
|
-
rt = RelativeTime.new(0,23,45,457834889)
|
143
|
-
rt.to_s.should == "00:23:45"
|
144
|
-
end
|
145
|
-
|
146
|
-
end
|
147
|
-
end
|