day 0.0.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## 0.0.1 (June 16, 2011)
2
+
3
+ Features:
4
+
5
+ - initial import of this dummy gem
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Sergey Gerasimov (http://grsmv.com)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,86 @@
1
+ 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.
2
+
3
+ Table of possible phrase types to parse:
4
+
5
+ ----------------------------------------------------------------------------------
6
+ по-русски | по-украински | is implemented?
7
+ ----------------------------------------------------------------------------------
8
+ вчера | | +
9
+ сегодня | | +
10
+ завтра | | +
11
+ два дня назад | | +
12
+ три дня назад | | +
13
+ (...) дней назад | | +
14
+ 2 дня назад | | +
15
+ 3 дня назад | | +
16
+ 5 дней назад | | +
17
+ через два дня | | +
18
+ через три дня | | +
19
+ через (...) дней | | +
20
+ через 2 дня | | +
21
+ через 3 дня | | +
22
+ через 25 дней | | +
23
+ в понедельник | | +
24
+ во вторник и т.д. | | +
25
+ в этот понедельник | | +
26
+ в этот вторник и т.д. | | +
27
+ пн (вт, ср, чт, пт, чб, вс) | | +
28
+ в пн (во вт, в ср ...) | |
29
+ в следующий понедельник | | +
30
+ в следующий вторник и т.д. | | +
31
+ в след пн (в след.? вт) | |
32
+ в прошлый понедельник | | +
33
+ в прошлый вторник и т.д. | | +
34
+ в прошлый пн (вт, ср) | |
35
+ ----------------------------------------------------------------------------------
36
+ через неделю | | +
37
+ через две недели и т.д. | | +
38
+ через 2 недели | | +
39
+ неделю назад | | +
40
+ две недели назад | | +
41
+ 2 недели назад | | +
42
+ ----------------------------------------------------------------------------------
43
+ через месяц | | +
44
+ через два месяца | | +
45
+ через 2 месяца | | +
46
+ через мес | |
47
+ через 2 мес | |
48
+ месяц назад | | +
49
+ два месяца назад | | +
50
+ пять месяцев назад | | +
51
+ 2 месяца назад | | +
52
+ 5 месяцев назад | | +
53
+ ----------------------------------------------------------------------------------
54
+ 2 октября | | +
55
+ 2 октября 2011 | | +
56
+ 2 окт | | +
57
+ 2 окт 2011 | | +
58
+ 17 июн, 2011 | | +
59
+ ----------------------------------------------------------------------------------
60
+ Date.parse (?):
61
+ ----------------------------------------------------------------------------------
62
+ 1.05.2011 | | +
63
+ 01.05.2011 | | +
64
+ 1-5-2011 | | +
65
+ 2011-5-1 | | +
66
+ 2011.5.1 | | +
67
+ 2011.1 | | error raised
68
+
69
+ TODO:
70
+ -----
71
+
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).
77
+ (and look at the http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)
78
+ 6. Set start date + Timezone
79
+
80
+
81
+ USAGE:
82
+ -----
83
+ puts Day::Ru 'через 2 месяца' #=> Wed Sep 14 00:00:00 +0300 2011
84
+ puts Day::Ru 'завтра' #=> Wed Jul 15 00:00:00 +0300 2011
85
+
86
+ # (For other examples see table at the top)
@@ -0,0 +1,40 @@
1
+ ---
2
+ ? !binary "0L7QutGC\n"
3
+ : oct
4
+
5
+ ? !binary "0LjRjtC9\n"
6
+ : jun
7
+
8
+ ? !binary "0LTQtdC6\n"
9
+ : dec
10
+
11
+ ? !binary "0LDQv9GA\n"
12
+ : apr
13
+
14
+ ? !binary "0Y/QvdCy\n"
15
+ : jan
16
+
17
+ ? !binary "0LzQsNGP\n"
18
+ : may
19
+
20
+ ? !binary "0LzQsNC5\n"
21
+ : may
22
+
23
+ ? !binary "0YHQtdC9\n"
24
+ : sep
25
+
26
+ ? !binary "0YTQtdCy\n"
27
+ : feb
28
+
29
+ ? !binary "0LDQstCz\n"
30
+ : aug
31
+
32
+ ? !binary "0L3QvtGP0LE=\n"
33
+ : nov
34
+
35
+ ? !binary "0LjRjtC7\n"
36
+ : jul
37
+
38
+ ? !binary "0LzQsNGA\n"
39
+ : march
40
+
@@ -0,0 +1,23 @@
1
+ ---
2
+ - nil
3
+ - !binary |
4
+ 0L/QvQ==
5
+
6
+ - !binary |
7
+ 0LLRgg==
8
+
9
+ - !binary |
10
+ 0YHRgA==
11
+
12
+ - !binary |
13
+ 0YfRgg==
14
+
15
+ - !binary |
16
+ 0L/Rgg==
17
+
18
+ - !binary |
19
+ 0YHQsQ==
20
+
21
+ - !binary |
22
+ 0LLRgQ==
23
+
@@ -0,0 +1,37 @@
1
+ ---
2
+ ? !binary "0LTQtdCy0Y/RgtGM\n"
3
+ : 9
4
+
5
+ ? !binary "0L/Rj9GC0Yw=\n"
6
+ : 5
7
+
8
+ ? !binary "0YjQtdGB0YLRjA==\n"
9
+ : 6
10
+
11
+ ? !binary "0LTQstC1\n"
12
+ : 2
13
+
14
+ ? !binary "0YfQtdGC0YvRgNC1\n"
15
+ : 4
16
+
17
+ ? !binary "0L7QtNC90YM=\n"
18
+ : 1
19
+
20
+ ? !binary "0LTQtdGB0Y/RgtGM\n"
21
+ : 10
22
+
23
+ ? !binary "0LLQvtGB0LXQvNGM\n"
24
+ : 8
25
+
26
+ ? !binary "0L7QtNC40L0=\n"
27
+ : 1
28
+
29
+ ? !binary "0YHQtdC80Yw=\n"
30
+ : 7
31
+
32
+ ? !binary "0YLRgNC4\n"
33
+ : 3
34
+
35
+ ? !binary "0LTQstCw\n"
36
+ : 2
37
+
@@ -0,0 +1,23 @@
1
+ ---
2
+ - nil
3
+ - !binary |
4
+ 0L/QvtC90LXQtNC10LvRjNC90LjQug==
5
+
6
+ - !binary |
7
+ 0LLRgtC+0YDQvdC40Lo=
8
+
9
+ - !binary |
10
+ 0YHRgNC10LTRgw==
11
+
12
+ - !binary |
13
+ 0YfQtdGA0LLQtdGA0LM=
14
+
15
+ - !binary |
16
+ 0L/Rj9GC0L3QuNGG0YM=
17
+
18
+ - !binary |
19
+ 0YHRg9Cx0LHQvtGC0YM=
20
+
21
+ - !binary |
22
+ 0LLQvtGB0LrRgNC10YHQtdC90YzQtQ==
23
+
data/lib/day.rb ADDED
@@ -0,0 +1,252 @@
1
+ $KCODE = 'u'
2
+
3
+ require 'date'
4
+ require 'iconv'
5
+ require 'yaml'
6
+
7
+ class Numeric
8
+ def days
9
+ self * 60 * 60 * 24
10
+ end
11
+ end
12
+
13
+ module Day
14
+
15
+ class Ru
16
+
17
+ # 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))
21
+ end
22
+
23
+ # TODO: - string to utf8 if Ruby version > 1.9
24
+ # - convert to lowercase with Unicode gem
25
+ # - set date
26
+ def initialize string
27
+ @string = string.strip
28
+ @now = Time.now
29
+ @week_start = @now - @now.wday.days
30
+ end
31
+
32
+ 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
+ end
239
+ end
240
+
241
+ # API simplifier
242
+ def Day::Ru string
243
+ Day::Ru.new(string).parse
244
+ 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,83 @@
1
+ #
2
+ # Levenshtein distance algorithm implementation for Ruby, with UTF-8 support
3
+ #
4
+ # Author:: Paul BATTLEY (pbattley @ gmail.com)
5
+ # Version:: 1.3
6
+ # Date:: 2005-04-19
7
+ #
8
+ # == About
9
+ #
10
+ # The Levenshtein distance is a measure of how similar two strings s and t are,
11
+ # calculated as the number of deletions/insertions/substitutions needed to
12
+ # transform s into t. The greater the distance, the more the strings differ.
13
+ #
14
+ # The Levenshtein distance is also sometimes referred to as the
15
+ # easier-to-pronounce-and-spell 'edit distance'.
16
+ #
17
+ # == Revision history
18
+ #
19
+ # * 2005-05-19 1.3 Repairing an oversight, distance can now be called via
20
+ # Levenshtein.distance(s, t)
21
+ # * 2005-05-04 1.2 Now uses just one 1-dimensional array. I think this is as
22
+ # far as optimisation can go.
23
+ # * 2005-05-04 1.1 Now storing only the current and previous rows of the matrix
24
+ # instead of the whole lot.
25
+ #
26
+ # == Licence
27
+ #
28
+ # Copyright (c) 2005 Paul Battley
29
+ #
30
+ # Usage of the works is permitted provided that this instrument is retained
31
+ # with the works, so that any entity that uses the works is notified of this
32
+ # instrument.
33
+ #
34
+ # DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
35
+ #
36
+
37
+ class Levenshtein
38
+
39
+ #
40
+ # Calculate the Levenshtein distance between two strings +str1+ and +str2+.
41
+ # +str1+ and +str2+ should be ASCII or UTF-8.
42
+ #
43
+ class << self
44
+
45
+ def distance(str1, str2)
46
+ s, t = str1.unpack('U*'), str2.unpack('U*')
47
+ n, m = s.length, t.length
48
+ return m if (0 == n)
49
+ return n if (0 == m)
50
+
51
+ d = (0..m).to_a
52
+ x = nil
53
+
54
+ (0...n).each do |i|
55
+ e = i+1
56
+ (0...m).each do |j|
57
+ cost = (s[i] == t[j]) ? 0 : 1
58
+ x = [
59
+ d[j+1] + 1, # insertion
60
+ e + 1, # deletion
61
+ d[j] + cost # substitution
62
+ ].min
63
+ d[j] = e
64
+ e = x
65
+ end
66
+ d[m] = x
67
+ end
68
+
69
+ return x
70
+ end
71
+ end
72
+ end
73
+
74
+ @needle = 'сиводня'
75
+
76
+ @haystack = %w( завтра сегодня вчера позавчера послезавтра январь февраль март апрель май июнь июль август сентябрь октябрь ноябрь декабрь апр)
77
+
78
+ words = {}
79
+ for word in @haystack
80
+ words[Levenshtein.distance(@needle, word).to_i] = word
81
+ end
82
+
83
+ puts "Closest to #{@needle} word is #{words.sort.flatten[1]}"
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: day
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Sergey Gerasimov
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-14 00:00:00 +03:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ 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
+ email:
24
+ - mail@grsmv.com
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - README.md
33
+ - CHANGELOG.md
34
+ - LICENSE
35
+ - lib/day.rb
36
+ - lib/levenshtein.rb
37
+ - data/month_vocabulary.yml
38
+ - data/short_week_days.yml
39
+ - data/simple_numerics.yml
40
+ - data/week_days.yml
41
+ has_rdoc: true
42
+ homepage: http://github.com/grsmv/day
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options: []
47
+
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ hash: 3
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirements: []
69
+
70
+ rubyforge_project: day
71
+ rubygems_version: 1.4.2
72
+ signing_key:
73
+ 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.
75
+ test_files: []
76
+