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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/dir-to-xml.rb +220 -226
- data.tar.gz.sig +2 -2
- metadata +49 -29
- 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: 6fd07741c205b9a10af1d80c5f9a298b36337acbe4fa6e3bfc15e53164eee0b8
|
4
|
+
data.tar.gz: 51f7acd3e7bc86fed507088781e576478ef846828ac050d35fbd30b0111aa738
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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, :
|
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
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
puts
|
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
|
-
|
47
|
+
@index, @recursive, @verbose, @debug = index, recursive, verbose, debug
|
122
48
|
|
123
|
-
|
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
|
-
|
51
|
+
#read the index file
|
52
|
+
@path = File.dirname(obj)
|
53
|
+
puts 'intialize() @path: ' + @path.inspect if @debug
|
133
54
|
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
144
|
-
|
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
|
-
|
74
|
+
alias changes activity
|
75
|
+
|
76
|
+
def directories()
|
77
|
+
@dx.all.select {|x| x.type == 'directory'}.map(&:name)
|
78
|
+
end
|
159
79
|
|
160
|
-
|
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.
|
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
|
-
|
172
|
-
|
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
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
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
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
dx
|
197
|
-
|
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
|
-
|
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
|
-
|
204
|
+
dir_latest.last[:path] = File.join(@path, dir_latest.first)
|
205
|
+
dir_latest.last
|
248
206
|
|
249
|
-
|
207
|
+
elsif latest_file and latest_file[:type] == 'file'
|
250
208
|
|
251
|
-
|
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
|
-
|
259
|
-
|
260
|
-
|
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
|
-
|
2
|
-
|
1
|
+
Ha>ݏA��6������&�z���ħ�|J����|_��H�0z����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
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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:
|
38
|
+
date: 2022-02-10 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
|
-
name:
|
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.
|
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.
|
76
|
+
version: '0.5'
|
57
77
|
- - ">="
|
58
78
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
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:
|
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
|