event_nlp 0.6.8 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/event_nlp.rb +215 -163
  4. data.tar.gz.sig +0 -0
  5. metadata +28 -27
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1200231cc34b803c923b8b4f83b03a7f9d4f97e5459b8ad0b28d90a8140bd024
4
- data.tar.gz: af0a750f75290c985454611f61004df0e31b73be38f58857af60d8ef7ba62e25
3
+ metadata.gz: b7bd2a0880cb2646bfd8241934a3f295f2790d1c8a6912058bf26dbd12c2f5e4
4
+ data.tar.gz: 1e62175f0137981d910a8e177f2f2ba6026e54e8f8306f17037f6f8d19d800aa
5
5
  SHA512:
6
- metadata.gz: aa698ae6633855f0dbc21244c57283aa9bb0155aba6f2e43fc17d9d76a1aa0bbf520e1edf4cee2940738bdedee4ec1f01a52b61b98257e9ab974319e4ad36192
7
- data.tar.gz: 83d534cda5ab96200952401ebde246701b30ce40fa8133f8badcb948f5edf9dbd7bdf6d209e718c32aa893cfcd227788a39c05163c0232492c6e261fa0142b35
6
+ metadata.gz: 803ba376567fd1693bbc3618bda094d46608ba293ca1d43dd93df305d017ce2403190fb8b33df128ef260e9210f33a530a4aa1fb1a62923d9f35c9bd77bed026
7
+ data.tar.gz: 26385ac01d68d9162d57e822ec271c1993f214b2e5960198f5a13d30fbb2368e34d6db5ee6e13422a76cadeda6c06cc6f6072aac70f3733162cb0aada7aa3b8c
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/event_nlp.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  # file: event_nlp.rb
4
4
 
5
- require 'chronic_cron'
6
5
  require 'ostruct'
7
6
  require 'app-routes'
7
+ require 'chronic_cron'
8
8
 
9
9
 
10
10
  module Ordinals
@@ -22,20 +22,22 @@ class EventNlp
22
22
  include AppRoutes
23
23
  using Ordinals
24
24
  using ColouredText
25
-
25
+
26
26
  attr_accessor :params
27
-
27
+
28
28
  def initialize(now=Time.now, params: {}, debug: false)
29
-
29
+
30
30
  super()
31
-
31
+
32
+ @debug = debug
33
+
32
34
  @now = now
33
35
  @params = params
34
36
  expressions(@params)
35
- @debug = debug
36
37
 
37
- end
38
38
 
39
+ end
40
+
39
41
  def parse(raws)
40
42
 
41
43
  s = filter_irregular(raws)
@@ -46,17 +48,36 @@ class EventNlp
46
48
  r = run_route(s)
47
49
 
48
50
  return unless r.is_a? Hash
49
-
51
+
50
52
  OpenStruct.new({input: s}.merge r)
51
-
53
+
52
54
  end
53
55
 
54
56
  # returns an Array object of dates, projected from a recurring event
55
57
  #
58
+ # Example parameters:
59
+ #
60
+ # s: 'Council Tax 30th Monthly'
61
+ # s: 'Council Tax 30th Monthly until 2nd October'
62
+ #
56
63
  def project(s, year: @now.year)
57
64
 
58
- r0 = parse s
65
+ s2, raw_end_date = s.split(/ +\buntil\b +/)
66
+
67
+ end_date = if raw_end_date then
68
+ EventNlp.new().parse(raw_end_date).date
69
+ else
70
+ (Date.parse('1 Jan ' + (year+1).to_s) - 1).to_time
71
+ end
72
+
73
+ puts 'project/end_date: ' + end_date.inspect if @debug
74
+
75
+ # filter the input to ensure validity
76
+ r0 = parse s2
77
+ puts 'project/r0: ' + r0.inspect if @debug
59
78
  r = parse r0.input
79
+ puts 'project/r: ' + r.inspect if @debug
80
+
60
81
  dates = []
61
82
  now = @now
62
83
 
@@ -68,8 +89,9 @@ class EventNlp
68
89
  end
69
90
 
70
91
  return [r.date] if (r.date == EventNlp.new(r.date+1, debug: @debug).parse(r.input).date)
92
+ #year.to_i
71
93
 
72
- while r.date.year == year.to_i do
94
+ while r.date <= end_date do
73
95
 
74
96
  dates << r.date
75
97
  @now = if r.recurring == 'month' then
@@ -143,50 +165,52 @@ class EventNlp
143
165
 
144
166
  end
145
167
 
146
- def expressions(params)
168
+ def expressions(params)
147
169
 
148
170
  starting = /(?:\(?\s*starting (\d+\w{2} \w+\s*\w*)(?: until (.*))?\s*\))?/
149
- weekdays2 = (Date::DAYNAMES + Date::ABBR_DAYNAMES).join('|').downcase
171
+ weekdays2 = (Date::DAYNAMES + Date::ABBR_DAYNAMES).join('|').downcase
150
172
  weekdays = "(%s)" % weekdays2
151
173
  months = "(%s)" % (Date::MONTHNAMES[1..-1] + Date::ABBR_MONTHNAMES[1..-1])\
152
174
  .join('|').downcase
175
+ years = /(20[0-9]{2})/
176
+
153
177
  times = /(?: *(?:at |@ |from )?(\d+(?::\d+)?(?:[ap]m|\b)) *)/
154
178
  times2 = /\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?/
155
- times3 = /(\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?)/
179
+ times3 = /(\d+(?::\d+)?[ap]m-\d+(?::\d+)?[ap]m|\d+(?::\d+)?-\d+(?::\d+)?)/
156
180
  days = /(\d+(?:st|nd|rd|th))/
157
181
  periods = /day|week|month/
158
-
182
+
159
183
  #weekdays = Date::DAYNAMES.join('|').downcase
160
184
  #
161
-
185
+
162
186
  #times = /(?: *at )?\d[ap]m/
163
187
 
164
- # e.g. electricity bill on the 28th of every month
188
+ # e.g. electricity bill on the 28th of every month
165
189
 
166
190
  get /(.*) on the #{days} of every (month)/i do |title, day, recurring|
167
191
 
168
192
 
169
193
  puts 'day: ' + day.inspect if @debug
170
194
  raw_d = Chronic.parse(day + ' ' + Date::MONTHNAMES[@now.month], now: @now)
171
-
195
+
172
196
  # if the date is less than now then increment it by a month
173
197
  d = raw_d < @now ? (raw_d.to_date >> 1).to_time : raw_d
174
-
175
-
198
+
199
+
176
200
  if @debug then
177
201
  puts [0.1, title, recurring, d].inspect.debug
178
202
  end
179
-
180
- {title: title, recurring: recurring, date: d}
181
-
203
+
204
+ {title: title, recurring: recurring, date: d}
205
+
182
206
  end
183
-
207
+
184
208
  #
185
209
 
186
210
  get /^(.*)\s+(every \d\w+ \w+#{times}\s*#{starting})/ do \
187
211
  |title, recurring, time, raw_date, end_date|
188
212
 
189
- input = params[:input].clone
213
+ input = params[:input].clone
190
214
  d = Chronic.parse(raw_date + ' ' + time.to_s, now: @now)
191
215
 
192
216
  if @debug then
@@ -194,7 +218,7 @@ class EventNlp
194
218
  puts 'd: ' + d.inspect
195
219
  puts 'recurring: ' + recurring.inspect
196
220
  end
197
-
221
+
198
222
  if recurring =~ /day|week/ then
199
223
 
200
224
  if d < @now then
@@ -210,22 +234,22 @@ class EventNlp
210
234
  puts 'new_date: ' + new_date.inspect if @debug
211
235
 
212
236
  input.gsub!(raw_date, new_date\
213
- .strftime("#{new_date.day.ordinal} %b %Y"))
237
+ .strftime("#{new_date.day.ordinal} %b %Y"))
214
238
  d = new_date
215
-
239
+
216
240
  end
217
241
  end
218
-
242
+
219
243
  if @debug then
220
244
  puts 'd: ' + d.inspect
221
245
  puts ["0.2", input, title, recurring, time, raw_date, end_date].inspect.debug
222
246
  end
223
-
224
- {input: input, title: title, recurring: recurring, date: d,
225
- end_date: end_date}
226
-
247
+
248
+ {input: input, title: title, recurring: recurring, date: d,
249
+ end_date: end_date}
250
+
227
251
  end
228
-
252
+
229
253
  # e.g. some event 1st Monday of every month (starting 3rd Jul 2017)
230
254
 
231
255
  get /^(.*)\s+(\d(?:st|nd|rd|th) \w+ of every \w+(?: at (\d+[ap]m) )?)\s*#{starting}/ do \
@@ -233,32 +257,32 @@ class EventNlp
233
257
 
234
258
  input = params[:input].clone
235
259
  d = Chronic.parse(raw_date, now: @now)
236
-
237
- if recurring =~ /day|week|month/ then
238
-
260
+
261
+ if recurring =~ /day|week|month/ then
262
+
239
263
  if d < @now then
240
264
 
241
265
  new_date = CronFormat.new(ChronicCron.new(recurring)\
242
266
  .to_expression, d).to_time
243
267
  input.gsub!(raw_date, new_date\
244
- .strftime("#{new_date.day.ordinal} %b %Y"))
268
+ .strftime("#{new_date.day.ordinal} %b %Y"))
245
269
  d = new_date
246
270
  else
247
271
  d = ChronicCron.new(recurring, d.to_date.to_time).to_time
248
272
  end
249
273
  end
250
-
274
+
251
275
  puts ['0.3'.highlight, title, recurring, time, raw_date, end_date].inspect.debug if @debug
252
- {input: input, title: title, recurring: recurring, date: d, end_date:
276
+ {input: input, title: title, recurring: recurring, date: d, end_date:
253
277
  end_date}
254
-
255
- end
278
+
279
+ end
256
280
 
257
281
  # some event every 2 weeks
258
282
  # some event every 2 weeks at 6am starting from 14th Jan
259
283
  # some event every 2 weeks at 6am starting from 18th Feb until 28th Oct
260
284
  # some event every 2nd Monday (starting 7th Nov 2016)
261
- # some event every 2nd Monday (starting 7th Nov until 3rd Dec)
285
+ # some event every 2nd Monday (starting 7th Nov until 3rd Dec)
262
286
  # some event every 2 weeks (starting 02/11/17)
263
287
  # some event every Wednesday 1pm-4pm
264
288
  #
@@ -267,22 +291,22 @@ class EventNlp
267
291
  input = params[:input].clone
268
292
  puts 'recurring: ' + recurring.inspect if @debug
269
293
  raw_start_date = recurring[/(?<=starting )[^\)]+/]
270
-
294
+
271
295
  d = if raw_start_date then
272
- start_date = Chronic.parse(raw_start_date, now: @now - 1,
296
+ start_date = Chronic.parse(raw_start_date, now: @now - 1,
273
297
  :endian_precedence => :little)
274
298
 
275
299
  puts ('recurring: ' + recurring.inspect).debug if @debug
276
300
  puts ('start_date: ' + start_date.inspect).debug if @debug
277
-
301
+
278
302
  if @now > start_date then
279
303
  exp = ChronicCron.new(recurring, start_date, debug: @debug).to_expression
280
304
  puts 'exp: ' + exp.inspect if @debug
281
-
305
+
282
306
  cf = CronFormat.new(exp, start_date, debug: @debug)
283
307
  puts ('cf.to_time: ' + cf.to_time.inspect).debug if @debug
284
308
  cf.next until cf.to_time > start_date
285
-
309
+
286
310
  new_date = cf.to_time
287
311
  input.gsub!(/(?<=starting )[^\)]+/, new_date\
288
312
  .strftime("#{new_date.day.ordinal} %b %Y"))
@@ -291,183 +315,183 @@ class EventNlp
291
315
  else
292
316
  start_date
293
317
  end
294
-
318
+
295
319
  else
296
320
  exp = ChronicCron.new(recurring).to_expression
297
321
  cf = CronFormat.new(exp, @now)
298
322
  cf.to_time
299
323
  end
324
+
300
325
 
301
-
302
-
326
+
303
327
  if recurring =~ /-/ then
304
- end_date = Chronic.parse d.to_date.to_s + ' ' +
328
+ end_date = Chronic.parse d.to_date.to_s + ' ' +
305
329
  recurring[/(?<=-)\d+(?::\d+)?(?:[ap]m)?/], now: @now
306
330
  end
307
-
331
+
308
332
  puts ['0.5'.highlight, title, recurring, d].join("\n").debug if @debug
309
- {input: input, title: title.rstrip, recurring: recurring,
333
+ {input: input, title: title.rstrip, recurring: recurring,
310
334
  date: d, end_date: end_date }
311
-
312
- end
313
-
335
+
336
+ end
337
+
314
338
  # some meeting 3rd thursday of the month at 7:30pm
315
339
  # some meeting First thursday of the month at 7:30pm
316
- get /(.*)\s+(\w+ \w+day of (?:the|every) month at .*)/ do
340
+ get /(.*)\s+(\w+ \w+day of (?:the|every) month at .*)/ do
317
341
  |title, recurring|
318
342
 
319
343
  puts ['1'.highlight, title, recurring].inspect.debug if @debug
320
344
  { title: title, recurring: recurring }
321
345
 
322
346
  end
323
-
324
-
347
+
348
+
325
349
  # 7th Oct Euston Station (meet at Timothy's house at 7pm)
326
350
  get /^(\d(?:st|nd|rd|th) \w+) *(.*)\s+at\s+(\w+)/i do \
327
351
  |raw_day, title, time|
328
-
352
+
329
353
  d = Chronic.parse(raw_day + ' ' + time, now: @now)
330
-
354
+
331
355
  puts ['1.5'.highlight, title, raw_day, time].inspect.debug if @debug
332
356
  { title: title, date: d }
333
-
334
- end
357
+
358
+ end
335
359
 
336
360
  # some event Wednesday
337
361
  # some event Wednesday 11am
338
-
362
+
339
363
  relative_day = '|today|tomorrow|tonight'
340
364
  get /^(.*)\s+(#{weekdays2+relative_day}\b)(?: \(([^\)]+)\)) (at \d{1,2}(?::\d{2})?(?:[ap]m)?)/i \
341
365
  do |title, raw_date, date2, time2|
342
366
  puts ('time2: ' + time2.inspect).debug if @debug
343
367
  puts ('date2: ' + date2).debug if @debug
344
368
  puts ('raw_date: ' + raw_date).debug if @debug
345
-
369
+
346
370
  d = if date2 then
347
371
  Chronic.parse(date2 + ' '+ time2.to_s, now: @now)
348
372
  else
349
373
  Chronic.parse(raw_date + ' '+ time2, now: @now)
350
374
  end
351
-
375
+
352
376
  puts ['4'.highlight, title, raw_date, date2, time2].inspect.debug if @debug
353
377
  {title: title, date: d }
354
-
378
+
355
379
  end
356
-
380
+
357
381
  # Group meeting Red Hall 2pm-4pm on Monday (4th Dec 2017)
358
382
  get /^(.*)\s+(#{times2})(?: on) +#{weekdays}\b(?: \(([^\)]+)\))?/i \
359
383
  do |title, xtimes, raw_day, actual_date|
360
-
384
+
361
385
  if @debug then
362
386
  puts ('actual_date: ' + actual_date.inspect).debug
363
387
  puts ('raw_day: ' + raw_day.inspect).debug
364
388
  puts ('xtimes: ' + xtimes.inspect).debug
365
389
  end
366
-
390
+
367
391
  input = params[:input].clone
368
-
392
+
369
393
  if actual_date then
370
394
  d = Chronic.parse actual_date, now: @now
371
395
  else
372
396
  d = Chronic.parse(raw_day, now: @now)
373
397
  input.sub!(/#{weekdays}\b/i,
374
- %Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
398
+ %Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
375
399
  end
376
400
 
377
401
  t1, t2 = xtimes.split(/-/,2)
378
-
402
+
379
403
  puts ('d: ' + d.inspect).debug if @debug
380
404
 
381
405
  d1, d2 = [t1, t2].map {|t| Chronic.parse([d.to_date.to_s, t].join(' '), now: @now) }
382
-
406
+
383
407
  puts ['4.65'.highlight, input, title, raw_day, d1, d2].inspect.debug if @debug
384
-
408
+
385
409
  {input: input, title: title, date: d1, end_date: d2 }
386
-
387
- end
388
-
410
+
411
+ end
412
+
389
413
  # hall 2 friday at 11am
390
414
 
391
415
  get /^(.*)\s+#{weekdays}\b(?: \(([^\)]+)\))?(?:#{times})? *(weekly)?/i \
392
416
  do |title, raw_day, actual_date, time, recurring|
393
-
417
+
394
418
  if @debug then
395
419
  puts ('recurring: ' + recurring.inspect).debug
396
420
  puts ('actual_date: ' + actual_date.inspect).debug
397
421
  puts ('raw_day: ' + raw_day.inspect).debug
398
422
  puts ('time: ' + time.inspect).debug
399
423
  end
400
-
424
+
401
425
  input = params[:input].clone
402
426
 
403
427
  d = Chronic.parse(raw_day + ' ' + time.to_s, now: @now)
404
428
 
405
429
  if recurring.nil?
406
430
  input.sub!(/#{weekdays}/i,
407
- %Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
431
+ %Q(#{raw_day} (#{d.strftime("#{d.day.ordinal} %b %Y")})))
408
432
  end
409
-
433
+
410
434
  puts ('d: ' + d.inspect).debug if @debug
411
-
435
+
412
436
  puts [1.7, input, title, raw_day].inspect.debug if @debug
413
-
437
+
414
438
  {input: input, title: title, date: d }
415
-
416
- end
417
-
418
-
439
+
440
+ end
441
+
442
+
419
443
  # e.g. 21/05/2017 Forum meetup at Roundpeg from 2pm
420
- get /^(\d+\/\d+\/\d+)\s+(.*)(?: from|at)\s+(\d+[ap]m)/ do
444
+ get /^(\d+\/\d+\/\d+)\s+(.*)(?: from|at)\s+(\d+[ap]m)/ do
421
445
  |raw_date, title, raw_time|
422
-
423
- d = Chronic.parse(raw_date + ' ' +
446
+
447
+ d = Chronic.parse(raw_date + ' ' +
424
448
  raw_time, now: @now, :endian_precedence => :little)
425
- recurring = nil
426
-
449
+ recurring = nil
450
+
427
451
  puts [3, title, raw_date].inspect.debug if @debug
428
452
  { title: title, date: d }
429
- end
430
-
453
+ end
454
+
431
455
  # friday hall 2 11am until 12am
432
456
  get /^#{weekdays}\s+(.*)\s+#{times} until #{times}$/i do \
433
457
  |raw_day, title, start_time, end_time|
434
-
458
+
435
459
  venue = title[/^at +(.*)/,1]
436
460
  d = Chronic.parse(raw_day + ' ' + start_time, now: @now)
437
461
  d2 = Chronic.parse(raw_day + ' ' + end_time, now: @now)
438
-
462
+
439
463
  puts ['1.44.3', title, raw_day].inspect.debug if @debug
440
464
  { title: title, date: d, end_date: d2, venue: venue }
441
-
442
- end
443
-
465
+
466
+ end
467
+
444
468
  # friday hall 2 11am
445
469
  get /^#{weekdays}\b\s+(.*)\s+(\d+(?::\d{2})?[ap]m)$/i do \
446
470
  |raw_day, title, time|
447
-
471
+
448
472
  puts [raw_day, title, time].inspect if @debug
449
473
  venue = title[/^at +(.*)/,1]
450
474
  d = Chronic.parse(raw_day + ' ' + time, now: @now)
451
-
475
+
452
476
  puts [1.44, title, raw_day].inspect.debug if @debug
453
477
  { title: title, date: d, venue: venue }
454
-
455
- end
478
+
479
+ end
456
480
 
457
481
  # Tuesday 10th July hall 2 at 11am
458
482
  get /#{weekdays}\b\s+#{days}\s+#{months}\s+(?:at )?(.*)\s+at\s+(#{times})/i \
459
483
  do |wday, day, month, title, time|
460
-
484
+
461
485
  d = Chronic.parse([day, month, time].join(' '), now: @now)
462
-
486
+
463
487
  puts ['1.44.5', day, month, title].inspect.debug if @debug
464
488
  { title: title, date: d }
465
-
466
- end
467
-
468
-
469
-
470
-
489
+
490
+ end
491
+
492
+
493
+
494
+
471
495
  # 27-Mar@1436 some important day
472
496
  # 25/07/2017 11pm some important day
473
497
  #
@@ -477,22 +501,22 @@ class EventNlp
477
501
  d = Chronic.parse(raw_date + ' ' + time.to_s, now: @now,
478
502
  :endian_precedence => :little)
479
503
  recurring = nil
480
-
504
+
481
505
  if annualar then
482
-
506
+
483
507
  recurring = 'yearly'
484
508
  if d < @now then
485
- d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
509
+ d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
486
510
  end
487
511
  end
488
-
489
-
512
+
513
+
490
514
  puts [3, title, raw_date, time].inspect.debug if @debug
491
515
  { title: title, date: d, recurring: recurring }
492
516
  end
493
517
 
494
518
 
495
-
519
+
496
520
  # Some event (10 Woodhouse Lane) 30th Nov from 9:15-17:00
497
521
 
498
522
  get /^(.*) #{days} #{months}(?: from)? (#{times2})/i do \
@@ -507,7 +531,7 @@ class EventNlp
507
531
 
508
532
  { title: title, date: d1, end_date: d2 }
509
533
  end
510
-
534
+
511
535
  # Some event (10 Woodhouse Lane) 30th Nov from 9:15-17:00
512
536
 
513
537
  get /^#{weekdays}\b #{months} #{days} #{times3} (.*)/i do \
@@ -522,7 +546,7 @@ class EventNlp
522
546
  puts [4.55, title, d1, d2].inspect.debug if @debug
523
547
 
524
548
  { title: title, date: d1, end_date: d2 }
525
- end
549
+ end
526
550
 
527
551
  # e.g. Wednesday 30th Nov at 9:15 10 Woodhouse Lane
528
552
 
@@ -536,12 +560,40 @@ class EventNlp
536
560
  { title: title, date: d1 }
537
561
  end
538
562
 
563
+ # Some event (10 Woodhouse Lane) 30th Nov at 9:15-10:00
564
+
565
+ get /^(.*) #{days} #{months} #{years}(?: at)? (#{times2})/i do \
566
+ |title, day, month, years, xtimes|
567
+
568
+ t1, t2 = xtimes.split(/-/,2)
569
+ puts '[title, years, day, month, t1] ' + [title, years, day, month, t1].inspect if @debug
570
+ d1 = Chronic.parse([month, day, years, t1].join(' '), now: @now)
571
+ d2 = Chronic.parse([month, day, years, t2].join(' '), now: @now)
572
+
573
+ puts [4.655, title, d1].inspect.debug if @debug
574
+
575
+ { title: title.sub(/ on$/,''), date: d1, end_date: d2 }
576
+ end
577
+
578
+ # Some event (10 Woodhouse Lane) 30th Nov at 9:15
579
+
580
+ get /^(.*) #{days} #{months} #{years}(?: at)? (#{times})/i do \
581
+ |title, day, month, years, t1|
582
+
583
+ puts '[title, years, day, month, t1] ' + [title, years, day, month, t1].inspect if @debug
584
+ d1 = Chronic.parse([month, day, years, t1].join(' '), now: @now)
585
+
586
+ puts [4.66, title, d1].inspect.debug if @debug
587
+
588
+ { title: title.sub(/ on$/,''), date: d1 }
589
+ end
590
+
539
591
  # Some event (10 Woodhouse Lane) 30th Nov at 9:15-
540
592
 
541
593
  get /^(.*) #{days} #{months}(?: at)? (#{times})/i do \
542
594
  |title, day, month, t1|
543
595
 
544
-
596
+ puts '[title, day, month, t1] ' + [title, day, month, t1].inspect if @debug
545
597
  d1 = Chronic.parse([month, day, t1].join(' '), now: @now)
546
598
 
547
599
  puts [4.7, title, d1].inspect.debug if @debug
@@ -552,73 +604,73 @@ class EventNlp
552
604
  # hall 2 at 11am
553
605
  #
554
606
  get /(.*)\s+at\s+(#{times})/i do |title, time|
555
-
607
+
556
608
  d = Chronic.parse(time, now: @now)
557
-
609
+
558
610
  puts [1.45, title].inspect.debug if @debug
559
611
  { title: title, date: d }
560
-
561
- end
562
-
563
-
612
+
613
+ end
614
+
615
+
564
616
  # Council Tax on the last day of the month
565
617
  #
566
618
  get /^(.*) (?:o[nf] the)\s*last day of the month/i do |title|
567
-
619
+
568
620
  td = @now.to_date
569
621
  d = Date.civil(td.year, td.month, -1).to_time
570
-
622
+
571
623
  puts [5, title].inspect.debug if @debug
572
624
  { title: title, date: d }
573
-
574
- end
575
-
625
+
626
+ end
627
+
576
628
  # Council Tax last day of the month
577
629
  #
578
630
  get /^(.*) +last day of the month/i do |title|
579
-
631
+
580
632
  td = @now.to_date
581
633
  d = Date.civil(td.year, td.month, -1).to_time
582
-
634
+
583
635
  puts [5.1, title].inspect.debug if @debug
584
636
  { title: title, date: d }
585
-
586
- end
587
-
637
+
638
+ end
639
+
588
640
  # some important day 11 Oct *
589
641
  #
590
642
  get /^(.*) +(\d+) +#{months} *(\*)?/i \
591
643
  do |title, day, month, annualar|
592
-
644
+
593
645
  raw_date = day + ' ' + month
594
646
 
595
647
  d = Chronic.parse(raw_date, now: @now,
596
648
  :endian_precedence => :little)
597
649
  recurring = nil
598
-
650
+
599
651
  if annualar then
600
-
652
+
601
653
  recurring = 'yearly'
602
654
  if d < @now then
603
- d = Chronic.parse(raw_date,
604
- now: Time.local(@now.year + 1, 1, 1))
655
+ d = Chronic.parse(raw_date,
656
+ now: Time.local(@now.year + 1, 1, 1))
605
657
  end
606
658
  end
607
-
608
-
659
+
660
+
609
661
  puts [6, title, raw_date].inspect.debug if @debug
610
662
  { title: title, date: d, recurring: recurring }
611
663
  end
612
-
613
-
614
-
664
+
665
+
666
+
615
667
  # Tuesday 3rd October gas service at Barbara's house morning 9am-1pm
616
668
  #
617
669
  get '*' do
618
-
670
+
619
671
  s = params[:input]
620
-
621
- time1, time2, month, weekday, day, end_date, annualar = nil, nil, nil,
672
+
673
+ time1, time2, month, weekday, day, end_date, annualar = nil, nil, nil,
622
674
  nil, nil, nil, false
623
675
 
624
676
  s2 = s.sub(/#{times}/i) {|x| time1 = x; ''}
@@ -633,29 +685,29 @@ class EventNlp
633
685
  raw_date = [day, month].compact.join(' ')
634
686
  raw_date = weekday if raw_date.empty?
635
687
 
636
- d = Chronic.parse(raw_date + ' ' + time1.to_s,
688
+ d = Chronic.parse(raw_date + ' ' + time1.to_s,
637
689
  :endian_precedence => :little, now: @now)
638
-
690
+
639
691
  if time2 then
640
692
  end_date = Chronic.parse(raw_date + ' ' + time2.to_s, now: @now,
641
693
  :endian_precedence => :little)
642
694
  end
643
-
695
+
644
696
  recurring = nil
645
-
697
+
646
698
  if annualar then
647
-
699
+
648
700
  recurring = 'yearly'
649
701
  if d < @now then
650
- d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
702
+ d = Chronic.parse(raw_date, now: Time.local(@now.year + 1, 1, 1))
651
703
  end
652
- end
653
-
704
+ end
705
+
654
706
  puts [10, title, raw_date, time1].inspect.debug if @debug
655
707
  { title: title, date: d, end_date: end_date, recurring: recurring }
656
- end
657
-
658
-
708
+ end
709
+
710
+
659
711
  end
660
-
712
+
661
713
  end
data.tar.gz.sig CHANGED
Binary file
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.6.8
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,32 +10,33 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
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
13
+ MIIEljCCAv6gAwIBAgIBATANBgkqhkiG9w0BAQsFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTIzMDMzMDA4MjEwNVoXDTI0MDMyOTA4MjEwNVowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC
18
+ ggGBAJ3t5zUzzxNb3KZVNPAwz7SKx8E0tp1n0lvbIpXWROKLbiVVWEL6PAnikGIU
19
+ 3DOdMm4ZyQUiY2PIoEVHS++OeA+fT8ZTIU9fVS/kWomrIraqhz2vImY2oewD/Qxp
20
+ 6cCvr+2/diAn7C8A2HYBaiGgMr75b64mnWAIcDGnj6Eg3ec5Y0qMTC/Eo/NIJCGN
21
+ GAtd/fWBqvx5BwHfo3YX1ES0UjNLmNjS0zQy5YD6jaTElJ31qvzqtZbU3bCuJpB8
22
+ CN/TyOuuBANdyICrrf1iizYoOfXvs44JNE0j7Kj4SBSy28hHWMlQ9s83Q3EktNwW
23
+ AzeofToLHSD5XSxTw7tSUG5GdW01vq/7jnhVkv5pi43DnoTQ1SJjkZAetR5QIqk9
24
+ uUVCLoTLTqP9T4CDcdngO/qGKRKS5OwkdsZJeAQQSlL+1u1u0NQIPqurCn2sf+Iv
25
+ WUnnxnSS9ZhQphqxJPFd/RVThd6CpS9tzIWG2SZzMOqQ7NiLwVWhtK/snL9Hh2/q
26
+ 6CJfcQIDAQABo4GKMIGHMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
27
+ BBSySBT3LMLi7K/V+ff+nI2zJEYqiDAmBgNVHREEHzAdgRtnZW1tYXN0ZXJAamFt
28
+ ZXNyb2JlcnRzb24uZXUwJgYDVR0SBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
29
+ c29uLmV1MA0GCSqGSIb3DQEBCwUAA4IBgQBsGD0pCs6dJJJNHbzmoe3LscVkeAu6
30
+ BzuKZSzuHnDCTreuZnt5JyiaIVwFgI9nIDv5xv1ql+p/7IakOQhGG/p8WqG7H53C
31
+ Fb6yuV11CtjXKRpN9z4bSCUAuID/R/x0+yqOWqb+0GJj0DKd33Q2r00nWZ6XOCx2
32
+ m/J/exb7p8PaZWyoPiJToMfSRz7BRt1nokig/rDny4ahBea6Flw9kqyQ2zbCagas
33
+ yvMvDmSrgyGWir/kj+aNI/64l0hciWoQCdG+cEn4fmv9YWx977Vy+v5theRiRtjb
34
+ pmBQP3C37V0RxFbgTDEIqwJcOdvZ1y+QJ9788CkydluVi/yL3Nh8684or3ih4WMX
35
+ 1WrKCmIHqObF6xSQx4LJnsaLf/scFwT1xewudG+A+aWkP/vLY68EWCnU5DSw1Z/a
36
+ hlofVJ6Yrd5wJGF95qQqR5NCHCDnm/eSuJqV68pEJDK2GBYtGeCSQK0WAB0drsKe
37
+ Ff0VKkMErJ7dvr9XcKLCxlft1WhzfHIByj0=
37
38
  -----END CERTIFICATE-----
38
- date: 2022-05-04 00:00:00.000000000 Z
39
+ date: 2023-03-30 00:00:00.000000000 Z
39
40
  dependencies:
40
41
  - !ruby/object:Gem::Dependency
41
42
  name: chronic_cron
@@ -103,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
104
  - !ruby/object:Gem::Version
104
105
  version: '0'
105
106
  requirements: []
106
- rubygems_version: 3.2.22
107
+ rubygems_version: 3.4.4
107
108
  signing_key:
108
109
  specification_version: 4
109
110
  summary: 'Parses a calendar event for date, time, and description e.g. hall 2 friday
metadata.gz.sig CHANGED
Binary file