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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/reminders_txt.rb +106 -81
- data.tar.gz.sig +0 -0
- metadata +38 -58
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fc2b2e1b2a96bb81a9cd1318c26d2ac7f19067d45c95b303921fab3127b1609
|
4
|
+
data.tar.gz: f26830637edcdf8485063c9f58bd7eb0edf179b11fef5d42edb4212163b6efd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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(
|
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
|
-
|
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
|
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.
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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:
|
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.
|
46
|
+
version: '1.9'
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 1.
|
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.
|
56
|
+
version: '1.9'
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 1.
|
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.
|
66
|
+
version: '0.6'
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
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.
|
76
|
+
version: '0.6'
|
77
77
|
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: 0.
|
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.
|
86
|
+
version: '0.2'
|
107
87
|
- - ">="
|
108
88
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0.
|
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.
|
96
|
+
version: '0.2'
|
117
97
|
- - ">="
|
118
98
|
- !ruby/object:Gem::Version
|
119
|
-
version: 0.
|
99
|
+
version: 0.2.0
|
120
100
|
description:
|
121
|
-
email:
|
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.
|
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
|