mindwords 0.6.3 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/mindwords.rb +176 -162
  4. data.tar.gz.sig +0 -0
  5. metadata +30 -30
  6. metadata.gz.sig +3 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18ab26d7ab5ff288172a06294982093e97db2b22998cb627ce5f7201dac62a6f
4
- data.tar.gz: b717eb9f9b9c99d88ed27b33913834f361ceb5715fd9e4e7bdff3bcf7abf9089
3
+ metadata.gz: 7d489cc248683b435ca0ba18e673b7aa75aa23395a73235df19ac355e928dae4
4
+ data.tar.gz: c8276a4a42198bae89ab48af00ec48b491e5a55761e9c3ed47e20524121dbc11
5
5
  SHA512:
6
- metadata.gz: ab92bd3423e50ad635cfd986d817a874db78b2fb7d57db01300400ce4dd5d267d706e1e642442c6bf4d9b5a84448d8be0fe0c13684cf3cfb160523e67da251d0
7
- data.tar.gz: b7b6e3e7971d76f3cd42989a2b69fb6e1d5a933c80f5bcfa61fc65542819ecc2d9b711f7d4af8d77ad8a9d3f4cf7e8a310cd1ce68574d511fbfa2e73af020c13
6
+ metadata.gz: 0f059026fe87db1dec7cd710093ccca7129817b4c461ae0f17d27aba822dce298b3a1948b8ce6c17493a802d39d0ded59edd2651b3d56c763ba455a2e68f9dd0
7
+ data.tar.gz: 3ee4096a398584ef5207fe2902d0e73806cee0791030461220b129f3169c62525c56a78cb288b9f19788813decc341ccb1e26bb6997affd68d6e0af70cd98118
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/mindwords.rb CHANGED
@@ -8,124 +8,138 @@ require 'line-tree'
8
8
 
9
9
  module HashCopy
10
10
  refine Hash do
11
-
11
+
12
12
  def deep_clone()
13
13
  Marshal.load(Marshal.dump(self))
14
14
  end
15
-
15
+
16
16
  end
17
17
  end
18
18
 
19
19
  class MindWords
20
20
  using ColouredText
21
21
  using HashCopy
22
-
22
+ include RXFHelperModule
23
+
23
24
  attr_accessor :lines, :filepath
24
-
25
+
25
26
  def initialize(raws='', parent: nil, debug: false)
26
27
 
27
28
  @parent, @debug = parent, debug
28
-
29
- s, type = RXFHelper.read raws
30
-
31
- @filepath = raws if type == :file or type == :dfs
32
- lines = s.strip.gsub(/^\n/,'').lines.uniq
33
- lines.shift if lines.first =~ /<\?mindwords\?>/
34
-
35
- @lines = lines.inject([]) do |r,line|
36
-
37
- # the following does 2 things:
38
- # 1. splits words separated by a bar (|) onto their own line
39
- # 2. prefixes a word with an underscore if the word is the
40
- # same as the hashtag. That way it's not removed by the
41
- # redundancy checker
42
29
 
43
- raw_words, raw_hashtags = line.split(/(?= #)/,2)
44
- words = raw_words.split(/ *\| */)
45
- hashtags = raw_hashtags.scan(/(?<=#)\w+/)
46
-
47
- words.each do |word|
48
-
49
- linex = (word + raw_hashtags)
50
- r << (hashtags.include?(word) ? linex.sub!(/\b#{word}\b/, '_\0') \
51
- : linex)
52
- end
30
+ import(raws) if raws.length > 1
53
31
 
54
- r
55
- end
56
-
57
32
  end
58
-
33
+
59
34
  def add(s)
60
-
35
+
61
36
  @lines.concat s.strip.lines
62
-
37
+
63
38
  end
64
-
39
+
65
40
  def breadcrumb()
66
41
  @parent.attributes[:breadcrumb].split(/ +\/ +/) if @parent
67
42
  end
68
-
43
+
69
44
  def headings()
70
45
  breadcrumb[0..-2]
71
46
  end
72
-
73
-
47
+
48
+
74
49
  def element(id)
75
-
50
+
76
51
  doc = Rexle.new(to_xml())
77
52
  e = doc.root.element("//*[@id='#{id}']")
78
53
  #e.attributes[:breadcrumb].to_s if e
79
-
54
+
80
55
  end
81
-
82
- def hashtags()
83
- @parent.attributes[:hashtags].split if @parent
56
+
57
+ # If title supplied, searches for a requested title and returns the
58
+ # associated hashtags
59
+ # When no title is supplied, it will return the hashtags for the
60
+ # parent element of a search result object
61
+ #
62
+ def hashtags(title=nil)
63
+
64
+ if title then
65
+ found = search(title)
66
+ found.hashtags() if found
67
+ else
68
+ @parent.attributes[:hashtags].split if @parent and @parent.attributes[:hashtags]
69
+ end
70
+
84
71
  end
85
-
72
+
73
+ def import(raws)
74
+
75
+ s, type = RXFHelper.read raws
76
+
77
+ @filepath = raws if type == :file or type == :dfs
78
+ lines = (s.strip.gsub(/(^\n|\r)/,'') + "\n").lines.uniq
79
+ lines.shift if lines.first =~ /<\?mindwords\?>/
80
+
81
+ @lines = lines.inject([]) do |r,line|
82
+
83
+ # the following does 2 things:
84
+ # 1. splits words separated by a bar (|) onto their own line
85
+ # 2. prefixes a word with an underscore if the word is the
86
+ # same as the hashtag. That way it's not removed by the
87
+ # redundancy checker
88
+
89
+ raw_words, raw_hashtags = line.split(/(?= #)/,2)
90
+ words = raw_words.split(/ *\| */)
91
+ hashtags = raw_hashtags.scan(/(?<=#)\w+/)
92
+
93
+ words.each do |word|
94
+
95
+ linex = (word + raw_hashtags)
96
+ r << (hashtags.include?(word) ? linex.sub!(/\b#{word}\b/, '_\0') \
97
+ : linex)
98
+ end
99
+
100
+ r
101
+ end
102
+ end
103
+
86
104
  # helpful when searching for a word itself using autosuggest
87
105
  #
88
106
  def lookup(s)
89
107
  self.to_words.keys.sort.grep /^#{s}/i
90
- end
91
-
92
- # same as #lines but inludes the breadcrumb path; Helpful to identify
108
+ end
109
+
110
+ # same as #lines but inludes the breadcrumb path; Helpful to identify
93
111
  # which words don't have a breadcrumb path.
94
112
  #
95
113
  def linesplus()
96
-
114
+
97
115
  to_a.map do |word, _|
98
116
  r = search word
99
117
  r ? [word, r.breadcrumb] : [r, nil]
100
118
  end
101
-
119
+
102
120
  end
103
121
 
104
122
  def save(file=@filepath)
105
-
123
+
106
124
  return if @lines.empty?
107
-
125
+
108
126
  puts 'before save' if @debug
109
-
110
- if File.exists? file then
111
- File.write file, to_s()
112
- else
113
- raise 'Filepath not given'
114
- end
115
-
127
+
128
+ FileX.write file, to_s()
129
+
116
130
  end
117
131
 
118
- # Accepts a list of words with the aim of returning a MindWords document
132
+ # Accepts a list of words with the aim of returning a MindWords document
119
133
  # using matched words with hashtags from the existing MindWords document.
120
134
  #
121
135
  def reflect(raws)
122
-
136
+
123
137
  h = to_h
124
-
138
+
125
139
  missing_words = []
126
-
140
+
127
141
  # add the tags from the main list
128
- a = raws.strip.lines.map do |x|
142
+ a = raws.strip.lines.map do |x|
129
143
  if h[x.chomp] then
130
144
  [x.chomp, h[x.chomp]]
131
145
  else
@@ -147,162 +161,162 @@ class MindWords
147
161
  raws3 = a.uniq.map {|s,tags| [s, tags.map {|x| '#' + x }.join(' ')].join(' ') }.join("\n")
148
162
 
149
163
  [MindWords.new(raws3), missing_words]
150
-
164
+
151
165
  end
152
-
166
+
153
167
  def search(keyword, succinct: true)
154
-
168
+
155
169
  a = @lines.grep(/#{keyword}/i).map do |line|
156
-
170
+
157
171
  puts 'line: ' + line.inspect if @debug
158
-
172
+
159
173
  words = line.split
160
174
  r = words.grep /#{keyword}/i
161
175
  i = words.index r[0]
162
-
176
+
163
177
  [line, i]
164
-
178
+
165
179
  end
166
-
180
+
167
181
  return nil if a.empty?
168
182
  #return a[0][0] if a.length < 2
169
183
 
170
184
  a2 = a.sort_by(&:last).map(&:first)
171
185
  puts 'a2: ' + a2.inspect if @debug
172
186
  e = element(keyword.downcase.gsub(/ +/,'-'))
173
-
187
+
174
188
  return MindWords.new(a2.uniq.join, debug: @debug) if e.nil?
175
189
 
176
190
  # find and add any linkage support lines
177
191
  #
178
-
192
+
179
193
  a3 = []
180
194
 
181
195
  a2.each do |line|
182
-
196
+
183
197
  line.chomp.scan(/#[^ ]+/).each do |hashtag|
184
-
198
+
185
199
  puts 'hashtag: ' + hashtag.inspect if @debug
186
200
  r2 = @lines.grep(/^#{hashtag[1..-1]} #/)
187
- a3 << r2.first if r2
188
-
201
+ a3 << r2.first if r2
202
+
189
203
  end
190
204
  end
191
205
 
192
206
  puts 'a2: ' + a2.inspect if @debug
193
207
  a2.concat a3
194
-
208
+
195
209
  if succinct then
196
210
  MindWords.new(a2.uniq.join, parent: e, debug: @debug)
197
211
  else
198
212
  MindWords.new(a2.uniq.join, debug: @debug)
199
213
  end
200
-
214
+
201
215
  end
202
-
216
+
203
217
  def sort()
204
218
  s = @lines.sort.join
205
-
219
+
206
220
  def s.to_s()
207
221
  self.lines.map do |x|
208
222
  title, hashtags = x.split(/(?=#)/,2)
209
223
  title + hashtags.chomp.brown
210
224
  end.join("\n")
211
- end
212
-
225
+ end
226
+
213
227
  return s
214
228
  end
215
-
229
+
216
230
  def sort!()
217
231
  @lines = sort().lines
218
232
  self
219
233
  end
220
-
234
+
221
235
  def tag_sort()
222
-
223
- h = @lines.group_by {|x| x[/#\w+/]}
236
+
237
+ h = @lines.group_by {|x| x[/#\w+/]}
224
238
  s = h.sort.map {|key, value| value.sort }.join
225
-
239
+
226
240
  def s.to_s()
227
241
  self.lines.map do |x|
228
242
  title, hashtags = x.split(/(?=#)/,2)
229
243
  title + hashtags.chomp.brown
230
244
  end.join("\n")
231
245
  end
232
-
246
+
233
247
  return s
234
-
248
+
235
249
  end
236
-
250
+
237
251
  def tag_sort!()
238
252
  @lines = tag_sort().lines
239
253
  self
240
254
  end
241
255
 
242
256
  def to_a()
243
-
244
- @lines.map do |x|
257
+
258
+ @lines.map do |x|
245
259
  s, rawtags = x.split(/(?= #)/,2)
246
260
  [s, rawtags.scan(/(?<=#)\w+/)]
247
261
  end
248
-
262
+
249
263
  end
250
-
264
+
251
265
  def to_h()
252
266
  to_a.to_h
253
267
  end
254
-
268
+
255
269
  def to_hashtags()
256
270
  @hashtags
257
271
  end
258
272
 
259
273
  def to_outline(sort: true)
260
-
274
+
261
275
  build()
262
-
276
+
263
277
  if sort then
264
278
  a = LineTree.new(@outline).to_a
265
- puts ('a: ' + a.inspect).debug if @debug
279
+ puts ('a: ' + a.inspect).debug if @debug
266
280
  a2tree(tree_sort(a))
267
281
  else
268
282
  @outline
269
283
  end
270
-
284
+
271
285
  end
272
-
286
+
273
287
  alias to_tree to_outline
274
-
288
+
275
289
  def to_s(colour: false)
276
-
290
+
277
291
  header = "<?mindwords?>\n\n"
278
292
  return header + @lines.map(&:chomp).join("\n") unless colour
279
-
293
+
280
294
  body = @lines.map do |x|
281
295
  title, hashtags = x.split(/(?=#)/,2)
282
296
  title + hashtags.chomp.brown
283
297
  end.join("\n")
284
-
298
+
285
299
  header + body
286
-
287
- end
288
-
300
+
301
+ end
302
+
289
303
  def to_words()
290
-
304
+
291
305
  h = {}
292
-
306
+
293
307
  Rexle.new(to_xml).root.each_recursive do |e|
294
-
308
+
295
309
  h[e.attributes[:title]] = {
296
- breadcrumb: e.attributes[:breadcrumb],
310
+ breadcrumb: e.attributes[:breadcrumb],
297
311
  hashtags: e.attributes[:hashtags]
298
312
  }
299
-
313
+
300
314
  end
301
-
315
+
302
316
  h
303
-
304
- end
305
-
317
+
318
+ end
319
+
306
320
  def to_xml()
307
321
  build() unless @xml
308
322
  @xml
@@ -311,13 +325,13 @@ class MindWords
311
325
  private
312
326
 
313
327
  def build()
314
-
328
+
315
329
  h = {}
316
330
 
317
331
  @lines.each do |line|
318
332
 
319
333
  title, rawtags = line.split(/(?= #)/,2)
320
-
334
+
321
335
  rawtags.scan(/#(\w+)/).flatten(1).each do |rawtag|
322
336
  tag = rawtag.gsub(/ +/, '_')
323
337
  h[tag] ||= []
@@ -325,32 +339,32 @@ class MindWords
325
339
  end
326
340
 
327
341
  end
328
-
342
+
329
343
  @hashtags = h.deep_clone.sort.map {|tag, fields| [tag, fields.sort]}.to_h
330
344
 
331
-
345
+
332
346
  a = rexlize(h)
333
347
  doc = Rexle.new(['root', {}, '', *a])
334
348
 
335
349
  # apply node nesting
336
350
 
337
351
  doc.root.elements.each do |e|
338
-
352
+
339
353
  doc.root.xpath('//' + e.name).each do |e2|
340
-
354
+
341
355
  next if e2 === e
342
-
356
+
343
357
  e2.parent.add e
344
358
  e2.delete
345
-
359
+
346
360
  end
347
-
361
+
348
362
  end
349
363
 
350
-
364
+
351
365
  # remove duplicates which appear in the same branch above the nested node
352
366
  rm_duplicates(doc)
353
-
367
+
354
368
  # remove redundant nodes (outsiders)
355
369
  # a redundant node is where all children exist in existing nested nodes
356
370
 
@@ -363,60 +377,60 @@ class MindWords
363
377
  e.backtrack.to_s if dups
364
378
 
365
379
  end
366
-
380
+
367
381
  puts 'redundants: ' + redundants.inspect if @debug
368
382
 
369
383
  redundants.compact.each {|x| doc.element(x).delete }
370
-
384
+
371
385
  node = if @parent then
372
386
  found = doc.root.element('//' + @parent.name)
373
387
  found ? found.parent : doc.root
374
388
  else
375
389
  doc.root
376
390
  end
377
-
378
- # the following removes any undescore prefix from words which were the
391
+
392
+ # the following removes any undescore prefix from words which were the
379
393
  # same as the hashtag
380
-
394
+
381
395
  node.root.each_recursive do |e|
382
396
 
383
397
  next unless e
384
398
  puts 'e: ' + e.inspect if @debug
385
-
399
+
386
400
  e.attributes[:id] = e.attributes[:id].sub(/^_/,'') if e.attributes[:id]
387
401
  e.attributes[:title] = e.attributes[:title].sub(/^_/,'') if e.attributes[:title]
388
402
  e.value = e.value.sub(/^_/,'')
389
403
  e.name = e.name.sub(/^_/,'')
390
-
391
- end
392
-
404
+
405
+ end
406
+
393
407
  # ----
394
-
408
+
395
409
  @outline = treeize node
396
-
410
+
397
411
  node.root.each_recursive do |e|
398
-
399
- e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
400
-
412
+
413
+ e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
414
+
401
415
  s = e.parent.attributes[:breadcrumb] ? \
402
416
  e.parent.attributes[:breadcrumb].to_s + ' / ' : ''
403
417
  e.attributes[:breadcrumb] = s + e.value.strip
404
-
418
+
405
419
  r = @lines.grep(/^#{e.attributes[:title]} #/i)
406
420
  next unless r.any?
407
421
  e.attributes[:hashtags] = r[0].scan(/(?<=#)\w+/).join(' ')
408
422
 
409
-
423
+
410
424
  end
411
-
425
+
412
426
  @xml = node.xml pretty: true
413
427
 
414
428
  end
415
-
429
+
416
430
  def rexlize(a)
417
-
431
+
418
432
  a.map do |x|
419
-
433
+
420
434
  puts 'x: ' + x.inspect if @debug
421
435
 
422
436
  case x
@@ -424,41 +438,41 @@ class MindWords
424
438
  [x.downcase.gsub(/ +/,''), {title: x}, x]
425
439
  when Hash
426
440
  [
427
- x.keys.first.downcase.gsub(/_/,' '),
428
- {title: x.keys.first},
441
+ x.keys.first.downcase.gsub(/_/,' '),
442
+ {title: x.keys.first},
429
443
  x.keys.first,
430
444
  *rexlize(x.values.first)
431
445
  ]
432
446
  when Array
433
447
  [
434
- x.first.downcase.gsub(/_/,' '),
448
+ x.first.downcase.gsub(/_/,' '),
435
449
  {title: x.first}, x.first, *rexlize(x.last)
436
450
  ]
437
451
  end
438
452
  end
439
453
 
440
454
  end
441
-
455
+
442
456
  def rm_duplicates(doc)
443
-
457
+
444
458
  duplicates = []
445
-
459
+
446
460
  doc.root.each_recursive do |e|
447
461
 
448
462
  rows = e.parent.xpath('//' + e.name)
449
463
  next if rows.length < 2
450
464
 
451
465
  rows[0..-2].each {|e2| duplicates << e.backtrack.to_s }
452
-
466
+
453
467
  end
454
468
 
455
469
  duplicates.each do |path|
456
-
470
+
457
471
  puts 'pathx: ' + path.inspect if @debug
458
472
  e = doc.element(path)
459
473
  e.delete if e
460
-
461
- end
474
+
475
+ end
462
476
 
463
477
  end
464
478
 
@@ -470,13 +484,13 @@ class MindWords
470
484
 
471
485
  puts 'e: ' + e.inspect if @debug
472
486
  if e.is_a? Rexle::Element then
473
- (' ' * indent) + e.value.to_s + "\n" + treeize(e,indent+1)
487
+ (' ' * indent) + e.value.to_s + "\n" + treeize(e,indent+1)
474
488
  end
475
489
  end
476
490
 
477
491
  lines.join
478
492
  end
479
-
493
+
480
494
  def tree_sort(a)
481
495
 
482
496
  if a.first.is_a? Array then
@@ -496,7 +510,7 @@ class MindWords
496
510
  (' ' * indent) + title + "\n" + children
497
511
  end.join
498
512
 
499
- end
513
+ end
500
514
 
501
515
  end
502
516
 
@@ -506,7 +520,7 @@ class MindWordsWidget
506
520
 
507
521
  end
508
522
 
509
-
523
+
510
524
  # can be used for main entries or a words list
511
525
  #
512
526
  def input(content: '', action: 'mwupdate', target: 'icontent')
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mindwords
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.7
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
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwMTA2MDAzNzI2WhcN
15
- MjIwMTA2MDAzNzI2WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCnNKTu
17
- gn/UJQjyq6a2T4UUemzEz8RnPLYDFkt+iM4mXm7dqSkZ5EdSEHdJ26r2P07yZjyB
18
- wg/WciIAG2tStBa9Kz3JLe4PveWMTlWDy0SruFAlUYVo8xaZjJmn7eAYFQz9mvVM
19
- 6HYp0ov8hDtYiDuhcmJ9tlVciusDcGuF9J9XoG3wH75EgRCVbxVXPTufhJNxAfmg
20
- Z8Z6pGm6gVRZ4YJ50+14vwTyyTjB3uFmJtjIn4UhDmAP3l1YUEQq0RCqEgdigzu7
21
- k1gX0A5Fs+5BKqK9kTlpZuceDH4Hqcmm4DPZ+asiXIYoRetlYaw/QJMpVpgOQ4tU
22
- PP0ZGl/QUSmrru/5uK+P4xOUL07O1dd+K6tyR8SC3Gh4Wzow8rUtyh7cXPz58bGY
23
- RtZaWPTWgz8FZs3S7NcIBdGU0Hlj8Z5QL26LatKIRsJz1yNaV8dRWZbhU9ML6RRJ
24
- 7T2avgjLyj1WWyx3Sg8afxxZ0Odp5wBc1LiqdqI+OybheGZdR1z17k/Xyj8CAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUWkD96lfk
26
- uPyGnc/MJwjZ5vZICwEwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMTI3MTQ1NDM4WhcN
15
+ MjMwMTI3MTQ1NDM4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC5j1vd
17
+ M1N+azakESYbM6MEesfRhcOCklUmUNk5LlHcrtoySInNFd9ky7EMilTg8hRPrf5m
18
+ YgEx9+6V4iAGhRrkmyPdjGbNvgjyGqPjzouwtElA1SIh6geIaiDr3GAQQ4Amez/g
19
+ jM0bh1xybLIhBxUJ+QDB/MCyWX7c6Lf2mmbWpKJJi9DxdgZT19nD5VrjLE989UwN
20
+ XOt/jc8s9zc3RFNadSTqVAWXXUb8F9Uh0zrkNwJD0jhmpHEyg7uZ6cHrxD9zZbLf
21
+ YLJFU+QgPCSUkJX3KUcLbpwHJbmwVbaRwHz16AanbyvBa3jHBOTLoRywpvjPQuec
22
+ vr+4cUzHHad9G329gwk9F/3VY0KMtvjxwsRKJ6R+0QacNNG/uyzDirlPfx2N9qy/
23
+ +vxoLS8NDLDG7lxa+vSXqBhfBlUGUTV+N3g7zwUQOfLetAza48Mzlhbtom/7GhXW
24
+ RLyW+RLWrNZmyxzmcTzIXMJknJcdh1lErfqlK4xJoFjoOz+Ezt91yfqo7pcCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUsko1pK7R
26
+ 6H51ylxgR7A2RLZ7B6UwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAbe9+Fvsl1/YO5V70fwm9KI6qDR8TBYVSgFBBHnBb
29
- vua8Qp+neqsLq/NVF/MAgBa8klFOw0LLPjKphKLSbJd7pb34etJytsIWcF2WLCGG
30
- s9JBtt3URieOcvKVyCnjAA4aQ3YGvgaM3t94y/LaoSQZEgu8385NczGI8GCFSEV5
31
- 0pv/71aTh42DuIbFrF5Qf7XMncgMzxZuVWaWuU25Nh4bK6swzSV8Pba89c8LhVj2
32
- WUxqYCA9Lrgw2H/RWxQIXS1xQ+zXLHc+ExzJ/qEDef7wsz3wIYRoGHbhciXxLHce
33
- +0EOblxngt+AdCB4PmQlVA5LdFSRzxMv84tGrnhAGefjGPe1KzegthuN7sl0yugD
34
- tiF/wCtUE7D7XQOINuJSGP2e+9XU3GmTZQvrdEuOO3LcTSU9jfn04leXaQ4pwv2M
35
- aWH7D2AmhOpqNwWnPHzWR/yzpigAVTrvpHfRxZleQj6Z/090nIH2KR0RdioMmPFq
36
- 3+574KQzs/gR9Y5a+iMcvHRN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAR1wfQlkrJf5zvVkq5Cl2fcXYKRnhk8N9lxUZPA2Z
29
+ nXfHed/9gdLpGLQHV91Q0W2taDFDnOpRj3e2dZxdihrJ4qJJ55w9cUgGcpqTjmgE
30
+ p/5Pxgy25wdHte0URJvy4fnIB0NjVe+pTLENGLhk9O+ktKxfI5b+3ImOHLirfsiM
31
+ Nt1J9bxPr++9WzOnvOBNpt+dSZE42/mEAoVHCLGp06XSCuj3TRE93TetO5K8Rqrz
32
+ Gr2rktYjmK75ckHc2Owb7k5q4MhENXDF0w+boTHKwhZ3YZ23ORWBAAe6EWZ5CJif
33
+ ACsKYTamTZJ1XtnSuwfZJ66HujeZDeDeU4Jn0IWl0Ocpuf5cGdgZdQ/jlA02M4Ev
34
+ 1IAsJkbXAdPHh9mLKUSeH2E1qJ8tg7MFVdBZMkvG4PNXXEk5fzijsrxrXbpY4IgW
35
+ eUqhPOSrxIRLebVebvo/SHN6+ed3Q1tXowsbLGCT9QwqbaZ5MZ7zks92mIWeJvsA
36
+ JdpabIXfcOANNKd0ha4NO+Yu
37
37
  -----END CERTIFICATE-----
38
- date: 2021-05-24 00:00:00.000000000 Z
38
+ date: 2022-01-27 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: line-tree
@@ -46,7 +46,7 @@ dependencies:
46
46
  version: '0.9'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 0.9.2
49
+ version: 0.9.3
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
@@ -56,27 +56,27 @@ dependencies:
56
56
  version: '0.9'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 0.9.2
59
+ version: 0.9.3
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rxfhelper
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '1.1'
66
+ version: '1.2'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 1.1.3
69
+ version: 1.2.1
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: '1.1'
76
+ version: '1.2'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 1.1.3
79
+ version: 1.2.1
80
80
  description:
81
81
  email: digital.robertson@gmail.com
82
82
  executables: []
metadata.gz.sig CHANGED
@@ -1 +1,3 @@
1
- � �� ����H\��`��z�yR�Њx'�# ����q�μ[�l|��?p�i�1�y���+�Ot)��5���ttU|X��cTb���O����m s�5�GkB(Q/��a�KM�~��A(:��[�"�T �d~��#��B��c��WŘ�e�u-al�i*�!�j�<Cʉ2���vu�=rf�A�5���� �F��d`�a�(P�1T��G�T���V Gvu`o|*$�7��Zճ5�9�՟ؿ�V4l52�9<��ߚ�m���؉�\�E��TQ���ˀ�Ċ�H�q�[ �$��U_�0���7�h� ae6}c�������6�Ɉ˪�`��R"X�Â�:ଃ���<UsUi�}�
1
+ 2��O�aK?��V�� J$�J����9��/�
2
+ ���W�O5;fl�3.��%D��P�Ӈ|V��RՁV�N螴�>�i�.^�r=�(`n �0>�TX���P�ڥ��gQ�{��P�^�)�R��1� 0�
3
+ Y�S2��P�&P��Y"s����ĶE��t\3a����3�r2��}�%Y� k�h!/�`��eţx��rǍ�eK��{�0���y�A�/����9׷U�X}?�+.��_smkh�P�`F�f��/6��jO��N��47�n���m�H$�����j���ܻ-��\ �ra|���N��l|�#������G���`Ϣ����ڼER�V���Z2EԷj��^� 6m��3��fא����,�n٣��U