timespan 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.md +13 -5
- data/VERSION +1 -1
- data/lib/timespan.rb +52 -14
- data/spec/spec_helper.rb +0 -2
- data/spec/timespan_spec.rb +17 -0
- data/timespan.gemspec +6 -3
- metadata +20 -4
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,22 +1,30 @@
|
|
1
|
-
|
1
|
+
# Timespan
|
2
2
|
|
3
3
|
Use TimeSpans in Ruby :)
|
4
4
|
|
5
5
|
Will calculate time diff in milliseconds between to dates, then allow you to get the time difference in some time unit as a number.
|
6
6
|
|
7
7
|
```ruby
|
8
|
-
t = TimeSpan.new(Date.today, 3.days.ago)
|
8
|
+
t = TimeSpan.new(:start => Date.today, :duration => 3.days.ago)
|
9
9
|
t.to_days # => 3
|
10
10
|
t.to_weeks # => 0
|
11
11
|
t.to_secs # => 259200
|
12
12
|
t.to_hours = 10800
|
13
|
+
|
14
|
+
t = TimeSpan.new(:from => Date.today, :to => "6 weeks from now")
|
15
|
+
|
16
|
+
t = TimeSpan.new(:from => Date.today, :duration => "7 weeks 3 days")
|
17
|
+
t = TimeSpan.new(:from => 2.days.ago, :duration => "5 months and 2 weeks")
|
13
18
|
``
|
14
19
|
|
15
|
-
|
20
|
+
See specs for more examples of usage
|
21
|
+
|
22
|
+
## TODO
|
16
23
|
|
17
|
-
|
24
|
+
* use Duration for duration calculations!
|
25
|
+
* Calculate start_time and end_time based on duration if not set explicitly!
|
18
26
|
|
19
|
-
|
27
|
+
## Contributing to timespan
|
20
28
|
|
21
29
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
22
30
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/lib/timespan.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'duration'
|
2
|
+
require 'spanner'
|
2
3
|
|
3
4
|
class TimeSpan
|
5
|
+
class ParseError < StandardError; end
|
6
|
+
|
4
7
|
attr_reader :start_time, :end_time, :seconds
|
5
8
|
|
6
9
|
alias_method :start_date, :start_time
|
@@ -36,8 +39,20 @@ class TimeSpan
|
|
36
39
|
end
|
37
40
|
|
38
41
|
def duration= duration
|
39
|
-
|
40
|
-
|
42
|
+
@duration = case duration
|
43
|
+
when Duration
|
44
|
+
duration
|
45
|
+
when Integer, Hash
|
46
|
+
Duration.new duration
|
47
|
+
when String
|
48
|
+
begin
|
49
|
+
Duration.new Spanner.parse(duration.gsub /and/, '')
|
50
|
+
rescue Exception => e
|
51
|
+
raise ParseError, "Internal error: Spanner couldn't parse String '#{duration}'"
|
52
|
+
end
|
53
|
+
else
|
54
|
+
raise ArgumentError, "the duration option must be set to any of: #{valid_duration_types}"
|
55
|
+
end
|
41
56
|
refresh! unless is_new?
|
42
57
|
end
|
43
58
|
|
@@ -80,39 +95,57 @@ class TimeSpan
|
|
80
95
|
def to_milliseconds
|
81
96
|
@to_seconds ||= (seconds * 1000.0).round
|
82
97
|
end
|
83
|
-
alias_method :to_mils,
|
84
|
-
alias_method :millis,
|
98
|
+
alias_method :to_mils, :to_milliseconds
|
99
|
+
alias_method :millis, :to_mils
|
100
|
+
alias_method :milliseconds, :to_mils
|
85
101
|
|
86
102
|
def to_minutes
|
87
103
|
@to_minutes ||= (to_seconds / 60.0).round
|
88
104
|
end
|
89
105
|
alias_method :to_m, :to_minutes
|
90
106
|
alias_method :to_mins, :to_minutes
|
107
|
+
alias_method :minutes, :to_minutes
|
91
108
|
|
92
109
|
def to_hours
|
93
110
|
@to_hours ||= (to_minutes / 60.0).round
|
94
111
|
end
|
95
|
-
alias_method :to_h,
|
112
|
+
alias_method :to_h, :to_hours
|
113
|
+
alias_method :hrs, :to_hours
|
114
|
+
alias_method :hours, :to_hours
|
96
115
|
|
97
116
|
def to_days
|
98
|
-
@to_days ||= (to_hours / 24).round
|
117
|
+
@to_days ||= (to_hours / 24.0).round
|
99
118
|
end
|
100
119
|
alias_method :to_d, :to_days
|
120
|
+
alias_method :days, :to_days
|
101
121
|
|
102
122
|
def to_weeks
|
103
|
-
@to_weeks ||= (to_days / 7).round
|
123
|
+
@to_weeks ||= (to_days / 7.0).round
|
104
124
|
end
|
105
|
-
alias_method :to_w,
|
125
|
+
alias_method :to_w, :to_weeks
|
126
|
+
alias_method :weeks, :to_days
|
106
127
|
|
107
128
|
def to_months
|
108
|
-
@to_months ||= (to_days / 30).round
|
129
|
+
@to_months ||= (to_days / 30.0).round
|
109
130
|
end
|
110
131
|
alias_method :to_mon, :to_months
|
132
|
+
alias_method :months, :to_months
|
111
133
|
|
112
134
|
def to_years
|
113
135
|
@to_years ||= (to_days.to_f / 365.25).round
|
114
136
|
end
|
115
|
-
alias_method :to_y,
|
137
|
+
alias_method :to_y, :to_years
|
138
|
+
alias_method :years, :to_years
|
139
|
+
|
140
|
+
def to_decades
|
141
|
+
@to_decades ||= (to_years / 10.0).round
|
142
|
+
end
|
143
|
+
alias_method :decades, :to_decades
|
144
|
+
|
145
|
+
def to_centuries
|
146
|
+
@to_centuries ||= (to_decades / 10.0).round
|
147
|
+
end
|
148
|
+
alias_method :centuries, :to_centuries
|
116
149
|
|
117
150
|
def units
|
118
151
|
%w{seconds minutes hours days weeks months years}
|
@@ -120,13 +153,14 @@ class TimeSpan
|
|
120
153
|
|
121
154
|
protected
|
122
155
|
|
123
|
-
def set_with_options options = {}
|
156
|
+
def set_with_options options = {}
|
124
157
|
case options
|
125
158
|
when Hash
|
126
159
|
duration = options[:duration]
|
127
|
-
@start_time = options[:from]
|
128
|
-
@end_time = options[:to]
|
129
|
-
when Integer
|
160
|
+
@start_time = options[:from] || options[:start]
|
161
|
+
@end_time = options[:to] || options[:end]
|
162
|
+
when Integer, String
|
163
|
+
duration = options
|
130
164
|
else
|
131
165
|
raise ArgumentError, "Timespan must take Hash or Integer, was: #{options}"
|
132
166
|
end
|
@@ -169,6 +203,10 @@ class TimeSpan
|
|
169
203
|
set_seconds
|
170
204
|
end
|
171
205
|
|
206
|
+
def valid_duration_types
|
207
|
+
[Duration, String, Integer, Hash]
|
208
|
+
end
|
209
|
+
|
172
210
|
def valid_compare? time
|
173
211
|
valid_compare_types.any? {|type| time.kind_of? type }
|
174
212
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/timespan_spec.rb
CHANGED
@@ -30,6 +30,23 @@ describe "Timespan" do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
describe 'set duration with String' do
|
34
|
+
let(:timespan) { TimeSpan.new :from => from, :duration => "3 days" }
|
35
|
+
|
36
|
+
it 'should be 3 days' do
|
37
|
+
timespan.to_d.should == 3
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'set duration with Spanner String including and' do
|
42
|
+
let(:timespan) { TimeSpan.new :from => from, :duration => "3 days and 2 hours" }
|
43
|
+
|
44
|
+
it 'should be 3 days and 2 hrs' do
|
45
|
+
timespan.to_h.should == (24 * 3) + 2
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
33
50
|
describe 'set start_time to new' do
|
34
51
|
let(:timespan) { TimeSpan.new :from => from, :to => to }
|
35
52
|
|
data/timespan.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "timespan"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.4"
|
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"]
|
12
|
-
s.date = "2012-04-
|
12
|
+
s.date = "2012-04-30"
|
13
13
|
s.description = "Easy to calculate time distance in different units"
|
14
14
|
s.email = "kmandrup@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.homepage = "http://github.com/kristianmandrup/timespan"
|
34
34
|
s.licenses = ["MIT"]
|
35
35
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version = "1.8.
|
36
|
+
s.rubygems_version = "1.8.24"
|
37
37
|
s.summary = "Use TimeSpans in ruby"
|
38
38
|
|
39
39
|
if s.respond_to? :specification_version then
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
|
42
42
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
43
43
|
s.add_runtime_dependency(%q<chronic>, [">= 0"])
|
44
|
+
s.add_runtime_dependency(%q<spanner>, [">= 0"])
|
44
45
|
s.add_runtime_dependency(%q<ruby-duration>, [">= 0"])
|
45
46
|
s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
|
46
47
|
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
@@ -49,6 +50,7 @@ Gem::Specification.new do |s|
|
|
49
50
|
s.add_development_dependency(%q<simplecov>, [">= 0.5"])
|
50
51
|
else
|
51
52
|
s.add_dependency(%q<chronic>, [">= 0"])
|
53
|
+
s.add_dependency(%q<spanner>, [">= 0"])
|
52
54
|
s.add_dependency(%q<ruby-duration>, [">= 0"])
|
53
55
|
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
54
56
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
@@ -58,6 +60,7 @@ Gem::Specification.new do |s|
|
|
58
60
|
end
|
59
61
|
else
|
60
62
|
s.add_dependency(%q<chronic>, [">= 0"])
|
63
|
+
s.add_dependency(%q<spanner>, [">= 0"])
|
61
64
|
s.add_dependency(%q<ruby-duration>, [">= 0"])
|
62
65
|
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
63
66
|
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
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.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chronic
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: spanner
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: ruby-duration
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
174
|
version: '0'
|
159
175
|
segments:
|
160
176
|
- 0
|
161
|
-
hash:
|
177
|
+
hash: 4198297860052493168
|
162
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
179
|
none: false
|
164
180
|
requirements:
|
@@ -167,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
183
|
version: '0'
|
168
184
|
requirements: []
|
169
185
|
rubyforge_project:
|
170
|
-
rubygems_version: 1.8.
|
186
|
+
rubygems_version: 1.8.24
|
171
187
|
signing_key:
|
172
188
|
specification_version: 3
|
173
189
|
summary: Use TimeSpans in ruby
|