fir-cli 0.2.0 → 0.2.1.a

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.
@@ -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