dir-to-xml 1.0.8 → 1.1.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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/dir-to-xml.rb +162 -211
  4. data.tar.gz.sig +2 -3
  5. metadata +49 -29
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfe35ab7508e85463cf2aeb0105e30e38372912a8a47f7d90a298caa702ff0dd
4
- data.tar.gz: fff6e43ea00d6a697e0b4aaa7aedbd5ef7d38645756b01329b0f9095edea3b11
3
+ metadata.gz: 6fd07741c205b9a10af1d80c5f9a298b36337acbe4fa6e3bfc15e53164eee0b8
4
+ data.tar.gz: 51f7acd3e7bc86fed507088781e576478ef846828ac050d35fbd30b0111aa738
5
5
  SHA512:
6
- metadata.gz: 06ee8ffb01712045e85717db1c74f67ccd68e526ee74e18d1905800eea6d55d75e634badb9f13b00f36d5eac1204d1ea62961db5f84ad03ae49bd9f1c36dae86
7
- data.tar.gz: 8243bee16134b8a3d41de944b37eff432fcd7b785f83703537ff156d4e6f127cc17c59c858e957b942fc21e24b1805d24fa0608e1f539f7226d3a16f0f4235b4
6
+ metadata.gz: a226d2e9028066bca47aee5b9dee85ef21531d6d947fb725f8ab09295bd41cf889378637c811c6eb3a6db8889339bc8f9fedbaa0316422f437515bc1ecb02e0a
7
+ data.tar.gz: 596a4e62fa36e4930151b7d2ee2c17b11d45e1c0606fa2e4783f24c80ff824940144d66c63004e4750de2cf88702c7be47553a8729c19496f2e6713198d48849
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/dir-to-xml.rb CHANGED
@@ -2,308 +2,259 @@
2
2
 
3
3
  # file: dir-to-xml.rb
4
4
 
5
+ require 'c32'
5
6
  require 'dxlite'
6
7
 
7
8
 
8
- class DirToXML
9
-
10
- attr_reader :dx, :activity
11
-
12
- def initialize(x= '.', recursive: false, index: 'dir.xml', debug: false)
9
+ # How dir-to-xml should work
10
+ #
11
+ # if the dir.xml file doesn't exist then
12
+ #
13
+ # generate the dir.xml file
14
+ #
15
+ # else
16
+ #
17
+ # # the dir.xml file does exist
18
+ #
19
+ # # check for one of the following:
20
+ # # 1 or more new files
21
+ # # 1 or more removed files
22
+ # # 1 or more modified files
23
+ #
24
+ # note: Ideally The index needs to be stored and retrieved the fastest way possible.
25
+ # This is why it's saved as a .json file rather .xml
26
+ #
27
+ # tested:
28
+ # * finding the latest file in the current directory
29
+ # * finding the latest file in a sub-directory (using recursive: true)
13
30
 
14
- super()
15
31
 
16
- @debug = debug
17
-
18
- @dx = nil
19
- @activity = {new: [], modified: []}
32
+ class DirToXML
33
+ using ColouredText
20
34
 
21
- if x.is_a? DxLite then
35
+ attr_reader :new_files, :deleted_files, :dx, :latest_files, :latest_file
22
36
 
23
- @dx = x
24
- @a = @dx.to_a
25
- @object = @a
37
+ def initialize(obj= '.', index: 'dir.json', recursive: false,
38
+ verbose: true, debug: false)
26
39
 
27
- return self
40
+ if verbose then
41
+ puts
42
+ puts 'DirToXML at your service!'.highlight
43
+ puts
44
+ puts
28
45
  end
29
46
 
30
- path = x
47
+ @index, @recursive, @verbose, @debug = index, recursive, verbose, debug
31
48
 
32
- @path, @index, @recursive = path, index, recursive
49
+ if File.basename(obj) == index then
33
50
 
34
- raise "Directory not found." unless File.exists? path
35
- filepath = File.join(path, index)
51
+ #read the index file
52
+ @path = File.dirname(obj)
53
+ puts 'intialize() @path: ' + @path.inspect if @debug
36
54
 
37
-
38
- if File.exists? filepath then
39
-
40
- @dx = DxLite.new(File.join(@path, @index), debug: @debug)
55
+ @dx = read(obj)
41
56
 
42
57
  else
58
+ @path = obj
59
+ puts 'intialize() @path: ' + @path.inspect if @debug
43
60
 
44
- @dx = DxLite.new('directory[title, file_path, last_modified, ' + \
45
- 'description]/file(name, type, ext, ctime, mtime, atime, ' + \
46
- 'description, owner, group, permissions)')
47
-
48
- puts 'before title' if @debug
49
- @dx.title = 'Index of ' + File.expand_path(@path)
50
- @dx.file_path = File.expand_path(@path)
51
- @dx.last_modified = ''
52
-
61
+ new_scan()
53
62
  end
54
63
 
55
- if @debug then
56
- puts 'before Dir.glob'
57
- puts '_path: ' + File.join(path, "*").inspect
58
- end
64
+ end
59
65
 
60
- a = Dir.glob(File.join(path, "*")).map{|x| File.basename(x) }.sort
61
- puts 'a: ' + a.inspect if @debug
66
+ def activity()
67
+ {
68
+ new: @new_files,
69
+ deleted: @deleted_files,
70
+ modified: @latest_files
71
+ }
72
+ end
62
73
 
63
- a.delete index
74
+ alias changes activity
64
75
 
65
- return if a.empty?
76
+ def directories()
77
+ @dx.all.select {|x| x.type == 'directory'}.map(&:name)
78
+ end
66
79
 
67
- a2 = a.inject([]) do |r, filename|
80
+ def find_all_by_ext(s)
81
+ @dx.find_all_by_ext(s)
82
+ end
68
83
 
69
- x = File.join(path, filename)
84
+ def find_by_filename(s)
85
+ @dx.find_by_filename(s)
86
+ end
70
87
 
71
- begin
72
- r << {
73
- name: filename,
74
- type: File::ftype(x),
75
- ext: File.extname(x),
76
- ctime: File::ctime(x),
77
- mtime: File::mtime(x),
78
- atime: File::atime(x)
79
- }
80
- rescue
81
- r
82
- end
88
+ def latest()
83
89
 
90
+ if @latest_file then
91
+ File.join(@latest_file[:path], @latest_file[:name])
84
92
  end
85
93
 
86
- # has the directory been modified since last time?
87
- #
88
- if @dx and @dx.respond_to? :last_modified and \
89
- @dx.last_modified.length > 0 then
90
-
91
- puts 'nothing to do' if @debug
92
- puts 'a2: ' + a2.inspect if @debug
93
- file = a2.max_by {|x| x[:mtime]}
94
+ end
94
95
 
95
- if @debug then
96
- puts 'file: ' + file.inspect
97
- puts 'd1: ' + Time.parse(@dx.last_modified).inspect
98
- puts 'd2: ' + (file[:mtime]).inspect
99
- end
96
+ def new_scan()
100
97
 
101
- if Time.parse(@dx.last_modified) >= file[:mtime] then
102
- @a = @dx.to_a
103
- return
104
- end
98
+ t = Time.now
99
+ records = scan_dir @path
100
+ puts 'new_scan() records: ' + records.inspect if @debug
105
101
 
106
- end
102
+ a = records.map {|x| x[:name]}
107
103
 
108
- puts 'stage 2' if @debug
104
+ if File.exists? File.join(@path, @index) then
109
105
 
110
- if @dx and @dx.respond_to? :last_modified then
106
+ @dx = read()
111
107
 
112
- if @dx.last_modified.length > 0 then
108
+ old_records = @dx.to_a
109
+ a2 = old_records.map {|x| x[:name]}
113
110
 
114
- t = Time.parse(@dx.last_modified)
111
+ # delete any old files
112
+ #
113
+ @deleted_files = a2 - a
115
114
 
116
- # find the most recently modified cur_files
117
- recent = a2.select {|x| x[:mtime] > t }.map {|x| x[:name]} \
118
- - %w(dir.xml dir.json)
115
+ if @deleted_files.any? then
119
116
 
120
- # is it a new file or recently modified?
121
- new_files = recent - @dx.to_a.map {|x| x[:name]}
122
- modified = recent - new_files
117
+ @deleted_files.each do |filename|
118
+ record = @dx.find_by_name filename
119
+ record.delete if record
120
+ end
123
121
 
124
- else
122
+ end
125
123
 
126
- new_files = a2.select {|x| x[:type] == 'file'}.map {|x| x[:name]}
127
- modified = []
124
+ # check for newly modified files
125
+ # compare the file date with index file last modified date
126
+ #
127
+ dtx_last_modified = Time.parse(@dx.last_modified)
128
128
 
129
+ select_records = records.select do |file|
130
+ file[:mtime] > dtx_last_modified
129
131
  end
130
132
 
131
- @activity = {modified: modified, new: new_files}
132
-
133
- end
133
+ find_latest(select_records)
134
134
 
135
+ # Add any new files
136
+ #
137
+ @new_files = a - a2
135
138
 
136
- command = File.exists?(File.join(path, index)) ? :refresh : :dxify
139
+ if @new_files.any? then
137
140
 
138
- self.method(command).call a2
139
- puts '@dx: ' + @dx.inspect if @debug
140
- puts '@dx.last_modified: ' + @dx.last_modified.inspect if @debug
141
+ @dx.last_modified = Time.now.to_s
142
+ @dx.import @new_files.map {|filename| getfile_info(filename) }
141
143
 
144
+ end
142
145
 
143
- @a = @dx.to_a
146
+ @dx.last_modified = Time.now.to_s if @deleted_files.any?
144
147
 
145
- if recursive then
148
+ else
146
149
 
147
- self.filter_by(type: :directory).to_a.each do |x|
150
+ @dx = new_index(records)
151
+ find_latest(records)
148
152
 
149
- path2 = File.join(path, x[:name])
150
- DirToXML.new(path2, recursive: true)
151
- end
152
153
  end
153
154
 
154
- @object = @a
155
+ t2 = Time.now - t
156
+ puts ("directory scanned in %.2f seconds" % t2).info if @verbose
155
157
 
156
158
  end
157
159
 
158
- def directories(&blk)
160
+ def read(index=@index)
159
161
 
160
- self.to_dx.all.select {|x| x.type == 'directory'}.map(&:name)
162
+ t = Time.now
163
+ puts 'read path: ' + File.join(@path, index).inspect if @Debug
161
164
 
162
- end
165
+ dx = DxLite.new(File.join(@path, index), autosave: true)
163
166
 
164
- def filter(&blk)
165
- @dx.filter &blk
166
- end
167
+ t2 = Time.now - t
168
+ puts ("%s read in %.2f seconds" % [@index, t2]).info if @verbose
167
169
 
168
- def filter_by(pattern=/.*/, type: nil, ext: nil, &blk)
170
+ return dx
169
171
 
170
- @object = @a.select do |x|
172
+ end
171
173
 
172
- puts '_x: ' + x.inspect if @debug
173
- pattern_match = x[:name] =~ pattern
174
+ private
174
175
 
175
- type_match = type ? x[:type] == type.to_s : true
176
- ext_match = ext ? x[:ext] == ext.to_s : true
176
+ def find_latest(files)
177
177
 
178
- pattern_match and type_match and ext_match
178
+ @latest_files = files.sort_by {|file| file[:mtime]}
179
+ puts '@latest_files: ' + @latest_files.inspect if @debug
179
180
 
180
- end
181
+ @latest_file = @latest_files[-1]
182
+ puts ':@latest_file: ' + @latest_file.inspect if @debug
181
183
 
182
- return if @object.empty?
184
+ dir_list = directories()
183
185
 
184
- @dx = DxLite.new
185
- @dx.import @object
186
+ if dir_list.any? then
186
187
 
187
- block_given? ? @dx.all.map(&:name).each(&blk) : self
188
+ dir_latest = dir_list.map do |dir|
188
189
 
189
- end
190
+ puts 'dir: ' + dir.inspect if @debug
191
+ dtx2 = DirToXML.new(File.join(@path, dir), index: @index,
192
+ recursive: true, verbose: false, debug: @debug)
193
+ [dir, dtx2.latest_file]
190
194
 
191
- def find_all_by_ext(s)
192
- @dx.all.select {|item| item.ext == s}
193
- end
195
+ end.reject {|_,latest| latest.nil? }.sort_by {|_, x| x[:mtime]}.last
194
196
 
195
- def find_by_filename(s)
196
- @dx.all.find {|item| item.name == s}
197
- end
197
+ puts 'dir_latest: ' + dir_latest.inspect if @debug
198
198
 
199
- alias find_by_file find_by_filename
199
+ @latest_file = if dir_latest and \
200
+ ((dir_latest.last[:mtime] > latest_file[:mtime]) \
201
+ or latest_file.nil? \
202
+ or latest_file[:type] == 'directory') then
200
203
 
201
- def last_modified(ext=nil)
204
+ dir_latest.last[:path] = File.join(@path, dir_latest.first)
205
+ dir_latest.last
202
206
 
203
- if ext and ext != '*' then
204
- @object = @a.select{|x| x[:ext][/#{ext}/] or x[:type] == 'directory'}
205
- end
207
+ elsif latest_file and latest_file[:type] == 'file'
206
208
 
207
- a = sort_by :mtime
209
+ latest_file[:path] = @path
210
+ latest_file
208
211
 
209
- lm = a[-1]
212
+ end
210
213
 
211
- if @recursive and lm[:type] == 'directory' then
212
- return [lm, DirToXML.new(File.join(@path, lm[:name])).last_modified]
213
214
  else
214
- lm
215
+ return
215
216
  end
216
- end
217
-
218
- def save()
219
- @dx.save File.join(@path, @index)
220
- end
221
-
222
- def select_by_ext(ext, &blk)
223
-
224
- @a = @dx.to_a unless @a
225
-
226
- @object = ext != '*' ? @a.select{|x| x[:ext][/#{ext}$/]} : @a
227
- return if @object.empty?
228
-
229
- dx = DxLite.new
230
- dx.import @object
231
- dtx = DirToXML.new(dx)
232
- block_given? ? dtx.dx.all.map(&:name).each(&blk) : dtx
233
- end
234
-
235
- def sort_by(sym)
236
-
237
- puts 'inside sort_by' if @debug
238
- procs = [
239
- [
240
- :mtime,
241
- lambda do |obj|
242
- obj.sort_by do |x|
243
- x[:mtime].is_a?(String) ? Time.parse(x[:mtime]) : x[:mtime]
244
- end
245
- end
246
- ]
247
- ]
248
- proc1 = procs.assoc(sym).last
249
-
250
- puts '@object: ' + @object.inspect if @debug
251
- @object = @a = @dx.to_a if @object.nil?
252
- proc1.call(@object)
253
217
 
254
218
  end
255
219
 
256
- def sort_by_last_modified()
257
- sort_by :mtime
258
- end
220
+ def getfile_info(filename)
259
221
 
260
- alias sort_by_lastmodified sort_by_last_modified
222
+ x = File.join(@path, filename)
223
+ puts 'x: ' + x.inspect if @debug
261
224
 
262
- def to_a
263
- @object || @a
264
- end
265
-
266
- def to_h()
267
- self.to_a.inject({}){|r,x| r.merge(x[:name] => x)}
268
- end
269
-
270
- def to_xml(options=nil)
271
- @dx.to_xml options
272
- end
273
-
274
- def to_dynarex
275
- @dx.clone
225
+ begin
226
+ {
227
+ name: filename,
228
+ type: File::ftype(x),
229
+ ext: File.extname(x),
230
+ mtime: File::mtime(x),
231
+ description: ''
232
+ }
233
+ end
276
234
  end
277
235
 
278
- alias to_dx to_dynarex
236
+ def new_index(records)
279
237
 
280
- private
238
+ dx = DxLite.new('directory[title, file_path, ' +
239
+ 'last_modified, description]/file(name, ' +
240
+ 'type, ext, mtime, description)')
281
241
 
282
- def dxify(a)
242
+ puts 'before title' if @debug
243
+ dx.title = 'Index of ' + @path
244
+ dx.file_path = @path
245
+ dx.last_modified = Time.now
246
+ dx.import records.reverse
247
+ dx.save File.join(@path, @index)
283
248
 
284
- @dx.last_modified = Time.now.to_s if @dx.respond_to? :last_modified
285
- @dx.import a
286
- @dx.save File.join(@path, @index)
249
+ return dx
287
250
 
288
251
  end
289
252
 
290
- def refresh(cur_files)
291
-
292
- puts 'inside refresh' if @debug
293
-
294
- prev_files = @dx.to_a
295
-
296
- #puts 'prev_files: ' + prev_files.inspect
297
- #puts 'cur_files: ' + cur_files.inspect
298
-
299
- cur_files.each do |x|
300
-
301
- file = prev_files.find {|item| item[:name] == x[:name] }
302
- #puts 'found : ' + file.inspect if @debug
303
- x[:description] = file[:description] if file and file[:description]
304
- end
253
+ def scan_dir(path)
305
254
 
306
- dxify(cur_files)
255
+ a = Dir.glob(File.join(path, "*")).map {|x| File.basename(x) }
256
+ a.delete @index
257
+ a.map {|filename| getfile_info(filename) }
307
258
 
308
259
  end
309
260
 
data.tar.gz.sig CHANGED
@@ -1,3 +1,2 @@
1
- ?�uHI%�93�1ݝҼ�ɡ�ꂈ+��h�$�nj~F��0Rʂ֍��:��-ؠ��2��;}��->i9 7�-as��ϗ���
2
- �闎�&Cz�|�w���y��vt]f7��}̚c���.�p�Ub�loTA �ؑ��,}��� �k�u�c�o� +�Ud$��J�JY�������nDS�xz�UQ�,�G�9f'�A��p��SS���ԹB5��Ut�T��a�K�TJ^��Km�����hI�o���i�D�K9^?!ە8X�c^��;J
3
- VI�v79���I���^�LE��e#�X:� Z�5v5�g[L��դ�۹"
1
+ Ha>ݏA��6������&�z���ħ�|J����|_��H0z����C���v��N�#��1�״$���^&KW�e���*!�/�Ւe@:e;�c����R=�?&'�'�O�[��N���Q�p��#���f}�
2
+ {1��>��ӟ
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dir-to-xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,52 +11,72 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwMTIzMTgwNTQ4WhcN
15
- MjIwMTIzMTgwNTQ4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC3/Li6
17
- /b2XI6+wLVA57zxSEu6RtQqu94GlPisH87ziQS+xYDYq8MqrlqHwA2O6GyK+dnCS
18
- V0pdXagOSMj27drmy9j6AhdOGxZTvB4M+q2uxxSt1AU8jAlKVBhRiKt15sbSF43K
19
- 3cY/PrccN4XpJT1YD44WU4+FwaGatFwcAsHtPpxYZgYMZj1sY+wnlKklqBrcWo6H
20
- 21+fRAVgHi5dqypH6Yez5Rc2rUKEg72OIU76iSjyx9XP8CiX4sxSqw+HRwyCkjKx
21
- d5Onb6vhlSyWpBwRmPRP1bbiztxho4Pla28HM+qVvLIqHpCYoWZi2xmKBoJ5oKPx
22
- cUj1ThI5nucnixrbg5dUjhJF9Ews4PukHtG2uIc/7WG+vCbZHn2CZNqH4HfB8cW5
23
- yoeD4sBFEJwzK8nfGZuAwJ0yOi8yZTqcW8HyK/IVXH+fqC1NsQVEL5yYhnaCCVvx
24
- ShG2g5rh48kNN5CsIQb87WP3J/YnsXhIz3+dwJPmLt+QuWE6sI1NkGWHQFECAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUEmUqvmku
26
- azMk41rHySinmAUmae8wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjEwMTcwNzMwWhcN
15
+ MjMwMjEwMTcwNzMwWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCjKYHi
17
+ pAa4sq7iRTV7XB75YoxA+OKNh8nqMnSNeOw3lJ3UYW4ulFKOvD+2LddRH1DD3CrP
18
+ 0AYx2MI56Pu/UgtLZkze5pMf6CqLn8MCvonuSjNTj01bDi+fq8xAKu85LwG3xVP3
19
+ kqMCppRwlf7wtkc8tkC6vjc+GhggwTda8z7quTtiVpy2r3JJUs4QXDTqzfKNC+la
20
+ dueojDyI3m6mmaGyoT3k3LpTc0Vjg3JeiYsyWxGvK6R0JWqZiv7uwlxtzvuK/v5h
21
+ 1iMhim2hB/6pFZalAddVfzvPCQiRek7nDKxPgvMDze2GIzvrpOapntu18nC1FYnO
22
+ kAC8vIStaFxmYzZYMB5h8C5q2xhJ3u6uGdyhpMuwvQOkhq4jdvI8SJ04eBhQH0DI
23
+ ta8OyiPQoqwegXXhBGU35/yZczB6QFswBaw7jTFcya1YKFDvXmLWOl0g6UOFnl66
24
+ QXnaC/xwRBh48VGALRPCgHuSf0Ag5LP+rv52s6Fbbs5B6syj059gNLO+DKkCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU/5KH1BIb
26
+ QxZC8hteME4fAEsveW8wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAUyL0Sh3Ld6sK0fldg057McECcaOIyB/nKJApz1er
29
- ET9qYthBvhpcaNNo19NFuf9W9UyaE6RI9Eb07DvGYyVP/b0yTrIKyzXzSAwFmrek
30
- 3VUVAhdqOIrIrf16Zpm4NoOGTOst+6sXZ9KQ52DPPwxdLbRCL7HkUFBMIVf2x2LV
31
- XflA8IOlSUPH2vmHJnE0yfs7Lzd5+xYpKeOzQSHo0p+SBDzIim3mOZ3ryf4IZQhv
32
- wh0fYGJ2iC/w3rPA78Awm6FNPlGCPjgPIz4mliMicRI/sZmFQvn8+2HYWEzDDOO8
33
- zYvUB7rkjDGXYqN1Ft3N6EOuNworOFjUlcPrDFCQHf4UgPjD6Z8WbYkI9c7LWtjc
34
- HJCyl/PVyS0Srbl8IPn7JsgUCS7S02KOnVzukQ7PTc1wBlAZ4mNb7N9EOp90GP9a
35
- YSREEphg3phQsU9LV4Dlc2Id4gB3W+//c1Ek6TFieKoVemKMkbtB1lgqsEpTCfwh
36
- oNUg84DlSmZ2z9LKagBVAlDy
28
+ BgkqhkiG9w0BAQsFAAOCAYEAXGQs4E7LZmG5OckxSpsJVhHaRYXp7ZghKTbn/K6X
29
+ fEtU8x781gphdo4wNOg8XA4MGAmZTBRi+7x9JE/NmxkC8KtqMSR89ynUtlhRldkF
30
+ +4uiJNtUSn9Ya3RyfUADF7gJ9OM4WpjXbpXBLtHe+GETjwl3EfDGQ6SNiUCRRaH+
31
+ DXthsMNrME6QFQ+n2IW7E2nn6ElLACWRUA1lqyRSC6doomKS3BIOmMmZ4aBrtIlB
32
+ 3zBEnu2eXHgd2OkfIiFO+DU2wVF2cs01V41lk575rciiWKGfybmDT3+CQu3kTUHz
33
+ PkegIP3JOdHPhLsfzgycgbjOaNSEX21SDhPwmLmSng0oNn56N9Po1qFKUG0+XxvA
34
+ qkFeIsspayVS94HDHTs68XQx4XsZJHfV/H9Sw331V1H7QJkXdbmEDVHXa5D+lI4g
35
+ m7hEq9GAsvYejQNMhcxlvi+e70d3QiEg+2SVsBHaUGURzv0LjycCOjOaUxQA5swC
36
+ JKGINad8xoEL7XIDoO6EnBcY
37
37
  -----END CERTIFICATE-----
38
- date: 2022-01-15 00:00:00.000000000 Z
38
+ date: 2022-02-10 00:00:00.000000000 Z
39
39
  dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: c32
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.0
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.3'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.3.0
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0.3'
40
60
  - !ruby/object:Gem::Dependency
41
61
  name: dxlite
42
62
  requirement: !ruby/object:Gem::Requirement
43
63
  requirements:
44
64
  - - "~>"
45
65
  - !ruby/object:Gem::Version
46
- version: '0.4'
66
+ version: '0.5'
47
67
  - - ">="
48
68
  - !ruby/object:Gem::Version
49
- version: 0.4.1
69
+ version: 0.5.1
50
70
  type: :runtime
51
71
  prerelease: false
52
72
  version_requirements: !ruby/object:Gem::Requirement
53
73
  requirements:
54
74
  - - "~>"
55
75
  - !ruby/object:Gem::Version
56
- version: '0.4'
76
+ version: '0.5'
57
77
  - - ">="
58
78
  - !ruby/object:Gem::Version
59
- version: 0.4.1
79
+ version: 0.5.1
60
80
  description:
61
81
  email: digital.robertson@gmail.com
62
82
  executables: []
@@ -76,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
96
  requirements:
77
97
  - - ">="
78
98
  - !ruby/object:Gem::Version
79
- version: 2.5.3
99
+ version: 3.0.2
80
100
  required_rubygems_version: !ruby/object:Gem::Requirement
81
101
  requirements:
82
102
  - - ">="
metadata.gz.sig CHANGED
Binary file