reminders_txt 0.5.2 → 0.8.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: 18bd04b91568bbb4c2b648ff1eb4cf089abff05819083b183b3db06f6ac95c1e
4
- data.tar.gz: 3d687633ab3d1cda5d0b477eb7fc202e2501249661c882806c68e0a35e6e3827
3
+ metadata.gz: 1fc2b2e1b2a96bb81a9cd1318c26d2ac7f19067d45c95b303921fab3127b1609
4
+ data.tar.gz: f26830637edcdf8485063c9f58bd7eb0edf179b11fef5d42edb4212163b6efd1
5
5
  SHA512:
6
- metadata.gz: 2213cd6d31824e0433f69cb1682a1dea00a1f31797d111903bc8279b8a832b64ee17a7cf96e672ebc568b19c09d24ee3509651c7857b2f7b37480be6bdca9aa1
7
- data.tar.gz: faa87b6e0f3cf5c67fe4d8bffe2868891f2be32230d79c75268fe10448103e614fdfaf432aae35c63751e9fb2f3af80de914ee4939c9b6ff2bcf484c35a159fe
6
+ metadata.gz: 4ddbd6e691d5595755ad3306763b4fa299038b3e530cfc34651ca10e2602c0da294b219f2f0a6e694b5a3f504d7640b788ea14f94cbdfe6a21b06e4e5046821a
7
+ data.tar.gz: 9cc2180d39caf63e23fe672a070d2d74b4bd543352a97dac21efe272cb4dde3f0a1ab540ec0e733542e6c82c1cd38837498a82e16e0d9dc022c5f83f539146cb
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/reminders_txt.rb CHANGED
@@ -7,143 +7,158 @@ require 'dynarex'
7
7
  require 'event_nlp'
8
8
  require 'digest/md5'
9
9
  require 'human_speakable'
10
+ require 'rxfreadwrite'
10
11
 
11
12
 
12
13
  class RemindersTxtException < Exception
13
-
14
14
 
15
15
  end
16
16
 
17
17
 
18
18
  class RemindersTxt
19
19
  using ColouredText
20
- include RXFHelperModule
21
-
20
+ include RXFReadWriteModule
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
- @filepath = File.join(Dir.pwd, 'reminders.txt')
45
- @dxfilepath = @filepath.sub(/.txt$/,'.xml')
44
+ @filepath = File.join(DirX.pwd, 'reminders.txt')
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
+ def after(d)
79
+
80
+ date = d.is_a?(String) ? Chronic.parse(d).to_datetime : d
81
+ @dx.filter {|x| DateTime.parse(x.date) > date}
82
+
83
+ end
84
+
78
85
  def before(d)
79
-
86
+
80
87
  future_date = d.is_a?(String) ? Chronic.parse(d).to_datetime : d
81
88
  @dx.filter {|x| DateTime.parse(x.date) < future_date}
82
-
89
+
83
90
  end
84
-
91
+
85
92
  def find(s)
86
93
  @dx.filter {|x| x.title =~ /#{s}/i}
87
94
  end
88
95
 
89
96
  def upcoming(ndays=5, days: ndays, months: nil)
90
-
97
+
91
98
  next_date = if months then
92
99
  @now.to_datetime >> months.to_i
93
100
  else
94
101
  ((@now.to_date + days.to_i + 1).to_time - 1).to_datetime
95
102
  end
96
-
103
+
97
104
  @dx.filter {|x| DateTime.parse(x.date) <= next_date}
98
105
  end
99
-
106
+
100
107
  def updated?()
101
108
  @updated
102
- end
103
-
109
+ end
110
+
104
111
  def today()
105
112
  upcoming 0
106
113
  end
107
-
114
+
108
115
  def tomorrow()
109
116
  upcoming days: 1
110
117
  end
111
-
118
+
112
119
  def this_week()
113
120
  upcoming days: 6
114
121
  end
115
-
122
+
116
123
  alias weekahead this_week
117
-
124
+
125
+ def this_month()
126
+ upcoming months: 1
127
+ end
128
+
118
129
  def this_year()
119
130
  upcoming months: 12
120
131
  end
121
-
132
+
122
133
  def to_s()
123
134
 
124
135
  filename = File.basename(@filepath).sub(/\.xml$/, '.txt')
125
136
  [filename, '=' * filename.length, '', *@dx.all.map(&:input)].join("\n")
126
137
 
127
138
  end
128
-
139
+
129
140
  def to_xml()
130
141
  @dx.to_xml pretty: true
131
- end
132
-
142
+ end
143
+
133
144
  private
134
-
145
+
135
146
  def import_txt(s)
136
147
 
148
+ puts 'inside import_txt' if @debug
137
149
  @file_contents = s
138
150
  buffer = s.lines[2..-1]
139
151
 
140
152
  @reminders = buffer.inject([]) do |r, x|
141
-
153
+
154
+ puts 'x: ' + x.inspect if @debug
142
155
  x.strip!
143
156
 
144
157
  if (x.length > 1) then
145
158
 
146
- rx = EventNlp.new(@now, params: {input: x}).parse(x)
159
+ puts '@now:' + @now.inspect if @debug
160
+
161
+ rx = EventNlp.new(@now, params: {input: x}, debug: @debug).parse(x)
147
162
  puts ('rx: ' + rx.inspect).debug if @debug
148
163
  r << rx if rx
149
164
  end
@@ -154,13 +169,15 @@ class RemindersTxt
154
169
  @updated = false
155
170
 
156
171
  refresh()
157
-
172
+
158
173
  end
159
-
174
+
160
175
  # synchronise with the XML file and remove any expired dates
161
176
  #
162
177
  def refresh()
163
178
 
179
+ puts 'inside refresh()' if @debug
180
+
164
181
  reminders = @reminders.clone
165
182
  # if XML file doesn't exist, create it
166
183
 
@@ -169,16 +186,18 @@ class RemindersTxt
169
186
  @dx = Dynarex.new @dxfilepath
170
187
 
171
188
  @reminders.each do |reminder|
189
+
172
190
  s = reminder.input
191
+ puts ('refresh() checking s: ' + s).debug if @debug
173
192
  r = @dx.find_by_input s
174
-
193
+
175
194
  # it is on file and it's not a recurring or annual event?
176
195
  # use the date from file if the record exists
177
196
 
178
197
  if (r and r.recurring.empty? and not s[/\*$/]) then
179
198
  DateTime.parse(r.date)
180
- else
181
-
199
+ else
200
+
182
201
  if reminder.date then
183
202
  reminder.date.to_datetime
184
203
  else
@@ -186,68 +205,74 @@ class RemindersTxt
186
205
  + reminder.inspect
187
206
  end
188
207
  end
189
-
208
+
190
209
  end
191
-
210
+
192
211
  else
193
212
 
194
213
  save_dx()
195
-
214
+
196
215
  end
197
216
 
198
217
  # delete expired non-recurring reminders
199
218
  @reminders.reject! do |x|
200
-
219
+
201
220
  if @debug then
202
221
  puts 'rejects filter: '
203
222
  puts ' x.input: ' + x.input.inspect
204
- puts ' x.date.to_time: ' + x.date.to_time.inspect
223
+ puts ' x.date.to_time: ' + x.date.to_time.inspect
205
224
  end
206
-
225
+
207
226
  x.date.to_time < @now if not x.recurring
208
-
227
+
209
228
  end
210
-
229
+
211
230
  @reminders.sort_by!(&:date)
212
231
 
213
232
  # did the reminders change?
214
-
233
+ puts 'self.to_s: ' + self.to_s if @debug
234
+
215
235
  h1 = (Digest::MD5.new << self.to_s).to_s
216
236
  h2 = (Digest::MD5.new << @file_contents).to_s
217
237
 
218
238
  b = h1 != h2
219
239
 
240
+ if @debug then
241
+ puts 'reminders: ' + reminders.inspect
242
+ puts '@reminders: ' + @reminders.inspect
243
+ end
244
+
220
245
  if b or @reminders != reminders then
221
246
 
222
- save_dx()
223
- 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
224
249
  @updated = true
225
250
  else
226
251
  puts 'no update'
227
252
  end
228
-
253
+
229
254
  [:refresh, b]
230
-
255
+
231
256
  end
232
257
 
233
258
  def save_detail()
234
-
259
+
235
260
  # fetch the notes file if it exists
236
261
  filepath = File.dirname @dxfilepath
237
-
262
+
238
263
  notesfile = File.join(filepath, 'reminder_notes.xml')
239
- return unless File.exists? notesfile
240
-
241
- dx = Dynarex.new notesfile
264
+ return unless FileX.exists? notesfile
265
+
266
+ dx = Dynarex.new notesfile
242
267
 
243
- h = dx.all.inject({}) do |r,x|
268
+ h = dx.all.inject({}) do |r,x|
244
269
 
245
270
  a = x.info.lines
246
271
  tag = a.shift[/\w+/]
247
272
  body = a.join.strip
248
-
273
+
249
274
  r.merge(tag.to_sym => body)
250
-
275
+
251
276
  end
252
277
 
253
278
  rows = @dx.all.map do |x|
@@ -255,46 +280,46 @@ class RemindersTxt
255
280
  hashtag ? x.to_h.merge(info: h[hashtag.to_sym]) : x.to_h
256
281
  end
257
282
 
258
- dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
283
+ dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
259
284
  'date, end_date, venue, info)'
260
285
  dx2.import rows
261
286
  dx2.save File.join(filepath, 'reminder_details.xml')
262
287
 
263
288
  end
264
-
289
+
265
290
  def save_dx()
266
-
291
+
267
292
  @dx = Dynarex.new(
268
293
  'reminders/reminder(input, title, recurring, date, end_date, venue)')
269
294
  @reminders.each {|x| @dx.create x.to_h}
270
295
  @dx.save @dxfilepath
271
-
296
+
272
297
  save_detail()
273
-
298
+
274
299
  end
275
-
276
-
300
+
301
+
277
302
  end
278
303
 
279
304
  class RemindersTxtVoice < RemindersTxt
280
305
  using HumanSpeakable
281
-
306
+
282
307
  def weekahead() plain_talk(super) end
283
308
  def today() plain_talk(super) end
284
309
  def tomorrow() plain_talk(super) end
285
-
310
+
286
311
  private
287
-
312
+
288
313
  def plain_talk(entries)
289
-
314
+
290
315
  s = entries.all.map do |x|
291
316
  date = DateTime.parse(x.date)
292
317
  "you are at %s, %s at %s." % [(x.venue.empty? ? x.title : x.venue), \
293
318
  date.humanize, date.to_time.humanize]
294
319
  end.join(" Then ")
295
320
 
296
- s.sub!(/^./){|x| x.upcase}
297
-
321
+ s.sub!(/^./){|x| x.upcase}
322
+
298
323
  end
299
-
324
+
300
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.5.2
4
+ version: 0.8.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
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwODI3MTQyNzQ1WhcN
15
- MTkwODI3MTQyNzQ1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDXSeGl
17
- jA7t0dTfrt5uPzHbjshY0b5E/xow3ABWmT8DUEP18xBtnEUrilHRh9GEGvMN0Fsq
18
- O/kpqQAqTAqQQOVxyGhbbOQXOY86+SnZtBurNgcJ0QsiDnum4zqjbJT0lscpPdPK
19
- t+mXcVcAOdhQndEYIBILiISRfcwxHgjxThAl4dzuS1ifFGCuIpFGJJ49DkigCFdL
20
- oTKnImrLw5mSW1/BTY0JEhY4OhpGlaF6B6UOktj6M9tpSgezMcmovR2LGsmcUjjl
21
- rgspsBjQ23/h3dwimCDbXDrJEHBKaWgBwoxt6Hya+ybB9IjMPTmnFeAT06bNGyIf
22
- bSPcT2UrdvxbU73eEZdcnSQgRnDYQ3TFzQjQGiukgJVkm82v+WCHIpcjBgw0bS6s
23
- rR+Hhtf7cZsCxJMRPJxqYonG+yin/mPJfKB2ou9MJggkuny2QZfWtfw+Gun/svVl
24
- Ly9Hsq6gTvHWdcmQlPhn7Gx+OZ8CR0M2SOqV5Mvlrhv6/O2tfoC3us3Q45kCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUpxsXwGY1
26
- MQV4+OxT3LFEi4/T6OYwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
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
- BgkqhkiG9w0BAQsFAAOCAYEAR12sqgiO9IWN25TPvwTnZX4DIFBa4TQ2pOODG7wI
29
- uTWKnkWiAeiY/3dJ+sRp5+zf5VyOKt3gXmLhxdA4cfPvAmNNwZV2RbjELQvgfgHh
30
- gP+jIlDpx5Xy2WBpx1a9sQ1Yb8kWDG2988n44HVSJD6e5ngZn4PFLmoY3mIk1m5l
31
- dI4Z0AGFjiN2WeQp2aMtWsseoS7LvTm17xOtKNwLfWze9h9DRTNeICu7Dg69eswQ
32
- Dd7K/ZLzHn/7xBCbybx3oUlx/w5m102wxNiUSjvlvlDbbheyFjyVGQcudIlWJkKm
33
- rNRRoNfNjxaFhKsMdiyrfGmWhOBIsfPlGyhR7WMQYiz5ACjrlmnVnc8Aab1ipiUG
34
- almSkip+iLRS55rdH4mSncK3iQurf6Jny9x2JD+U6cRXz/UPpNqFb/bU1mxXiU1a
35
- U6f6HfP/6K9f602IeJGEDybVHYFQ7Ssl+AeclLBiMqy5HYuL7kRoD9C2D166GI42
36
- M4blonk3dgx08AvXnjoMsgqh
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-03-12 00:00:00.000000000 Z
38
+ date: 2022-02-23 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: dynarex
@@ -43,82 +43,62 @@ 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.17
49
+ version: 1.9.6
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.17
59
+ version: 1.9.6
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: event_nlp
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '0.5'
66
+ version: '0.6'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 0.5.2
69
+ version: 0.6.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0.5'
76
+ version: '0.6'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 0.5.2
80
- - !ruby/object:Gem::Dependency
81
- name: chronic_cron
82
- requirement: !ruby/object:Gem::Requirement
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: 0.5.0
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.5'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 0.5.0
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '0.5'
79
+ version: 0.6.0
100
80
  - !ruby/object:Gem::Dependency
101
81
  name: human_speakable
102
82
  requirement: !ruby/object:Gem::Requirement
103
83
  requirements:
104
84
  - - "~>"
105
85
  - !ruby/object:Gem::Version
106
- version: '0.1'
86
+ version: '0.2'
107
87
  - - ">="
108
88
  - !ruby/object:Gem::Version
109
- version: 0.1.1
89
+ version: 0.2.0
110
90
  type: :runtime
111
91
  prerelease: false
112
92
  version_requirements: !ruby/object:Gem::Requirement
113
93
  requirements:
114
94
  - - "~>"
115
95
  - !ruby/object:Gem::Version
116
- version: '0.1'
96
+ version: '0.2'
117
97
  - - ">="
118
98
  - !ruby/object:Gem::Version
119
- version: 0.1.1
99
+ version: 0.2.0
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,7 @@ 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
+ rubygems_version: 3.2.22
147
127
  signing_key:
148
128
  specification_version: 4
149
129
  summary: Reads and updates diary reminders from a plain text file
metadata.gz.sig CHANGED
Binary file