itools 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2876ab57e24166720edbf0095b8e285b85ad645a66efd062c070cb83f7283295
4
- data.tar.gz: e8ba46ca564e846af2bab933d5d269c1b6fa9ce62c2073c61479c023d39113a4
3
+ metadata.gz: 572fcb73d2ed042ab8d43f2ae359cc22c46f7b1a91c70aa53dcdadf424a65b3d
4
+ data.tar.gz: 1fb8249f6f2d8934c7b7d04712b310d1465cbb1c253e8f950fe7be2efab9e628
5
5
  SHA512:
6
- metadata.gz: 7c4f1708c264a5319776106626406b892c9e24f8b64e49c7e3e38fa34e7fc23dfb6d444faa8235d835ec8498dc4fc3d069554a1dcda8c311aabb5bcd891fe19f
7
- data.tar.gz: 603e757dbb3b4003309c64b93a877cea9f572018130cee216384b260e0fc5ef5400ff982b74738d3a7d8de798e8a128ac0cf117f32bdae20aec83015e132b341
6
+ metadata.gz: 7d4bb2508282c6ec1b8ef24e3ac60fa80e648c16ddffb8bbe4a52f641801eb1178105139fcc10b8deee6c63966b4e965073b39f11e5fcdcc73d8e15c8539a30c
7
+ data.tar.gz: 5ebe0bced44d8a2c33dee0f949ddc4ed4c86d2544585da1909d7ac1ec68566e385fb3280b408415b41ac4594553dc64e47af658b36da3d18611de7606b2f03a6
data/Gemfile CHANGED
@@ -3,4 +3,4 @@ source "https://rubygems.org"
3
3
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in itools.gemspec
6
- gemspec
6
+ gemspec
@@ -8,6 +8,9 @@ GEM
8
8
  specs:
9
9
  gli (2.18.0)
10
10
  rake (10.4.2)
11
+ ruby-ole (1.2.12.1)
12
+ spreadsheet (1.1.8)
13
+ ruby-ole (>= 1.0)
11
14
 
12
15
  PLATFORMS
13
16
  ruby
@@ -17,6 +20,7 @@ DEPENDENCIES
17
20
  gli (~> 2.17)
18
21
  itools!
19
22
  rake (~> 10.0)
23
+ spreadsheet (~> 1.1.8)
20
24
 
21
25
  BUNDLED WITH
22
26
  1.17.1
data/bin/itools CHANGED
@@ -15,4 +15,11 @@ command :parse do |c|
15
15
  end
16
16
  end
17
17
 
18
+ desc "search str(or strs) in some file(or folder's file)"
19
+ arg 'xxx.txt'
20
+ command :search do |c|
21
+ c.action do |global_options, options, args|
22
+ Itools::StringSearcher.search_result(args[0],args[1])
23
+ end
24
+ end
18
25
  exit run(ARGV)
@@ -38,4 +38,5 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency "bundler", "~> 1.17"
39
39
  spec.add_development_dependency "rake", "~> 10.0"
40
40
  spec.add_development_dependency "gli", "~> 2.17"
41
+ spec.add_development_dependency "spreadsheet", '~> 1.1', '>= 1.1.8'
41
42
  end
@@ -1,2 +1,3 @@
1
1
  require "itools/version"
2
2
  require "itools/link_map"
3
+ require "itools/string_searcher"
@@ -2,251 +2,251 @@ require 'fileutils'
2
2
  require 'pathname'
3
3
 
4
4
  module Itools
5
- # ---------------------------------ObjectFile class---------------------------------
6
- class ObjectFile
7
- attr_accessor :serial_number, :file_path, :file_name
8
- def initialize()
9
- @serial_number = []
10
- end
5
+ # ---------------------------------ObjectFile class---------------------------------
6
+ class ObjectFile
7
+ attr_accessor :serial_number, :file_path, :file_name
8
+ def initialize()
9
+ @serial_number = []
10
+ end
11
11
 
12
- end
13
- # ---------------------------------Sections class---------------------------------
14
- class Sections
15
- attr_accessor :address, :size, :segment, :section
12
+ end
13
+ # ---------------------------------Sections class---------------------------------
14
+ class Sections
15
+ attr_accessor :address, :size, :segment, :section
16
16
 
17
- end
18
- # ---------------------------------Symbols class---------------------------------
19
- class Symbols
20
- attr_accessor :s_address, :s_size, :s_file_serial_number, :s_name
21
- def initialize
22
- @s_file_serial_number = -1 #防止为0
23
- end
24
- end
17
+ end
18
+ # ---------------------------------Symbols class---------------------------------
19
+ class Symbols
20
+ attr_accessor :s_address, :s_size, :s_file_serial_number, :s_name
21
+ def initialize
22
+ @s_file_serial_number = -1 #防止为0
23
+ end
24
+ end
25
25
 
26
- # ---------------------------------DSSymbols class---------------------------------
27
- class DSSymbols
28
- attr_accessor :size, :file, :name
29
- end
26
+ # ---------------------------------DSSymbols class---------------------------------
27
+ class DSSymbols
28
+ attr_accessor :size, :file, :name
29
+ end
30
30
 
31
- # ---------------------------------LinkMap class---------------------------------
32
- class LinkMap
33
- # 包含的属性
34
- attr_accessor :l_name, :l_path, :l_arch, :l_obj_files, :l_sections, :l_symbols, :l_dead_stripped_symbols, :l_sym_map
35
- # 初始化方法
36
- def initialize(fName)
37
- @l_name = fName
38
- @l_obj_files = []
39
- @l_symbols = []
40
- @l_sections = []
41
- @l_dead_stripped_symbols = []
42
- end
43
- # 得到path
44
- def get_path(str)
45
- splitparam = str.split(" ")
46
- @l_path = splitparam.last
47
- end
48
- # 处理object文件
49
- def handle_ojbect_files(str)
50
- tempSplit = str.split("]")
51
- if tempSplit.size > 1
52
- obj_file = ObjectFile.new
53
- obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
54
- obj_file.file_path = tempSplit[1].strip
55
- obj_file.file_name = tempSplit[1].split("/").last.chomp
56
- l_obj_files << obj_file
31
+ # ---------------------------------LinkMap class---------------------------------
32
+ class LinkMap
33
+ # 包含的属性
34
+ attr_accessor :l_name, :l_path, :l_arch, :l_obj_files, :l_sections, :l_symbols, :l_dead_stripped_symbols, :l_sym_map
35
+ # 初始化方法
36
+ def initialize(fName)
37
+ @l_name = fName
38
+ @l_obj_files = []
39
+ @l_symbols = []
40
+ @l_sections = []
41
+ @l_dead_stripped_symbols = []
42
+ end
43
+ # 得到path
44
+ def get_path(str)
45
+ splitparam = str.split(" ")
46
+ @l_path = splitparam.last
47
+ end
48
+ # 处理object文件
49
+ def handle_ojbect_files(str)
50
+ tempSplit = str.split("]")
51
+ if tempSplit.size > 1
52
+ obj_file = ObjectFile.new
53
+ obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
54
+ obj_file.file_path = tempSplit[1].strip
55
+ obj_file.file_name = tempSplit[1].split("/").last.chomp
56
+ l_obj_files << obj_file
57
+ end
58
+ end
59
+ # 处理sections
60
+ def handle_sections(str)
61
+ sectionSplit = str.split(" ")
62
+ if sectionSplit.size == 4
63
+ section = Sections.new
64
+ section.address = sectionSplit[0]
65
+ section.size = sectionSplit[1]
66
+ section.segment = sectionSplit[2]
67
+ section.section = sectionSplit[3]
68
+ l_sections << section
69
+ end
70
+ end
71
+ # get arch
72
+ def get_arch(str)
73
+ splitparam = str.split(" ")
74
+ @l_arch = splitparam.last
75
+ end
76
+ # 处理Symbols
77
+ def handle_symbols(str)
78
+ # 字符编码产生的异常处理
79
+ begin
80
+ symbolsSplit = str.split("\t")
81
+ rescue => exception
82
+ return
83
+ end
84
+ if symbolsSplit.size > 2
85
+ symbol = Symbols.new
86
+ symbol.s_address = symbolsSplit[0]
87
+ symbol.s_size = symbolsSplit[1]
88
+ # 获取编号和名字
89
+ serial_name_str = symbolsSplit[2]
90
+ file_and_name_split = serial_name_str.split("]")
91
+ if file_and_name_split.size > 1
92
+ symbol.s_file_serial_number = file_and_name_split[0].delete("[").strip.to_i #设置文件编号
93
+ symbol.s_name = file_and_name_split[1]
57
94
  end
58
- end
59
- # 处理sections
60
- def handle_sections(str)
61
- sectionSplit = str.split(" ")
62
- if sectionSplit.size == 4
63
- section = Sections.new
64
- section.address = sectionSplit[0]
65
- section.size = sectionSplit[1]
66
- section.segment = sectionSplit[2]
67
- section.section = sectionSplit[3]
68
- l_sections << section
69
- end
70
- end
71
- # get arch
72
- def get_arch(str)
73
- splitparam = str.split(" ")
74
- @l_arch = splitparam.last
75
- end
76
- # 处理Symbols
77
- def handle_symbols(str)
78
- # 字符编码产生的异常处理
79
- begin
80
- symbolsSplit = str.split("\t")
81
- rescue => exception
82
- return
83
- end
84
- if symbolsSplit.size > 2
85
- symbol = Symbols.new
86
- symbol.s_address = symbolsSplit[0]
87
- symbol.s_size = symbolsSplit[1]
88
- # 获取编号和名字
89
- serial_name_str = symbolsSplit[2]
90
- file_and_name_split = serial_name_str.split("]")
91
- if file_and_name_split.size > 1
92
- symbol.s_file_serial_number = file_and_name_split[0].delete("[").strip.to_i #设置文件编号
93
- symbol.s_name = file_and_name_split[1]
94
- end
95
-
96
- l_symbols << symbol
97
- else
98
- end
99
- end
100
- # 处理symbols的数组,把symbols转换成hashmap
101
- def handle_l_sym_map
102
- @l_sym_map = @l_symbols.group_by(&:s_file_serial_number)
103
- if @l_sym_map.include?(-1)
104
- puts "移除无用元素"
105
- @l_sym_map.delete(-1)
106
- end
107
- end
108
- # 处理link map file
109
- def handle_map
110
- handle_method_name = ""
111
- File.read(@l_name).each_line do |line|
112
- if line[0] == "#"
113
- if line.include?("Path:")
114
- handle_method_name = "get_path"
115
- puts "处理path..."
116
- elsif line.include?("Arch:")
117
- handle_method_name = "get_arch"
118
- puts "处理Arch..."
119
- elsif line.include?("Object files")
120
- handle_method_name = "handle_ojbect_files"
121
- puts "处理Object files..."
122
- elsif line.include?("Sections")
123
- handle_method_name = "handle_sections"
124
- puts "处理Sections..."
125
- elsif line.include?("Symbols:") #symbols:和Dead Stripped Symbols处理一样
126
- puts "处理#{line.delete('#').strip}..."
127
- handle_method_name = "handle_symbols"
128
- end
129
- end
130
- self.send(handle_method_name, line)
131
-
132
- end
133
- end
134
- def self.parser(path_para)
135
- start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
136
- # 获取link map file's name
137
- link_map_file_name = path_para
138
- puts "获取的文件路径为:#{link_map_file_name}"
139
- if link_map_file_name.nil?
140
- puts "请按照如下命令执行该脚本:"
141
- puts "\033[31mruby linkMapParse.rb **.txt \033[0m"
142
- puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-x86_64.txt"
143
- exit
144
- end
145
- if File.exist?(link_map_file_name)
146
- puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
147
- else
148
- puts "\033[31m#{link_map_file_name}文件不存在,请重新输入文件 \033[0m"
149
- exit
95
+
96
+ l_symbols << symbol
97
+ else
98
+ end
99
+ end
100
+ # 处理symbols的数组,把symbols转换成hashmap
101
+ def handle_l_sym_map
102
+ @l_sym_map = @l_symbols.group_by(&:s_file_serial_number)
103
+ if @l_sym_map.include?(-1)
104
+ puts "移除无用元素"
105
+ @l_sym_map.delete(-1)
106
+ end
107
+ end
108
+ # 处理link map file
109
+ def handle_map
110
+ handle_method_name = ""
111
+ File.read(@l_name).each_line do |line|
112
+ if line[0] == "#"
113
+ if line.include?("Path:")
114
+ handle_method_name = "get_path"
115
+ puts "处理path..."
116
+ elsif line.include?("Arch:")
117
+ handle_method_name = "get_arch"
118
+ puts "处理Arch..."
119
+ elsif line.include?("Object files")
120
+ handle_method_name = "handle_ojbect_files"
121
+ puts "处理Object files..."
122
+ elsif line.include?("Sections")
123
+ handle_method_name = "handle_sections"
124
+ puts "处理Sections..."
125
+ elsif line.include?("Symbols:") #symbols:和Dead Stripped Symbols处理一样
126
+ puts "处理#{line.delete('#').strip}..."
127
+ handle_method_name = "handle_symbols"
128
+ end
150
129
  end
130
+ self.send(handle_method_name, line)
151
131
 
152
- link_map = LinkMap.new(link_map_file_name)
153
- link_map.handle_map #处理文件为对象,然后继续后续操作
154
- link_map.handle_l_sym_map #处理symbols为hashmap
155
- sizeResultArr = []
132
+ end
133
+ end
134
+ def self.parser(path_para)
135
+ start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
136
+ # 获取link map file's name
137
+ link_map_file_name = path_para
138
+ puts "获取的文件路径为:#{link_map_file_name}"
139
+ if link_map_file_name.nil?
140
+ puts "请按照如下命令执行该脚本:"
141
+ puts "\033[31mruby linkMapParse.rb **.txt \033[0m"
142
+ puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-x86_64.txt"
143
+ exit
144
+ end
145
+ if File.exist?(link_map_file_name)
146
+ puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
147
+ else
148
+ puts "\033[31m#{link_map_file_name}文件不存在,请重新输入文件 \033[0m"
149
+ exit
150
+ end
156
151
 
157
- link_map.l_obj_files.each do |obj|
158
- temp_file_name = obj.file_name.split("(")[0]
159
-
160
- last_file = sizeResultArr.last
161
-
162
- if last_file && temp_file_name.eql?(last_file.file_name)
163
- last_file.file_serial_numers << obj.serial_number
164
- else
165
- sz_obj = SizeResult.new
166
- sz_obj.file_name = temp_file_name
167
- sz_obj.file_serial_numers << obj.serial_number
168
- sizeResultArr << sz_obj
169
- end
170
- end
171
- data_analyze_time = Time.now.to_i
172
- puts "\033[32m数据分析完成,耗时#{data_analyze_time - start_time}秒。开始计算结果\033[0m"
152
+ link_map = LinkMap.new(link_map_file_name)
153
+ link_map.handle_map #处理文件为对象,然后继续后续操作
154
+ link_map.handle_l_sym_map #处理symbols为hashmap
155
+ sizeResultArr = []
173
156
 
174
- # 计算赋值size,此处耗时较长
175
- total_size = 0
176
- sizeResultArr.each do |obj|
177
- # 处理方法2
178
- obj.file_serial_numers.each do |s_number|
179
- begin
180
- link_map.l_sym_map[s_number].each do |symb|
181
- obj.size = obj.size + symb.s_size.hex
182
- total_size = total_size +symb.s_size.hex #统计总大小
183
- end
184
- rescue => exception
185
- end
186
- end
187
- # 处理方法1 太过耗时
188
- # link_map.l_symbols.each do |symb|
189
- # if obj.file_serial_numers.include?(symb.s_file_serial_number)
190
- # obj.size = obj.size + symb.s_size.hex
191
- # end
192
- # end
193
- # puts "正在计算#{obj.file_name}的大小..."
194
- end
195
- data_handle_time = Time.now.to_i #处理数据时间
196
- puts "\033[32m数据处理完成,耗时#{data_handle_time - data_analyze_time}秒。开始对结果进行大小排序(从大到小)...\033[0m"
197
- # 按照从大到小排序
198
- sizeResultArr.sort_by!{|obj|[-obj.size]}
199
- sort_handle_time = Time.now.to_i #排序耗时
200
- puts "\033[32m数据排序完成,耗时#{sort_handle_time - data_handle_time}秒。开始输出结果:\033[0m"
201
- puts "\033[32m--------------------------------\033[0m"
157
+ link_map.l_obj_files.each do |obj|
158
+ temp_file_name = obj.file_name.split("(")[0]
202
159
 
203
- # 判断文件是否存在
204
- save_file_path = SizeResult.getSaveFileName(path_para)
205
- if File.exist?(save_file_path)
206
- File.delete(save_file_path)
207
- end
160
+ last_file = sizeResultArr.last
208
161
 
209
- # 创建要保存数据的文件
210
- save_file = File.new(save_file_path,"w+")
211
- # 打印结果
212
- sizeResultArr.each do |obj|
213
- puts "#{obj.file_name} " + SizeResult.handleSize(obj.size)
214
- save_file.puts("#{obj.file_name} #{SizeResult.handleSize(obj.size)}")
215
- end
216
- save_file.puts("总大小为:#{SizeResult.handleSize(total_size)}")
217
- save_file.close
218
- puts "总大小为(仅供参考):#{SizeResult.handleSize(total_size)}"
219
- puts "\033[32m--------------------------------\033[0m"
220
- end_time = Time.now.to_i #程序执行结束时间
221
- puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
222
- puts " "
223
- puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
224
- end
225
-
226
- end
227
- # --------------------------------- Size utils class ---------------------------------
228
- class SizeResult
229
- attr_accessor :file_name, :file_serial_numers, :size
230
- def initialize
231
- @file_serial_numers = []
232
- @size = 0
233
- end
234
- # size字符化
235
- def self.handleSize(size)
236
- if size > 1024 * 1024
237
- return format("%.2f",(size.to_f/(1024*1024))) + "MB"
238
- elsif size > 1024
239
- return format("%.2f",(size.to_f/1024)) + "KB"
162
+ if last_file && temp_file_name.eql?(last_file.file_name)
163
+ last_file.file_serial_numers << obj.serial_number
240
164
  else
241
- return size.to_s + "B"
165
+ sz_obj = SizeResult.new
166
+ sz_obj.file_name = temp_file_name
167
+ sz_obj.file_serial_numers << obj.serial_number
168
+ sizeResultArr << sz_obj
242
169
  end
243
- end
244
- # 获取结果文件保存到目录
245
- def self.getSaveFileName(path_para)
246
- path = Pathname.new(path_para)
247
- # 要保存的地址
248
- save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result.txt"
249
- return save_file_path
250
- end
251
- end
252
- end
170
+ end
171
+ data_analyze_time = Time.now.to_i
172
+ puts "\033[32m数据分析完成,耗时#{data_analyze_time - start_time}秒。开始计算结果\033[0m"
173
+
174
+ # 计算赋值size,此处耗时较长
175
+ total_size = 0
176
+ sizeResultArr.each do |obj|
177
+ # 处理方法2
178
+ obj.file_serial_numers.each do |s_number|
179
+ begin
180
+ link_map.l_sym_map[s_number].each do |symb|
181
+ obj.size = obj.size + symb.s_size.hex
182
+ total_size = total_size +symb.s_size.hex #统计总大小
183
+ end
184
+ rescue => exception
185
+ end
186
+ end
187
+ # 处理方法1 太过耗时
188
+ # link_map.l_symbols.each do |symb|
189
+ # if obj.file_serial_numers.include?(symb.s_file_serial_number)
190
+ # obj.size = obj.size + symb.s_size.hex
191
+ # end
192
+ # end
193
+ # puts "正在计算#{obj.file_name}的大小..."
194
+ end
195
+ data_handle_time = Time.now.to_i #处理数据时间
196
+ puts "\033[32m数据处理完成,耗时#{data_handle_time - data_analyze_time}秒。开始对结果进行大小排序(从大到小)...\033[0m"
197
+ # 按照从大到小排序
198
+ sizeResultArr.sort_by!{|obj|[-obj.size]}
199
+ sort_handle_time = Time.now.to_i #排序耗时
200
+ puts "\033[32m数据排序完成,耗时#{sort_handle_time - data_handle_time}秒。开始输出结果:\033[0m"
201
+ puts "\033[32m--------------------------------\033[0m"
202
+
203
+ # 判断文件是否存在
204
+ save_file_path = SizeResult.getSaveFileName(path_para)
205
+ if File.exist?(save_file_path)
206
+ File.delete(save_file_path)
207
+ end
208
+
209
+ # 创建要保存数据的文件
210
+ save_file = File.new(save_file_path,"w+")
211
+ # 打印结果
212
+ sizeResultArr.each do |obj|
213
+ puts "#{obj.file_name} " + SizeResult.handleSize(obj.size)
214
+ save_file.puts("#{obj.file_name} #{SizeResult.handleSize(obj.size)}")
215
+ end
216
+ save_file.puts("总大小为:#{SizeResult.handleSize(total_size)}")
217
+ save_file.close
218
+ puts "总大小为(仅供参考):#{SizeResult.handleSize(total_size)}"
219
+ puts "\033[32m--------------------------------\033[0m"
220
+ end_time = Time.now.to_i #程序执行结束时间
221
+ puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
222
+ puts " "
223
+ puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
224
+ end
225
+
226
+ end
227
+ # --------------------------------- Size utils class ---------------------------------
228
+ class SizeResult
229
+ attr_accessor :file_name, :file_serial_numers, :size
230
+ def initialize
231
+ @file_serial_numers = []
232
+ @size = 0
233
+ end
234
+ # size字符化
235
+ def self.handleSize(size)
236
+ if size > 1024 * 1024
237
+ return format("%.2f",(size.to_f/(1024*1024))) + "MB"
238
+ elsif size > 1024
239
+ return format("%.2f",(size.to_f/1024)) + "KB"
240
+ else
241
+ return size.to_s + "B"
242
+ end
243
+ end
244
+ # 获取结果文件保存到目录
245
+ def self.getSaveFileName(path_para)
246
+ path = Pathname.new(path_para)
247
+ # 要保存的地址
248
+ save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result.txt"
249
+ return save_file_path
250
+ end
251
+ end
252
+ end
@@ -1,3 +1,3 @@
1
1
  module Itools
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - zhanggui
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-22 00:00:00.000000000 Z
11
+ date: 2018-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,26 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.17'
55
+ - !ruby/object:Gem::Dependency
56
+ name: spreadsheet
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 1.1.8
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.1'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.1.8
55
75
  description: 'iOS dev tools '
56
76
  email:
57
77
  - scottzg@126.com
@@ -98,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
118
  version: '0'
99
119
  requirements: []
100
120
  rubyforge_project:
101
- rubygems_version: 2.7.6
121
+ rubygems_version: 2.7.8
102
122
  signing_key:
103
123
  specification_version: 4
104
124
  summary: iOS tools