dir-to-xml 1.0.6 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|