nostradamus 0.0.3 → 1.0.0
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.
- checksums.yaml +7 -0
- data/.travis.yml +4 -0
- data/README.md +65 -0
- data/lib/nostradamus.rb +58 -23
- data/lib/nostradamus/version.rb +2 -2
- data/nostradamus.gemspec +6 -1
- data/spec/nostradamus/nostradamus_spec.rb +188 -11
- data/spec/spec_helper.rb +9 -6
- metadata +44 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1e44655ec1d07f8c31bd5e13ca94463fde2f53b7
|
4
|
+
data.tar.gz: e97a83425711798b33ea9382471003fe76f42801
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 53b96a266aba5b9d3061da6bf437a2d4c76b6dc4ef7718636344e1445f91f28cec0a162faaba1c95c9b6eae8dae77619787e322a695e16dbeec87aade40d344d
|
7
|
+
data.tar.gz: a6e9ba4c41d4b4fdd75c96385a8adf8a3eca964bc2ab7c2f27ec88b9d39fcbf3be83c1d1b2127fd824ab9a7e75a99b73897df4ecaab65e4f38b05ca6fad74e17
|
data/.travis.yml
ADDED
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#The Nostradamus gem
|
2
|
+
|
3
|
+
You can parse human time to seconds or convert seconds to human time.
|
4
|
+
|
5
|
+
## Install nostradamus gem
|
6
|
+
|
7
|
+
Add `nostradamus` in Gemfile and run `bundle install`.
|
8
|
+
|
9
|
+
gem "nostradamus"
|
10
|
+
|
11
|
+
Or only execute `gem install nostradamus` on terminal.
|
12
|
+
|
13
|
+
## How to use
|
14
|
+
|
15
|
+
### Human time to seconds:
|
16
|
+
```
|
17
|
+
Nostradamus.parse("10:00") # => 36000
|
18
|
+
Nostradamus.parse("10:00:00") # => 36000
|
19
|
+
```
|
20
|
+
|
21
|
+
### Seconds to human time:
|
22
|
+
```
|
23
|
+
Nostradamus.humanize(36000, :short) # => "10:00"
|
24
|
+
Nostradamus.humanize(36000) # => "10:00:00"
|
25
|
+
```
|
26
|
+
|
27
|
+
### Sum with seconds
|
28
|
+
```
|
29
|
+
time = Nostradamus.new("12:00") + 60
|
30
|
+
time.to_i # => 43260
|
31
|
+
time.to_s # => "12:01:00"
|
32
|
+
time.to_s(:short) # => "12:01"
|
33
|
+
```
|
34
|
+
|
35
|
+
### Sum with another Nostradamus instance
|
36
|
+
```
|
37
|
+
time = Nostradamus.new("12:00") + Nostradamus.new(60)
|
38
|
+
time.to_i # => 43260
|
39
|
+
time.to_s # => "12:01:00"
|
40
|
+
time.to_s(:short) # => "12:01"
|
41
|
+
```
|
42
|
+
|
43
|
+
### Compare times
|
44
|
+
```
|
45
|
+
Nostradamus.new("12:00") == 43260
|
46
|
+
Nostradamus.new("00:01:00") == Nostradamus.new(60)
|
47
|
+
```
|
48
|
+
|
49
|
+
### Returning a Time object
|
50
|
+
```
|
51
|
+
Nostradamus.new("12:00").to_time # => Returns a object: Time.new(CURRENT_YEAR, CURRENT_MONTH, CURRENT_DAY, 12, 0)
|
52
|
+
Nostradamus.new("12:00").to_time(:on => Date.new(2012, 5, 1)) # => Returns a object: Time.new(2012, 5, 1, 12, 0)
|
53
|
+
```
|
54
|
+
|
55
|
+
## Contributions
|
56
|
+
|
57
|
+
If you want contribute, please:
|
58
|
+
|
59
|
+
* Fork the project.
|
60
|
+
* Make your feature addition or bug fix.
|
61
|
+
* Send me a pull request on Github.
|
62
|
+
|
63
|
+
## Code Status
|
64
|
+
|
65
|
+
[](https://travis-ci.org/caironoleto/nostradamus)
|
data/lib/nostradamus.rb
CHANGED
@@ -1,42 +1,77 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
class Nostradamus
|
3
4
|
HOURS_REGEX = /^([0-9]*):.*/
|
4
5
|
MINUTES_REGEX = /[0-9]*:([0-9]*).*/
|
5
6
|
SECONDS_REGEX = /[0-9]*:[0-9]*:([0-9]*)/
|
6
7
|
|
7
|
-
def parse(human_time)
|
8
|
+
def self.parse(human_time)
|
8
9
|
if human_time
|
9
|
-
|
10
|
+
new(human_time).to_i
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
def humanize(seconds, format = nil)
|
14
|
+
def self.humanize(seconds, format = nil)
|
14
15
|
if seconds
|
15
|
-
|
16
|
+
new(seconds).to_s(format)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
+
def initialize(time)
|
21
|
+
@time = time
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(value)
|
25
|
+
to_i == self.class.new(value).to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
def +(value)
|
29
|
+
self.class.new(time_in_seconds + value.to_i)
|
30
|
+
end
|
31
|
+
|
32
|
+
def <(value)
|
33
|
+
to_i < self.class.new(value).to_i
|
34
|
+
end
|
35
|
+
|
36
|
+
def >(value)
|
37
|
+
to_i > self.class.new(value).to_i
|
38
|
+
end
|
20
39
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
if params[:format] && params[:format] == :short
|
33
|
-
"#{hours}:#{"%02d" % minutes}"
|
34
|
-
else
|
35
|
-
"#{hours}:#{"%02d" % minutes}:#{"%02d" % seconds}"
|
36
|
-
end
|
40
|
+
def to_i
|
41
|
+
time_in_seconds
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_s(format = nil)
|
45
|
+
hours, minutes, seconds = extract_time_from_seconds(time_in_seconds)
|
46
|
+
|
47
|
+
if format == :short
|
48
|
+
"#{hours}:#{"%02d" % minutes}"
|
49
|
+
else
|
50
|
+
"#{hours}:#{"%02d" % minutes}:#{"%02d" % seconds}"
|
37
51
|
end
|
38
52
|
end
|
39
53
|
|
54
|
+
def to_time(params = {})
|
55
|
+
date = params[:on] || Date.today
|
56
|
+
hours, minutes, seconds = extract_time_from_seconds(time_in_seconds)
|
57
|
+
|
58
|
+
Time.zone.local(date.year, date.month, date.day, hours, minutes)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def time_in_seconds
|
64
|
+
@seconds ||= if @time.is_a?(String)
|
65
|
+
hours = extract_hours_from_human_time(@time)
|
66
|
+
minutes = extract_minutes_from_human_time(@time)
|
67
|
+
seconds = extract_seconds_from_human_time(@time)
|
68
|
+
|
69
|
+
(hours * 3600) + (minutes * 60) + (seconds)
|
70
|
+
else
|
71
|
+
@time
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
40
75
|
def extract_hours_from_human_time(time)
|
41
76
|
time.match(HOURS_REGEX)
|
42
77
|
matched($1)
|
data/lib/nostradamus/version.rb
CHANGED
data/nostradamus.gemspec
CHANGED
@@ -17,5 +17,10 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
gem.version = Nostradamus::Version::STRING
|
19
19
|
|
20
|
-
gem.
|
20
|
+
gem.required_ruby_version = '>= 2.2'
|
21
|
+
|
22
|
+
gem.add_dependency 'activesupport', '>= 5.0.0'
|
23
|
+
gem.add_dependency 'tzinfo', '>= 0.3.33'
|
24
|
+
|
25
|
+
gem.add_development_dependency 'rspec', '>= 3.5.0'
|
21
26
|
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'nostradamus'
|
3
2
|
|
4
3
|
describe Nostradamus do
|
5
|
-
context "
|
4
|
+
context "#parse" do
|
6
5
|
it "should parse human time to seconds" do
|
7
|
-
described_class.parse("12:00").
|
8
|
-
described_class.parse("12:00:00").
|
9
|
-
described_class.parse("12:15").
|
10
|
-
described_class.parse("12:15:15").
|
6
|
+
expect(described_class.parse("12:00")).to eq 43200
|
7
|
+
expect(described_class.parse("12:00:00")).to eq 43200
|
8
|
+
expect(described_class.parse("12:15")).to eq 44100
|
9
|
+
expect(described_class.parse("12:15:15")).to eq 44115
|
11
10
|
end
|
12
11
|
|
13
12
|
it "should not raise error without value" do
|
@@ -17,12 +16,12 @@ describe Nostradamus do
|
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
|
-
context "
|
19
|
+
context "#humanize" do
|
21
20
|
it "should convert seconds to human time" do
|
22
|
-
described_class.humanize(43200, :short).
|
23
|
-
described_class.humanize(44100).
|
24
|
-
described_class.humanize(44115).
|
25
|
-
described_class.humanize(44115, :short).
|
21
|
+
expect(described_class.humanize(43200, :short)).to eq "12:00"
|
22
|
+
expect(described_class.humanize(44100)).to eq "12:15:00"
|
23
|
+
expect(described_class.humanize(44115)).to eq "12:15:15"
|
24
|
+
expect(described_class.humanize(44115, :short)).to eq "12:15"
|
26
25
|
end
|
27
26
|
|
28
27
|
it "should not raise error without value" do
|
@@ -31,4 +30,182 @@ describe Nostradamus do
|
|
31
30
|
}.to_not raise_error
|
32
31
|
end
|
33
32
|
end
|
33
|
+
|
34
|
+
context "convert human time to seconds" do
|
35
|
+
it "should compare human time to seconds" do
|
36
|
+
expect(described_class.new("12:00")).to eq 43200
|
37
|
+
expect(described_class.new("12:00:00")).to eq 43200
|
38
|
+
expect(described_class.new("12:15")).to eq 44100
|
39
|
+
expect(described_class.new("12:15:15")).to eq 44115
|
40
|
+
end
|
41
|
+
|
42
|
+
context "less (<)" do
|
43
|
+
it "should be less than 44115 seconds" do
|
44
|
+
expect(described_class.new("12:00")).to be < 44115
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not be less than" do
|
48
|
+
expect(described_class.new("12:00")).to_not be < 40115
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "greater (<)" do
|
53
|
+
it "should be greater than" do
|
54
|
+
expect(described_class.new("12:00")).to be > 40115
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not be greater than" do
|
58
|
+
expect(described_class.new("12:00")).to_not be > 44115
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "#to_i" do
|
63
|
+
it "should return seconds" do
|
64
|
+
expect(described_class.new("12:15:15").to_i).to eq 44115
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "#to_s" do
|
69
|
+
subject do
|
70
|
+
described_class.new("12:00")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return formatted time with seconds" do
|
74
|
+
expect(subject.to_s).to eq "12:00:00"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return short formatted time" do
|
78
|
+
expect(subject.to_s(:short)).to eq "12:00"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "sum seconds" do
|
83
|
+
let :time do
|
84
|
+
described_class.new("12:00") + 60
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should be a instance of Nostradamus" do
|
88
|
+
expect(time).to be_instance_of Nostradamus
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should sum 60 seconds" do
|
92
|
+
expect(time).to eq 43260
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "sum with another Nostradamus instance" do
|
97
|
+
let :time do
|
98
|
+
described_class.new("12:00") + described_class.new("00:00:60")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should be a instance of Nostradamus" do
|
102
|
+
expect(time).to be_instance_of Nostradamus
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should sum 60 seconds" do
|
106
|
+
expect(time).to eq 43260
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "convert seconds to human time" do
|
112
|
+
it "should compare seconds to human time" do
|
113
|
+
expect(described_class.new(43200)).to eq "12:00"
|
114
|
+
expect(described_class.new(44100)).to eq "12:15:00"
|
115
|
+
expect(described_class.new(44100)).to eq "12:15"
|
116
|
+
expect(described_class.new(44115)).to eq "12:15:15"
|
117
|
+
end
|
118
|
+
|
119
|
+
context "less (<)" do
|
120
|
+
it "should be less than 44115 seconds" do
|
121
|
+
expect(described_class.new(43200)).to be < 44115
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should not be less than" do
|
125
|
+
expect(described_class.new(43200)).to_not be < 40115
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "greater (<)" do
|
130
|
+
it "should be greater than" do
|
131
|
+
expect(described_class.new(43200)).to be > 40115
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should not be greater than" do
|
135
|
+
expect(described_class.new(43200)).to_not be > 44115
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "#to_i" do
|
140
|
+
it "should return seconds" do
|
141
|
+
expect(described_class.new(44115).to_i).to eq 44115
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "#to_s" do
|
146
|
+
subject do
|
147
|
+
described_class.new(44115)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should return formatted time with seconds" do
|
151
|
+
expect(subject.to_s).to eq "12:15:15"
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should return short formatted time" do
|
155
|
+
expect(subject.to_s(:short)).to eq "12:15"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context "sum seconds" do
|
160
|
+
let :time do
|
161
|
+
described_class.new(43200) + 60
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should be a instance of Nostradamus" do
|
165
|
+
expect(time).to be_instance_of Nostradamus
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should sum 60 seconds" do
|
169
|
+
expect(time).to eq 43260
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "sum with another Nostradamus instance" do
|
174
|
+
let :time do
|
175
|
+
described_class.new(43200) + described_class.new(60)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should be a instance of Nostradamus" do
|
179
|
+
expect(time).to be_instance_of Nostradamus
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should sum 60 seconds" do
|
183
|
+
expect(time).to eq 43260
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "convert seconds to time object" do
|
189
|
+
context "without a base date" do
|
190
|
+
let :today do
|
191
|
+
Date.today
|
192
|
+
end
|
193
|
+
|
194
|
+
it "return a today time object" do
|
195
|
+
expect(described_class.new(43200).to_time).to eq Time.zone.local(today.year, today.month, today.day, 12, 0)
|
196
|
+
expect(described_class.new("12:00").to_time).to eq Time.zone.local(today.year, today.month, today.day, 12, 0)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context "with a base date" do
|
201
|
+
let :date do
|
202
|
+
Date.new(2012, 10, 1)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "uses a date to return a time object" do
|
206
|
+
expect(described_class.new(43200).to_time(:on => date)).to eq Time.zone.local(date.year, date.month, date.day, 12, 0)
|
207
|
+
expect(described_class.new("12:00").to_time(:on => date)).to eq Time.zone.local(date.year, date.month, date.day, 12, 0)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
34
211
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'active_support'
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
require 'tzinfo'
|
5
|
+
|
6
|
+
require 'nostradamus'
|
7
|
+
|
8
|
+
Time.zone = 'Pacific Time (US & Canada)'
|
9
|
+
|
7
10
|
RSpec.configure do |config|
|
8
11
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
12
|
config.run_all_when_everything_filtered = true
|
metadata
CHANGED
@@ -1,32 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nostradamus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Cairo Noleto
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-08-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: tzinfo
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.33
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.33
|
14
41
|
- !ruby/object:Gem::Dependency
|
15
42
|
name: rspec
|
16
43
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
44
|
requirements:
|
19
|
-
- -
|
45
|
+
- - ">="
|
20
46
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
47
|
+
version: 3.5.0
|
22
48
|
type: :development
|
23
49
|
prerelease: false
|
24
50
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
51
|
requirements:
|
27
|
-
- -
|
52
|
+
- - ">="
|
28
53
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
54
|
+
version: 3.5.0
|
30
55
|
description: Time calculation
|
31
56
|
email:
|
32
57
|
- caironoleto@gmail.com
|
@@ -34,9 +59,11 @@ executables: []
|
|
34
59
|
extensions: []
|
35
60
|
extra_rdoc_files: []
|
36
61
|
files:
|
37
|
-
- .gitignore
|
38
|
-
- .rspec
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
39
65
|
- Gemfile
|
66
|
+
- README.md
|
40
67
|
- lib/nostradamus.rb
|
41
68
|
- lib/nostradamus/version.rb
|
42
69
|
- nostradamus.gemspec
|
@@ -44,27 +71,26 @@ files:
|
|
44
71
|
- spec/spec_helper.rb
|
45
72
|
homepage: https://github.com/caironoleto/nostradamus
|
46
73
|
licenses: []
|
74
|
+
metadata: {}
|
47
75
|
post_install_message:
|
48
76
|
rdoc_options: []
|
49
77
|
require_paths:
|
50
78
|
- lib
|
51
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
80
|
requirements:
|
54
|
-
- -
|
81
|
+
- - ">="
|
55
82
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
83
|
+
version: '2.2'
|
57
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
85
|
requirements:
|
60
|
-
- -
|
86
|
+
- - ">="
|
61
87
|
- !ruby/object:Gem::Version
|
62
88
|
version: '0'
|
63
89
|
requirements: []
|
64
90
|
rubyforge_project:
|
65
|
-
rubygems_version:
|
91
|
+
rubygems_version: 2.5.1
|
66
92
|
signing_key:
|
67
|
-
specification_version:
|
93
|
+
specification_version: 4
|
68
94
|
summary: Time calculation
|
69
95
|
test_files:
|
70
96
|
- spec/nostradamus/nostradamus_spec.rb
|