reminders_txt 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97b8979998448a59a4606ca6222c74a8c923be7439f67f3fc39835a6a59752e6
4
- data.tar.gz: 6efdd23bdbe788704510861ee5cba874baa170baa8c8c93397fbde295ff50e82
3
+ metadata.gz: 47aef7833540b8091c405532ea18f2c7e5f21907a4cc2bc5dd44c027858fcf2b
4
+ data.tar.gz: 772c3421c3521bc8ef5de3db1fe8742c1f8dc8dfed435b7416ff33252137629b
5
5
  SHA512:
6
- metadata.gz: 3621d7e5a617a9a8cba619cf87e4a59e6136d04a943448bd6badba010a26b9644194dddf56cf6c6c119584da31f6490c9a330378be775a8b4ddfe6c63317fac3
7
- data.tar.gz: e8575e6dec4d6e75674cd5d404b8e151c1bc0bbe4f531b5ed042644849f779bc77c4ecf687d9e598263f82a1fe9fdf3874fbdcf5ad5cfd82b456c998958aee28
6
+ metadata.gz: 7f8437caf5ed5917341837189ac3c437602e629bac78404376ba2d2af5a495b823577dceac1ff4f1929d2bd8fd51839b8860535e19f33732d624cf35b3e1a4b9
7
+ data.tar.gz: fe18da158fae800b99d3cc9c92bef68048cc2f3c61649cfbd9f36aedbabd135c198f125000d86271489669c1d8826ff450f6c2ab67cf596117bc6cac456e91ff
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/reminders_txt.rb CHANGED
@@ -10,7 +10,7 @@ require 'human_speakable'
10
10
 
11
11
 
12
12
  class RemindersTxtException < Exception
13
-
13
+
14
14
 
15
15
  end
16
16
 
@@ -18,138 +18,146 @@ end
18
18
  class RemindersTxt
19
19
  using ColouredText
20
20
  include RXFHelperModule
21
-
21
+
22
22
  attr_reader :reminders, :dx
23
-
23
+
24
24
  def initialize(raw_s='reminders.txt', now: Time.now, debug: false)
25
25
 
26
26
  super()
27
27
 
28
28
  @now, @debug = now, debug
29
-
29
+
30
30
  puts ('@now: ' + @now.inspect).debug if @debug
31
31
 
32
-
32
+
33
33
  @filepath = raw_s
34
-
34
+
35
35
  if raw_s.lines.length > 1 then
36
36
 
37
37
  if raw_s.lstrip[0] == '<' then
38
38
 
39
39
  @filepath = 'reminders.xml'
40
40
  @dx = Dynarex.new raw_s
41
-
41
+
42
42
  else
43
43
 
44
44
  @filepath = File.join(Dir.pwd, 'reminders.txt')
45
- @dxfilepath = @filepath.sub(/.txt$/,'.xml')
45
+ @dxfilepath = @filepath.sub(/.txt$/,'.xml')
46
46
 
47
47
  @dx = Dynarex.new
48
- import_txt(raw_s)
49
-
48
+ import_txt(raw_s)
49
+
50
50
  end
51
-
51
+
52
52
  elsif File.extname(@filepath) == '.txt'
53
53
 
54
54
  s = FileX.read @filepath
55
55
  @filename = File.basename(@filepath)
56
- @dxfilepath = @filepath.sub(/.txt$/,'.xml')
57
-
56
+ @dxfilepath = @filepath.sub(/.txt$/,'.xml')
57
+
58
58
  import_txt(s)
59
-
59
+
60
60
  else
61
-
61
+
62
62
  @dx = Dynarex.new @filepath
63
-
63
+
64
64
  end
65
65
  end
66
-
66
+
67
67
  def add(s)
68
68
 
69
69
  s.strip!
70
70
  r = EventNlp.new(@now, params: {input: s}).parse(s)
71
71
  return if r.nil?
72
-
72
+
73
73
  @reminders << r
74
- refresh()
74
+ refresh()
75
75
 
76
76
  end
77
-
77
+
78
78
  def after(d)
79
-
79
+
80
80
  date = d.is_a?(String) ? Chronic.parse(d).to_datetime : d
81
81
  @dx.filter {|x| DateTime.parse(x.date) > date}
82
-
83
- end
84
-
82
+
83
+ end
84
+
85
85
  def before(d)
86
-
86
+
87
87
  future_date = d.is_a?(String) ? Chronic.parse(d).to_datetime : d
88
88
  @dx.filter {|x| DateTime.parse(x.date) < future_date}
89
-
89
+
90
90
  end
91
-
91
+
92
92
  def find(s)
93
93
  @dx.filter {|x| x.title =~ /#{s}/i}
94
94
  end
95
95
 
96
96
  def upcoming(ndays=5, days: ndays, months: nil)
97
-
97
+
98
98
  next_date = if months then
99
99
  @now.to_datetime >> months.to_i
100
100
  else
101
101
  ((@now.to_date + days.to_i + 1).to_time - 1).to_datetime
102
102
  end
103
-
103
+
104
104
  @dx.filter {|x| DateTime.parse(x.date) <= next_date}
105
105
  end
106
-
106
+
107
107
  def updated?()
108
108
  @updated
109
- end
110
-
109
+ end
110
+
111
111
  def today()
112
112
  upcoming 0
113
113
  end
114
-
114
+
115
115
  def tomorrow()
116
116
  upcoming days: 1
117
117
  end
118
-
118
+
119
119
  def this_week()
120
120
  upcoming days: 6
121
121
  end
122
-
122
+
123
123
  alias weekahead this_week
124
-
124
+
125
+ def this_month()
126
+ upcoming months: 1
127
+ end
128
+
125
129
  def this_year()
126
130
  upcoming months: 12
127
131
  end
128
-
132
+
129
133
  def to_s()
130
134
 
131
135
  filename = File.basename(@filepath).sub(/\.xml$/, '.txt')
132
136
  [filename, '=' * filename.length, '', *@dx.all.map(&:input)].join("\n")
133
137
 
134
138
  end
135
-
139
+
136
140
  def to_xml()
137
141
  @dx.to_xml pretty: true
138
- end
139
-
142
+ end
143
+
140
144
  private
141
-
145
+
142
146
  def import_txt(s)
143
147
 
148
+ puts 'inside import_txt' if @debug
144
149
  @file_contents = s
145
150
  buffer = s.lines[2..-1]
146
151
 
147
152
  @reminders = buffer.inject([]) do |r, x|
148
-
153
+
154
+ puts 'x: ' + x.inspect if @debug
149
155
  x.strip!
150
156
 
151
157
  if (x.length > 1) then
152
158
 
159
+ puts '@now:' + @now.inspect if @debug
160
+
153
161
  rx = EventNlp.new(@now, params: {input: x}, debug: @debug).parse(x)
154
162
  puts ('rx: ' + rx.inspect).debug if @debug
155
163
  r << rx if rx
@@ -161,15 +169,15 @@ class RemindersTxt
161
169
  @updated = false
162
170
 
163
171
  refresh()
164
-
172
+
165
173
  end
166
-
174
+
167
175
  # synchronise with the XML file and remove any expired dates
168
176
  #
169
177
  def refresh()
170
178
 
171
179
  puts 'inside refresh()' if @debug
172
-
180
+
173
181
  reminders = @reminders.clone
174
182
  # if XML file doesn't exist, create it
175
183
 
@@ -178,18 +186,18 @@ class RemindersTxt
178
186
  @dx = Dynarex.new @dxfilepath
179
187
 
180
188
  @reminders.each do |reminder|
181
-
189
+
182
190
  s = reminder.input
183
191
  puts ('refresh() checking s: ' + s).debug if @debug
184
192
  r = @dx.find_by_input s
185
-
193
+
186
194
  # it is on file and it's not a recurring or annual event?
187
195
  # use the date from file if the record exists
188
196
 
189
197
  if (r and r.recurring.empty? and not s[/\*$/]) then
190
198
  DateTime.parse(r.date)
191
- else
192
-
199
+ else
200
+
193
201
  if reminder.date then
194
202
  reminder.date.to_datetime
195
203
  else
@@ -197,74 +205,74 @@ class RemindersTxt
197
205
  + reminder.inspect
198
206
  end
199
207
  end
200
-
208
+
201
209
  end
202
-
210
+
203
211
  else
204
212
 
205
213
  save_dx()
206
-
214
+
207
215
  end
208
216
 
209
217
  # delete expired non-recurring reminders
210
218
  @reminders.reject! do |x|
211
-
219
+
212
220
  if @debug then
213
221
  puts 'rejects filter: '
214
222
  puts ' x.input: ' + x.input.inspect
215
- puts ' x.date.to_time: ' + x.date.to_time.inspect
223
+ puts ' x.date.to_time: ' + x.date.to_time.inspect
216
224
  end
217
-
225
+
218
226
  x.date.to_time < @now if not x.recurring
219
-
227
+
220
228
  end
221
-
229
+
222
230
  @reminders.sort_by!(&:date)
223
231
 
224
232
  # did the reminders change?
225
233
  puts 'self.to_s: ' + self.to_s if @debug
226
-
234
+
227
235
  h1 = (Digest::MD5.new << self.to_s).to_s
228
236
  h2 = (Digest::MD5.new << @file_contents).to_s
229
237
 
230
238
  b = h1 != h2
231
-
239
+
232
240
  if @debug then
233
241
  puts 'reminders: ' + reminders.inspect
234
242
  puts '@reminders: ' + @reminders.inspect
235
243
  end
236
-
244
+
237
245
  if b or @reminders != reminders then
238
246
 
239
- save_dx()
240
- FileX.write File.join(File.dirname(@filepath), 'reminders.txt'), self.to_s
247
+ save_dx()
248
+ FileX.write File.join(File.dirname(@filepath), 'reminders.txt'), self.to_s
241
249
  @updated = true
242
250
  else
243
251
  puts 'no update'
244
252
  end
245
-
253
+
246
254
  [:refresh, b]
247
-
255
+
248
256
  end
249
257
 
250
258
  def save_detail()
251
-
259
+
252
260
  # fetch the notes file if it exists
253
261
  filepath = File.dirname @dxfilepath
254
-
262
+
255
263
  notesfile = File.join(filepath, 'reminder_notes.xml')
256
264
  return unless File.exists? notesfile
257
-
258
- dx = Dynarex.new notesfile
259
265
 
260
- h = dx.all.inject({}) do |r,x|
266
+ dx = Dynarex.new notesfile
267
+
268
+ h = dx.all.inject({}) do |r,x|
261
269
 
262
270
  a = x.info.lines
263
271
  tag = a.shift[/\w+/]
264
272
  body = a.join.strip
265
-
273
+
266
274
  r.merge(tag.to_sym => body)
267
-
275
+
268
276
  end
269
277
 
270
278
  rows = @dx.all.map do |x|
@@ -272,46 +280,46 @@ class RemindersTxt
272
280
  hashtag ? x.to_h.merge(info: h[hashtag.to_sym]) : x.to_h
273
281
  end
274
282
 
275
- dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
283
+ dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
276
284
  'date, end_date, venue, info)'
277
285
  dx2.import rows
278
286
  dx2.save File.join(filepath, 'reminder_details.xml')
279
287
 
280
288
  end
281
-
289
+
282
290
  def save_dx()
283
-
291
+
284
292
  @dx = Dynarex.new(
285
293
  'reminders/reminder(input, title, recurring, date, end_date, venue)')
286
294
  @reminders.each {|x| @dx.create x.to_h}
287
295
  @dx.save @dxfilepath
288
-
296
+
289
297
  save_detail()
290
-
298
+
291
299
  end
292
-
293
-
300
+
301
+
294
302
  end
295
303
 
296
304
  class RemindersTxtVoice < RemindersTxt
297
305
  using HumanSpeakable
298
-
306
+
299
307
  def weekahead() plain_talk(super) end
300
308
  def today() plain_talk(super) end
301
309
  def tomorrow() plain_talk(super) end
302
-
310
+
303
311
  private
304
-
312
+
305
313
  def plain_talk(entries)
306
-
314
+
307
315
  s = entries.all.map do |x|
308
316
  date = DateTime.parse(x.date)
309
317
  "you are at %s, %s at %s." % [(x.venue.empty? ? x.title : x.venue), \
310
318
  date.humanize, date.to_time.humanize]
311
319
  end.join(" Then ")
312
320
 
313
- s.sub!(/^./){|x| x.upcase}
314
-
321
+ s.sub!(/^./){|x| x.upcase}
322
+
315
323
  end
316
-
324
+
317
325
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reminders_txt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,31 +11,31 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwOTEwMjIxMDAyWhcN
15
- MjAwOTA5MjIxMDAyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCpl8al
17
- 48UWqZgRIgs1EURPZMVXv4p1TmdXDvuFCYQjzWBCsPc5qnzCV+AMPbaJw5swxdu5
18
- MDWuSoxTUiMdfL8qNpE8RVB7ldH9FZDXBbTKoJITgvt07i9MEyvKXqpIpQEnn434
19
- yUlWz9F+EriEZ5qJx8WNINX5HCyM64qX9ToQI0jm8SDwhW3YLjSuEJ/rU2iXyE4c
20
- +ff9j5jP9OHMyr2K1H3DDsZmds8MsitRbLBMrOIJh802z434sHh4SzcSQkzr15GP
21
- nzoS8zEnjjWmhO6v09vql6ZX0Y42EuxnY9k7y58VE5fxaRmEHEGC7GjRxU7PR02v
22
- NdWgYUVxGsAF4Wl920DzBjorQ3Qw8iCUpcH8cW/tiZU/5ZIkpg1a2oPesxlh5YSW
23
- ok33GWOabC41EVc20nWLDzJ4kge2RTvHKpz81Cptp3LdsKMYEDpBt3qtEsyyN51e
24
- nXQB7rqS+sLX7EY9QpGD0ojS0bH3Nb1H0bYeiFWHK0T7PySxVe2pqqh+0KkCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUDJ1o5bjL
26
- DZgKwH/ezPMECD9zOwwwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjAyMTQzOTIyWhcN
15
+ MjMwMjAyMTQzOTIyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDyuWp6
17
+ R95hbPIOVhI9BxGT17x1oAVsTc/BP9VeNAk4MKejK3S+YFv+6M7vXJY5rfW1uNVi
18
+ NzbEt3akUkYVqUZ8XfNxG2CcUEeMmkk/YiJA9zyXW6hb4txcc1b0ekmRvFCwVqpB
19
+ ofbQd3JpYZJ7CsH5NkvkZdwUm5KnxqoxxFD9w2u63z3/JAAaJBGOwrYryH0XrX+O
20
+ 2jfw5nxJX8JAPdzR7VfOQV+2i7+0SUSOECtHE4/k+WTu/WnFAzAtqRNE93QB3YF3
21
+ TA6ospSIyVDQPYqq0tpeUxbYmJQ7kmFF0Kc6ZEXN54tsDhg8aOtsvRtzwcVfZuhc
22
+ RJQdEbsN195Q4hDFMAIqxBueSuSEujlnVVkXkmvT7ZA6imbb5MPSORKJCAh6uB4c
23
+ II16+wzXfWikj2OPCdegZKr00kG9LuC0qPfRKJWSVVIlhPsswamiKGj4vMYSPnc/
24
+ juKrlC7/kmovp6ySjXRA6t03uJjUeMeuvj6eihuxiZdT8r0HeqrMAXltD+ECAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUX8XM4mRu
26
+ OpjWNvRPYrT2LntRDG4wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAO3sBZzLrd1Ak8b2Ckw45Xc+51Nn1Qr6Pdk8erw4T
29
- 46gst7gdgZ5D62Oe05gl6eLW8MK1IOfdMx5YEVsNCpJYpI1tXGO7ZIBVguYLAWom
30
- RPHfFJraSTGwjpU+Zyr6uyfclR1dVaqkapgtikrJ8/cqG/BCYoxAIraiLn1kJ+tF
31
- G1bNlaBEH2kqwAHJyMbMLrNIdp76w2D3IjarX6eOLXoD8W3uR7mI4sGUaCW5UXJz
32
- fZnNj4Xwivo6NlRNi5CHOUrplVAgRGHatMu8MtrZyIr8uj+IvdNB3rkuh4Z3ftE5
33
- ISrHXet/Gt6V9kRKVY8ieUtIeaEjsQS0oaopkHw6CA/3KI1uiVxSLqvmnor8PQwb
34
- qKvKKjYnJWjRMj+Gl5pjhdu47S97fR7BjtXU0LuDf5IH1r2PgXRSMfbM91LSzzge
35
- BTEl/Y9FxPLxYQmps8Ut058T2G3hVHzaOckIxdhCwYyzA4Bcrukfok/+wdYe/NW4
36
- CUFAhVCmmO+WPBpim/B6NBmp
28
+ BgkqhkiG9w0BAQsFAAOCAYEAfEfGdQvb787MqUj3pRstbdt9ycVqXr7Ctqz1xv72
29
+ G2lvakKPZOhPuk3HEVcWT3qAxz0m0CqTrP5SBls6Daq0FvOX3CRWsLvlYcenHuqB
30
+ 4tmdC9YPz5Ddqrsc3UHITZQWtBHrhMgO6bU5sUweY3QdinRUVAz+JkS1HnvGdks7
31
+ noiqQ2iIy8lEiCi2LL5Ov8G0OmOpomOU7jIK6iQIdZB4g6d25iv3um0OzwX8EXDo
32
+ OaR5OH2c7TKOf9p3FfNmJ7zp0WJDchjqa7MIaJNkMCc3RKrB2ixO5AptuTT2XQ70
33
+ eSaeDAWlb4pmbBQbCRejl71KOFz3pldcGoVuANq33c3cfTu4C6tbXxRbs2fiNjrn
34
+ eYgIEbYn1n+EJ9AqQ9jau+5jkpip5X+ix/vHl3oLWLB0rQ20HP/Ftq8zkjMZLuDD
35
+ tYyvieamfpSjWJEZi7K760qv2dWJ9kwfaJ7Q3TVP4Jjt0Iwep7Gutk7GV3uY35DA
36
+ iHcajrfKduh5CsLsvkXRjR4E
37
37
  -----END CERTIFICATE-----
38
- date: 2019-09-10 00:00:00.000000000 Z
38
+ date: 2022-02-02 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: dynarex
@@ -43,42 +43,22 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.8'
46
+ version: '1.9'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 1.8.20
49
+ version: 1.9.2
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '1.8'
56
+ version: '1.9'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 1.8.20
59
+ version: 1.9.2
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: event_nlp
62
- requirement: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '0.5'
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: 0.5.4
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '0.5'
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- version: 0.5.4
80
- - !ruby/object:Gem::Dependency
81
- name: chronic_cron
82
62
  requirement: !ruby/object:Gem::Requirement
83
63
  requirements:
84
64
  - - ">="
@@ -101,24 +81,24 @@ dependencies:
101
81
  name: human_speakable
102
82
  requirement: !ruby/object:Gem::Requirement
103
83
  requirements:
104
- - - "~>"
105
- - !ruby/object:Gem::Version
106
- version: '0.1'
107
84
  - - ">="
108
85
  - !ruby/object:Gem::Version
109
- version: 0.1.3
86
+ version: 0.2.0
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.2'
110
90
  type: :runtime
111
91
  prerelease: false
112
92
  version_requirements: !ruby/object:Gem::Requirement
113
93
  requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '0.1'
117
94
  - - ">="
118
95
  - !ruby/object:Gem::Version
119
- version: 0.1.3
96
+ version: 0.2.0
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.2'
120
100
  description:
121
- email: james@jamesrobertson.eu
101
+ email: digital.robertson@gmail.com
122
102
  executables: []
123
103
  extensions: []
124
104
  extra_rdoc_files: []
@@ -143,7 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
123
  - !ruby/object:Gem::Version
144
124
  version: '0'
145
125
  requirements: []
146
- rubygems_version: 3.0.1
126
+ rubyforge_project:
127
+ rubygems_version: 2.7.10
147
128
  signing_key:
148
129
  specification_version: 4
149
130
  summary: Reads and updates diary reminders from a plain text file
metadata.gz.sig CHANGED
Binary file