dir-to-xml 1.0.6 → 1.1.1
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 +221 -232
- data.tar.gz.sig +0 -0
- 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: 372af34f7da498e42ef32c51ee16e6c4f4270f70363d937f577390e1c690ba04
|
4
|
+
data.tar.gz: 49f55f26145a5b0d43120f2a06601641ef1e1dc39acf1be24e9993d78421b333
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff46b964f643d8d32d0f681596d1e8c4d193fe967775cfaf5502d52aa28ef6f906c5811d607ac9d9147ba1dae6374ba8b4704306ff1e679dead279e609d0f5a1
|
7
|
+
data.tar.gz: 65a8b57721dd15a038e9190e736355476d052d63f535c9386024bd5c01099870d8d01e0f80bc92ca7314e47fcf2d72f061af6c19a953463a3e174185ee9b0a00
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/dir-to-xml.rb
CHANGED
@@ -2,272 +2,261 @@
|
|
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
|
-
|
89
|
-
if @debug then
|
90
|
-
puts 'file: ' + file.inspect
|
91
|
-
puts 'd1: ' + Time.parse(@dx.last_modified).inspect
|
92
|
-
puts 'd2: ' + (file[:mtime]).inspect
|
93
|
-
end
|
94
|
-
|
95
|
-
return if Time.parse(@dx.last_modified) >= file[:mtime]
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
puts 'stage 2'
|
100
|
-
|
101
|
-
if @dx and @dx.respond_to? :last_modified then
|
102
|
-
|
103
|
-
if @dx.last_modified.length > 0 then
|
104
|
-
|
105
|
-
t = Time.parse(@dx.last_modified)
|
106
|
-
|
107
|
-
# find the most recently modified cur_files
|
108
|
-
recent = a2.select {|x| Time.parse(x[:mtime]) > t }.map {|x| x[:name]} \
|
109
|
-
- %w(dir.xml dir.json)
|
110
|
-
|
111
|
-
# is it a new file or recently modified?
|
112
|
-
new_files = recent - @dx.to_a.map {|x| x[:name]}
|
113
|
-
modified = recent - new_files
|
114
|
-
|
115
|
-
else
|
116
|
-
|
117
|
-
new_files = a2.select {|x| x[:type] == 'file'}.map {|x| x[:name]}
|
118
|
-
modified = []
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
@activity = {modified: modified, new: new_files}
|
123
|
-
|
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
|
124
45
|
end
|
125
|
-
|
126
46
|
|
127
|
-
|
47
|
+
@index, @recursive, @verbose, @debug = index, recursive, verbose, debug
|
128
48
|
|
129
|
-
|
130
|
-
puts '@dx: ' + @dx.inspect if @debug
|
131
|
-
puts '@dx.last_modified: ' + @dx.last_modified.inspect if @debug
|
132
|
-
|
133
|
-
|
134
|
-
@a = @dx.to_a
|
135
|
-
|
136
|
-
if recursive then
|
49
|
+
if File.basename(obj) == index then
|
137
50
|
|
138
|
-
|
51
|
+
#read the index file
|
52
|
+
@path = File.dirname(obj)
|
53
|
+
puts 'intialize() @path: ' + @path.inspect if @debug
|
139
54
|
|
140
|
-
|
141
|
-
|
142
|
-
|
55
|
+
@dx = read(obj)
|
56
|
+
|
57
|
+
else
|
58
|
+
@path = obj
|
59
|
+
puts 'intialize() @path: ' + @path.inspect if @debug
|
60
|
+
|
61
|
+
new_scan()
|
143
62
|
end
|
144
|
-
|
145
|
-
@object = @a
|
146
63
|
|
147
64
|
end
|
148
|
-
|
149
|
-
def
|
150
|
-
|
65
|
+
|
66
|
+
def activity()
|
67
|
+
{
|
68
|
+
new: @new_files,
|
69
|
+
deleted: @deleted_files,
|
70
|
+
modified: @latest_files
|
71
|
+
}
|
151
72
|
end
|
152
|
-
|
153
|
-
def filter_by(pattern=/.*/, type: nil, ext: nil)
|
154
|
-
|
155
|
-
@object = @a.select do |x|
|
156
|
-
|
157
|
-
pattern_match = x[:name] =~ pattern
|
158
|
-
|
159
|
-
type_match = type ? x[:type] == type.to_s : true
|
160
|
-
ext_match = ext ? x[:ext] == ext.to_s : true
|
161
|
-
|
162
|
-
pattern_match and type_match and ext_match
|
163
73
|
|
164
|
-
|
74
|
+
alias changes activity
|
165
75
|
|
166
|
-
|
76
|
+
def directories()
|
77
|
+
@dx.all.select {|x| x.type == 'directory'}.map(&:name)
|
167
78
|
end
|
168
|
-
|
79
|
+
|
80
|
+
def find_all_by_ext(s)
|
81
|
+
@dx.find_all_by_ext(s)
|
82
|
+
end
|
83
|
+
|
169
84
|
def find_by_filename(s)
|
170
|
-
@dx.
|
85
|
+
@dx.find_by_filename(s)
|
171
86
|
end
|
172
|
-
|
173
|
-
alias find_by_file find_by_filename
|
174
|
-
|
175
|
-
def last_modified(ext=nil)
|
176
87
|
|
177
|
-
|
178
|
-
|
88
|
+
def latest()
|
89
|
+
|
90
|
+
if @latest_file then
|
91
|
+
File.join(@latest_file[:path], @latest_file[:name])
|
179
92
|
end
|
180
|
-
|
181
|
-
a = sort_by :mtime
|
182
93
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
+
|
187
148
|
else
|
188
|
-
|
149
|
+
|
150
|
+
@dx = new_index(records)
|
151
|
+
find_latest(records)
|
152
|
+
|
189
153
|
end
|
154
|
+
|
155
|
+
t2 = Time.now - t
|
156
|
+
puts ("directory scanned in %.2f seconds" % t2).info if @verbose
|
157
|
+
|
190
158
|
end
|
191
|
-
|
192
|
-
def
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
dx
|
203
|
-
|
204
|
-
block_given? ? dtx.dx.all.map(&:name).each(&blk) : dtx
|
205
|
-
end
|
206
|
-
|
207
|
-
def sort_by(sym)
|
208
|
-
|
209
|
-
puts 'inside sort_by' if @debug
|
210
|
-
procs = [[:mtime, lambda{|obj| obj.sort_by{|x| x[:mtime]}}]]
|
211
|
-
proc1 = procs.assoc(sym).last
|
212
|
-
|
213
|
-
puts '@object: ' + @object.inspect if @debug
|
214
|
-
@object = @a = @dx.to_a if @object.nil?
|
215
|
-
proc1.call(@object)
|
216
|
-
|
217
|
-
end
|
218
|
-
|
219
|
-
def sort_by_last_modified()
|
220
|
-
sort_by :mtime
|
221
|
-
end
|
222
|
-
|
223
|
-
alias sort_by_lastmodified sort_by_last_modified
|
224
|
-
|
225
|
-
def to_a
|
226
|
-
@object || @a
|
227
|
-
end
|
228
|
-
|
229
|
-
def to_h()
|
230
|
-
self.to_a.inject({}){|r,x| r.merge(x[:name] => x)}
|
231
|
-
end
|
232
|
-
|
233
|
-
def to_xml(options=nil)
|
234
|
-
@dx.to_xml options
|
235
|
-
end
|
236
|
-
|
237
|
-
def to_dynarex
|
238
|
-
@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
|
+
|
239
172
|
end
|
240
|
-
|
241
|
-
alias to_dx to_dynarex
|
242
|
-
|
173
|
+
|
243
174
|
private
|
244
|
-
|
245
|
-
def dxify(a)
|
246
|
-
|
247
|
-
@dx.last_modified = Time.now.to_s if @dx.respond_to? :last_modified
|
248
|
-
@dx.import a
|
249
|
-
@dx.save File.join(@path, @index)
|
250
175
|
|
251
|
-
|
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
|
+
@latest_file[:path] = @path
|
183
|
+
puts ':@latest_file: ' + @latest_file.inspect if @debug
|
184
|
+
|
185
|
+
dir_list = directories()
|
186
|
+
|
187
|
+
if dir_list.any? then
|
188
|
+
|
189
|
+
dir_latest = dir_list.map do |dir|
|
190
|
+
|
191
|
+
puts 'dir: ' + dir.inspect if @debug
|
192
|
+
dtx2 = DirToXML.new(File.join(@path, dir), index: @index,
|
193
|
+
recursive: true, verbose: false, debug: @debug)
|
194
|
+
[dir, dtx2.latest_file]
|
195
|
+
|
196
|
+
end.reject {|_,latest| latest.nil? }.sort_by {|_, x| x[:mtime]}.last
|
197
|
+
|
198
|
+
puts 'dir_latest: ' + dir_latest.inspect if @debug
|
199
|
+
|
200
|
+
@latest_file = if dir_latest and \
|
201
|
+
((dir_latest.last[:mtime] > latest_file[:mtime]) \
|
202
|
+
or latest_file.nil? \
|
203
|
+
or latest_file[:type] == 'directory') then
|
252
204
|
|
253
|
-
|
205
|
+
dir_latest.last[:path] = File.join(@path, dir_latest.first)
|
206
|
+
dir_latest.last
|
254
207
|
|
255
|
-
|
208
|
+
elsif latest_file and latest_file[:type] == 'file'
|
256
209
|
|
257
|
-
|
258
|
-
|
259
|
-
#puts 'prev_files: ' + prev_files.inspect
|
260
|
-
#puts 'cur_files: ' + cur_files.inspect
|
261
|
-
|
262
|
-
cur_files.each do |x|
|
210
|
+
latest_file[:path] = @path
|
211
|
+
latest_file
|
263
212
|
|
264
|
-
|
265
|
-
|
266
|
-
|
213
|
+
end
|
214
|
+
|
215
|
+
else
|
216
|
+
return
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
def getfile_info(filename)
|
222
|
+
|
223
|
+
x = File.join(@path, filename)
|
224
|
+
puts 'x: ' + x.inspect if @debug
|
225
|
+
|
226
|
+
begin
|
227
|
+
{
|
228
|
+
name: filename,
|
229
|
+
type: File::ftype(x),
|
230
|
+
ext: File.extname(x),
|
231
|
+
mtime: File::mtime(x),
|
232
|
+
description: ''
|
233
|
+
}
|
267
234
|
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def new_index(records)
|
238
|
+
|
239
|
+
dx = DxLite.new('directory[title, file_path, ' +
|
240
|
+
'last_modified, description]/file(name, ' +
|
241
|
+
'type, ext, mtime, description)')
|
242
|
+
|
243
|
+
puts 'before title' if @debug
|
244
|
+
dx.title = 'Index of ' + @path
|
245
|
+
dx.file_path = @path
|
246
|
+
dx.last_modified = Time.now
|
247
|
+
dx.import records.reverse
|
248
|
+
dx.save File.join(@path, @index)
|
249
|
+
|
250
|
+
return dx
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
def scan_dir(path)
|
255
|
+
|
256
|
+
a = Dir.glob(File.join(path, "*")).map {|x| File.basename(x) }
|
257
|
+
a.delete @index
|
258
|
+
a.map {|filename| getfile_info(filename) }
|
268
259
|
|
269
|
-
dxify(cur_files)
|
270
|
-
|
271
260
|
end
|
272
|
-
|
261
|
+
|
273
262
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
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.
|
4
|
+
version: 1.1.1
|
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
|