EXtremeZip 2022.1.27 → 2022.2.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28ef36288016b807b01a2a9a8b4e5b8c53c28c89ed0686a53b2a5d03c4f3b5b6
4
- data.tar.gz: 45078a0ebfeae22cd0c3d1e1d211702a88f111491842bbc92de3410a925d38ce
3
+ metadata.gz: d6f7accde07ae32cb5a0b760673749535b3cbbcaf33df4688ca303b427080bff
4
+ data.tar.gz: 808669d1eb5fa58e9f6d89b5e8a01c0bafebf0f49475f215aee8cbb0f2b756e3
5
5
  SHA512:
6
- metadata.gz: b7d21377242380c6610b40d7ddca1d3bc7a3a3b1140e879317059a4e2993a8a8a0db38a3e6b632c1ac6e337fa55064cedde5b98f04445a8687bb50d8c50cf977
7
- data.tar.gz: de35bd17671ba87ae37c97ab053d1bbf578622f4fa380899218e8a71c74108f8d55961c2227180f5e3126c9075b5dc3b722504d2cfba24192a51672d1bfe9414
6
+ metadata.gz: 634db332f4d8656a233ab935ab82c83ef1dc934861534da11c47dfbf6e93e98a6432e7542a4951fdb3d9e5b294c1fb397185d471d07e2fb8e026f9922eacd8f2
7
+ data.tar.gz: 35eb1b03750c86e87f71fb997f529cd79ef407d42d3ced0d34ecd831fe503bb74acfd37101c4bacc02ee809e49e0285efa5844c2aabb22e19f2c010efe2d52df
@@ -1,20 +1,47 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # require 'pathname'
4
- # require File.dirname(__FILE__)+'/filemessage.pb.rb'
5
3
  require 'victoriafresh'
6
4
  require 'cbor'
7
5
  require 'lzma'
8
6
  require 'get_process_mem'
9
7
 
10
8
  def checkMemoryUsage(lineNumber)
11
- mem = GetProcessMem.new
9
+ mem = GetProcessMem.new
12
10
 
13
- puts("#{lineNumber} , Memory: #{mem.mb}"); # Debug
11
+ puts("#{lineNumber} , Memory: #{mem.mb}"); # Debug
14
12
  end # def checkMemoryUsage
15
13
 
16
- # 根据版本号,提取VFS数据内容
17
- def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
14
+
15
+
16
+
17
+ class ExtremeUnZip
18
+ # 根据偏移值来读取压缩块数据列表。
19
+ def readVfsDataList(wholeCbor)
20
+ compressedVfsDataList = [] # 获取压缩后的数据块列表
21
+ startIndix=wholeCbor['vfsDataListStart'] # 初始起始位置。
22
+
23
+ puts "whole length: #{@wholeFileContent.length}, list conent: #{wholeCbor['vfsDataList']}" # Debug
24
+
25
+
26
+ wholeCbor['vfsDataList'].each do |currentBlockInfo| # 一个个块地处理
27
+ length=currentBlockInfo['length'] # 获取长度。
28
+
29
+ currentBlock=@wholeFileContent[startIndix, length] # 读取内容
30
+
31
+ puts "start index: #{startIndix}, length: #{length}, content length: #{currentBlock.length}" # Debug
32
+
33
+ compressedVfsDataList << currentBlock # 加入当前块
34
+
35
+ startIndix+=length # 位移。
36
+ end
37
+
38
+ compressedVfsDataList # 返回 内容
39
+ end
40
+
41
+ # 根据版本号,提取VFS数据内容
42
+
43
+
44
+ def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
18
45
  victoriaFreshData = '' # 解压后的数据块整体
19
46
  dataFileName = 'victoriafreshdata.w' # 数据文件名
20
47
  dataFile = {} # 数据文件对象
@@ -31,6 +58,10 @@ def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
31
58
  dataFile.close # 关闭文件
32
59
  elsif (fileVersion >= 30) # 30以上版本
33
60
  compressedVfsDataList = wholeCbor['vfsDataList'] # 获取压缩后的数据块列表
61
+
62
+ if (fileVersion>=251) # 251 以上版本。要按照偏移值来读取压缩数据块列表。
63
+ compressedVfsDataList=readVfsDataList(wholeCbor) # 根据偏移值来读取压缩块数据列表。
64
+ end # if (fileVersion>=251) # 251 以上版本
34
65
 
35
66
  puts("data block amont: #{compressedVfsDataList.length}") # Debug
36
67
 
@@ -44,18 +75,12 @@ def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
44
75
 
45
76
  begin # 解压
46
77
  currentRawData = LZMA.decompress(currentCompressed) # 解压这一块
47
-
48
78
 
49
79
  dataFile.syswrite(currentRawData) # 写入内容
50
80
  rescue RuntimeError => e # 解压失败
51
81
  puts "Warning: the exz file may be incomplete." # 报告错误。文件可能不完整。
52
82
  end # begin # 解压
53
83
 
54
- # victoriaFreshData=victoriaFreshData+currentRawData #追加
55
- # victoriaFreshData << currentRawData #追加
56
-
57
- #puts("byte size: #{victoriaFreshData.bytesize}") # debug.
58
-
59
84
  dataBlockCounter += 1 # count
60
85
  end # compressedVfsDataList.each do |currentCompressed|
61
86
 
@@ -65,88 +90,46 @@ def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
65
90
  dataFileName # 返回解压后的数据块整体
66
91
  end # def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
67
92
 
68
- def extractVfsDataWithVersion(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
69
- victoriaFreshData = '' # 解压后的数据块整体
70
-
71
- if (fileVersion == 14) # 14版本
72
- compressedVfsData = wholeCbor['vfsData'] # 获取压缩后的数据内容
73
-
74
- victoriaFreshData = LZMA.decompress(compressedVfsData) # 解压缩数据内容
75
- elsif (fileVersion >= 30) # 30以上版本
76
- compressedVfsDataList = wholeCbor['vfsDataList'] # 获取压缩后的数据块列表
77
-
78
- puts("data block amont: #{compressedVfsDataList.length}") # Debug
79
-
80
- dataBlockCounter = 0 # Data block counter
81
-
82
- compressedVfsDataList.each do |currentCompressed| # 一块块地解压
83
- puts("data block counter: #{dataBlockCounter}") # Debug
84
- checkMemoryUsage(34)
85
-
86
- currentRawData = LZMA.decompress(currentCompressed) # 解压这一块
87
-
88
- # victoriaFreshData=victoriaFreshData+currentRawData #追加
89
- victoriaFreshData << currentRawData # 追加
90
-
91
- puts("byte size: #{victoriaFreshData.bytesize}") # debug.
92
-
93
- dataBlockCounter += 1 # count
94
- end # compressedVfsDataList.each do |currentCompressed|
95
- end # if (fileVersion==14) #14版本
96
-
97
- victoriaFreshData # 返回解压后的数据块整体
98
- end # extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
99
-
100
- class ExtremeUnZip
101
- # 解压
93
+ # 解压
102
94
  def exuz(rootPath)
103
- result = true # 解压结果
104
-
105
- wholeFileContent = File.read(rootPath) # 最终文件内容
95
+ result = true # 解压结果
106
96
 
107
- checkMemoryUsage(60)
97
+ currentBlockFile = File.new(rootPath, 'rb') # 打开文件
108
98
 
109
- puts wholeFileContent.class # debug
99
+ @wholeFileContent = currentBlockFile.read # 读取全部内容
110
100
 
111
- wholeCborByteArray = wholeFileContent[4..-1] # 从第5个到末尾
101
+ currentBlockFile.close # 关闭文件
112
102
 
113
- # puts wholeCborByteArray #Debug.
103
+ checkMemoryUsage(60)
114
104
 
115
- #/usr/local/share/gems/gems/EXtremeZip-2021.7.8/lib/extremeunzip.zzaqsu.rb:110:in `decode': end of buffer reached (EOFError)
105
+ wholeCborByteArray = @wholeFileContent[4..-1] # 从第5个到末尾
116
106
 
117
107
  begin # 可能出错。
118
- options = {:tolerant => true}
108
+ options = {:tolerant => true}
119
109
 
120
- wholeCbor = CBOR.decode(wholeCborByteArray, options) # 解码
110
+ wholeCbor = CBOR.decode(wholeCborByteArray, options) # 解码
121
111
 
122
- fileVersion = wholeCbor['version'] # 获取版本号
112
+ fileVersion = wholeCbor['version'] # 获取版本号
123
113
 
124
114
  if (fileVersion < 14) # 版本号过小
125
- checkMemoryUsage(85)
126
- puts 'file version too old' # 报告错误
115
+ checkMemoryUsage(85)
116
+ puts 'file version too old' # 报告错误
127
117
  else # 版本号够大
128
- compressedVfsMenu = wholeCbor['vfsMenu'] # 获取压缩后的目录内容
118
+ compressedVfsMenu = wholeCbor['vfsMenu'] # 获取压缩后的目录内容
129
119
 
130
- checkMemoryUsage(90)
131
- replyByteArray = LZMA.decompress(compressedVfsMenu) # 解码目录VFS字节数组内容
120
+ checkMemoryUsage(90)
121
+ replyByteArray = LZMA.decompress(compressedVfsMenu) # 解码目录VFS字节数组内容
132
122
 
133
- # puts replyByteArray #Debug
134
-
135
- checkMemoryUsage(95)
136
- # victoriaFreshData=extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
137
- victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
138
-
139
- # puts victoriaFreshData #Debug
140
-
141
- checkMemoryUsage(100)
142
- $clipDownloader = VictoriaFresh.new # 创建下载器。
143
-
144
- $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) # 释放各个文件
123
+ checkMemoryUsage(95)
124
+
125
+ victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
145
126
 
146
- fileToRemove = File.new(victoriaFreshDataFile) # 要删除的文件
127
+ checkMemoryUsage(100)
128
+ $clipDownloader = VictoriaFresh.new # 创建下载器。
147
129
 
148
- #File.delete(fileToRemove) # 删除文件
130
+ $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) # 释放各个文件
149
131
 
132
+ fileToRemove = File.new(victoriaFreshDataFile) # 要删除的文件
150
133
  end # if (fileVersion<14) #版本号过小
151
134
 
152
135
  result =true # 解压成功
@@ -8,6 +8,7 @@ require 'etc' # cpu amount
8
8
  require 'cod'
9
9
  require 'uuid'
10
10
  require 'get_process_mem'
11
+ require 'pathname'
11
12
 
12
13
  def checkMemoryUsage(lineNumber)
13
14
  mem = GetProcessMem.new
@@ -22,6 +23,7 @@ class ExtremeZip
22
23
  @filePartCounter = 0 # 文件分块计数器
23
24
  @responsePipeList = [] # 任务回复管道列表
24
25
  @processIdList = [] # 子进程编号列表。
26
+ @processTimestamp = Time.new.to_i # 记录进程启动的时间戳。
25
27
 
26
28
  @maxSubProcessAmount = Etc.nprocessors # 获取最大的子进程个数
27
29
 
@@ -48,34 +50,161 @@ class ExtremeZip
48
50
 
49
51
  # 加入基本文件信息
50
52
  def addBasicFileInformation
51
- @wholeCbor['version'] = 233 # 文件格式版本号
53
+ @wholeCbor['version'] = 251 # 文件格式版本号
52
54
 
53
55
  uuid = UUID.new # 获取生成器
54
56
  @wholeCbor['uuid'] = uuid.generate # 指定本个压缩包的唯一编号
57
+
58
+ @wholeCbor['website']='https://rubygems.org/gems/EXtremeZip' # 加入网站地址
59
+
60
+ @wholeCbor['vfsDataListStart']=198910 # 压缩 VFS 数据列表起始位置。
55
61
  end # addBasicFileInformation # 加入基本文件信息
62
+
63
+ def writeStamp(rootPath) # 更新时间戳文件
64
+ directoryPathName=Pathname.new(rootPath) #构造路径名字对象。
65
+ datastore= "#{directoryPathName.expand_path}/.exzstamp" # 配置文件路径
66
+ puts "writing stamp file: #{datastore}" # Debug
67
+
68
+ #stamp = wholeCbor['timestamp'] # 获取时间戳
69
+ stampCbor={} # 时间戳对象。
70
+ stampCbor['timestamp']= @processTimestamp # 设置时间戳。
71
+
72
+ compressed= stampCbor.to_cbor
73
+
74
+ extremeZipOutputFile = File.new(datastore, 'wb') # 创建文件
75
+ extremeZipOutputFile.syswrite(compressed) # 写入文件
76
+ extremeZipOutputFile.close # 关闭文件
77
+
78
+ end # writeStamp # 更新时间戳文件
79
+
80
+ def loadStamp(rootPath) # 读取时间戳阈值。
81
+ stamp=0 # 默认值。
82
+ fileExists=false # 文件是否存在
83
+
84
+ directoryPathName=Pathname.new(rootPath) #构造路径名字对象。
85
+
86
+ isFile=directoryPathName.file? #是否是文件。
87
+
88
+ unless isFile #是文件就跳过。
89
+ #陈欣
90
+
91
+ datastore= "#{directoryPathName.expand_path}/.exzstamp" # 配置文件路径
92
+ puts "reading stamp file: #{datastore}" # Debug
93
+
94
+ begin # 尝试读取。
95
+
96
+ #陈欣
97
+
98
+ currentBlockFile = File.new(datastore, 'rb') # 打开文件
99
+
100
+ fileExists=true # 文件存在
101
+
102
+ stampFileContent = currentBlockFile.read # 读取全部内容
103
+
104
+ currentBlockFile.close # 关闭文件
105
+
106
+ options = {:tolerant => true}
107
+
108
+ wholeCbor = CBOR.decode(stampFileContent, options) # 解码
109
+
110
+ stamp = wholeCbor['timestamp'] # 获取时间戳
111
+ rescue Errno::ENOENT
112
+
113
+ end
114
+
115
+
116
+ end #unless isFile #是文件就跳过。
117
+
118
+ return stamp, fileExists # 返回时间戳。
119
+ end #loadStamp(rootPath) # 读取时间戳阈值。
56
120
 
57
121
  # 压缩
58
122
  def exz(rootPath)
59
- victoriaFresh, = @clipDownloader.checkOnce(rootPath) # 打包该目录树。
123
+ timestampTHreshold, fileExists=loadStamp(rootPath) # 读取时间戳阈值。
124
+
125
+ #陈欣
126
+
127
+ if (timestampTHreshold > 0) # 有效的时间戳
128
+ @clipDownloader.timestampThreshold=timestampTHreshold # 设置文件时间戳阈值。
129
+ end #if (timestampTHreshold > 0) # 有效的时间戳
130
+
131
+ if fileExists # 存在文件,则表明将要发生增量压缩
132
+ @wholeCbor['incremental']=true # 是增量压缩。
133
+
134
+ end # if fileExists # 存在文件,则表明用户要求增量压缩
60
135
 
61
- @filePartAmount = @clipDownloader.currentDiskFlushSuffix # 获取文件个数
136
+ @wholeCbor['timestamp']=@processTimestamp # 记录进程启动的时间戳。
137
+
138
+ victoriaFresh, = @clipDownloader.checkOnce(rootPath) # 打包该目录树。
62
139
 
63
- compressVfsMenu(victoriaFresh) # 压缩目录数据。
140
+ @filePartAmount = @clipDownloader.currentDiskFlushSuffix # 获取文件个数
64
141
 
65
- addBasicFileInformation # 加入基本文件信息
142
+ compressVfsMenu(victoriaFresh) # 压缩目录数据。
66
143
 
67
- processIdList, responsePipeList = launchSubProcesses # 启动子进程。
144
+ addBasicFileInformation # 加入基本文件信息
68
145
 
69
- receiveCompressedVfsDataList(processIdList, responsePipeList) # 接收压缩后的数据块列表
146
+ processIdList, responsePipeList = launchSubProcesses # 启动子进程。
70
147
 
71
- checkMemoryUsage(155)
72
- @wholeCbor['vfsDataList'] = @vfsDataList # 加入数据
148
+ receiveCompressedVfsDataList(processIdList, responsePipeList) # 接收压缩后的数据块列表
73
149
 
150
+ checkMemoryUsage(155)
151
+ @wholeCbor['vfsDataList'] = @vfsDataList # 加入数据
152
+
153
+ wholeFileContent = 'exz' + "\0" + @wholeCbor.to_cbor # 追加CBOR字节数组
154
+
155
+ vfsDataListStart=wholeFileContent.length # 按照现在的序列化情况,计算出来的起始位置。
156
+
157
+ while (vfsDataListStart!=@wholeCbor['vfsDataListStart']) # 计算出的偏移不一致
158
+ @wholeCbor['vfsDataListStart']=vfsDataListStart # 使用新的值
74
159
  wholeFileContent = 'exz' + "\0" + @wholeCbor.to_cbor # 追加CBOR字节数组
160
+ vfsDataListStart=wholeFileContent.length # 按照现在的序列化情况,计算出来的起始位置。
161
+ end
75
162
 
76
- # 写入文件:
77
- writeFile(wholeFileContent, victoriaFresh) # 写入文件内容
163
+ # 写入文件:
164
+ writeFile(wholeFileContent, victoriaFresh) # 写入文件内容
165
+
166
+ appendVfsDataList victoriaFresh # 追加压缩块列表数据。
167
+
168
+ if fileExists # 存在文件,则表明将要发生增量压缩
169
+ writeStamp # 更新时间戳文件
170
+ end # if fileExists # 存在文件,则表明用户要求增量压缩
171
+
78
172
  end # def exz(rootPath)
173
+
174
+ # 写入压缩块文件
175
+ def writeCompressBlock(compressed, processCounter)
176
+ extremeZipOutputFile = File.new("comressed.#{processCounter}.cex", 'wb') # 创建文件
177
+ extremeZipOutputFile.syswrite(compressed) # 写入文件
178
+ extremeZipOutputFile.close # 关闭文件
179
+ end
180
+
181
+ # 追加压缩块列表数据。
182
+ def appendVfsDataList (victoriaFresh)
183
+ extremeZipOutputFile = File.new("#{victoriaFresh['name']}.exz", 'ab') # 打开文件
184
+
185
+ processCounter=0 # 块计数器。
186
+
187
+ @wholeCbor['vfsDataList'].each do
188
+ #extremeZipOutputFile = File.new("comressed.#{processCounter}.cex", 'wb') # 创建文件
189
+
190
+ currentBlockFile = File.new("comressed.#{processCounter}.cex", 'rb') # 打开文件
191
+
192
+ wholeFileContent = currentBlockFile.read # 读取全部内容
193
+
194
+ currentBlockFile.close # 关闭文件
195
+ File.delete(currentBlockFile) # 删除数据块文件
196
+
197
+ #wholeFileContent=File.read("comressed.#{processCounter}.cex", 'rb') # 读取压缩块。
198
+
199
+ puts "wirte file contetn length: #{wholeFileContent.length}" # Debghu
200
+
201
+ extremeZipOutputFile.syswrite(wholeFileContent) # 写入文件
202
+
203
+ processCounter += 1 # 计数
204
+ end
205
+
206
+ extremeZipOutputFile.close # 关闭文件
207
+ end
79
208
 
80
209
  # 写入文件内容
81
210
  def writeFile(wholeFileContent, victoriaFresh)
@@ -92,8 +221,16 @@ class ExtremeZip
92
221
  currentSubProcess=processIdList[processCounter] # 获取子进程对象
93
222
  #processIdList.each do |currentSubProcess|
94
223
  compressed = receiveFromSubProcess(currentSubProcess, responsePipeList, processCounter) # 从子进程中读取数据,并终止子进程
224
+
225
+ #写入当前压缩块到文件系统中去作为缓存。陈欣
226
+ writeCompressBlock(compressed, processCounter) # 写入压缩块文件
227
+
228
+ blockInfo={} # 块信息
229
+ blockInfo['length']=compressed.length # 记录长度
230
+
231
+ puts "block length: #{blockInfo['length']}" # Debug
95
232
 
96
- @vfsDataList << compressed # 加入数据块列表中
233
+ @vfsDataList << blockInfo # 加入数据块列表中
97
234
  checkMemoryUsage(150)
98
235
 
99
236
  processCounter += 1 # 子进程计数
@@ -112,7 +249,7 @@ class ExtremeZip
112
249
 
113
250
  currentBlockFile.close # 关闭文件
114
251
 
115
- #File.delete(currentBlockFile) # 删除数据块文件
252
+ File.delete(currentBlockFile) # 删除数据块文件
116
253
 
117
254
  currentBlockData
118
255
  end
@@ -121,11 +258,8 @@ class ExtremeZip
121
258
  def schedule1Block(filePartCounter)
122
259
  currentBlockData = readBlockFile(filePartCounter) # 读取块文件内容
123
260
 
124
- # currentTaskPipe = Cod.pipe # 任务分配管道
125
261
  currentResponsePipe = Cod.pipe # 任务回复管道
126
262
 
127
- puts("forking sub process, file part counter: #{filePartCounter}") # Debug.
128
-
129
263
  p1 = fork do # 复制出子进程
130
264
  compressInSubProcess(currentBlockData, currentResponsePipe) # 在子进程中具体执行的压缩代码
131
265
  end # p1 = fork do #复制出子进程
@@ -146,11 +280,8 @@ class ExtremeZip
146
280
 
147
281
  # 启动子进程。
148
282
  def launchSubProcesses
149
-
150
- #while ((@filePartCounter < @filePartAmount) && (true)) # 未处理完毕,并且未达到最大子进程个数
151
283
  while ((@filePartCounter < @filePartAmount) && (@filePartCounter<@maxSubProcessAmount)) # 未处理完毕,并且未达到最大子进程个数
152
284
  currentResponsePipe, p1 = schedule1Block(@filePartCounter) # 计划一个块的压缩计算
153
-
154
285
  end # while processDataLength < victoriaFreshData.byte_size do #未处理完毕
155
286
 
156
287
  [@processIdList, @responsePipeList]
@@ -168,7 +299,6 @@ class ExtremeZip
168
299
 
169
300
  currentResponsePipe.put currentCompressedVfsData # 将压缩后的数据块写入到回复管道中
170
301
 
171
- checkMemoryUsage(125)
172
302
  puts("finished #{Process.pid}") # Debug
173
303
  end # compressInSubProcess(currentBlockData, currentResponsePipe) # 在子进程中具体执行的压缩代码
174
304
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: EXtremeZip
3
3
  version: !ruby/object:Gem::Version
4
- version: 2022.1.27
4
+ version: 2022.2.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hxcan Cai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-27 00:00:00.000000000 Z
11
+ date: 2022-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cod
@@ -86,20 +86,20 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 2022.1.27
89
+ version: 2022.2.19
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
- version: 2022.1.27
92
+ version: 2022.2.19
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: 2022.1.27
99
+ version: 2022.2.19
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: 2022.1.27
102
+ version: 2022.2.19
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: hx_cbor
105
105
  requirement: !ruby/object:Gem::Requirement