reminders_txt 0.5.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: 82d43b528dbfbaf1fe0db1f39201ee83b132df59d915c130fc6fb743994cc02d
4
- data.tar.gz: 6d7081ca6905ab0acb4149e7b65e632f5047b9cc1ce62750749c5b7222179fac
3
+ metadata.gz: 47aef7833540b8091c405532ea18f2c7e5f21907a4cc2bc5dd44c027858fcf2b
4
+ data.tar.gz: 772c3421c3521bc8ef5de3db1fe8742c1f8dc8dfed435b7416ff33252137629b
5
5
  SHA512:
6
- metadata.gz: f6a26f7f3fb6e13f543923ea85ccb33b6ba1e4198c50942db1a9280d5a615b7d80704bb73ae5578b0658c43805f74317c60967f951b1754ab80c6b64261c95cf
7
- data.tar.gz: 894912a616fa45da1bc71bff611be87ff4543f2f0686b28e38bd20e768c77d16a3a57731f7d377fa0f2a7d1f45201df6e56309b71a7a8c199e3ef0bf207226ea
6
+ metadata.gz: 7f8437caf5ed5917341837189ac3c437602e629bac78404376ba2d2af5a495b823577dceac1ff4f1929d2bd8fd51839b8860535e19f33732d624cf35b3e1a4b9
7
+ data.tar.gz: fe18da158fae800b99d3cc9c92bef68048cc2f3c61649cfbd9f36aedbabd135c198f125000d86271489669c1d8826ff450f6c2ab67cf596117bc6cac456e91ff
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/reminders_txt.rb CHANGED
@@ -6,22 +6,11 @@
6
6
  require 'dynarex'
7
7
  require 'event_nlp'
8
8
  require 'digest/md5'
9
-
10
-
11
- module Ordinal
12
- refine Integer do
13
-
14
- def ordinal
15
- self.to_s + ( (10...20).include?(self) ? 'th' :
16
- %w{ th st nd rd th th th th th th }[self % 10] )
17
- end
18
-
19
- end
20
- end
9
+ require 'human_speakable'
21
10
 
22
11
 
23
12
  class RemindersTxtException < Exception
24
-
13
+
25
14
 
26
15
  end
27
16
 
@@ -29,132 +18,147 @@ end
29
18
  class RemindersTxt
30
19
  using ColouredText
31
20
  include RXFHelperModule
32
-
21
+
33
22
  attr_reader :reminders, :dx
34
-
23
+
35
24
  def initialize(raw_s='reminders.txt', now: Time.now, debug: false)
36
25
 
37
26
  super()
38
27
 
39
28
  @now, @debug = now, debug
40
-
29
+
41
30
  puts ('@now: ' + @now.inspect).debug if @debug
42
31
 
43
-
32
+
44
33
  @filepath = raw_s
45
-
34
+
46
35
  if raw_s.lines.length > 1 then
47
36
 
48
37
  if raw_s.lstrip[0] == '<' then
49
38
 
50
39
  @filepath = 'reminders.xml'
51
40
  @dx = Dynarex.new raw_s
52
-
41
+
53
42
  else
54
43
 
55
44
  @filepath = File.join(Dir.pwd, 'reminders.txt')
56
- @dxfilepath = @filepath.sub(/.txt$/,'.xml')
45
+ @dxfilepath = @filepath.sub(/.txt$/,'.xml')
57
46
 
58
47
  @dx = Dynarex.new
59
- import_txt(raw_s)
60
-
48
+ import_txt(raw_s)
49
+
61
50
  end
62
-
51
+
63
52
  elsif File.extname(@filepath) == '.txt'
64
53
 
65
54
  s = FileX.read @filepath
66
55
  @filename = File.basename(@filepath)
67
- @dxfilepath = @filepath.sub(/.txt$/,'.xml')
68
-
56
+ @dxfilepath = @filepath.sub(/.txt$/,'.xml')
57
+
69
58
  import_txt(s)
70
-
59
+
71
60
  else
72
-
61
+
73
62
  @dx = Dynarex.new @filepath
74
-
63
+
75
64
  end
76
65
  end
77
-
66
+
78
67
  def add(s)
79
68
 
80
69
  s.strip!
81
70
  r = EventNlp.new(@now, params: {input: s}).parse(s)
82
71
  return if r.nil?
83
-
72
+
84
73
  @reminders << r
85
- refresh()
74
+ refresh()
75
+
76
+ end
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}
86
82
 
87
83
  end
88
-
84
+
89
85
  def before(d)
90
-
86
+
91
87
  future_date = d.is_a?(String) ? Chronic.parse(d).to_datetime : d
92
88
  @dx.filter {|x| DateTime.parse(x.date) < future_date}
93
-
89
+
94
90
  end
95
-
91
+
96
92
  def find(s)
97
93
  @dx.filter {|x| x.title =~ /#{s}/i}
98
94
  end
99
95
 
100
96
  def upcoming(ndays=5, days: ndays, months: nil)
101
-
97
+
102
98
  next_date = if months then
103
99
  @now.to_datetime >> months.to_i
104
100
  else
105
- @now.to_datetime + days.to_i
101
+ ((@now.to_date + days.to_i + 1).to_time - 1).to_datetime
106
102
  end
107
-
103
+
108
104
  @dx.filter {|x| DateTime.parse(x.date) <= next_date}
109
105
  end
110
-
106
+
111
107
  def updated?()
112
108
  @updated
113
- end
114
-
109
+ end
110
+
115
111
  def today()
116
112
  upcoming 0
117
113
  end
118
-
114
+
119
115
  def tomorrow()
120
116
  upcoming days: 1
121
117
  end
122
-
118
+
123
119
  def this_week()
124
120
  upcoming days: 6
125
121
  end
126
-
122
+
127
123
  alias weekahead this_week
128
-
124
+
125
+ def this_month()
126
+ upcoming months: 1
127
+ end
128
+
129
129
  def this_year()
130
130
  upcoming months: 12
131
131
  end
132
-
132
+
133
133
  def to_s()
134
134
 
135
135
  filename = File.basename(@filepath).sub(/\.xml$/, '.txt')
136
136
  [filename, '=' * filename.length, '', *@dx.all.map(&:input)].join("\n")
137
137
 
138
138
  end
139
-
139
+
140
140
  def to_xml()
141
141
  @dx.to_xml pretty: true
142
- end
143
-
142
+ end
143
+
144
144
  private
145
-
145
+
146
146
  def import_txt(s)
147
147
 
148
+ puts 'inside import_txt' if @debug
148
149
  @file_contents = s
149
150
  buffer = s.lines[2..-1]
150
151
 
151
152
  @reminders = buffer.inject([]) do |r, x|
152
-
153
+
154
+ puts 'x: ' + x.inspect if @debug
153
155
  x.strip!
154
156
 
155
157
  if (x.length > 1) then
156
158
 
157
- 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)
158
162
  puts ('rx: ' + rx.inspect).debug if @debug
159
163
  r << rx if rx
160
164
  end
@@ -165,13 +169,15 @@ class RemindersTxt
165
169
  @updated = false
166
170
 
167
171
  refresh()
168
-
172
+
169
173
  end
170
-
174
+
171
175
  # synchronise with the XML file and remove any expired dates
172
176
  #
173
177
  def refresh()
174
178
 
179
+ puts 'inside refresh()' if @debug
180
+
175
181
  reminders = @reminders.clone
176
182
  # if XML file doesn't exist, create it
177
183
 
@@ -180,16 +186,18 @@ class RemindersTxt
180
186
  @dx = Dynarex.new @dxfilepath
181
187
 
182
188
  @reminders.each do |reminder|
189
+
183
190
  s = reminder.input
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,68 +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
234
+
226
235
  h1 = (Digest::MD5.new << self.to_s).to_s
227
236
  h2 = (Digest::MD5.new << @file_contents).to_s
228
237
 
229
238
  b = h1 != h2
230
239
 
240
+ if @debug then
241
+ puts 'reminders: ' + reminders.inspect
242
+ puts '@reminders: ' + @reminders.inspect
243
+ end
244
+
231
245
  if b or @reminders != reminders then
232
246
 
233
- save_dx()
234
- 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
235
249
  @updated = true
236
250
  else
237
251
  puts 'no update'
238
252
  end
239
-
253
+
240
254
  [:refresh, b]
241
-
255
+
242
256
  end
243
257
 
244
258
  def save_detail()
245
-
259
+
246
260
  # fetch the notes file if it exists
247
261
  filepath = File.dirname @dxfilepath
248
-
262
+
249
263
  notesfile = File.join(filepath, 'reminder_notes.xml')
250
264
  return unless File.exists? notesfile
251
-
252
- dx = Dynarex.new notesfile
253
265
 
254
- h = dx.all.inject({}) do |r,x|
266
+ dx = Dynarex.new notesfile
267
+
268
+ h = dx.all.inject({}) do |r,x|
255
269
 
256
270
  a = x.info.lines
257
271
  tag = a.shift[/\w+/]
258
272
  body = a.join.strip
259
-
273
+
260
274
  r.merge(tag.to_sym => body)
261
-
275
+
262
276
  end
263
277
 
264
278
  rows = @dx.all.map do |x|
@@ -266,48 +280,46 @@ class RemindersTxt
266
280
  hashtag ? x.to_h.merge(info: h[hashtag.to_sym]) : x.to_h
267
281
  end
268
282
 
269
- dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
283
+ dx2 = Dynarex.new 'reminders/reminder(input, title, recurring, ' +
270
284
  'date, end_date, venue, info)'
271
285
  dx2.import rows
272
286
  dx2.save File.join(filepath, 'reminder_details.xml')
273
287
 
274
288
  end
275
-
289
+
276
290
  def save_dx()
277
-
291
+
278
292
  @dx = Dynarex.new(
279
293
  'reminders/reminder(input, title, recurring, date, end_date, venue)')
280
294
  @reminders.each {|x| @dx.create x.to_h}
281
295
  @dx.save @dxfilepath
282
-
296
+
283
297
  save_detail()
284
-
298
+
285
299
  end
286
-
287
-
300
+
301
+
288
302
  end
289
303
 
290
304
  class RemindersTxtVoice < RemindersTxt
291
- using Ordinal
292
-
293
- def weekahead()
294
-
295
- s = super.all.map do |x|
305
+ using HumanSpeakable
306
+
307
+ def weekahead() plain_talk(super) end
308
+ def today() plain_talk(super) end
309
+ def tomorrow() plain_talk(super) end
310
+
311
+ private
312
+
313
+ def plain_talk(entries)
314
+
315
+ s = entries.all.map do |x|
296
316
  date = DateTime.parse(x.date)
297
- "you are at %s, on %s, at %s." % [(x.venue.empty? ? x.title : x.venue), \
298
- format_date(date), date.strftime("%-I:%M%P")
299
- ]
317
+ "you are at %s, %s at %s." % [(x.venue.empty? ? x.title : x.venue), \
318
+ date.humanize, date.to_time.humanize]
300
319
  end.join(" Then ")
301
320
 
302
- s.sub!(/^./){|x| x.upcase}
303
-
321
+ s.sub!(/^./){|x| x.upcase}
322
+
304
323
  end
305
-
306
- private
307
-
308
- def format_date(date)
309
- [Date::DAYNAMES[date.wday], 'the', date.day.ordinal, 'of',
310
- Date::MONTHNAMES[date.month]].join(' ')
311
- end
312
-
324
+
313
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.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
- 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-09 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,62 +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.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.17
59
+ version: 1.9.2
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: event_nlp
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '0.5'
67
64
  - - ">="
68
65
  - !ruby/object:Gem::Version
69
- version: 0.5.1
66
+ version: 0.6.0
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.6'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '0.5'
77
74
  - - ">="
78
75
  - !ruby/object:Gem::Version
79
- version: 0.5.1
76
+ version: 0.6.0
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0.6'
80
80
  - !ruby/object:Gem::Dependency
81
- name: chronic_cron
81
+ name: human_speakable
82
82
  requirement: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
- version: 0.5.0
86
+ version: 0.2.0
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.5'
89
+ version: '0.2'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 0.5.0
96
+ version: 0.2.0
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: '0.5'
99
+ version: '0.2'
100
100
  description:
101
- email: james@jamesrobertson.eu
101
+ email: digital.robertson@gmail.com
102
102
  executables: []
103
103
  extensions: []
104
104
  extra_rdoc_files: []
@@ -123,7 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubygems_version: 3.0.1
126
+ rubyforge_project:
127
+ rubygems_version: 2.7.10
127
128
  signing_key:
128
129
  specification_version: 4
129
130
  summary: Reads and updates diary reminders from a plain text file
metadata.gz.sig CHANGED
Binary file