dir-to-xml 1.0.5 → 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 +220 -226
  4. data.tar.gz.sig +2 -2
  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: 001e83927dbcc6a8bbde99e4eca19b904a5344b02f5ab8ad2b1fc63a7e55a24b
4
- data.tar.gz: 67404d3cec0b93c5c2a4fbea8ff01e3e18ea24df2176c6ac4dcaaf6495a97c69
3
+ metadata.gz: 6fd07741c205b9a10af1d80c5f9a298b36337acbe4fa6e3bfc15e53164eee0b8
4
+ data.tar.gz: 51f7acd3e7bc86fed507088781e576478ef846828ac050d35fbd30b0111aa738
5
5
  SHA512:
6
- metadata.gz: 64ed16618d5d1bdd857b1cf1739b59f9964e90ce315437cc0e5dbe995e87b258dcfbde302cdd5f47233f95b8b55324801af65884b6aef1fd6b5e72b6a62295ed
7
- data.tar.gz: d0ab3ede67051850dada5596979063397a875f1a25655acd5242f0ffe5899fefe30a71605c26fe437bfb451dc49c7a3bff518b006392834d3885ac72bd7b62e3
6
+ metadata.gz: a226d2e9028066bca47aee5b9dee85ef21531d6d947fb725f8ab09295bd41cf889378637c811c6eb3a6db8889339bc8f9fedbaa0316422f437515bc1ecb02e0a
7
+ data.tar.gz: 596a4e62fa36e4930151b7d2ee2c17b11d45e1c0606fa2e4783f24c80ff824940144d66c63004e4750de2cf88702c7be47553a8729c19496f2e6713198d48849
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/dir-to-xml.rb CHANGED
@@ -2,266 +2,260 @@
2
2
 
3
3
  # file: dir-to-xml.rb
4
4
 
5
+ require 'c32'
5
6
  require 'dxlite'
6
7
 
7
8
 
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)
30
+
31
+
8
32
  class DirToXML
33
+ using ColouredText
9
34
 
10
- attr_reader :dx, :activity
11
-
12
- def initialize(x= '.', recursive: false, index: 'dir.xml', debug: false)
13
-
14
- super()
15
-
16
- @debug = debug
17
-
18
- @dx = nil
19
- @activity = {new: [], modified: []}
20
-
21
- if x.is_a? DxLite then
22
-
23
- @dx = x
24
- @a = @dx.to_a
25
- @object = @a
26
-
27
- return self
28
- end
29
-
30
- path = x
31
-
32
- @path, @index, @recursive = path, index, recursive
33
-
34
- raise "Directory not found." unless File.exists? path
35
- filepath = File.join(path, index)
36
-
37
-
38
- if File.exists? filepath then
39
-
40
- @dx = DxLite.new(File.join(@path, @index), debug: @debug)
41
-
42
- else
43
-
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
-
53
- end
54
-
55
- puts 'before Dir.glob' if @debug
56
-
57
- a = Dir.glob(File.join(path, "*")).map{|x| File.basename(x) }.sort
58
-
59
- a.delete index
60
-
61
- a2 = a.inject([]) do |r, filename|
62
-
63
- x = File.join(path, filename)
64
-
65
- begin
66
- r << {
67
- name: filename,
68
- type: File::ftype(x),
69
- ext: File.extname(x),
70
- ctime: File::ctime(x),
71
- mtime: File::mtime(x),
72
- atime: File::atime(x)
73
- }
74
- rescue
75
- r
76
- end
35
+ attr_reader :new_files, :deleted_files, :dx, :latest_files, :latest_file
77
36
 
78
- end
79
-
80
- # has the directory been modified since last time?
81
- #
82
- if @dx and @dx.respond_to? :last_modified and \
83
- @dx.last_modified.length > 0 then
84
-
85
- puts 'nothing to do' if @debug
86
-
87
- file = a2.max_by {|x| x[:mtime]}
88
- puts 'file: ' + file.inspect if @debug
89
- return if Time.parse(@dx.last_modified) >= (file[:mtime])
90
-
91
- end
92
-
93
-
94
-
95
- if @dx and @dx.respond_to? :last_modified then
96
-
97
- if @dx.last_modified.length > 0 then
98
-
99
- t = Time.parse(@dx.last_modified)
100
-
101
- # find the most recently modified cur_files
102
- recent = a2.select {|x| x[:mtime] > t }.map {|x| x[:name]} \
103
- - %w(dir.xml dir.json)
104
-
105
- # is it a new file or recently modified?
106
- new_files = recent - @dx.to_a.map {|x| x[:name]}
107
- modified = recent - new_files
108
-
109
- else
110
-
111
- new_files = a2.select {|x| x[:type] == 'file'}.map {|x| x[:name]}
112
- modified = []
113
-
114
- end
115
-
116
- @activity = {modified: modified, new: new_files}
117
-
37
+ def initialize(obj= '.', index: 'dir.json', recursive: false,
38
+ verbose: true, debug: false)
39
+
40
+ if verbose then
41
+ puts
42
+ puts 'DirToXML at your service!'.highlight
43
+ puts
44
+ puts
118
45
  end
119
-
120
46
 
121
- command = File.exists?(File.join(path, index)) ? :refresh : :dxify
47
+ @index, @recursive, @verbose, @debug = index, recursive, verbose, debug
122
48
 
123
- self.method(command).call a2
124
- puts '@dx: ' + @dx.inspect if @debug
125
- puts '@dx.last_modified: ' + @dx.last_modified.inspect if @debug
126
-
127
-
128
- @a = @dx.to_a
129
-
130
- if recursive then
49
+ if File.basename(obj) == index then
131
50
 
132
- self.filter_by(type: :directory).to_a.each do |x|
51
+ #read the index file
52
+ @path = File.dirname(obj)
53
+ puts 'intialize() @path: ' + @path.inspect if @debug
133
54
 
134
- path2 = File.join(path, x[:name])
135
- DirToXML.new(path2, recursive: true)
136
- end
55
+ @dx = read(obj)
56
+
57
+ else
58
+ @path = obj
59
+ puts 'intialize() @path: ' + @path.inspect if @debug
60
+
61
+ new_scan()
137
62
  end
138
-
139
- @object = @a
140
63
 
141
64
  end
142
-
143
- def filter(&blk)
144
- @dx.filter &blk
65
+
66
+ def activity()
67
+ {
68
+ new: @new_files,
69
+ deleted: @deleted_files,
70
+ modified: @latest_files
71
+ }
145
72
  end
146
-
147
- def filter_by(pattern=/.*/, type: nil, ext: nil)
148
-
149
- @object = @a.select do |x|
150
-
151
- pattern_match = x[:name] =~ pattern
152
-
153
- type_match = type ? x[:type] == type.to_s : true
154
- ext_match = ext ? x[:ext] == ext.to_s : true
155
-
156
- pattern_match and type_match and ext_match
157
73
 
158
- end
74
+ alias changes activity
75
+
76
+ def directories()
77
+ @dx.all.select {|x| x.type == 'directory'}.map(&:name)
78
+ end
159
79
 
160
- self
80
+ def find_all_by_ext(s)
81
+ @dx.find_all_by_ext(s)
161
82
  end
162
-
83
+
163
84
  def find_by_filename(s)
164
- @dx.all.find {|item| item.name == s}
85
+ @dx.find_by_filename(s)
165
86
  end
166
-
167
- alias find_by_file find_by_filename
168
-
169
- def last_modified(ext=nil)
170
87
 
171
- if ext and ext != '*' then
172
- @object = @a.select{|x| x[:ext][/#{ext}/] or x[:type] == 'directory'}
88
+ def latest()
89
+
90
+ if @latest_file then
91
+ File.join(@latest_file[:path], @latest_file[:name])
173
92
  end
174
-
175
- a = sort_by :mtime
176
93
 
177
- lm = a[-1]
178
-
179
- if @recursive and lm[:type] == 'directory' then
180
- return [lm, DirToXML.new(File.join(@path, lm[:name])).last_modified]
94
+ end
95
+
96
+ def new_scan()
97
+
98
+ t = Time.now
99
+ records = scan_dir @path
100
+ puts 'new_scan() records: ' + records.inspect if @debug
101
+
102
+ a = records.map {|x| x[:name]}
103
+
104
+ if File.exists? File.join(@path, @index) then
105
+
106
+ @dx = read()
107
+
108
+ old_records = @dx.to_a
109
+ a2 = old_records.map {|x| x[:name]}
110
+
111
+ # delete any old files
112
+ #
113
+ @deleted_files = a2 - a
114
+
115
+ if @deleted_files.any? then
116
+
117
+ @deleted_files.each do |filename|
118
+ record = @dx.find_by_name filename
119
+ record.delete if record
120
+ end
121
+
122
+ end
123
+
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
+
129
+ select_records = records.select do |file|
130
+ file[:mtime] > dtx_last_modified
131
+ end
132
+
133
+ find_latest(select_records)
134
+
135
+ # Add any new files
136
+ #
137
+ @new_files = a - a2
138
+
139
+ if @new_files.any? then
140
+
141
+ @dx.last_modified = Time.now.to_s
142
+ @dx.import @new_files.map {|filename| getfile_info(filename) }
143
+
144
+ end
145
+
146
+ @dx.last_modified = Time.now.to_s if @deleted_files.any?
147
+
181
148
  else
182
- lm
149
+
150
+ @dx = new_index(records)
151
+ find_latest(records)
152
+
183
153
  end
154
+
155
+ t2 = Time.now - t
156
+ puts ("directory scanned in %.2f seconds" % t2).info if @verbose
157
+
184
158
  end
185
-
186
- def save()
187
- @dx.save File.join(@path, @index)
188
- end
189
-
190
- def select_by_ext(ext, &blk)
191
-
192
- @object = ext != '*' ? @a.select{|x| x[:ext][/#{ext}$/]} : @a
193
- return if @object.empty?
194
-
195
- dx = DxLite.new
196
- dx.import @object
197
- dtx = DirToXML.new(dx)
198
- block_given? ? dtx.dx.all.map(&:name).each(&blk) : dtx
199
- end
200
-
201
- def sort_by(sym)
202
-
203
- puts 'inside sort_by' if @debug
204
- procs = [[:mtime, lambda{|obj| obj.sort_by{|x| x[:mtime]}}]]
205
- proc1 = procs.assoc(sym).last
206
-
207
- puts '@object: ' + @object.inspect if @debug
208
- @object = @a = @dx.to_a if @object.nil?
209
- proc1.call(@object)
210
-
211
- end
212
-
213
- def sort_by_last_modified()
214
- sort_by :mtime
215
- end
216
-
217
- alias sort_by_lastmodified sort_by_last_modified
218
-
219
- def to_a
220
- @object || @a
221
- end
222
-
223
- def to_h()
224
- self.to_a.inject({}){|r,x| r.merge(x[:name] => x)}
225
- end
226
-
227
- def to_xml(options=nil)
228
- @dx.to_xml options
229
- end
230
-
231
- def to_dynarex
232
- @dx.clone
159
+
160
+ def read(index=@index)
161
+
162
+ t = Time.now
163
+ puts 'read path: ' + File.join(@path, index).inspect if @Debug
164
+
165
+ dx = DxLite.new(File.join(@path, index), autosave: true)
166
+
167
+ t2 = Time.now - t
168
+ puts ("%s read in %.2f seconds" % [@index, t2]).info if @verbose
169
+
170
+ return dx
171
+
233
172
  end
234
-
235
- alias to_dx to_dynarex
236
-
173
+
237
174
  private
238
-
239
- def dxify(a)
240
-
241
- @dx.last_modified = Time.now.to_s if @dx.respond_to :last_modified
242
- @dx.import a
243
- @dx.save File.join(@path, @index)
244
175
 
245
- end
176
+ def find_latest(files)
177
+
178
+ @latest_files = files.sort_by {|file| file[:mtime]}
179
+ puts '@latest_files: ' + @latest_files.inspect if @debug
180
+
181
+ @latest_file = @latest_files[-1]
182
+ puts ':@latest_file: ' + @latest_file.inspect if @debug
183
+
184
+ dir_list = directories()
185
+
186
+ if dir_list.any? then
187
+
188
+ dir_latest = dir_list.map do |dir|
189
+
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]
194
+
195
+ end.reject {|_,latest| latest.nil? }.sort_by {|_, x| x[:mtime]}.last
196
+
197
+ puts 'dir_latest: ' + dir_latest.inspect if @debug
198
+
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
246
203
 
247
- def refresh(cur_files)
204
+ dir_latest.last[:path] = File.join(@path, dir_latest.first)
205
+ dir_latest.last
248
206
 
249
- puts 'inside refresh' if @debug
207
+ elsif latest_file and latest_file[:type] == 'file'
250
208
 
251
- prev_files = @dx.to_a
252
-
253
- #puts 'prev_files: ' + prev_files.inspect
254
- #puts 'cur_files: ' + cur_files.inspect
255
-
256
- cur_files.each do |x|
209
+ latest_file[:path] = @path
210
+ latest_file
257
211
 
258
- file = prev_files.find {|item| item[:name] == x[:name] }
259
- #puts 'found : ' + file.inspect if @debug
260
- x[:description] = file[:description] if file and file[:description]
212
+ end
213
+
214
+ else
215
+ return
216
+ end
217
+
218
+ end
219
+
220
+ def getfile_info(filename)
221
+
222
+ x = File.join(@path, filename)
223
+ puts 'x: ' + x.inspect if @debug
224
+
225
+ begin
226
+ {
227
+ name: filename,
228
+ type: File::ftype(x),
229
+ ext: File.extname(x),
230
+ mtime: File::mtime(x),
231
+ description: ''
232
+ }
261
233
  end
234
+ end
235
+
236
+ def new_index(records)
237
+
238
+ dx = DxLite.new('directory[title, file_path, ' +
239
+ 'last_modified, description]/file(name, ' +
240
+ 'type, ext, mtime, description)')
241
+
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)
248
+
249
+ return dx
250
+
251
+ end
252
+
253
+ def scan_dir(path)
254
+
255
+ a = Dir.glob(File.join(path, "*")).map {|x| File.basename(x) }
256
+ a.delete @index
257
+ a.map {|filename| getfile_info(filename) }
262
258
 
263
- dxify(cur_files)
264
-
265
259
  end
266
-
260
+
267
261
  end
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- D����")xefc=cw��n�� xf��bE{gcϽ�}�X�FI6!1D_+�)�y0��מSL��E_�qԺ�?�CIQ�Ǻ&x&뼘�C���ſ�m/�0VX{LDt�.��',�6Wk����<��]��ր@bߢWbhh,+���.1dD Zj��ī0Og�|����xz���& �ׂβ��65i=����nRDy+���3b-��#��F{CK������sz�z��"� J6�D��0�$a`����
2
- ����]!�{r�,�\8Ia�.���+���b�S0���D;�;+�v����K�̸��]���>��n�:P@-���~x��o^I�3b�`�B�x9����6�����_Bq��Ik{:u�^
1
+ Ha>ݏA��6������&�z���ħ�|J����|_��H0z����C���v��N�#��1�״$���^&KWe���*!�/�Ւe@:e;�c����R=�?&'�'O[��N���Qp��#���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.5
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: 2021-02-01 00:00:00.000000000 Z
38
+ date: 2022-02-10 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
- name: dxlite
41
+ name: c32
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.0
44
47
  - - "~>"
45
48
  - !ruby/object:Gem::Version
46
49
  version: '0.3'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
47
54
  - - ">="
48
55
  - !ruby/object:Gem::Version
49
- version: 0.3.2
56
+ version: 0.3.0
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0.3'
60
+ - !ruby/object:Gem::Dependency
61
+ name: dxlite
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.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.3'
76
+ version: '0.5'
57
77
  - - ">="
58
78
  - !ruby/object:Gem::Version
59
- version: 0.3.2
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