reminders_txt 0.6.0 → 0.7.0

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