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