reminders_txt 0.5.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: 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