day 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.md +7 -6
  2. data/lib/day.rb +33 -222
  3. data/lib/ru/parse.rb +99 -0
  4. data/lib/ru/parse_methods.rb +75 -0
  5. metadata +26 -11
data/README.md CHANGED
@@ -39,6 +39,9 @@ Table of possible phrase types to parse:
39
39
  неделю назад | | +
40
40
  две недели назад | | +
41
41
  2 недели назад | | +
42
+ на следующей неделе | |
43
+ на след.(?) неделе | |
44
+ на прошлой неделе | |
42
45
  ----------------------------------------------------------------------------------
43
46
  через месяц | | +
44
47
  через два месяца | | +
@@ -69,13 +72,11 @@ Table of possible phrase types to parse:
69
72
  TODO:
70
73
  -----
71
74
 
72
- 1. Move Unicode gem (unicode-0.4.0) in dependencies
73
- 2. Write tests for sure in equality of numerical and literal days values and for sure in right date recognition
74
- 3. Write YARD documentation
75
- 4. Pack as gem
76
- 5. Type error recognition ('черз' instead 'через') and fixing. (?!: vocabulary + Levenshtein distance).
75
+ 1. Write tests for sure in equality of numerical and literal days values and for sure in right date recognition
76
+ 2. Write YARD documentation
77
+ 3. Type error recognition ('черз' instead 'через') and fixing. (?!: vocabulary + Levenshtein distance).
77
78
  (and look at the http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)
78
- 6. Set start date + Timezone
79
+ 4. Set start date + Timezone
79
80
 
80
81
 
81
82
  USAGE:
data/lib/day.rb CHANGED
@@ -1,8 +1,18 @@
1
- $KCODE = 'u'
1
+ # coding: utf-8
2
+
3
+ if RUBY_VERSION < "1.9"
4
+ $KCODE = 'u'
5
+ require 'rubygems'
6
+ require 'unicode'
7
+ else
8
+ $LOAD_PATH << '.'
9
+ require 'unicode_utils'
10
+ end
2
11
 
3
12
  require 'date'
4
- require 'iconv'
5
13
  require 'yaml'
14
+ require 'ru/parse'
15
+ require 'ru/parse_methods'
6
16
 
7
17
  class Numeric
8
18
  def days
@@ -10,231 +20,40 @@ class Numeric
10
20
  end
11
21
  end
12
22
 
23
+ ##
24
+ # Force encoding change for Ruby 1.9
25
+ # for more information see http://goo.gl/alaUM
26
+ #
27
+ class String
28
+ def encode!
29
+ (defined?(Encoding) && self.respond_to?(:force_encoding)) ?
30
+ self.force_encoding('ASCII-8BIT') : self
31
+ end
32
+
33
+ def to_downcase
34
+ (RUBY_VERSION < "1.9") ?
35
+ ::Unicode::downcase(self) : ::UnicodeUtils.downcase(self)
36
+ end
37
+ end
38
+
13
39
  module Day
14
40
 
15
41
  class Ru
16
42
 
17
43
  # getting class variables from 'data' folder contents
18
- Dir.chdir(File.join(File.dirname(__FILE__), '..', 'data'))
19
- Dir.glob('*.yml') do |yml|
20
- class_variable_set "@@#{yml.gsub('.yml', '')}".to_sym, YAML::load(File.read(yml))
44
+ Dir.glob('../data/*.yml') do |yml|
45
+ class_variable_set(
46
+ "@@#{yml.gsub(/(\.\.\/data\/|\.yml)/, '')}".to_sym, YAML::load(File.read(yml))
47
+ )
21
48
  end
22
49
 
23
- # TODO: - string to utf8 if Ruby version > 1.9
24
- # - convert to lowercase with Unicode gem
25
- # - set date
26
50
  def initialize string
27
- @string = string.strip
51
+ @string = string.strip.to_downcase.encode!
28
52
  @now = Time.now
29
53
  @week_start = @now - @now.wday.days
30
54
  end
31
55
 
32
56
  attr_accessor :date
33
-
34
- private
35
-
36
-
37
- def yesterday_today_tomorrow
38
- @date = case @string
39
- when /^(позавчера)$/ then @now - 2.days
40
- when /^(вчера)$/ then @now - 1.days
41
- when /^(завтра)$/ then @now + 1.days
42
- when /^(послезавтра)$/ then @now + 2.days
43
- else @now
44
- end
45
- end
46
-
47
-
48
- def future_days days_num
49
- @date = @now + days_num.to_i.days
50
- end
51
-
52
-
53
- def previous_days days_num
54
- @date = @now - days_num.to_i.days
55
- end
56
-
57
-
58
- def in_week_day day
59
- @date = @week_start + @@week_days.index(day).days
60
- end
61
-
62
-
63
- def in_week_day_short_notation day
64
- @date = @week_start + @@short_week_days.index(day).days
65
- end
66
-
67
-
68
- def in_past_week_day day
69
- @date = in_week_day(day) - 7.days
70
- end
71
-
72
-
73
- def in_next_week_day day
74
- @date = in_week_day(day) + 7.days
75
- end
76
-
77
-
78
- def next_weeks weeks_num
79
- weeks = weeks_num.nil? ? 1 : weeks_num.to_i
80
- @date = @now + (weeks * 7).days
81
- end
82
-
83
-
84
- def previous_weeks weeks_num
85
- weeks = weeks_num.nil? ? 1 : weeks_num.to_i
86
- @date = @now - (weeks * 7).days
87
- end
88
-
89
-
90
- def month_proto num
91
- month = num.nil? ? 1 : num.to_i
92
- year, mon = yield(month)
93
- @date = Time.mktime(year, mon, @now.day)
94
- end
95
-
96
-
97
- def next_month num
98
- month_proto(num) { |month|
99
- @now.mon + month > 12 ?
100
- [(@now.year + (@now.mon + month) / 12), ((@now.mon + month) % 12)] :
101
- [@now.year, (@now.mon + month)]
102
- }
103
- end
104
-
105
-
106
- def previous_month num
107
- month_proto(num) { |month|
108
- @now.mon - month < 1 ?
109
- [(@now.year - (@now.mon - month) / 12 * -1), (12 - ((month - @now.mon) % 12))] :
110
- [@now.year, (@now.mon - month)]
111
- }
112
- end
113
-
114
- public
115
-
116
- def parse
117
- case @string
118
-
119
- # вчера
120
- # сегодня
121
- # завтра
122
- when /^(позавчера|вчера|сегодня|завтра|послезавтра)$/i
123
- yesterday_today_tomorrow
124
-
125
- # через 1 день
126
- # через 2 дня
127
- # через 5 дней
128
- when /^через\s(\d{1,})\sд(н(|я|ей)|ень)$/i
129
- future_days $1
130
-
131
- # через один день
132
- # через два дня
133
- # через пять дней
134
- when /^через\s(#{@@simple_numerics.keys.join('|')})\sд(н(|я|ей)|ень)$/
135
- future_days @@simple_numerics[$1]
136
-
137
- # 1 день назад
138
- # 2 дня назад
139
- # 5 дней назад
140
- when /^(\d{1,})\sд(н(|я|ей)|ень)\sназад/i
141
- previous_days $1
142
-
143
- # два дня назад
144
- # пять дней назад
145
- when /^(#{@@simple_numerics.keys.join('|')})\sд(н(|я|ей)|ень)\sназад$/
146
- previous_days @@simple_numerics[$1]
147
-
148
- # в понедельник
149
- # во вторник
150
- # в воскресенье
151
- # в эту среду
152
- when /^во?\s(эт(о|от|у)\s)?(#{@@week_days.join('|')})$/i
153
- in_week_day $3
154
-
155
- # пн (вт ... вс)
156
- when /^(#{@@short_week_days.join('|')})$/i
157
- in_week_day_short_notation $1
158
-
159
- # в прошлый понедельник
160
- # в прошлую среду
161
- # в прошлое воскресенье
162
- when /^в\sпрошл(ый|ую|ое)\s(#{@@week_days.join('|')})/i
163
- in_past_week_day $2
164
-
165
- # в следующий понедельник
166
- # в следующую пятницу
167
- # в следующее воскресенье
168
- when /^в\sследующ(ий|ую|ее)\s(#{@@week_days.join('|')})/i
169
- in_next_week_day $2
170
-
171
- # через неделю
172
- # через 1 неделю
173
- # через 2 недели
174
- # через 5 недель
175
- when /^через\s(\d{1,})?\s?недел(и|ю|ь)$/i
176
- next_weeks $1
177
-
178
- # через две недели
179
- # через десять недель
180
- when /^через\s(#{@@simple_numerics.keys.join('|')})\sнедел(и|ю|ь)$/
181
- next_weeks @@simple_numerics[$1]
182
-
183
- # неделю назад
184
- # 1 неделю назад
185
- # 2 недели назад
186
- # 5 недель назад
187
- when /^(\d{1,})?\s?недел(и|ю|ь)\sназад$/i
188
- previous_weeks $1
189
-
190
- # две недели назад
191
- # десять недель назад
192
- when /^(#{@@simple_numerics.keys.join('|')})\sнедел(и|ю|ь)\sназад$/
193
- previous_weeks @@simple_numerics[$1]
194
-
195
- # через месяц
196
- # через 1 месяц
197
- # через 2 месяца
198
- # через 5 месяцев
199
- when /^через\s(\d{1,})?\s?месяц(|а|ев)$/i
200
- next_month $1
201
-
202
- # через два месяца
203
- # через десять месяцев
204
- when /^через\s(#{@@simple_numerics.keys.join('|')})\sмесяц(|а|ев)$/i
205
- next_month @@simple_numerics[$1]
206
-
207
- # месяц назад
208
- # 1 месяц назад
209
- # 2 месяца назад
210
- # 5 месяцев назад
211
- when /^(\d{1,})?\s?месяц(|а|ев)\sназад$/i
212
- previous_month $1
213
-
214
- # два месяца назад
215
- # десять месяцев назад
216
- when /^(#{@@simple_numerics.keys.join('|')})\sмесяц(|а|ев)\sназад$/i
217
- previous_month @@simple_numerics[$1]
218
-
219
- # 2 октября, 2 окт, 2 окт 2011
220
- else
221
- if @string =~ /\s?(#{@@month_vocabulary.keys.join('|')})/
222
- @string.gsub!($1, @@month_vocabulary[$1])
223
- end
224
-
225
- begin
226
- tmp_date = Date.parse @string
227
- @date = Time.mktime(tmp_date.year, tmp_date.mon, tmp_date.day)
228
-
229
- # TODO: raise an error: Date not recognized
230
- rescue => err
231
- puts err
232
- end
233
- end
234
-
235
- @date
236
- end
237
-
238
57
  end
239
58
  end
240
59
 
@@ -242,11 +61,3 @@ end
242
61
  def Day::Ru string
243
62
  Day::Ru.new(string).parse
244
63
  end
245
-
246
- # 1.05.2011
247
- # 01.05.2011
248
- # 1-5-2011
249
- # 2011-5-1
250
- # 2011.5.1
251
- # 2011.1 (!!!)
252
- #p Day::Ru 'через 2 месяца'
@@ -0,0 +1,99 @@
1
+ # coding: ASCII-8BIT
2
+
3
+ module Day
4
+
5
+ class Ru
6
+
7
+ public
8
+
9
+ def parse
10
+ case @string
11
+
12
+ # вчера, сегодня, завтра
13
+ when /^(позавчера|вчера|сегодня|завтра|послезавтра)$/i then
14
+ yesterday_today_tomorrow
15
+
16
+ # через (1 день | 2 дня | 5 дней)
17
+ when /^через\s(\d{1,})\sд(н(|я|ей)|ень)$/i then
18
+ future_days $1
19
+
20
+ # через (один день | два дня | пять дней)
21
+ when /^через\s(#{@@simple_numerics.keys.join('|')})\sд(н(|я|ей)|ень)$/ then
22
+ future_days @@simple_numerics[$1]
23
+
24
+ # (1 день | 2 дня | 5 дней) назад
25
+ when /^(\d{1,})\sд(н(|я|ей)|ень)\sназад/i then
26
+ previous_days $1
27
+
28
+ # (два дня | пять дней) назад
29
+ when /^(#{@@simple_numerics.keys.join('|')})\sд(н(|я|ей)|ень)\sназад$/ then
30
+ previous_days @@simple_numerics[$1]
31
+
32
+ # в понедельник, во вторник, в воскресенье, в эту среду
33
+ when /^во?\s(эт(о|от|у)\s)?(#{@@week_days.join('|')})$/i then
34
+ in_week_day $3
35
+
36
+ # пн (вт ... вс)
37
+ when /^(#{@@short_week_days.join('|')})$/i then
38
+ in_week_day_short_notation $1
39
+
40
+ # в прошлый понедельник, в прошлую среду, в прошлое воскресенье
41
+ when /^в\sпрошл(ый|ую|ое)\s(#{@@week_days.join('|')})/i then
42
+ in_past_week_day $2
43
+
44
+ # в следующий понедельник, в следующую пятницу, в следующее воскресенье
45
+ when /^в\sследующ(ий|ую|ее)\s(#{@@week_days.join('|')})/i then
46
+ in_next_week_day $2
47
+
48
+ # через (неделю | 1 неделю | 2 недели | 5 недель)
49
+ when /^через\s(\d{1,})?\s?недел(и|ю|ь)$/i then
50
+ next_weeks $1
51
+
52
+ # через (две недели | десять недель)
53
+ when /^через\s(#{@@simple_numerics.keys.join('|')})\sнедел(и|ю|ь)$/ then
54
+ next_weeks @@simple_numerics[$1]
55
+
56
+ # неделю назад, 1 неделю назад, 2 недели назад, 5 недель назад
57
+ when /^(\d{1,})?\s?недел(и|ю|ь)\sназад$/i then
58
+ previous_weeks $1
59
+
60
+ # две недели назад, десять недель назад
61
+ when /^(#{@@simple_numerics.keys.join('|')})\sнедел(и|ю|ь)\sназад$/ then
62
+ previous_weeks @@simple_numerics[$1]
63
+
64
+ # через (месяц | 1 месяц | 2 месяца | 5 месяцев)
65
+ when /^через\s(\d{1,})?\s?месяц(|а|ев)$/i then
66
+ next_month $1
67
+
68
+ # через (два месяца | десять месяцев)
69
+ when /^через\s(#{@@simple_numerics.keys.join('|')})\sмесяц(|а|ев)$/i then
70
+ next_month @@simple_numerics[$1]
71
+
72
+ # месяц назад, 1 месяц назад, 2 месяца назад, 5 месяцев назад
73
+ when /^(\d{1,})?\s?месяц(|а|ев)\sназад$/i then
74
+ previous_month $1
75
+
76
+ # два месяца назад, десять месяцев назад
77
+ when /^(#{@@simple_numerics.keys.join('|')})\sмесяц(|а|ев)\sназад$/i then
78
+ previous_month @@simple_numerics[$1]
79
+
80
+ # 2 октября, 2 окт, 2 окт 2011
81
+ else
82
+ if @string =~ /\s?(#{@@month_vocabulary.keys.join('|')})/
83
+ @string.gsub!($1, @@month_vocabulary[$1])
84
+ end
85
+
86
+ begin
87
+ tmp_date = Date.parse @string
88
+ @date = Time.mktime(tmp_date.year, tmp_date.mon, tmp_date.day)
89
+
90
+ # TODO: raise an error: Date not recognized
91
+ rescue => err
92
+ puts err
93
+ end
94
+ end
95
+
96
+ @date
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,75 @@
1
+ # coding: ASCII-8BIT
2
+
3
+ module Day
4
+
5
+ class Ru
6
+
7
+ private
8
+
9
+ def yesterday_today_tomorrow
10
+ @date = case @string
11
+ when /^(позавчера)$/ then @now - 2.days
12
+ when /^(вчера)$/ then @now - 1.days
13
+ when /^(завтра)$/ then @now + 1.days
14
+ when /^(послезавтра)$/ then @now + 2.days
15
+ else @now
16
+ end
17
+ end
18
+
19
+ def future_days days_num
20
+ @date = @now + days_num.to_i.days
21
+ end
22
+
23
+ def previous_days days_num
24
+ @date = @now - days_num.to_i.days
25
+ end
26
+
27
+ def in_week_day day
28
+ @date = @week_start + @@week_days.index(day).days
29
+ end
30
+
31
+ def in_week_day_short_notation day
32
+ @date = @week_start + @@short_week_days.index(day).days
33
+ end
34
+
35
+ def in_past_week_day day
36
+ @date = in_week_day(day) - 7.days
37
+ end
38
+
39
+ def in_next_week_day day
40
+ @date = in_week_day(day) + 7.days
41
+ end
42
+
43
+ def next_weeks weeks_num
44
+ weeks = weeks_num.nil? ? 1 : weeks_num.to_i
45
+ @date = @now + (weeks * 7).days
46
+ end
47
+
48
+ def previous_weeks weeks_num
49
+ weeks = weeks_num.nil? ? 1 : weeks_num.to_i
50
+ @date = @now - (weeks * 7).days
51
+ end
52
+
53
+ def month_proto num
54
+ month = num.nil? ? 1 : num.to_i
55
+ year, mon = yield(month)
56
+ @date = Time.mktime(year, mon, @now.day)
57
+ end
58
+
59
+ def next_month num
60
+ month_proto(num) { |month|
61
+ @now.mon + month > 12 ?
62
+ [(@now.year + (@now.mon + month) / 12), ((@now.mon + month) % 12)] :
63
+ [@now.year, (@now.mon + month)]
64
+ }
65
+ end
66
+
67
+ def previous_month num
68
+ month_proto(num) { |month|
69
+ @now.mon - month < 1 ?
70
+ [(@now.year - (@now.mon - month) / 12 * -1), (12 - ((month - @now.mon) % 12))] :
71
+ [@now.year, (@now.mon - month)]
72
+ }
73
+ end
74
+ end
75
+ end
metadata CHANGED
@@ -1,24 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: day
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
- - Sergey Gerasimov
13
+ - Serge Gerasimov
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-14 00:00:00 +03:00
19
- default_executable:
20
- dependencies: []
21
-
18
+ date: 2012-03-20 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: unicode
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 11
29
+ segments:
30
+ - 0
31
+ - 4
32
+ - 2
33
+ version: 0.4.2
34
+ type: :runtime
35
+ version_requirements: *id001
22
36
  description: Gem for date parsing (in the scale of the day, hours is not very important in my projects now). It support Russian and Ukrainian (in future) languages.
23
37
  email:
24
38
  - mail@grsmv.com
@@ -34,11 +48,12 @@ files:
34
48
  - LICENSE
35
49
  - lib/day.rb
36
50
  - lib/levenshtein.rb
51
+ - lib/ru/parse.rb
52
+ - lib/ru/parse_methods.rb
37
53
  - data/month_vocabulary.yml
38
54
  - data/short_week_days.yml
39
55
  - data/simple_numerics.yml
40
56
  - data/week_days.yml
41
- has_rdoc: true
42
57
  homepage: http://github.com/grsmv/day
43
58
  licenses: []
44
59
 
@@ -68,9 +83,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
83
  requirements: []
69
84
 
70
85
  rubyforge_project: day
71
- rubygems_version: 1.4.2
86
+ rubygems_version: 1.8.15
72
87
  signing_key:
73
88
  specification_version: 3
74
- summary: Gem for date parsing (in the scale of the day, hours is not very important in my projects now). It support Russian and Ukrainian (in future) languages.
89
+ summary: Gem for date parsing
75
90
  test_files: []
76
91