event_nlp 0.5.3 → 0.6.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/event_nlp.rb +219 -184
- data.tar.gz.sig +2 -1
- metadata +36 -31
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4ec4582a9a97efbf6e4b24803edb1675c8cc8bbcdff692b90472502bfd71c1e
|
4
|
+
data.tar.gz: 63226f49c9ad8b5f2219cc8506152c5ddaed21e97e0e7c6e55c017bc83d3e644
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eab396db7a03c0416d71eb911d4bd35d573f33a265c8aa773dcbbf45368a8702df0f695701ee3f2472c084106de6c60d3aee5826e68ec8c032770be191db7a76
|
7
|
+
data.tar.gz: b70f2239f852026b7b3559c0814c331be502a47410ecdf8808646faec727c5adc17e282d8d9159c2bf4658d2ce03ddf161d0b84433b95cbe529658cf965b0b29
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/event_nlp.rb
CHANGED
@@ -12,7 +12,7 @@ module Ordinals
|
|
12
12
|
|
13
13
|
refine Integer do
|
14
14
|
def ordinal
|
15
|
-
self.to_s + ( (10
|
15
|
+
self.to_s + ( self.between?(10,20) ? 'th' :
|
16
16
|
%w{ th st nd rd th th th th th th }[self % 10] )
|
17
17
|
end
|
18
18
|
end
|
@@ -23,99 +23,132 @@ class EventNlp
|
|
23
23
|
include AppRoutes
|
24
24
|
using Ordinals
|
25
25
|
using ColouredText
|
26
|
-
|
26
|
+
|
27
27
|
attr_accessor :params
|
28
|
-
|
28
|
+
|
29
29
|
def initialize(now=Time.now, params: {}, debug: false)
|
30
|
-
|
30
|
+
|
31
31
|
super()
|
32
|
-
|
32
|
+
|
33
33
|
@now = now
|
34
34
|
@params = params
|
35
35
|
expressions(@params)
|
36
36
|
@debug = debug
|
37
37
|
|
38
38
|
end
|
39
|
-
|
40
|
-
def parse(
|
39
|
+
|
40
|
+
def parse(raws)
|
41
|
+
|
42
|
+
# catch irregular expressions and interpret them in advance
|
43
|
+
#
|
44
|
+
# e.g. Cafe meeting Thursday every 2 weeks =>
|
45
|
+
# Cafe meeting every 2nd Thursday
|
46
|
+
#
|
47
|
+
weekdays2 = (Date::DAYNAMES + Date::ABBR_DAYNAMES).join('|').downcase
|
48
|
+
pattern = /(?<day>#{weekdays2}) every (?<n>\d) weeks/i
|
49
|
+
found = raws.match(pattern)
|
50
|
+
|
51
|
+
s = if found then
|
52
|
+
s2 = "every %s %s" % [found[:n].to_i.ordinal, found[:day]]
|
53
|
+
raws.sub(pattern, s2)
|
54
|
+
else
|
55
|
+
raws
|
56
|
+
end
|
57
|
+
|
58
|
+
#-----------------------------------------------------------
|
41
59
|
|
42
60
|
@params[:input] = s
|
43
61
|
r = run_route(s)
|
44
62
|
|
45
63
|
return unless r.is_a? Hash
|
46
|
-
|
64
|
+
|
47
65
|
OpenStruct.new({input: s}.merge r)
|
48
|
-
|
49
|
-
end
|
66
|
+
|
67
|
+
end
|
50
68
|
|
51
69
|
private
|
52
70
|
|
53
|
-
def expressions(params)
|
71
|
+
def expressions(params)
|
54
72
|
|
55
73
|
starting = /(?:\(?\s*starting (\d+\w{2} \w+\s*\w*)(?: until (.*))?\s*\))?/
|
56
|
-
weekdays2 = (Date::DAYNAMES + Date::ABBR_DAYNAMES).join('|').downcase
|
74
|
+
weekdays2 = (Date::DAYNAMES + Date::ABBR_DAYNAMES).join('|').downcase
|
57
75
|
weekdays = "(%s)" % weekdays2
|
58
76
|
months = "(%s)" % (Date::MONTHNAMES[1..-1] + Date::ABBR_MONTHNAMES[1..-1])\
|
59
77
|
.join('|').downcase
|
60
78
|
times = /(?: *(?:at |@ |from )?(\d+(?::\d+)?(?:[ap]m|\b)) *)/
|
61
79
|
times2 = /\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?/
|
62
|
-
times3 = /(\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?)/
|
80
|
+
times3 = /(\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?)/
|
63
81
|
days = /(\d+(?:st|nd|rd|th))/
|
64
82
|
periods = /day|week|month/
|
65
|
-
|
83
|
+
|
66
84
|
#weekdays = Date::DAYNAMES.join('|').downcase
|
67
85
|
#
|
68
|
-
|
86
|
+
|
69
87
|
#times = /(?: *at )?\d[ap]m/
|
70
88
|
|
71
|
-
# e.g. electricity bill on the 28th of every month
|
89
|
+
# e.g. electricity bill on the 28th of every month
|
72
90
|
|
73
91
|
get /(.*) on the (#{days}) of every (#{periods})/ do |title, day, recurring|
|
74
92
|
|
75
93
|
|
76
94
|
raw_d = Chronic.parse(day)
|
77
|
-
|
95
|
+
|
78
96
|
# if the date is less than now then increment it by a month
|
79
97
|
d = raw_d < @now ? (raw_d.to_date >> 1).to_time : raw_d
|
80
|
-
|
81
|
-
|
98
|
+
|
99
|
+
|
82
100
|
if @debug then
|
83
101
|
puts [0.1, title, recurring, d].inspect.debug
|
84
102
|
end
|
85
|
-
|
86
|
-
{title: title, recurring: recurring, date: d}
|
87
|
-
|
103
|
+
|
104
|
+
{title: title, recurring: recurring, date: d}
|
105
|
+
|
88
106
|
end
|
89
|
-
|
90
107
|
|
91
|
-
|
108
|
+
|
109
|
+
get /^(.*)\s+(every \d\w+ \w+#{times}\s*#{starting})/ do \
|
92
110
|
|title, recurring, time, raw_date, end_date|
|
93
111
|
|
94
|
-
input = params[:input].clone
|
112
|
+
input = params[:input].clone
|
95
113
|
d = Chronic.parse(raw_date + ' ' + time.to_s)
|
96
|
-
|
114
|
+
|
115
|
+
if @debug then
|
116
|
+
puts 'e300'
|
117
|
+
puts 'd: ' + d.inspect
|
118
|
+
puts 'recurring: ' + recurring.inspect
|
119
|
+
end
|
120
|
+
|
97
121
|
if recurring =~ /day|week/ then
|
98
122
|
|
99
123
|
if d < @now then
|
100
124
|
|
101
|
-
|
102
|
-
|
125
|
+
cc = ChronicCron.new(recurring, d)
|
126
|
+
exp = cc.to_expression
|
127
|
+
puts 'exp: ' + exp.inspect if @debug
|
128
|
+
|
129
|
+
cf = CronFormat.new(exp, d)
|
130
|
+
cf.next until cf.to_time > @now
|
131
|
+
|
132
|
+
new_date = cf.to_time
|
133
|
+
puts 'new_date: ' + new_date.inspect if @debug
|
134
|
+
|
103
135
|
input.gsub!(raw_date, new_date\
|
104
|
-
.strftime("#{new_date.day.ordinal} %b %Y"))
|
136
|
+
.strftime("#{new_date.day.ordinal} %b %Y"))
|
105
137
|
d = new_date
|
106
|
-
|
138
|
+
|
107
139
|
end
|
108
140
|
end
|
109
|
-
|
141
|
+
|
110
142
|
if @debug then
|
111
|
-
puts
|
143
|
+
puts 'd: ' + d.inspect
|
144
|
+
puts ["0.2", input, title, recurring, time, raw_date, end_date].inspect.debug
|
112
145
|
end
|
113
|
-
|
114
|
-
{input: input, title: title, recurring: recurring, date: d,
|
115
|
-
end_date: end_date}
|
116
|
-
|
146
|
+
|
147
|
+
{input: input, title: title, recurring: recurring, date: d,
|
148
|
+
end_date: end_date}
|
149
|
+
|
117
150
|
end
|
118
|
-
|
151
|
+
|
119
152
|
# e.g. some event 1st Monday of every month (starting 3rd Jul 2017)
|
120
153
|
|
121
154
|
get /^(.*)\s+(\d(?:st|nd|rd|th) \w+ of every \w+(?: at (\d+[ap]m) )?)\s*#{starting}/ do \
|
@@ -123,54 +156,56 @@ class EventNlp
|
|
123
156
|
|
124
157
|
input = params[:input].clone
|
125
158
|
d = Chronic.parse(raw_date)
|
126
|
-
|
127
|
-
if recurring =~ /day|week|month/ then
|
128
|
-
|
159
|
+
|
160
|
+
if recurring =~ /day|week|month/ then
|
161
|
+
|
129
162
|
if d < @now then
|
130
163
|
|
131
164
|
new_date = CronFormat.new(ChronicCron.new(recurring)\
|
132
165
|
.to_expression, d).to_time
|
133
166
|
input.gsub!(raw_date, new_date\
|
134
|
-
.strftime("#{new_date.day.ordinal} %b %Y"))
|
167
|
+
.strftime("#{new_date.day.ordinal} %b %Y"))
|
135
168
|
d = new_date
|
136
169
|
else
|
137
170
|
d = ChronicCron.new(recurring, d.to_date.to_time).to_time
|
138
171
|
end
|
139
172
|
end
|
140
|
-
|
141
|
-
puts [0.3, title, recurring, time, raw_date, end_date].inspect.debug if @debug
|
142
|
-
{input: input, title: title, recurring: recurring, date: d, end_date:
|
173
|
+
|
174
|
+
puts ['0.3'.highlight, title, recurring, time, raw_date, end_date].inspect.debug if @debug
|
175
|
+
{input: input, title: title, recurring: recurring, date: d, end_date:
|
143
176
|
end_date}
|
144
|
-
|
145
|
-
end
|
177
|
+
|
178
|
+
end
|
146
179
|
|
147
180
|
# some event every 2 weeks
|
148
181
|
# some event every 2 weeks at 6am starting from 14th Jan
|
149
182
|
# some event every 2 weeks at 6am starting from 18th Feb until 28th Oct
|
150
183
|
# some event every 2nd Monday (starting 7th Nov 2016)
|
151
|
-
# some event every 2nd Monday (starting 7th Nov until 3rd Dec)
|
184
|
+
# some event every 2nd Monday (starting 7th Nov until 3rd Dec)
|
152
185
|
# some event every 2 weeks (starting 02/11/17)
|
153
186
|
# some event every Wednesday 1pm-4pm
|
154
187
|
#
|
155
188
|
get /^(.*)(every .*)/ do |title, recurring|
|
156
189
|
|
157
190
|
input = params[:input].clone
|
191
|
+
puts 'recurring: ' + recurring.inspect if @debug
|
158
192
|
raw_start_date = recurring[/(?<=starting )[^\)]+/]
|
159
|
-
|
193
|
+
|
160
194
|
d = if raw_start_date then
|
161
|
-
start_date = Chronic.parse(raw_start_date, now: @now - 1,
|
195
|
+
start_date = Chronic.parse(raw_start_date, now: @now - 1,
|
162
196
|
:endian_precedence => :little)
|
163
197
|
|
198
|
+
puts ('recurring: ' + recurring.inspect).debug if @debug
|
164
199
|
puts ('start_date: ' + start_date.inspect).debug if @debug
|
165
|
-
|
200
|
+
|
166
201
|
if @now > start_date then
|
167
|
-
exp = ChronicCron.new(recurring, start_date).to_expression
|
202
|
+
exp = ChronicCron.new(recurring, start_date, debug: @debug).to_expression
|
168
203
|
puts 'exp: ' + exp.inspect if @debug
|
169
|
-
|
170
|
-
cf = CronFormat.new(exp, start_date)
|
171
|
-
puts cf.to_time if @debug
|
172
|
-
|
173
|
-
|
204
|
+
|
205
|
+
cf = CronFormat.new(exp, start_date, debug: @debug)
|
206
|
+
puts ('cf.to_time: ' + cf.to_time.inspect).debug if @debug
|
207
|
+
cf.next until cf.to_time > start_date
|
208
|
+
|
174
209
|
new_date = cf.to_time
|
175
210
|
input.gsub!(/(?<=starting )[^\)]+/, new_date\
|
176
211
|
.strftime("#{new_date.day.ordinal} %b %Y"))
|
@@ -179,208 +214,208 @@ class EventNlp
|
|
179
214
|
else
|
180
215
|
start_date
|
181
216
|
end
|
182
|
-
|
217
|
+
|
183
218
|
else
|
184
219
|
exp = ChronicCron.new(recurring).to_expression
|
185
220
|
cf = CronFormat.new(exp, @now)
|
186
221
|
cf.to_time
|
187
222
|
end
|
188
|
-
|
189
223
|
|
190
|
-
|
224
|
+
|
225
|
+
|
191
226
|
if recurring =~ /-/ then
|
192
|
-
end_date = Chronic.parse d.to_date.to_s + ' ' +
|
193
|
-
recurring[/(?<=-)\d+(?::\d+)?(?:[ap]m)?/]
|
227
|
+
end_date = Chronic.parse d.to_date.to_s + ' ' +
|
228
|
+
recurring[/(?<=-)\d+(?::\d+)?(?:[ap]m)?/]
|
194
229
|
end
|
195
|
-
|
196
|
-
puts [0.5, title, recurring, d].
|
197
|
-
{input: input, title: title.rstrip, recurring: recurring,
|
230
|
+
|
231
|
+
puts ['0.5'.highlight, title, recurring, d].join("\n").debug if @debug
|
232
|
+
{input: input, title: title.rstrip, recurring: recurring,
|
198
233
|
date: d, end_date: end_date }
|
199
|
-
|
200
|
-
end
|
201
|
-
|
234
|
+
|
235
|
+
end
|
236
|
+
|
202
237
|
# some meeting 3rd thursday of the month at 7:30pm
|
203
238
|
# some meeting First thursday of the month at 7:30pm
|
204
|
-
get /(.*)\s+(\w+ \w+day of (?:the|every) month at .*)/ do
|
239
|
+
get /(.*)\s+(\w+ \w+day of (?:the|every) month at .*)/ do
|
205
240
|
|title, recurring|
|
206
241
|
|
207
|
-
puts [1, title, recurring].inspect.debug if @debug
|
242
|
+
puts ['1'.highlight, title, recurring].inspect.debug if @debug
|
208
243
|
{ title: title, recurring: recurring }
|
209
244
|
|
210
245
|
end
|
211
|
-
|
212
|
-
|
246
|
+
|
247
|
+
|
213
248
|
# 7th Oct Euston Station (meet at Timothy's house at 7pm)
|
214
249
|
get /^(\d(?:st|nd|rd|th) \w+) *(.*)\s+at\s+(\w+)/i do \
|
215
250
|
|raw_day, title, time|
|
216
|
-
|
251
|
+
|
217
252
|
d = Chronic.parse(raw_day + ' ' + time)
|
218
|
-
|
219
|
-
puts [1.5, title, raw_day, time].inspect.debug if @debug
|
253
|
+
|
254
|
+
puts ['1.5'.highlight, title, raw_day, time].inspect.debug if @debug
|
220
255
|
{ title: title, date: d }
|
221
|
-
|
222
|
-
end
|
256
|
+
|
257
|
+
end
|
223
258
|
|
224
259
|
# some event Wednesday
|
225
260
|
# some event Wednesday 11am
|
226
|
-
|
261
|
+
|
227
262
|
relative_day = '|today|tomorrow|tonight'
|
228
263
|
get /^(.*)\s+(#{weekdays2+relative_day}\b)(?: \(([^\)]+)\)) (at \d{1,2}(?::\d{2})?(?:[ap]m)?)/i \
|
229
264
|
do |title, raw_date, date2, time2|
|
230
265
|
puts ('time2: ' + time2.inspect).debug if @debug
|
231
266
|
puts ('date2: ' + date2).debug if @debug
|
232
267
|
puts ('raw_date: ' + raw_date).debug if @debug
|
233
|
-
|
268
|
+
|
234
269
|
d = if date2 then
|
235
270
|
Chronic.parse(date2 + ' '+ time2.to_s)
|
236
271
|
else
|
237
272
|
Chronic.parse(raw_date + ' '+ time2)
|
238
273
|
end
|
239
|
-
|
240
|
-
puts [4, title, raw_date, date2, time2].inspect.debug if @debug
|
274
|
+
|
275
|
+
puts ['4'.highlight, title, raw_date, date2, time2].inspect.debug if @debug
|
241
276
|
{title: title, date: d }
|
242
|
-
|
277
|
+
|
243
278
|
end
|
244
|
-
|
279
|
+
|
245
280
|
# Group meeting Red Hall 2pm-4pm on Monday (4th Dec 2017)
|
246
281
|
get /^(.*)\s+(#{times2})(?: on) +#{weekdays}\b(?: \(([^\)]+)\))?/i \
|
247
282
|
do |title, xtimes, raw_day, actual_date|
|
248
|
-
|
283
|
+
|
249
284
|
if @debug then
|
250
285
|
puts ('actual_date: ' + actual_date.inspect).debug
|
251
286
|
puts ('raw_day: ' + raw_day.inspect).debug
|
252
287
|
puts ('xtimes: ' + xtimes.inspect).debug
|
253
288
|
end
|
254
|
-
|
289
|
+
|
255
290
|
input = params[:input].clone
|
256
|
-
|
291
|
+
|
257
292
|
if actual_date then
|
258
293
|
d = Chronic.parse actual_date
|
259
294
|
else
|
260
|
-
d = Chronic.parse(raw_day)
|
295
|
+
d = Chronic.parse(raw_day)
|
261
296
|
input.sub!(/#{weekdays}\b/i,
|
262
|
-
%Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
|
297
|
+
%Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
|
263
298
|
end
|
264
299
|
|
265
300
|
t1, t2 = xtimes.split(/-/,2)
|
266
|
-
|
301
|
+
|
267
302
|
puts ('d: ' + d.inspect).debug if @debug
|
268
303
|
|
269
304
|
d1, d2 = [t1, t2].map {|t| Chronic.parse([d.to_date.to_s, t].join(' ')) }
|
270
|
-
|
271
|
-
puts [4.65, input, title, raw_day, d1, d2].inspect.debug if @debug
|
272
|
-
|
305
|
+
|
306
|
+
puts ['4.65'.highlight, input, title, raw_day, d1, d2].inspect.debug if @debug
|
307
|
+
|
273
308
|
{input: input, title: title, date: d1, end_date: d2 }
|
274
|
-
|
275
|
-
end
|
276
|
-
|
309
|
+
|
310
|
+
end
|
311
|
+
|
277
312
|
# hall 2 friday at 11am
|
278
313
|
|
279
314
|
get /^(.*)\s+#{weekdays}\b(?: \(([^\)]+)\))?(#{times})?/i \
|
280
315
|
do |title, raw_day, actual_date, time|
|
281
|
-
|
316
|
+
|
282
317
|
if @debug then
|
283
318
|
puts ('actual_date: ' + actual_date.inspect).debug
|
284
319
|
puts ('raw_day: ' + raw_day.inspect).debug
|
285
320
|
puts ('time: ' + time.inspect).debug
|
286
321
|
end
|
287
|
-
|
322
|
+
|
288
323
|
input = params[:input].clone
|
289
|
-
|
324
|
+
|
290
325
|
if actual_date then
|
291
326
|
d = Chronic.parse(raw_day + ' ' + time.to_s)
|
292
327
|
else
|
293
|
-
d = Chronic.parse(raw_day + ' ' + time.to_s)
|
328
|
+
d = Chronic.parse(raw_day + ' ' + time.to_s)
|
294
329
|
input.sub!(/#{weekdays}/i,
|
295
|
-
%Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
|
330
|
+
%Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
|
296
331
|
end
|
297
|
-
|
332
|
+
|
298
333
|
puts ('d: ' + d.inspect).debug if @debug
|
299
|
-
|
334
|
+
|
300
335
|
puts [1.7, input, title, raw_day].inspect.debug if @debug
|
301
|
-
|
336
|
+
|
302
337
|
{input: input, title: title, date: d }
|
303
|
-
|
304
|
-
end
|
305
|
-
|
306
|
-
|
338
|
+
|
339
|
+
end
|
340
|
+
|
341
|
+
|
307
342
|
# e.g. 21/05/2017 Forum meetup at Roundpeg from 2pm
|
308
|
-
get /^(\d+\/\d+\/\d+)\s+(.*)(?: from|at)\s+(\d+[ap]m)/ do
|
343
|
+
get /^(\d+\/\d+\/\d+)\s+(.*)(?: from|at)\s+(\d+[ap]m)/ do
|
309
344
|
|raw_date, title, raw_time|
|
310
|
-
|
311
|
-
d = Chronic.parse(raw_date + ' ' +
|
345
|
+
|
346
|
+
d = Chronic.parse(raw_date + ' ' +
|
312
347
|
raw_time, :endian_precedence => :little)
|
313
|
-
recurring = nil
|
314
|
-
|
348
|
+
recurring = nil
|
349
|
+
|
315
350
|
puts [3, title, raw_date].inspect.debug if @debug
|
316
351
|
{ title: title, date: d }
|
317
|
-
end
|
318
|
-
|
352
|
+
end
|
353
|
+
|
319
354
|
# friday hall 2 11am until 12am
|
320
355
|
get /^#{weekdays}\s+(.*)\s+#{times} until #{times}$/i do \
|
321
356
|
|raw_day, title, start_time, end_time|
|
322
|
-
|
357
|
+
|
323
358
|
venue = title[/^at +(.*)/,1]
|
324
359
|
d = Chronic.parse(raw_day + ' ' + start_time)
|
325
360
|
d2 = Chronic.parse(raw_day + ' ' + end_time)
|
326
|
-
|
361
|
+
|
327
362
|
puts ['1.44.3', title, raw_day].inspect.debug if @debug
|
328
363
|
{ title: title, date: d, end_date: d2, venue: venue }
|
329
|
-
|
330
|
-
end
|
331
|
-
|
364
|
+
|
365
|
+
end
|
366
|
+
|
332
367
|
# friday hall 2 11am
|
333
368
|
get /^#{weekdays}\b\s+(.*)\s+(\d+(?::\d{2})?[ap]m)$/i do \
|
334
369
|
|raw_day, title, time|
|
335
|
-
|
370
|
+
|
336
371
|
puts [raw_day, title, time].inspect if @debug
|
337
372
|
venue = title[/^at +(.*)/,1]
|
338
373
|
d = Chronic.parse(raw_day + ' ' + time)
|
339
|
-
|
374
|
+
|
340
375
|
puts [1.44, title, raw_day].inspect.debug if @debug
|
341
376
|
{ title: title, date: d, venue: venue }
|
342
|
-
|
343
|
-
end
|
377
|
+
|
378
|
+
end
|
344
379
|
|
345
380
|
# Tuesday 10th July hall 2 at 11am
|
346
381
|
get /#{weekdays}\b\s+#{days}\s+#{months}\s+(?:at )?(.*)\s+at\s+(#{times})/i \
|
347
382
|
do |wday, day, month, title, time|
|
348
|
-
|
383
|
+
|
349
384
|
d = Chronic.parse([day, month, time].join(' '))
|
350
|
-
|
385
|
+
|
351
386
|
puts ['1.44.5', day, month, title].inspect.debug if @debug
|
352
387
|
{ title: title, date: d }
|
353
|
-
|
354
|
-
end
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
388
|
+
|
389
|
+
end
|
390
|
+
|
391
|
+
|
392
|
+
|
393
|
+
|
359
394
|
# 27-Mar@1436 some important day
|
360
395
|
# 25/07/2017 11pm some important day
|
361
396
|
#
|
362
397
|
get /^(\d+\/\d+\/\d+)\s*(\d+(?:\:\d+)?[ap]m)?\s+([^\*]+)(\*)?/ \
|
363
398
|
do |raw_date, time, title, annualar|
|
364
399
|
|
365
|
-
d = Chronic.parse(raw_date + ' ' + time.to_s,
|
400
|
+
d = Chronic.parse(raw_date + ' ' + time.to_s,
|
366
401
|
:endian_precedence => :little)
|
367
402
|
recurring = nil
|
368
|
-
|
403
|
+
|
369
404
|
if annualar then
|
370
|
-
|
405
|
+
|
371
406
|
recurring = 'yearly'
|
372
407
|
if d < @now then
|
373
|
-
d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
|
408
|
+
d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
|
374
409
|
end
|
375
410
|
end
|
376
|
-
|
377
|
-
|
411
|
+
|
412
|
+
|
378
413
|
puts [3, title, raw_date, time].inspect.debug if @debug
|
379
414
|
{ title: title, date: d, recurring: recurring }
|
380
415
|
end
|
381
416
|
|
382
417
|
|
383
|
-
|
418
|
+
|
384
419
|
# Some event (10 Woodhouse Lane) 30th Nov from 9:15-17:00
|
385
420
|
|
386
421
|
get /^(.*) #{days} #{months}(?: from)? (#{times2})/i do \
|
@@ -395,7 +430,7 @@ class EventNlp
|
|
395
430
|
|
396
431
|
{ title: title, date: d1, end_date: d2 }
|
397
432
|
end
|
398
|
-
|
433
|
+
|
399
434
|
# Some event (10 Woodhouse Lane) 30th Nov from 9:15-17:00
|
400
435
|
|
401
436
|
get /^#{weekdays}\b #{months} #{days} #{times3} (.*)/i do \
|
@@ -410,7 +445,7 @@ class EventNlp
|
|
410
445
|
puts [4.55, title, d1, d2].inspect.debug if @debug
|
411
446
|
|
412
447
|
{ title: title, date: d1, end_date: d2 }
|
413
|
-
end
|
448
|
+
end
|
414
449
|
|
415
450
|
# e.g. Wednesday 30th Nov at 9:15 10 Woodhouse Lane
|
416
451
|
|
@@ -422,8 +457,8 @@ class EventNlp
|
|
422
457
|
puts [4.6, title, d1].inspect.debug if @debug
|
423
458
|
|
424
459
|
{ title: title, date: d1 }
|
425
|
-
end
|
426
|
-
|
460
|
+
end
|
461
|
+
|
427
462
|
# Some event (10 Woodhouse Lane) 30th Nov at 9:15-
|
428
463
|
|
429
464
|
get /^(.*) #{days} #{months}(?: at)? (#{times})/i do \
|
@@ -440,73 +475,73 @@ class EventNlp
|
|
440
475
|
# hall 2 at 11am
|
441
476
|
#
|
442
477
|
get /(.*)\s+at\s+(#{times})/i do |title, time|
|
443
|
-
|
478
|
+
|
444
479
|
d = Chronic.parse(time)
|
445
|
-
|
480
|
+
|
446
481
|
puts [1.45, title].inspect.debug if @debug
|
447
482
|
{ title: title, date: d }
|
448
|
-
|
449
|
-
end
|
450
|
-
|
451
|
-
|
483
|
+
|
484
|
+
end
|
485
|
+
|
486
|
+
|
452
487
|
# Council Tax on the last day of the month
|
453
488
|
#
|
454
489
|
get /^(.*) (?:o[nf] the)\s*last day of the month/i do |title|
|
455
|
-
|
490
|
+
|
456
491
|
td = @now.to_date
|
457
492
|
d = Date.civil(td.year, td.month, -1).to_time
|
458
|
-
|
493
|
+
|
459
494
|
puts [5, title].inspect.debug if @debug
|
460
495
|
{ title: title, date: d }
|
461
|
-
|
462
|
-
end
|
463
|
-
|
496
|
+
|
497
|
+
end
|
498
|
+
|
464
499
|
# Council Tax last day of the month
|
465
500
|
#
|
466
501
|
get /^(.*) +last day of the month/i do |title|
|
467
|
-
|
502
|
+
|
468
503
|
td = @now.to_date
|
469
504
|
d = Date.civil(td.year, td.month, -1).to_time
|
470
|
-
|
505
|
+
|
471
506
|
puts [5.1, title].inspect.debug if @debug
|
472
507
|
{ title: title, date: d }
|
473
|
-
|
474
|
-
end
|
475
|
-
|
508
|
+
|
509
|
+
end
|
510
|
+
|
476
511
|
# some important day 11 Oct *
|
477
512
|
#
|
478
513
|
get /^(.*) +(\d+) +#{months} *(\*)?/i \
|
479
514
|
do |title, day, month, annualar|
|
480
|
-
|
515
|
+
|
481
516
|
raw_date = day + ' ' + month
|
482
517
|
|
483
|
-
d = Chronic.parse(raw_date,
|
518
|
+
d = Chronic.parse(raw_date,
|
484
519
|
:endian_precedence => :little)
|
485
520
|
recurring = nil
|
486
|
-
|
521
|
+
|
487
522
|
if annualar then
|
488
|
-
|
523
|
+
|
489
524
|
recurring = 'yearly'
|
490
525
|
if d < @now then
|
491
|
-
d = Chronic.parse(raw_date,
|
492
|
-
now: Time.local(@now.year + 1, 1, 1))
|
526
|
+
d = Chronic.parse(raw_date,
|
527
|
+
now: Time.local(@now.year + 1, 1, 1))
|
493
528
|
end
|
494
529
|
end
|
495
|
-
|
496
|
-
|
530
|
+
|
531
|
+
|
497
532
|
puts [6, title, raw_date].inspect.debug if @debug
|
498
533
|
{ title: title, date: d, recurring: recurring }
|
499
534
|
end
|
500
|
-
|
501
|
-
|
502
|
-
|
535
|
+
|
536
|
+
|
537
|
+
|
503
538
|
# Tuesday 3rd October gas service at Barbara's house morning 9am-1pm
|
504
539
|
#
|
505
540
|
get '*' do
|
506
|
-
|
541
|
+
|
507
542
|
s = params[:input]
|
508
|
-
|
509
|
-
time1, time2, month, weekday, day, end_date, annualar = nil, nil, nil,
|
543
|
+
|
544
|
+
time1, time2, month, weekday, day, end_date, annualar = nil, nil, nil,
|
510
545
|
nil, nil, nil, false
|
511
546
|
|
512
547
|
s2 = s.sub(/#{times}/i) {|x| time1 = x; ''}
|
@@ -521,29 +556,29 @@ class EventNlp
|
|
521
556
|
raw_date = [day, month].compact.join(' ')
|
522
557
|
raw_date = weekday if raw_date.empty?
|
523
558
|
|
524
|
-
d = Chronic.parse(raw_date + ' ' + time1.to_s,
|
559
|
+
d = Chronic.parse(raw_date + ' ' + time1.to_s,
|
525
560
|
:endian_precedence => :little, now: @now)
|
526
|
-
|
561
|
+
|
527
562
|
if time2 then
|
528
|
-
end_date = Chronic.parse(raw_date + ' ' + time2.to_s,
|
563
|
+
end_date = Chronic.parse(raw_date + ' ' + time2.to_s,
|
529
564
|
:endian_precedence => :little)
|
530
565
|
end
|
531
|
-
|
566
|
+
|
532
567
|
recurring = nil
|
533
|
-
|
568
|
+
|
534
569
|
if annualar then
|
535
|
-
|
570
|
+
|
536
571
|
recurring = 'yearly'
|
537
572
|
if d < @now then
|
538
|
-
d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
|
573
|
+
d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
|
539
574
|
end
|
540
|
-
end
|
541
|
-
|
575
|
+
end
|
576
|
+
|
542
577
|
puts [10, title, raw_date, time1].inspect.debug if @debug
|
543
578
|
{ title: title, date: d, end_date: end_date, recurring: recurring }
|
544
|
-
end
|
545
|
-
|
546
|
-
|
579
|
+
end
|
580
|
+
|
581
|
+
|
547
582
|
end
|
548
|
-
|
583
|
+
|
549
584
|
end
|
data.tar.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
ot�+�a����B����g��!b��C��xD��R�ŀ���
|
2
|
+
,Twq�-m�T�%GZ�.z�0<��f��Eϊ����ԫ�de�����y�iur��@�~6�4��p�ӄ�O>j���UWA��.�^J,�F���|�9�HG�������#���T��3*]�r~d;2�Yk�,��=�,������L�v:(�S/�ܢ��n�ا+-�O%H�Wj���bf7�=�07v�H˸X��~�v*�pPw�<Mt���움�u�"&6�6+�p]=�A��.�T�E���~�Gy\�N�i�x�иWT�!Lʠ�����k���b���qo�P{eZ5�B��a��G��lN
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: event_nlp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -10,48 +10,53 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
13
|
+
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjAyMTQwNDQxWhcN
|
15
|
+
MjMwMjAyMTQwNDQxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDRlXO8
|
17
|
+
lKNDGq9FsP2ZGakZKcR2g8utQq4DCO4x2ZpGzdq2uRuvZl/TG1eUt4NrHi6CAoYZ
|
18
|
+
Q3Sf11JJCL4ZBEi6Qm4YVMQ06gdsWBeWcO9wnOv198eKqsWbVmzpvRWmKJvjpzEY
|
19
|
+
nilcadAm1CCadUvfOi25WNhz+4jbzP09rdrI64Rmp0GJv5DjmtmgznQEWWZPyRVw
|
20
|
+
5mbMIxAxepUus1KFkZSXsyqWsmcupJ0z4myicgD0GPNL47hO84DwG6KZ1dpVS/ar
|
21
|
+
E0KCPZPKIN7dnLsqgAnw41/VRQSDUdjyT7T8sv6Kb/wa6hXxaS/SFVlI8G5RI/la
|
22
|
+
tjGIHg84+JFySryZVGHpOepGxgILpeqNvXXIK59Az1/OiS70A3xQBFmHYUNngbJd
|
23
|
+
8Gk83TYzTksXvnVBEhJKZwZYuWHT32burAz7+RDBdXl2cdiwX5IjkUq0BqPaGeuu
|
24
|
+
ZpJl29gP1YlCImTGWEPx9y30G/kdNYuVOJbzk2UEdCSlYjAQVtrYLTGRW08CAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUSXtv+Esp
|
26
|
+
k8epEo2XhtatYkQhLO0wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
|
+
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEACwZ89nT9aFdxhWGboWw+R5rAnTRqDQS2U1/n7Vs0
|
29
|
+
uAMg5MVU/jIEFCnynXZMmJwzN3r972rkjxj9mn6DGnVu1YI1IAohMwls5BVPm4/V
|
30
|
+
HgOsV5YFOzfJpThCqVzo3HwkqZWoO7LEgIIHJ/3UYnCfWM6uHmDuyOTLnCHL+lVD
|
31
|
+
1pi26mG34ViOfEQzgW6HwswixuUQ4LI2eYtzyKIS3qAYEVm7UwujdbKghEycFKdF
|
32
|
+
sBJVdzARYZGMbrKm8dWeBWrMhW+Fdy8HlN0D4XMYmCIYghZ5XiOICaTlv4rYOkr8
|
33
|
+
sThE7E1FNUonatzkBVmSDlJZ6K0nBZLy3RKC48BP8SnSM/LtQe9atiiJBPOAOck3
|
34
|
+
yjnIKndZd6EKQ2X55kjrO1J+/2tqfMOUjH8/pJLmeeR8xV5+oAz65qpFx8FZOFPC
|
35
|
+
w8lJ+I6Lqqr5GpsweOnEHW4w200sMRD40u8qmGHrqirihL2KrwTD6A9UObvA5AxZ
|
36
|
+
4Z4EPvKg+3jsK9Gv3GGSLdrD
|
32
37
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
38
|
+
date: 2022-04-01 00:00:00.000000000 Z
|
34
39
|
dependencies:
|
35
40
|
- !ruby/object:Gem::Dependency
|
36
41
|
name: chronic_cron
|
37
42
|
requirement: !ruby/object:Gem::Requirement
|
38
43
|
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
version: 0.5.0
|
42
44
|
- - "~>"
|
43
45
|
- !ruby/object:Gem::Version
|
44
|
-
version: '0.
|
46
|
+
version: '0.7'
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.7.1
|
45
50
|
type: :runtime
|
46
51
|
prerelease: false
|
47
52
|
version_requirements: !ruby/object:Gem::Requirement
|
48
53
|
requirements:
|
49
|
-
- - ">="
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version: 0.5.0
|
52
54
|
- - "~>"
|
53
55
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
56
|
+
version: '0.7'
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.7.1
|
55
60
|
- !ruby/object:Gem::Dependency
|
56
61
|
name: app-routes
|
57
62
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,7 +78,7 @@ dependencies:
|
|
73
78
|
- !ruby/object:Gem::Version
|
74
79
|
version: 0.1.19
|
75
80
|
description:
|
76
|
-
email:
|
81
|
+
email: digital.robertson@gmail.com
|
77
82
|
executables: []
|
78
83
|
extensions: []
|
79
84
|
extra_rdoc_files: []
|
@@ -98,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
103
|
- !ruby/object:Gem::Version
|
99
104
|
version: '0'
|
100
105
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.2.22
|
102
107
|
signing_key:
|
103
108
|
specification_version: 4
|
104
109
|
summary: 'Parses a calendar event for date, time, and description e.g. hall 2 friday
|
metadata.gz.sig
CHANGED
Binary file
|