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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/dir-to-xml.rb +221 -232
  4. data.tar.gz.sig +0 -0
  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: a24fbbc39d5a5d420a7b67713292409a71aae25b72484c9af7f261af3b1f952f
4
- data.tar.gz: 8e33e3dd2579ee7ef0c3c56144b2cc2beecb68784e20c60b73ea1f8bb1adc9fb
3
+ metadata.gz: 372af34f7da498e42ef32c51ee16e6c4f4270f70363d937f577390e1c690ba04
4
+ data.tar.gz: 49f55f26145a5b0d43120f2a06601641ef1e1dc39acf1be24e9993d78421b333
5
5
  SHA512:
6
- metadata.gz: c45dfed7498b83d0918456d4deb47570cec2f6ab63e27baf0cc26f815927a161a783d3278f6ad5bb421f7d199f9332ea42fd3e9afa10c8ba1c4bd17838785ca6
7
- data.tar.gz: 0dc2bdf0cc9483abf4f0ec8fc4f33c48a2d64e9e30cc1b281383c1bb3f9586b7aa4bd5db3459fed4a205e1b9c05954bdaa6629c416f78e357fbe543e4261a154
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, :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
-
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
- command = File.exists?(File.join(path, index)) ? :refresh : :dxify
47
+ @index, @recursive, @verbose, @debug = index, recursive, verbose, debug
128
48
 
129
- self.method(command).call a2
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
- 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
139
54
 
140
- path2 = File.join(path, x[:name])
141
- DirToXML.new(path2, recursive: true)
142
- end
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 filter(&blk)
150
- @dx.filter &blk
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
- end
74
+ alias changes activity
165
75
 
166
- self
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.all.find {|item| item.name == s}
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
- if ext and ext != '*' then
178
- @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])
179
92
  end
180
-
181
- a = sort_by :mtime
182
93
 
183
- lm = a[-1]
184
-
185
- if @recursive and lm[:type] == 'directory' then
186
- 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
+
187
148
  else
188
- lm
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 save()
193
- @dx.save File.join(@path, @index)
194
- end
195
-
196
- def select_by_ext(ext, &blk)
197
-
198
- @object = ext != '*' ? @a.select{|x| x[:ext][/#{ext}$/]} : @a
199
- return if @object.empty?
200
-
201
- dx = DxLite.new
202
- dx.import @object
203
- dtx = DirToXML.new(dx)
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
- 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
+ @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
- def refresh(cur_files)
205
+ dir_latest.last[:path] = File.join(@path, dir_latest.first)
206
+ dir_latest.last
254
207
 
255
- puts 'inside refresh' if @debug
208
+ elsif latest_file and latest_file[:type] == 'file'
256
209
 
257
- prev_files = @dx.to_a
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
- file = prev_files.find {|item| item[:name] == x[:name] }
265
- #puts 'found : ' + file.inspect if @debug
266
- x[:description] = file[:description] if file and file[:description]
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.0.6
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
- 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