fir-cli 0.2.0 → 0.2.1.a

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,247 +0,0 @@
1
- # coding: utf-8
2
- module Fir
3
- class Cli
4
- def initialize(*args)
5
- super
6
- @tmpfiles = []
7
- _init_config
8
- _load_config
9
- _puts_welcome
10
- end
11
- def self.find_extends
12
- `gem list --local`
13
- .each_line("\n")
14
- .map { |gem| /^[^\s]+/.match(gem)[0] }
15
- .select { |gem| true if gem.start_with? 'fir-cli-' }
16
- end
17
- def self.output_options
18
- option :verbose,
19
- :desc => '设置输出辅助信息的详细程度',
20
- :type => :string,
21
- :enum => ['v', 'vv', 'vvv']
22
- option :quiet,
23
- :aliases => '-q',
24
- :desc => '安静模式,不输出任何辅助信息',
25
- :type => 'boolean'
26
- option :color,
27
- :desc => '设置输出带有颜色的信息',
28
- :type => 'boolean'
29
- end
30
- private
31
- def _extends
32
- @extends ||= Cli.find_extends
33
- end
34
- def _init_config
35
- @uconfig = UserConfig.new '.fir'
36
- @global_config = @uconfig['global.yaml']
37
- end
38
- def _load_config
39
- @config = @uconfig[_profile]
40
- end
41
- def _profile
42
- @global_config['profile'] || 'default.yaml'
43
- end
44
- def _path(path)
45
- path = Pathname.new(Dir.pwd).join(path).cleanpath
46
- end
47
- no_commands do
48
- %w(token email verbose origin branch).each do |_m|
49
- define_method "_opt_#{_m}" do
50
- unless instance_variable_get("@#{_m}")
51
- instance_variable_set("@#{_m}", options[_m.to_sym] || @config[_m] )
52
- end
53
- instance_variable_get("@#{_m}")
54
- end
55
- private "_opt_#{_m}".to_sym
56
- end
57
- %w(publish resign quiet color trim).each do |_m|
58
- define_method "_opt_#{_m}" do
59
- return false if options[_m.to_sym] == false
60
- unless instance_variable_get("@#{_m}")
61
- instance_variable_set("@#{_m}", options[_m.to_sym] || @config[_m] )
62
- end
63
- instance_variable_get("@#{_m}")
64
- end
65
- private "_opt_#{_m}".to_sym
66
- end
67
- end
68
- def _is_ipa(path)
69
- path.end_with? '.ipa'
70
- end
71
- def _is_apk(path)
72
- path.end_with? '.apk'
73
- end
74
- def _is_workspace(path)
75
- path.end_with? '.xcworkspace'
76
- end
77
- def _is_xcodeproject(path)
78
- path.end_with? '.xcodeproj'
79
- end
80
- def _is_identifier(str)
81
- /^(?:(?:[a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$/.match str
82
- end
83
- def _is_email(str)
84
- /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/i.match str
85
- end
86
- def _chk_login(prompt = true)
87
- if !_opt_token && prompt == true
88
- token = _prompt_secret('请输入用户 token:')
89
- @token = token if token.length > 0
90
- end
91
- if !@token
92
- _puts_require_token
93
- exit 1
94
- elsif !_user(@token)
95
- _puts_invalid_token
96
- exit 1
97
- end
98
- end
99
- def _prompt_secret(prompt)
100
- ask(prompt) { |q| q.echo = false }
101
- end
102
- def _prompt(prompt)
103
- ask(prompt) { |q| q }
104
- end
105
- def _puts(text)
106
- return puts _format text if !/^[->!] /.match text
107
- return if _opt_quiet
108
- case _opt_verbose || 'vv' # If nothing about log is set, use the default option - vv
109
- when 'v'
110
- puts _format text if text.start_with?('!')
111
- when 'vv'
112
- puts _format text if text.start_with?('!') || text.start_with?('>')
113
- when 'vvv'
114
- puts _format text if text.start_with?('!') || text.start_with?('>') || text.start_with?('-')
115
- end
116
- end
117
- def _format(text)
118
- return text.gsub /\e\[\d+(?:;\d+)*m/, '' if _opt_color == false
119
- text
120
- end
121
- def _puts_welcome
122
- _puts "> #{Paint['欢迎使用 FIR.im 命令行工具,如需帮助请输入:', :green]} fir help"
123
- end
124
- def _puts_require_token
125
- _puts "! #{Paint['用户 token 不能为空', :red]}"
126
- end
127
- def _puts_invalid_token
128
- _puts "! #{Paint['输入的用户 token 不合法', :red]}"
129
- end
130
- def _puts_invalid_email
131
- _puts "! #{Paint['输入的邮件地址不合法', :red]}"
132
- end
133
- def _info(path, more = false)
134
- if _is_ipa path
135
- _ipa_info path, more
136
- elsif _is_apk path
137
- _apk_info path, more
138
- else
139
- _puts "! #{Paint['只能支持后缀为 ipa 和 apk 的文件', :red]}"
140
- exit 1
141
- end
142
- end
143
- def _apk_info(path, more = false)
144
- path = _path path
145
- apk = Android::Apk.new path
146
- info = {
147
- :type => 'android',
148
- :identifier => apk.manifest.package_name,
149
- :name => apk.label,
150
- :version => apk.manifest.version_code,
151
- :short_version => apk.manifest.version_name
152
- }
153
- if more
154
- info[:icons] = apk.icon.map do |name, data|
155
- tfile = Tempfile.new ["icon-#{SecureRandom.hex}", '.png']
156
- tfile.write data
157
- @tmpfiles.push tfile
158
- {
159
- :name => File.basename(name),
160
- :path => tfile.path
161
- }
162
- end
163
- end
164
- info
165
- end
166
- def _ipa_info(path, more = false)
167
- path = _path path
168
- ipa = Lagunitas::IPA.new path
169
- _puts '> 正在解析 ipa 文件...'
170
- app = ipa.app
171
- info = {
172
- :type => 'ios',
173
- :identifier => app.identifier,
174
- :name => app.name,
175
- :display_name => app.display_name,
176
- :version => app.version,
177
- :short_version => app.short_version,
178
- :devices => app.devices,
179
- :release_type => app.release_type,
180
- :distribution_name => app.distribution_name
181
- }
182
- if more
183
- if app.icons
184
- info[:icons] = app.icons.sort { |a,b| -(a[:width] <=> b[:width]) }.map do |icon|
185
- tfile = Tempfile.new ["icon-#{SecureRandom.hex}", '.png']
186
- @tmpfiles.push tfile
187
- FileUtils.cp icon[:path], tfile.path
188
- {
189
- :name => File.basename(icon[:path]),
190
- :path => tfile.path
191
- }
192
- end
193
- end
194
- info[:plist] = app.info
195
- app.mobileprovision.delete 'DeveloperCertificates' if app.mobileprovision
196
- info[:mobileprovision] = app.mobileprovision
197
- end
198
- ipa.cleanup
199
- info
200
- end
201
- def _base_path
202
- @base_path ||= begin
203
- path = @config['base_path'] || 'http://fir.im'
204
- path = path.strip
205
- if path.end_with? '/'
206
- path.chop
207
- else
208
- path
209
- end
210
- end
211
- end
212
- def _os
213
- return 'mac' if /darwin/ =~ RUBY_PLATFORM
214
- return 'windows' if /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
215
- return 'linux'
216
- end
217
- def _exec(cmd, code=1)
218
- output = `#{cmd}`
219
- if $?.exitstatus != 0
220
- puts output
221
- exit code
222
- end
223
- end
224
- def _convert_settings(*settings)
225
- settings.reduce({}) do |hash, setting|
226
- key,val = setting.split('=', 2).map(&:strip)
227
- hash[key.to_sym] = val
228
- hash
229
- end
230
- end
231
- def _batch_publish(*dirs)
232
- _puts "! #{ Paint['至少需要提供一个文件夹', :red] }" if dirs.length == 0
233
- dirs.each do |dir|
234
- Dir.foreach(dir) do |_f|
235
- if _is_ipa(_f) || _is_apk(_f)
236
- _puts "> 正在发布 #{ _f }"
237
- begin
238
- publish File.join dir, _f
239
- rescue Exception => e
240
- _puts "! #{ _f } 失败:#{ e.to_s }"
241
- end
242
- end
243
- end
244
- end
245
- end
246
- end
247
- end