fir-cli 1.1.5 → 1.1.7

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
  SHA1:
3
- metadata.gz: a54b86beb839fc05c906644de84e9ad608bd4af7
4
- data.tar.gz: 2a88b3488a574fd21003dfa5a36daf79c64d63fe
3
+ metadata.gz: 246352dde6de24af1e32a1e0128bcb520526537f
4
+ data.tar.gz: 5321f7bfdf10cb2863cdeefd6bc01c898e7e9b7d
5
5
  SHA512:
6
- metadata.gz: 661ab259e7b88e109e7017a1d6e80f9b6bbb186c20ba0506511fe97e4b549a039833cae765c389dc896dc6a38025d0f89e137f6db2eadfa6705823f375ae7a1d
7
- data.tar.gz: 83a661e7e9614a76bdf65d3f785575ce8178f5c2e8f7c4eaecac885c2a6251ce1d21d6344525da22853ad82e1cdec6e58cc254c0f5ba69e63aa74f1818f3b32b
6
+ metadata.gz: 9f94e52edcbd93b3f2f9e75368722bc40ff64f54a3b07bf1bf9040e721cd2ec98beedbaa1fc959b60b63eef76126b3482509e3b9d2d2b5d2a95154a2bc5c984a
7
+ data.tar.gz: 8a4e0a531bdb8a1e32a4724838479f7cf613198d1cb86e24826cb2a16b02125f04080bf7f5950f87706ef0eb80579fb4a503bc3d01c464c5b25a7468a184cf46
data/.codeclimate.yml ADDED
@@ -0,0 +1,8 @@
1
+ # Save as .codeclimate.yml (note leading .) in project root directory
2
+ languages:
3
+ Ruby: true
4
+ JavaScript: true
5
+ PHP: true
6
+ Python: true
7
+ # exclude_paths:
8
+ # - "foo/bar.rb"
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /fir-cli_tmp/
11
+ /test/build_project/
11
12
  *.bundle
12
13
  *.so
13
14
  *.o
data/CHANGELOG CHANGED
@@ -1,5 +1,15 @@
1
1
  ## 更新记录
2
2
 
3
+ ### FIR-CLI 1.1.7
4
+ - 增加符号表上传指令, `fir mapping(alias m)`
5
+ - 有一下三种方式上传符号表(目前已经支持 dSYM 和 txt 两种格式的符号表文件上传)
6
+ - 1. 指定 version 和 build 上传: `fir m <mapping file path> -P <bughd project id> -v <app version> -b <app build> -T <your api token>`
7
+ - 2. 在 publish 的时候自动上传: `fir p <app file path> -m <mapping file path> -P <bughd project id> -T <your api token>`
8
+ - 3. 在 build_ipa 的时候自动上传: `fir b <project dir> -P <bughd project id> -M -p -T <your api token>`
9
+
10
+ ### FIR-CLI 1.1.6
11
+ - 不再转换 icon
12
+
3
13
  ### FIR-CLI 1.1.5
4
14
  - 增加团队成员直接上传 app
5
15
 
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  FIR.im CLI
2
2
  ---
3
3
 
4
- [![Join the chat at https://gitter.im/FIRHQ/fir-cli](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/FIRHQ/fir-cli?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
4
  ![Build Status Images](https://travis-ci.org/FIRHQ/fir-cli.svg)
5
+ [![Code Climate](https://codeclimate.com/github/FIRHQ/fir-cli/badges/gpa.svg)](https://codeclimate.com/github/FIRHQ/fir-cli)
6
6
 
7
7
  > FIR.im CLI 可以通过指令查看, 上传, 编译应用
8
8
 
@@ -15,16 +15,19 @@ FIR.im CLI 使用 Ruby 构建,只要安装相应 ruby gem 即可:
15
15
  $ sudo gem install fir-cli
16
16
  ```
17
17
 
18
- 如果出现无法安装的现象, 请先升级下系统自带的 gem 包后再执行命令安装 fir-cli
18
+ 如果出现无法安装的现象, 请先更换 Ruby 的淘宝源(由于国内网络原因, 你懂的), 并升级下系统自带的 gem
19
19
 
20
20
  ```shell
21
- sudo gem update --system
22
- ```
21
+ sudo gem sources --remove https://rubygems.org/
22
+ sudo gem sources -a https://ruby.taobao.org/
23
+ sudo gem sources -l
24
+ *** CURRENT SOURCES ***
23
25
 
24
- 如果出现无法安装的现象, 请先升级下系统自带的 gem 包后再执行命令安装 fir-cli
26
+ https://ruby.taobao.org
27
+ # 请确保只有 ruby.taobao.org, 如果有其他的源, 请 remove 掉
25
28
 
26
- ```shell
27
29
  sudo gem update --system
30
+ sudo gem install fir-cli
28
31
  ```
29
32
 
30
33
  安装后,你可以在命令行执行指令
@@ -36,6 +39,8 @@ Commands:
36
39
  fir help # Describe available commands or one specific command.
37
40
  fir info APP_FILE_PATH # Show iOS/Android app's info, support ipa/apk file (aliases: 'i').
38
41
  fir login # Login FIR.im (aliases: 'l').
42
+ fir mapping MAPPING_FILE_PATH # Upload app's mapping file to BugHD.com (aliases: 'm').
43
+ fir me # Show current user info if user is logined (aliases: 'm').
39
44
  fir publish APP_FILE_PATH # Publish iOS/Android app to FIR.im, support ipa/apk file (aliases: 'p').
40
45
  fir upgrade # Upgrade FIR-CLI and quit (aliases: u).
41
46
  fir version # Show FIR-CLI version number and quit (aliases: v)
@@ -52,7 +57,7 @@ Options:
52
57
  ### 参数说明
53
58
 
54
59
  - `alias <short command>` 意味着可以用 alias 别名来代替该指令, 例如 `fir b`
55
- - `-T` 用户在 FIR.im 上的 token, `publish` 需要使用此参数
60
+ - `-T` 用户在 FIR.im 上的 api_token, `publish` 需要使用此参数
56
61
  - `-L` 指定 FIR-CLI 的输出 log, 默认为 STDOUT
57
62
  - `-V` Verbose, 默认为输出所有信息( INFO 和 ERROR), 如果设置 `--no-verbose`, 则只输出 ERROR 信息
58
63
  - `-q` 静默模式, 默认关闭
@@ -87,7 +92,7 @@ $ fir p path/to/application -T YOUR_FIR_TOKEN
87
92
  $ fir l
88
93
  ```
89
94
 
90
- 这时系统会提示输入用户 token, 用户 token 可在[这里](http://fir.im/user/info)查看
95
+ 这时系统会提示输入用户 token, 用户 token 可在 **[这里](http://fir.im/user/info)** 查看
91
96
 
92
97
  ```shell
93
98
  > Please enter your FIR.im token:
@@ -108,16 +113,22 @@ $ fir build_ipa path/to/project -o path/to/output
108
113
  ```
109
114
 
110
115
  ### 复杂一点
111
- ```
116
+
117
+ ```shell
112
118
  $ fir b path/to/workspace -o path/to/output -w -C Release -t allTargets GCC_PREPROCESSOR_DEFINITIONS="FOO=bar"
113
119
  ```
114
120
 
115
121
  该指令在指向的目录中,找到第一个 workspace 文件,对其进行编译。使用 `Release` 设置,编译策略为 `allTargets`,同时设置了预编译参数 `FOO`。
116
122
 
123
+ ### 编译用 CocoaPods 做依赖管理的 .ipa包
124
+
125
+ ```shell
126
+ $ fir b path/to/workspace -w -S <scheme name>
127
+ ```
117
128
  ### 一步, 从源代码到 FIR.im
118
129
  > 只需要输入 -p -T
119
130
 
120
- ```
131
+ ```shell
121
132
  $ fir build_ipa path/to/project -o path/to/output -p -T YOUR_FIR_TOKEN
122
133
  > I, [2015-02-28T23:14:33.501293 #36861] INFO -- : Building......
123
134
  > I, [2015-02-28T23:14:33.501400 #36861] INFO -- : ✈ -------------------------------------------- ✈
@@ -131,6 +142,27 @@ $ fir build_ipa path/to/project -o path/to/output -p -T YOUR_FIR_TOKEN
131
142
  > I, [2015-02-28T23:14:48.311900 #36861] INFO -- : Published succeed: http://fir.im/xxx
132
143
  ```
133
144
 
145
+ ### 上传符号表
146
+
147
+ 有以下三种方式上传符号表至 [BugHD.com](http://bughd.com) 所对应的项目, 目前已经支持 dSYM 和 txt 两种格式的符号表文件上传
148
+
149
+ > 指定 version 和 build 上传:
150
+
151
+ ```shell
152
+ $ fir m <mapping file path> -P <bughd project id> -v <app version> -b <app build> -T <your api token>
153
+ ```
154
+
155
+ > 在 publish 的时候自动上传:
156
+
157
+ ```shell
158
+ $ fir p <app file path> -m <mapping file path> -P <bughd project id> -T <your api token>
159
+ ```
160
+ > 在 build_ipa 的时候自动上传:
161
+
162
+ ```shell
163
+ $ fir b <project dir> -P <bughd project id> -M -p -T <your api token>
164
+ ```
165
+
134
166
  ## 需要帮助?
135
167
 
136
168
  输入以下指令获取全面功能介绍
@@ -140,7 +172,7 @@ $ fir -h
140
172
  $ fir publish -h
141
173
  ```
142
174
 
143
- 如果还有疑问随时发邮件至[fir-cli](mailto: hi@fir.im)
175
+ 如果还有疑问随时发邮件至 [fir-cli](mailto: dev@fir.im)
144
176
 
145
177
  ## 永远使用最新功能
146
178
 
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
+ require File.expand_path('../test/test_helper', __FILE__)
2
3
 
3
4
  desc "Run the tests."
4
5
  task :test do
5
6
  $: << "lib" << "test"
6
- Dir["test/*_test.rb"].each { |f| require f[5..-1] }
7
+ Dir["test/*_test.rb"].each { |f| require f[5..-4] }
7
8
  end
8
9
 
9
- task :default => :test
10
-
10
+ task default: :test
data/fir-cli.gemspec CHANGED
@@ -28,18 +28,22 @@ Gem::Specification.new do |spec|
28
28
  /_/ /___/_/ |_| \____/_____/___/
29
29
 
30
30
  ## 更新记录
31
- ### FIR-CLI 1.1.5
31
+ ### FIR-CLI 1.1.7
32
32
  - 完全兼容新版 API ✔
33
33
  - 请使用新版 API Token
34
34
  - 新版 API Token 查看地址: `http://fir.im/user/info`
35
- - 增加 `fir me` 指令查看当前登录用户
36
- - 增加团队成员直接上传 app
35
+ - 增加符号表上传指令, `fir mapping(alias m)`
36
+ - 有以下三种方式上传符号表(目前已经支持 dSYM 和 txt 两种格式的符号表文件上传)
37
+ - 1. 指定 version 和 build 上传: `fir m <mapping file path> -P <bughd project id> -v <app version> -b <app build> -T <your api token>`
38
+ - 2. 在 publish 的时候自动上传: `fir p <app file path> -m <mapping file path> -P <bughd project id> -T <your api token>`
39
+ - 3. 在 build_ipa 的时候自动上传: `fir b <project dir> -P <bughd project id> -M -p -T <your api token>`
37
40
  - https://github.com/FIRHQ/fir-cli
38
41
  )
39
42
 
40
43
  spec.add_development_dependency "bundler", "~> 1.7"
41
44
  spec.add_development_dependency "rake", "~> 10.0"
42
45
  spec.add_development_dependency "minitest", "~> 5.7"
46
+ spec.add_development_dependency "pry", "~> 0.10"
43
47
 
44
48
  spec.add_dependency "thor", "~> 0.19"
45
49
  spec.add_dependency "CFPropertyList", "~> 2.3"
data/lib/fir/api.yml CHANGED
@@ -1,5 +1,11 @@
1
- domain: 'http://fir.im'
2
- base_url: 'http://api.fir.im'
3
- user_url: 'http://api.fir.im/user'
4
- app_url: 'http://api.fir.im/apps'
5
- udids_url: 'http://api.fir.im/devices/multi_udid'
1
+ fir:
2
+ domain: 'http://fir.im'
3
+ base_url: 'http://api.fir.im'
4
+ user_url: 'http://api.fir.im/user'
5
+ app_url: 'http://api.fir.im/apps'
6
+ udids_url: 'http://api.fir.im/devices/multi_udid'
7
+ bughd:
8
+ domain: 'http://bughd.com'
9
+ base_url: 'http://api.bughd.com'
10
+ project_url: 'http://api.bughd.com/projects'
11
+ full_version_url: 'http://api.bughd.com/full_versions'
data/lib/fir/cli.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module FIR
4
4
  class CLI < Thor
5
- class_option :token, type: :string, aliases: "-T", desc: "User's api_token at FIR.im"
5
+ class_option :token, type: :string, aliases: "-T", desc: "User's API Token at FIR.im"
6
6
  class_option :logfile, type: :string, aliases: "-L", desc: "Path to writable logfile"
7
7
  class_option :verbose, type: :boolean, aliases: "-V", desc: "Show verbose", default: true
8
8
  class_option :quiet, type: :boolean, aliases: "-q", desc: "Silence commands"
@@ -16,9 +16,11 @@ module FIR
16
16
 
17
17
  Example:
18
18
 
19
- $ fir b <project dir> [-C <configuration>] [-t <target name>] [-o <ipa output dir>] [settings] [-c <changelog>] [-p -T <your token>]
19
+ $ fir b <project dir> [-C <configuration>] [-t <target name>] [-o <ipa output dir>] [settings] [-c <changelog>] [-p -T <your api token>]
20
20
 
21
- $ fir b <workspace dir> -w -S <scheme name> [-C <configuration>] [-t <target name>] [-o <ipa output dir>] [settings] [-c <changelog>] [-p -T <your token>]
21
+ $ fir b <project dir> [-c <changelog> -P <bughd project id> -M -p -T <your api token>]
22
+
23
+ $ fir b <workspace dir> -w -S <scheme name> [-C <configuration>] [-t <target name>] [-o <ipa output dir>] [settings] [-c <changelog>] [-p -T <your api token>]
22
24
  LONGDESC
23
25
  map ["b", "build"] => :build_ipa
24
26
  method_option :workspace, type: :boolean, aliases: "-w", desc: "true/false if build workspace"
@@ -30,6 +32,8 @@ module FIR
30
32
  method_option :publish, type: :boolean, aliases: "-p", desc: "true/false if publish to FIR.im"
31
33
  method_option :short, type: :string, aliases: "-s", desc: "Set custom short link if publish to FIR.im"
32
34
  method_option :changelog, type: :string, aliases: "-c", desc: "Set changelog if publish to FIR.im"
35
+ method_option :mapping, type: :boolean, aliases: "-M", desc: "true/false if upload app's mapping file to BugHD.com"
36
+ method_option :proj, type: :string, aliases: "-P", desc: "Project id in BugHD.com if upload app's mapping file"
33
37
  def build_ipa *args
34
38
  prepare :build_ipa
35
39
 
@@ -46,9 +50,19 @@ module FIR
46
50
  end
47
51
 
48
52
  desc "publish APP_FILE_PATH", "Publish iOS/Android app to FIR.im, support ipa/apk file (aliases: 'p')."
53
+ long_desc <<-LONGDESC
54
+ `publish` command will publish your app file to FIR.im, also the command support to publish app's short & changelog.
55
+
56
+ Example:
57
+
58
+ $ fir p <app file path> [-c <changelog> -s <custom short link> -T <your api token>]
59
+ $ fir p <app file path> [-c <changelog> -s <custom short link> -m <mapping file path> -P <bughd project id> -T <your api token>]
60
+ LONGDESC
49
61
  map "p" => :publish
50
- method_option :short, type: :string, aliases: "-s", desc: "Set custom short link"
51
- method_option :changelog, type: :string, aliases: "-c", desc: "Set changelog"
62
+ method_option :short, type: :string, aliases: "-s", desc: "Set custom short link"
63
+ method_option :changelog, type: :string, aliases: "-c", desc: "Set changelog"
64
+ method_option :mappingfile, type: :string, aliases: "-m", desc: "App's mapping file"
65
+ method_option :proj, type: :string, aliases: "-P", desc: "Project id in BugHD.com if upload app's mapping file"
52
66
  def publish *args
53
67
  prepare :publish
54
68
 
@@ -60,18 +74,35 @@ module FIR
60
74
  def login *args
61
75
  prepare :login
62
76
 
63
- token = options[:token] || args.first || ask("Please enter your FIR.im token:", :white, echo: true)
77
+ token = options[:token] || args.first || ask("Please enter your FIR.im API Token:", :white, echo: true)
64
78
  FIR.login(token)
65
79
  end
66
80
 
67
- desc "me", "Show current user info if user is logined (aliases: 'm')."
68
- map "m" => :me
81
+ desc "me", "Show current user info if user is logined."
69
82
  def me *args
70
83
  prepare :me
71
84
 
72
85
  FIR.me
73
86
  end
74
87
 
88
+ desc "mapping MAPPING_FILE_PATH", "Upload app's mapping file to BugHD.com (aliases: 'm')."
89
+ long_desc <<-LONGDESC
90
+ `mapping` command will upload your app's mapping file to BugHD.com if you have the same app/project in BugHD.com.
91
+
92
+ Example:
93
+
94
+ $ fir m <mapping file path> -P <bughd project id> -v <app version> -b <app build> -T <your fir api token>
95
+ LONGDESC
96
+ map "m" => :mapping
97
+ method_option :proj, type: :string, aliases: "-P", desc: "Project id in BugHD.com"
98
+ method_option :version, type: :string, aliases: "-v", desc: "App version"
99
+ method_option :build, type: :string, aliases: "-b", desc: "App build"
100
+ def mapping *args
101
+ prepare :mapping
102
+
103
+ FIR.mapping(*args, options)
104
+ end
105
+
75
106
  desc "upgrade", "Upgrade FIR-CLI and quit (aliases: u)."
76
107
  map "u" => :upgrade
77
108
  def upgrade
@@ -0,0 +1,144 @@
1
+ # encoding: utf-8
2
+
3
+ module ActiveSupport
4
+ # A typical module looks like this:
5
+ #
6
+ # module M
7
+ # def self.included(base)
8
+ # base.extend ClassMethods
9
+ # base.class_eval do
10
+ # scope :disabled, -> { where(disabled: true) }
11
+ # end
12
+ # end
13
+ #
14
+ # module ClassMethods
15
+ # ...
16
+ # end
17
+ # end
18
+ #
19
+ # By using <tt>ActiveSupport::Concern</tt> the above module could instead be
20
+ # written as:
21
+ #
22
+ # require 'active_support/concern'
23
+ #
24
+ # module M
25
+ # extend ActiveSupport::Concern
26
+ #
27
+ # included do
28
+ # scope :disabled, -> { where(disabled: true) }
29
+ # end
30
+ #
31
+ # class_methods do
32
+ # ...
33
+ # end
34
+ # end
35
+ #
36
+ # Moreover, it gracefully handles module dependencies. Given a +Foo+ module
37
+ # and a +Bar+ module which depends on the former, we would typically write the
38
+ # following:
39
+ #
40
+ # module Foo
41
+ # def self.included(base)
42
+ # base.class_eval do
43
+ # def self.method_injected_by_foo
44
+ # ...
45
+ # end
46
+ # end
47
+ # end
48
+ # end
49
+ #
50
+ # module Bar
51
+ # def self.included(base)
52
+ # base.method_injected_by_foo
53
+ # end
54
+ # end
55
+ #
56
+ # class Host
57
+ # include Foo # We need to include this dependency for Bar
58
+ # include Bar # Bar is the module that Host really needs
59
+ # end
60
+ #
61
+ # But why should +Host+ care about +Bar+'s dependencies, namely +Foo+? We
62
+ # could try to hide these from +Host+ directly including +Foo+ in +Bar+:
63
+ #
64
+ # module Bar
65
+ # include Foo
66
+ # def self.included(base)
67
+ # base.method_injected_by_foo
68
+ # end
69
+ # end
70
+ #
71
+ # class Host
72
+ # include Bar
73
+ # end
74
+ #
75
+ # Unfortunately this won't work, since when +Foo+ is included, its <tt>base</tt>
76
+ # is the +Bar+ module, not the +Host+ class. With <tt>ActiveSupport::Concern</tt>,
77
+ # module dependencies are properly resolved:
78
+ #
79
+ # require 'active_support/concern'
80
+ #
81
+ # module Foo
82
+ # extend ActiveSupport::Concern
83
+ # included do
84
+ # def self.method_injected_by_foo
85
+ # ...
86
+ # end
87
+ # end
88
+ # end
89
+ #
90
+ # module Bar
91
+ # extend ActiveSupport::Concern
92
+ # include Foo
93
+ #
94
+ # included do
95
+ # self.method_injected_by_foo
96
+ # end
97
+ # end
98
+ #
99
+ # class Host
100
+ # include Bar # It works, now Bar takes care of its dependencies
101
+ # end
102
+ module Concern
103
+ class MultipleIncludedBlocks < StandardError #:nodoc:
104
+ def initialize
105
+ super "Cannot define multiple 'included' blocks for a Concern"
106
+ end
107
+ end
108
+
109
+ def self.extended(base) #:nodoc:
110
+ base.instance_variable_set(:@_dependencies, [])
111
+ end
112
+
113
+ def append_features(base)
114
+ if base.instance_variable_defined?(:@_dependencies)
115
+ base.instance_variable_get(:@_dependencies) << self
116
+ return false
117
+ else
118
+ return false if base < self
119
+ @_dependencies.each { |dep| base.send(:include, dep) }
120
+ super
121
+ base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
122
+ base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
123
+ end
124
+ end
125
+
126
+ def included(base = nil, &block)
127
+ if base.nil?
128
+ raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block)
129
+
130
+ @_included_block = block
131
+ else
132
+ super
133
+ end
134
+ end
135
+
136
+ def class_methods(&class_methods_module_definition)
137
+ mod = const_defined?(:ClassMethods, false) ?
138
+ const_get(:ClassMethods) :
139
+ const_set(:ClassMethods, Module.new)
140
+
141
+ mod.module_eval(&class_methods_module_definition)
142
+ end
143
+ end
144
+ end
@@ -197,3 +197,22 @@ class Hash
197
197
  end
198
198
  end
199
199
  end
200
+
201
+ class File
202
+
203
+ class << self
204
+ # A binary file is Mach-O dSYM
205
+ #
206
+ # @return [true, false]
207
+ def is_dsym? file_path
208
+ !!(`file -b #{file_path}` =~ /dSYM/)
209
+ end
210
+
211
+ # A file is ASCII text
212
+ #
213
+ # @return [true, false]
214
+ def is_txt? file_path
215
+ !!(`file -b #{file_path}` =~ /text/)
216
+ end
217
+ end
218
+ end
data/lib/fir/patches.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require_relative './patches/concern'
3
4
  require_relative './patches/native_patch'
4
5
  require_relative './patches/os_patch'
5
- require_relative './patches/parser_patch'