itools 0.1.3 → 0.1.4

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: 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