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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/reminders_txt.rb +114 -102
- data.tar.gz.sig +0 -0
- metadata +44 -43
- 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: 47aef7833540b8091c405532ea18f2c7e5f21907a4cc2bc5dd44c027858fcf2b
|
4
|
+
data.tar.gz: 772c3421c3521bc8ef5de3db1fe8742c1f8dc8dfed435b7416ff33252137629b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|
-
|
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
|
-
|
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
|
292
|
-
|
293
|
-
def weekahead()
|
294
|
-
|
295
|
-
|
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,
|
298
|
-
|
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.
|
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
|
-
|
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-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.
|
46
|
+
version: '1.9'
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 1.
|
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.
|
56
|
+
version: '1.9'
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 1.
|
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.
|
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.
|
76
|
+
version: 0.6.0
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.6'
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
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.
|
86
|
+
version: 0.2.0
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
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.
|
96
|
+
version: 0.2.0
|
97
97
|
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: '0.
|
99
|
+
version: '0.2'
|
100
100
|
description:
|
101
|
-
email:
|
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
|
-
|
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
|