spanner 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/spanner.rb +16 -6
- data/spec/spanner_spec.rb +5 -1
- metadata +12 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/spanner.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
1
3
|
class Spanner
|
2
4
|
|
3
5
|
ParseError = Class.new(RuntimeError)
|
4
6
|
|
5
7
|
def self.parse(str, opts = nil)
|
6
|
-
Spanner.new(
|
8
|
+
Spanner.new(opts).parse(str)
|
7
9
|
end
|
8
10
|
|
9
11
|
attr_reader :value, :raise_on_error, :from
|
10
12
|
|
11
|
-
def initialize(
|
13
|
+
def initialize(opts)
|
12
14
|
@value = value
|
13
15
|
@on_error = opts && opts.key?(:on_error) ? opts[:on_error] : :raise
|
14
|
-
|
16
|
+
@length_of_month = opts && opts[:length_of_month]
|
15
17
|
|
16
18
|
@from = if opts && opts.key?(:from)
|
17
19
|
case opts[:from]
|
@@ -25,13 +27,21 @@ class Spanner
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
30
|
+
def self.days_in_month(year, month)
|
31
|
+
(Date.new(year, 12, 31) << (12-month)).day
|
32
|
+
end
|
33
|
+
|
34
|
+
def length_of_month
|
35
|
+
@length_of_month ||= Spanner.parse("#{Spanner.days_in_month(Time.new.year, Time.new.month)} days")
|
36
|
+
end
|
37
|
+
|
28
38
|
def error(err)
|
29
39
|
if on_error == :raise
|
30
40
|
raise ParseError.new(err)
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
34
|
-
def parse
|
44
|
+
def parse(value)
|
35
45
|
parts = []
|
36
46
|
part_contextualized = nil
|
37
47
|
value.scan(/[\+\-]?(?:\d*\.\d+|\d+)|[a-z]+/i).each do |part|
|
@@ -56,13 +66,13 @@ class Spanner
|
|
56
66
|
when 'm', 'min', 'minutes' then 60
|
57
67
|
when 'd', 'days' then 86_400
|
58
68
|
when 'w', 'wks', 'weeks' then 604_800
|
59
|
-
when 'months', 'month', '
|
69
|
+
when 'months', 'month', 'M' then length_of_month
|
60
70
|
when 'years', 'y' then 31_556_926
|
61
71
|
when /\As/ then 1
|
62
72
|
when /\Am/ then 60
|
63
73
|
when /\Ah/ then 86_400
|
64
74
|
when /\Aw/ then 604_800
|
65
|
-
when /\
|
75
|
+
when /\AM/ then length_of_month
|
66
76
|
when /\Ay/ then 31_556_926
|
67
77
|
end
|
68
78
|
|
data/spec/spanner_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe Spanner do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
#simple
|
14
|
-
{ '.5s' => 0.5, '1s' => 1, '1.5s' => 1.5, '1m' => 60, '1.5m' => 90, '1d' => 86400, '1.7233312d' => 148895.81568 }.each do |input, output|
|
14
|
+
{ '.5s' => 0.5, '1s' => 1, '1.5s' => 1.5, '1m' => 60, '1.5m' => 90, '1d' => 86400, '1.7233312d' => 148895.81568, '1M' => Spanner.days_in_month(Time.new.year, Time.new.month) * 24 * 60 * 60 }.each do |input, output|
|
15
15
|
it "should parse #{input} and return #{output}" do
|
16
16
|
Spanner.parse(input).should == output
|
17
17
|
end
|
@@ -24,6 +24,10 @@ describe Spanner do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
it "should let you set the length of a month" do
|
28
|
+
Spanner.parse("4 months", :length_of_month => 1234).should == 4936
|
29
|
+
end
|
30
|
+
|
27
31
|
it "should accept time as from option" do
|
28
32
|
now = Time.new
|
29
33
|
Spanner.parse('23s', :from => now).should == now.to_i + 23
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spanner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Joshua Hull
|
@@ -9,7 +14,7 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-03
|
17
|
+
date: 2010-05-03 00:00:00 -04:00
|
13
18
|
default_executable:
|
14
19
|
dependencies: []
|
15
20
|
|
@@ -42,18 +47,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
42
47
|
requirements:
|
43
48
|
- - ">="
|
44
49
|
- !ruby/object:Gem::Version
|
50
|
+
segments:
|
51
|
+
- 0
|
45
52
|
version: "0"
|
46
|
-
version:
|
47
53
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
54
|
requirements:
|
49
55
|
- - ">="
|
50
56
|
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 0
|
51
59
|
version: "0"
|
52
|
-
version:
|
53
60
|
requirements: []
|
54
61
|
|
55
62
|
rubyforge_project:
|
56
|
-
rubygems_version: 1.3.
|
63
|
+
rubygems_version: 1.3.6
|
57
64
|
signing_key:
|
58
65
|
specification_version: 3
|
59
66
|
summary: Natural language time span parsing
|