dir-to-xml 1.0.5 → 1.1.0

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/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