temporal 0.4.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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ vendor/*
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :gemcutter
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,27 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ temporal (0.4.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.2)
10
+ rake (0.8.7)
11
+ rspec (2.4.0)
12
+ rspec-core (~> 2.4.0)
13
+ rspec-expectations (~> 2.4.0)
14
+ rspec-mocks (~> 2.4.0)
15
+ rspec-core (2.4.0)
16
+ rspec-expectations (2.4.0)
17
+ diff-lcs (~> 1.1.2)
18
+ rspec-mocks (2.4.0)
19
+
20
+ PLATFORMS
21
+ ruby
22
+
23
+ DEPENDENCIES
24
+ bundler (>= 1.0.0)
25
+ rake (>= 0.8.7)
26
+ rspec (>= 1.3.0)
27
+ temporal!
data/README.txt ADDED
@@ -0,0 +1,6 @@
1
+ ** THIS PROJECT IS NOT YET READY FOR USE **
2
+
3
+ Temporal is a natural language date and time parser.
4
+
5
+ source code : http://github.com/clivecrous/temporal/
6
+ home page : http://clivecrous.lighthouseapp.com/projects/13349/home
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ task :default => :test
5
+
6
+ desc "unit tests"
7
+ task :test do
8
+ exec 'cd lib && bundle exec rspec ../test/*'
9
+ end
@@ -0,0 +1,4 @@
1
+ module Temporal
2
+ class Anomaly < Exception
3
+ end
4
+ end
@@ -0,0 +1,12 @@
1
+ [Numeric,Range].each do |klass|
2
+ Temporal::Mathematics.units( klass )
3
+ Temporal::Mathematics.operators( klass )
4
+ end
5
+
6
+ [Time].each do |klass|
7
+ Temporal::Mathematics.operators( klass )
8
+ end
9
+
10
+ [Range].each do |klass|
11
+ Temporal::Mathematics.negation( klass )
12
+ end
@@ -0,0 +1,92 @@
1
+ module Temporal
2
+ module Mathematics
3
+
4
+ def self.units klass
5
+ klass.class_eval do
6
+ Temporal::Shift.units.each do |unit|
7
+ if klass == Range
8
+ define_method unit do
9
+ if exclude_end?
10
+ return Temporal::Shift.new( first, unit )...Temporal::Shift.new( last, unit )
11
+ else
12
+ return Temporal::Shift.new( first, unit )..Temporal::Shift.new( last, unit )
13
+ end
14
+ end
15
+ else
16
+ define_method unit do
17
+ Temporal::Shift.new( self, unit )
18
+ end
19
+ end
20
+ define_method "#{unit}s" do
21
+ send(unit)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.negation klass
28
+ klass.class_eval do
29
+ begin
30
+ alias :temporal_negation :-@
31
+ rescue
32
+ def temporal_negation
33
+ raise NoMethodError.new( "undefined method `-@' for #{self.to_s}:#{self.class.to_s}" )
34
+ end
35
+ end
36
+ def -@
37
+ return temporal_negation unless self.class == Temporal::Shift or self.class == Range
38
+ if exclude_end?
39
+ -first...-last
40
+ else
41
+ -first..-last
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.operators klass
48
+ klass.class_eval do
49
+ begin
50
+ alias :temporal_addition :+
51
+ rescue
52
+ def temporal_addition target
53
+ raise NoMethodError.new( "undefined method `+' for #{self.to_s}:#{self.class.to_s}" )
54
+ end
55
+ end
56
+ def + target
57
+ if target.class == Range
58
+ if self.class == Range
59
+ raise Temporal::Anomaly.new( "Missmatched Range end exclusions" ) if exclude_end? != target.exclude_end?
60
+ if target.exclude_end?
61
+ return (target.first + first)...(target.last + last)
62
+ else
63
+ return (target.first + first)..(target.last + last)
64
+ end
65
+ else
66
+ if target.exclude_end?
67
+ return (target.first + self)...(target.last + self)
68
+ else
69
+ return (target.first + self)..(target.last + self)
70
+ end
71
+ end
72
+ end
73
+ return temporal_addition( target ) unless target.class == Temporal::Shift
74
+ target + self
75
+ end
76
+
77
+ begin
78
+ alias :temporal_subtraction :-
79
+ rescue
80
+ def temporal_subtraction target
81
+ raise NoMethodError.new( "undefined method `-' for #{self.to_s}:#{self.class.to_s}" )
82
+ end
83
+ end
84
+ def - target
85
+ return temporal_subtraction( target ) unless target.class == Temporal::Shift or target.class == Range
86
+ (-target) + self
87
+ end
88
+ end
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,24 @@
1
+ module Temporal
2
+ class Parser
3
+
4
+ add_literal( /(^|\W)noe(\W|$)/i ) do
5
+ Time.now
6
+ end
7
+
8
+ add_literal( /(^|\W)vandag(\W|$)/i ) do
9
+ today_start = Time.parse(Time.now.strftime("%Y-%m-%d"))
10
+ today_start...today_start+1.day
11
+ end
12
+
13
+ add_literal( /(^|\W)gister(\W|$)/i ) do
14
+ yesterday_start = Time.parse((Time.now-1.day).strftime("%Y-%m-%d"))
15
+ yesterday_start...yesterday_start+1.day
16
+ end
17
+
18
+ add_literal( /(^|\W)more(\W|$)/i ) do
19
+ tomorrow_start = Time.parse((Time.now+1.day).strftime("%Y-%m-%d"))
20
+ tomorrow_start...tomorrow_start+1.day
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Temporal
2
+ class Parser
3
+
4
+ add_literal( /(^|\W)now(\W|$)/i ) do
5
+ Time.now
6
+ end
7
+
8
+ add_literal( /(^|\W)today(\W|$)/i ) do
9
+ today_start = Time.parse(Time.now.strftime("%Y-%m-%d"))
10
+ today_start...today_start+1.day
11
+ end
12
+
13
+ add_literal( /(^|\W)yesterday(\W|$)/i ) do
14
+ yesterday_start = Time.parse((Time.now-1.day).strftime("%Y-%m-%d"))
15
+ yesterday_start...yesterday_start+1.day
16
+ end
17
+
18
+ add_literal( /(^|\W)tomorrow(\W|$)/i ) do
19
+ tomorrow_start = Time.parse((Time.now+1.day).strftime("%Y-%m-%d"))
20
+ tomorrow_start...tomorrow_start+1.day
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ module Temporal
2
+ class Parser
3
+ @@literals = {}
4
+
5
+ def self.add_literal literal, &block
6
+ @@literals[ literal ] = block
7
+ end
8
+
9
+ def self.match? string
10
+ to_match = string.downcase.strip
11
+ @@literals.keys.each do |key|
12
+ return true if to_match =~ key
13
+ end
14
+ return false
15
+ end
16
+
17
+ def self.parse string
18
+ @@literals.keys.each do |key|
19
+ match = string.match(key)
20
+ next unless match
21
+ result = []
22
+ result << parse(match.pre_match) if match.pre_match.strip.size > 0
23
+ result << @@literals[key].call
24
+ result << parse(match.post_match) if match.post_match.strip.size > 0
25
+ result.flatten!
26
+ if result.empty?
27
+ result = nil
28
+ else
29
+ result = result.pop if result.size == 1
30
+ end
31
+ return result
32
+ end
33
+ string
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,163 @@
1
+ module Temporal
2
+ class Shift
3
+
4
+ include Comparable
5
+
6
+ MINUTE = 60
7
+ HOUR = MINUTE * 60
8
+ DAY = HOUR * 24
9
+ WEEK = DAY * 7
10
+
11
+ YEAR = 12
12
+
13
+ MAX_MONTH_DAY = %w|31 0 31 30 31 30 31 31 30 31 30 31|.map{|n|n.to_i} # Don't worry about February
14
+
15
+ attr_accessor :seconds
16
+ attr_accessor :months
17
+
18
+ def initialize amount, unit
19
+ unless self.class.unit?( unit )
20
+ raise Temporal::Anomaly.new( "Bad #{self.class}.unit type of `#{unit}' given" )
21
+ end
22
+
23
+ @seconds = 0
24
+ @months = 0
25
+
26
+ unit = unit.to_s.downcase
27
+ unit.chop! if unit[-1..-1] == 's'
28
+ unit = unit.to_sym
29
+
30
+ case unit
31
+ when :second
32
+ @seconds = amount
33
+ when :minute
34
+ @seconds = amount * MINUTE
35
+ when :hour
36
+ @seconds = amount * HOUR
37
+ when :day
38
+ @seconds = amount * DAY
39
+ when :week
40
+ @seconds = amount * WEEK
41
+ when :month
42
+ @months = amount
43
+ when :year
44
+ @months = amount * YEAR
45
+ else
46
+ raise Temporal::Anomaly.new( "Internal Error, failed to catch bad #{self.class}.unit type of `#{unit}' given" )
47
+ end
48
+ end
49
+
50
+ def <=> target
51
+ return 1 if @months > target.months
52
+ return -1 if @months < target.months
53
+ return 1 if @seconds > target.seconds
54
+ return -1 if @seconds < target.seconds
55
+ 0
56
+ end
57
+
58
+ def self.units
59
+ %w|second minute hour day week month year|
60
+ end
61
+
62
+ def self.unit? unit
63
+ (unit.to_s.strip.downcase =~ /^(#{units.join('|')})s?$/) != nil
64
+ end
65
+
66
+ def + to_be_added
67
+
68
+ if to_be_added.class == self.class
69
+ result_instance = self.class.new( @seconds + to_be_added.seconds, :seconds )
70
+ result_instance.months = @months + to_be_added.months
71
+ return result_instance
72
+ end
73
+
74
+ if to_be_added.class == Time
75
+ new_time = (to_be_added + @seconds).localtime
76
+ new_year = new_time.year+(((new_time.month-1)+months)/12)
77
+ new_month = (((new_time.month-1)+months)%12)
78
+ new_day = new_time.day
79
+ if new_month == 1
80
+ if (new_year%4 == 0 and new_year%100 != 0) or new_year%400 == 0
81
+ max_mday = 29
82
+ else
83
+ max_mday = 28
84
+ end
85
+ else
86
+ max_mday = MAX_MONTH_DAY[ new_month ];
87
+ end
88
+ new_day = max_mday if new_day > max_mday
89
+ return Time.local( new_year, new_month+1 , new_day, new_time.hour, new_time.min, new_time.sec, new_time.usec )
90
+ end
91
+
92
+ if to_be_added.class == Range
93
+ new_first = self + to_be_added.first
94
+ new_last = self + to_be_added.last
95
+ if to_be_added.exclude_end?
96
+ return new_first...new_last
97
+ else
98
+ return new_first..new_last
99
+ end
100
+ end
101
+
102
+ raise Temporal::Anomaly.new( "Unable to add #{self.class} to instances of `#{to_be_added.class}'" )
103
+ end
104
+
105
+ def -@
106
+ negated = self.class.new( -@seconds, :seconds )
107
+ negated.months = -@months
108
+ return negated
109
+ end
110
+
111
+ def - to_be_subtracted
112
+ begin
113
+ self + ( -to_be_subtracted )
114
+ rescue Exception => e
115
+ raise Temporal::Anomaly.new( "Unable to subtract an instance of #{to_be_subtracted.class} from #{self.class}" )
116
+ end
117
+ end
118
+
119
+ def to_s
120
+ result = {}
121
+
122
+ result[:months] = @months
123
+
124
+ result[:years] = (result[:months]/12).truncate
125
+ result[:months] = result[:months] - ( result[:years] * 12 )
126
+ result[:months] = result[:months].truncate if result[:months].modulo(1) == 0
127
+
128
+ result[:seconds] = @seconds
129
+
130
+ result[:weeks] = (result[:seconds] / WEEK).truncate
131
+ result[:seconds] = result[:seconds] - (result[:weeks] * WEEK)
132
+ result[:days] = (result[:seconds] / DAY).truncate
133
+ result[:seconds] = result[:seconds] - (result[:days] * DAY)
134
+ result[:hours] = (result[:seconds] / HOUR).truncate
135
+ result[:seconds] = result[:seconds] - (result[:hours] * HOUR)
136
+ result[:minutes] = (result[:seconds] / MINUTE).truncate
137
+ result[:seconds] = result[:seconds] - (result[:minutes] * MINUTE)
138
+ result[:seconds] = result[:seconds].truncate if result[:seconds].modulo(1) == 0
139
+
140
+ result = Hash[ *result.select{|unit, amount| amount != 0 }.flatten ]
141
+
142
+ string = ""
143
+
144
+ %w|years months weeks days hours minutes seconds|.each do |unit|
145
+ unit = unit.to_sym
146
+ next unless result.has_key?( unit )
147
+ string += "#{result[ unit ]} #{unit}"
148
+ string.chop! if result[ unit ].abs == 1
149
+ result.delete( unit )
150
+ break if result.size == 0
151
+ if result.size == 1
152
+ string += " and "
153
+ else
154
+ string += ", "
155
+ end
156
+ end
157
+
158
+ string
159
+ end
160
+
161
+ end
162
+
163
+ end
@@ -0,0 +1,3 @@
1
+ module Temporal
2
+ VERSION = "0.4.0"
3
+ end
data/lib/temporal.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'time'
2
+ require 'temporal/version'
3
+ require 'temporal/anomaly'
4
+ require 'temporal/shift'
5
+ require 'temporal/mathematics'
6
+ require 'temporal/helpers'
7
+ require 'temporal/parser'
data/temporal.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/temporal/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "temporal"
6
+ s.version = Temporal::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Clive Crous"]
9
+ s.email = ["clive@crous.co.za"]
10
+ s.homepage = "http://www.darkarts.co.za/temporal"
11
+ s.summary = "A natural language date and time parser"
12
+ s.description = "This project is still in early development. Only the mathematical side is complete. eg: Time.now + 3.years + 2.months"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "temporal"
16
+
17
+ s.add_development_dependency "bundler", ">= 1.0.0"
18
+ s.add_development_dependency "rspec", ">= 1.3.0"
19
+ s.add_development_dependency "rake", ">= 0.8.7"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
23
+ s.require_path = 'lib'
24
+ end
data/test/days.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'temporal'
2
+
3
+ describe 'Temporal math with days' do
4
+
5
+ before do
6
+ @context = Time.local( 1975, 05, 13, 01, 23, 45)
7
+ end
8
+
9
+ it 'should add a day' do
10
+ ( @context + 1.day ).should == Time.local( 1975, 05, 14, 01, 23, 45)
11
+ end
12
+
13
+ it 'should subtract a day' do
14
+ ( @context - 1.day ).should == Time.local( 1975, 05, 12, 01, 23, 45)
15
+ end
16
+
17
+ it 'should add days' do
18
+ ( @context + 2.days ).should == Time.local( 1975, 05, 15, 01, 23, 45)
19
+ end
20
+
21
+ it 'should subtract days' do
22
+ ( @context - 2.days ).should == Time.local( 1975, 05, 11, 01, 23, 45)
23
+ end
24
+
25
+ it 'should wrap months while adding' do
26
+ ( Time.local( 1975, 05, 31, 01, 23, 45 ) + 1.day ).should == Time.local( 1975, 06, 1, 01, 23, 45 )
27
+ end
28
+
29
+ it 'should wrap months while subtracting' do
30
+ ( Time.local( 1975, 05, 1, 01, 23, 45 ) - 1.day ).should == Time.local( 1975, 04, 30, 01, 23, 45 )
31
+ end
32
+
33
+ it 'should wrap years while adding' do
34
+ ( Time.local( 1975, 12, 31, 01, 23, 45 ) + 1.day ).should == Time.local( 1976, 01, 01, 01, 23, 45 )
35
+ end
36
+
37
+ it 'should wrap years while subtracting' do
38
+ ( Time.local( 1975, 01, 01, 01, 23, 45 ) - 1.day ).should == Time.local( 1974, 12, 31, 01, 23, 45 )
39
+ end
40
+
41
+ end
42
+
43
+ describe 'One day in other units' do
44
+ it 'is 86400 seconds' do
45
+ 1.day.should == 86400.seconds
46
+ end
47
+ it 'is 1440 minutes' do
48
+ 1.day.should == 1440.minutes
49
+ end
50
+ it 'is 24 hours' do
51
+ 1.day.should == 24.hours
52
+ end
53
+ it 'is 1/7th of a week' do
54
+ 1.day.should == (1.0/7).weeks
55
+ end
56
+ end
data/test/hours.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'temporal'
2
+
3
+ describe 'One hour in other units' do
4
+ it 'is 3600 seconds' do
5
+ 1.hour.should == 3600.seconds
6
+ end
7
+ it 'is 60 minutes' do
8
+ 1.hour.should == 60.minutes
9
+ end
10
+ it 'is 1/24th of a day' do
11
+ 1.hour.should == (1.0/24).days
12
+ end
13
+ it 'is 1/168th of a week' do
14
+ 1.hour.should == (1.0/168).weeks
15
+ end
16
+ end
17
+
data/test/minutes.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'temporal'
2
+
3
+ describe 'One minute in other units' do
4
+ it 'is 60 seconds' do
5
+ 1.minute.should == 60.seconds
6
+ end
7
+ it 'is 1/60th of an hour' do
8
+ 1.minute.should == (1.0/60).hours
9
+ end
10
+ it 'is 1/1440th of a day' do
11
+ 1.minute.should == (1.0/1440).days
12
+ end
13
+ it 'is 1/10080th of a week' do
14
+ 1.minute.should == (1.0/10080).weeks
15
+ end
16
+ end
17
+
data/test/months.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'temporal'
2
+
3
+ describe 'Temporal math with months' do
4
+
5
+ it 'should wrap years while adding' do
6
+ ( Time.local( 1975, 8, 1 ) + 5.months ).should == Time.local( 1976, 1, 1 )
7
+ end
8
+
9
+ it 'should not wrap years while adding 1 month to november' do
10
+ ( Time.local( 1975, 11, 1 ) + 1.month ).should == Time.local( 1975, 12, 1 )
11
+ end
12
+
13
+ end
14
+
15
+ describe 'One month in other units' do
16
+ it 'is 1/12th of a year' do
17
+ 1.month.should == (1.0/12).years
18
+ end
19
+ end
data/test/seconds.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'temporal'
2
+
3
+ describe 'One second in other units' do
4
+ it 'is 1/60th of a minute' do
5
+ 1.second.should == (1.0/60).minutes
6
+ end
7
+ it 'is 1/3600th of a hour' do
8
+ 1.second.should == (1.0/3600).hours
9
+ end
10
+ it 'is 1/86400th of a day' do
11
+ 1.second.should == (1.0/86400).days
12
+ end
13
+ it 'is 1/604800th of a week' do
14
+ 1.second.should == (1.0/604800).weeks
15
+ end
16
+ end
17
+
data/test/weeks.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'temporal'
2
+
3
+ describe 'One week in other units' do
4
+ it 'is 604800 seconds' do
5
+ 1.week.should == 604800.seconds
6
+ end
7
+ it 'is 10080 minutes' do
8
+ 1.week.should == 10080.minutes
9
+ end
10
+ it 'is 168 hours' do
11
+ 1.week.should == 168.hours
12
+ end
13
+ it 'is 7 days' do
14
+ 1.week.should == 7.days
15
+ end
16
+ end
data/test/years.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'temporal'
2
+
3
+ describe 'One year in other units' do
4
+ it 'is 12 months' do
5
+ 1.year.should == 12.months
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: temporal
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 4
8
+ - 0
9
+ version: 0.4.0
10
+ platform: ruby
11
+ authors:
12
+ - Clive Crous
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-18 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 0
31
+ - 0
32
+ version: 1.0.0
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 3
46
+ - 0
47
+ version: 1.3.0
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rake
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ - 8
61
+ - 7
62
+ version: 0.8.7
63
+ type: :development
64
+ version_requirements: *id003
65
+ description: "This project is still in early development. Only the mathematical side is complete. eg: Time.now + 3.years + 2.months"
66
+ email:
67
+ - clive@crous.co.za
68
+ executables: []
69
+
70
+ extensions: []
71
+
72
+ extra_rdoc_files: []
73
+
74
+ files:
75
+ - .gitignore
76
+ - Gemfile
77
+ - Gemfile.lock
78
+ - README.txt
79
+ - Rakefile
80
+ - lib/temporal.rb
81
+ - lib/temporal/anomaly.rb
82
+ - lib/temporal/helpers.rb
83
+ - lib/temporal/mathematics.rb
84
+ - lib/temporal/parser.rb
85
+ - lib/temporal/parser/afrikaans.rb
86
+ - lib/temporal/parser/english.rb
87
+ - lib/temporal/shift.rb
88
+ - lib/temporal/version.rb
89
+ - temporal.gemspec
90
+ - test/days.rb
91
+ - test/hours.rb
92
+ - test/minutes.rb
93
+ - test/months.rb
94
+ - test/seconds.rb
95
+ - test/weeks.rb
96
+ - test/years.rb
97
+ has_rdoc: true
98
+ homepage: http://www.darkarts.co.za/temporal
99
+ licenses: []
100
+
101
+ post_install_message:
102
+ rdoc_options: []
103
+
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ segments:
120
+ - 1
121
+ - 3
122
+ - 6
123
+ version: 1.3.6
124
+ requirements: []
125
+
126
+ rubyforge_project: temporal
127
+ rubygems_version: 1.3.7
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: A natural language date and time parser
131
+ test_files: []
132
+