day 0.0.1 → 0.0.3

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.
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