timelord 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010 halogenandtoast
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,26 @@
1
+ =Timelord
2
+
3
+ Timelord parses dates out of strings. The string itself can contain non-date text - for instance: "Call Matt on Tuesday"
4
+ will return a date object for the upcoming Tuesday.
5
+
6
+ ==Usage
7
+
8
+ require 'timelord'
9
+ Timelord.parse("Tuesday").to_s # "2011-01-04"
10
+ Timelord.parse("On Tuesday go for a walk").to_s # "2011-01-04"
11
+
12
+ For more examples, check out the spec[https://github.com/halogenandtoast/timelord/blob/master/spec/timelord_spec.rb]
13
+
14
+ ==Date format
15
+
16
+ The default date format is the international format. 11/01 is January 11th.
17
+
18
+ To use the american date format pass in :american as the second parameter
19
+
20
+ Timelord.parse("11/01").to_s # "2011-01-11"
21
+ Timelord.parse("11/01", :american) # "2011-11-01"
22
+
23
+ ==In the future
24
+
25
+ As of version 0.0.1 all dates without a year automatically choose the next occurrence of that date. If there is demand
26
+ for the ability to retrieve previous dates, then the functionality will be added.
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rake'
2
2
  require 'spec/rake/spectask'
3
3
  require 'rake/rdoctask'
4
- require 'yaml'
4
+ require 'rake/gempackagetask'
5
5
 
6
6
  Spec::Rake::SpecTask.new do |t|
7
7
  t.spec_files = FileList['spec/**/*_spec.rb']
@@ -10,24 +10,11 @@ end
10
10
  task :default => [:test]
11
11
  task :test => [:spec]
12
12
 
13
- PKG_FILES = %w(Rakefile) + Dir.glob("{lib}/**/*")
14
-
15
- gem_spec = Gem::Specification.new do |spec|
16
- spec.name = 'timelord'
17
- spec.version = '0.0.3'
18
- spec.summary = 'Pull dates out of strings'
19
- spec.description = 'Pull dates out of strings.'
20
- spec.email = 'halogenandtoast@gmail.com'
21
- spec.homepage = 'http://github.com/halogenandtoast/timelord'
22
- spec.authors = ['Matthew Mongeau']
23
- spec.files = PKG_FILES
24
- end
25
-
26
- desc "Generate a gemspec file"
27
- task :gemspec do
28
- File.open("#{gem_spec.name}.gemspec", "w") do |f|
29
- f.write gem_spec.to_yaml
30
- end
13
+ specification = Gem::Specification.load("timelord.gemspec")
14
+ desc 'Package gem'
15
+ Rake::GemPackageTask.new(specification) do |package|
16
+ package.need_zip = true
17
+ package.need_tar = true
31
18
  end
32
19
 
33
20
  desc 'Generate documentation'
data/lib/timelord.rb CHANGED
@@ -6,7 +6,8 @@ class Timelord
6
6
  SHORT_MATCHER = SHORT_MONTHS.join('|').freeze
7
7
  ORDINAL_MATCHER = "st|nd|rd|th".freeze
8
8
  DAY_NAMES = %w(monday tuesday wednesday thursday friday saturday sunday).freeze
9
- DAY_MATCHER = DAY_NAMES.join('|').freeze
9
+ SHORT_DAY_NAMES = %w(mon tue wed thu fri sat sun).freeze
10
+ DAY_MATCHER = (DAY_NAMES + SHORT_DAY_NAMES).join('|').freeze
10
11
 
11
12
  # Parses a date str. Second parameter switches between international and american date formats.
12
13
  #
@@ -44,34 +45,54 @@ class Timelord
44
45
  date = Date.civil(today.year, today.month, $1.to_i)
45
46
  set_to_future(date)
46
47
  elsif str =~/next (#{DAY_MATCHER})/i
47
- current_date = today.strftime("%A").downcase
48
- current_index = DAY_NAMES.index(current_date)
49
- expected_index = DAY_NAMES.index($1.downcase)
50
- if expected_index <= current_index
51
- today + (7 - current_index + expected_index) + 7
52
- else
53
- diff = expected_index - current_index
54
- today + diff + 7
55
- end
48
+ expected_index = DAY_NAMES.index($1.downcase) || SHORT_DAY_NAMES.index($1.downcase)
49
+ next_weekday(expected_index)
50
+ elsif str =~/next tues/
51
+ next_weekday(DAY_NAMES.index("tue"))
52
+ elsif str =~/next (thur|thurs)/
53
+ next_weekday(DAY_NAMES.index("tue"))
56
54
  elsif str =~/(#{DAY_MATCHER})/i
57
- current_date = today.strftime("%A").downcase
58
- current_index = DAY_NAMES.index(current_date)
59
- expected_index = DAY_NAMES.index($1.downcase)
60
- if expected_index <= current_index
61
- today + (7 - current_index + expected_index)
62
- else
63
- diff = expected_index - current_index
64
- today + diff
65
- end
66
- elsif str =~ /today/i
55
+ expected_index = DAY_NAMES.index($1.downcase) || SHORT_DAY_NAMES.index($1.downcase)
56
+ current_weekday(expected_index)
57
+ elsif str =~/tues/
58
+ current_weekday(DAY_NAMES.index("tue"))
59
+ elsif str =~/(thur|thurs)/
60
+ current_weekday(DAY_NAMES.index("tue"))
61
+ elsif str =~ /(today|tod)/i
67
62
  today
68
- elsif str =~ /tomorrow/i
63
+ elsif str =~ /(tomorrow|tom)/i
69
64
  today + 1
70
65
  end
71
66
  end
72
67
 
73
68
  private
74
69
 
70
+ def self.today
71
+ Date.today
72
+ end
73
+
74
+ def self.next_weekday(date_index)
75
+ current_date = today.strftime("%A").downcase
76
+ current_index = DAY_NAMES.index(current_date)
77
+ if date_index <= current_index
78
+ today + (7 - current_index + date_index) + 7
79
+ else
80
+ diff = date_index - current_index
81
+ today + diff + 7
82
+ end
83
+ end
84
+
85
+ def self.current_weekday(date_index)
86
+ current_date = today.strftime("%A").downcase
87
+ current_index = DAY_NAMES.index(current_date)
88
+ if date_index <= current_index
89
+ today + (7 - current_index + date_index)
90
+ else
91
+ diff = date_index - current_index
92
+ today + diff
93
+ end
94
+ end
95
+
75
96
  def self.set_to_future(date)
76
97
  today = Date.today
77
98
  if date && date < today
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'timelord'
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'timecop'
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe Timelord, 'parse' do
4
+ before do
5
+ local_time = Time.local(2010,12,1,10,5,0)
6
+ Timecop.freeze(local_time)
7
+ end
8
+
9
+ it "returns nil when no time is present" do
10
+ Timelord.parse("No time here").should == nil
11
+ end
12
+
13
+ it "parses 'today'" do
14
+ Timelord.parse("I need to do something today.").should == Date.today
15
+ end
16
+
17
+ it "parses 'tod'" do
18
+ Timelord.parse("I need to do something tod.").should == Date.today
19
+ end
20
+
21
+ it "parses 'tomorrow'" do
22
+ tomorrow = Date.today + 1
23
+ Timelord.parse("I need to do something tomorrow.").should == tomorrow
24
+ end
25
+
26
+ it "parses 'tom'" do
27
+ tomorrow = Date.today + 1
28
+ Timelord.parse("I need to do something tom.").should == tomorrow
29
+ end
30
+
31
+ it "parses '12 Dec'" do
32
+ twelth_of_december = Date.civil(2010,12,12)
33
+ Timelord.parse("On 12 Dec I need to do something.").should == twelth_of_december
34
+ end
35
+
36
+ it "parses 'Dec 12'" do
37
+ twelth_of_december = Date.civil(2010,12,12)
38
+ Timelord.parse("On Dec 12 I need to do something.").should == twelth_of_december
39
+ end
40
+
41
+ it "parses American style dates" do
42
+ first_of_december = Date.today
43
+ Timelord.parse("On 12/1/2010 I need to do something.", :american).should == first_of_december
44
+ end
45
+
46
+ it "parses Internation style dates by default" do
47
+ first_of_december = Date.today
48
+ Timelord.parse("On 1/12/2010 I need to do something.", :international).should == first_of_december
49
+ end
50
+
51
+ it "parses yyyy/mm/dd" do
52
+ first_of_december = Date.today
53
+ Timelord.parse("On 2010/12/01 I need to do something.").should == first_of_december
54
+ end
55
+
56
+ it "parses yyyy/mm/d" do
57
+ first_of_december = Date.today
58
+ Timelord.parse("On 2010/12/1 I need to do something.").should == first_of_december
59
+ end
60
+
61
+ it "parses yyyy/m/d" do
62
+ first_of_january = Date.civil(2010, 1, 1)
63
+ Timelord.parse("On 2010/1/1 I need to do something.").should == first_of_january
64
+ end
65
+
66
+ it "parses yyyy-mm-dd" do
67
+ first_of_december = Date.today
68
+ Timelord.parse("On 2010-12-01 I need to do something.").should == first_of_december
69
+ end
70
+
71
+ it "parses mm/dd" do
72
+ first_of_december = Date.today
73
+ Timelord.parse("On 12/1 I need to do something.", :american).should == first_of_december
74
+ Timelord.parse("On 12/01 I need to do something.", :american).should == first_of_december
75
+ Timelord.parse("On 1/12 I need to do something.", :international).should == first_of_december
76
+ Timelord.parse("On 01/12 I need to do something.", :international).should == first_of_december
77
+ end
78
+
79
+ it "parses formats like 1st,2nd,3rd,4th,25th" do
80
+ first_of_december = Date.today
81
+ second_of_december = Date.today + 1
82
+ third_of_december = Date.today + 2
83
+ forth_of_december = Date.today + 3
84
+ twenty_fifth_of_december = Date.civil(2010,12,25)
85
+ Timelord.parse("On the 1st").should == first_of_december
86
+ Timelord.parse("On the 2nd").should == second_of_december
87
+ Timelord.parse("On the 3rd").should == third_of_december
88
+ Timelord.parse("On the 4th").should == forth_of_december
89
+ Timelord.parse("On the 25th").should == twenty_fifth_of_december
90
+ end
91
+
92
+ it "parses the day of the week" do
93
+ friday = Date.today + 2
94
+ monday = Date.today + 5
95
+ tuesday = Date.today + 6
96
+ thursday = Date.today + 1
97
+ Timelord.parse("On friday do something").should == friday
98
+ Timelord.parse("On Monday do something").should == monday
99
+ Timelord.parse("On fri do something").should == friday
100
+ Timelord.parse("On mon do something").should == monday
101
+ Timelord.parse("On tues do something").should == tuesday
102
+ Timelord.parse("On thurs do something").should == thursday
103
+ end
104
+
105
+ it "parses the next weekday" do
106
+ friday = Date.today + 9
107
+ monday = Date.today + 12
108
+ Timelord.parse("On next friday do something").should == friday
109
+ Timelord.parse("On next Monday do something").should == monday
110
+ end
111
+
112
+ it 'returns a date in the future' do
113
+ first_of_january = Date.civil(2011,1,1)
114
+ Timelord.parse("On 1 Jan I need to do something.").should == first_of_january
115
+ end
116
+
117
+ after do
118
+ Timecop.return
119
+ end
120
+ end
121
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timelord
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew Mongeau
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-03 00:00:00 -05:00
18
+ date: 2011-02-16 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
22
- description: Pull dates out of strings.
22
+ description:
23
23
  email: halogenandtoast@gmail.com
24
24
  executables: []
25
25
 
@@ -28,8 +28,12 @@ extensions: []
28
28
  extra_rdoc_files: []
29
29
 
30
30
  files:
31
+ - README.rdoc
32
+ - LICENSE
31
33
  - Rakefile
32
34
  - lib/timelord.rb
35
+ - spec/spec_helper.rb
36
+ - spec/timelord_spec.rb
33
37
  has_rdoc: true
34
38
  homepage: http://github.com/halogenandtoast/timelord
35
39
  licenses: []