flappy-cli 0.3.0

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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +2 -0
  8. data/bin/console +14 -0
  9. data/bin/flappy +14 -0
  10. data/bin/setup +8 -0
  11. data/flappy-cli.gemspec +50 -0
  12. data/lib/flappy/api.yml +7 -0
  13. data/lib/flappy/cli.rb +145 -0
  14. data/lib/flappy/patches/blank.rb +131 -0
  15. data/lib/flappy/patches/concern.rb +146 -0
  16. data/lib/flappy/patches/default_headers.rb +9 -0
  17. data/lib/flappy/patches/hash.rb +79 -0
  18. data/lib/flappy/patches/instance_variables.rb +30 -0
  19. data/lib/flappy/patches/native_patch.rb +28 -0
  20. data/lib/flappy/patches/os_patch.rb +28 -0
  21. data/lib/flappy/patches/try.rb +102 -0
  22. data/lib/flappy/patches.rb +12 -0
  23. data/lib/flappy/util/archive_ipa.rb +55 -0
  24. data/lib/flappy/util/build_apk.rb +104 -0
  25. data/lib/flappy/util/build_common.rb +90 -0
  26. data/lib/flappy/util/build_ipa.rb +331 -0
  27. data/lib/flappy/util/config.rb +41 -0
  28. data/lib/flappy/util/http.rb +30 -0
  29. data/lib/flappy/util/iOS_check.rb +29 -0
  30. data/lib/flappy/util/iOS_env_config.rb +54 -0
  31. data/lib/flappy/util/iOS_logger.rb +113 -0
  32. data/lib/flappy/util/info.rb +39 -0
  33. data/lib/flappy/util/ipa_info.rb +198 -0
  34. data/lib/flappy/util/mapping.rb +84 -0
  35. data/lib/flappy/util/multi_io.rb +27 -0
  36. data/lib/flappy/util/parser/apk.rb +42 -0
  37. data/lib/flappy/util/parser/bin/pngcrush +0 -0
  38. data/lib/flappy/util/parser/common.rb +24 -0
  39. data/lib/flappy/util/parser/pngcrush.rb +23 -0
  40. data/lib/flappy/util/publish.rb +185 -0
  41. data/lib/flappy/util/update_pod.rb +264 -0
  42. data/lib/flappy/util.rb +105 -0
  43. data/lib/flappy/version.rb +3 -0
  44. data/lib/flappy-cli.rb +3 -0
  45. data/lib/flappy.rb +28 -0
  46. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000308/20170103000308_WorkspaceForPackageTest.json +1 -0
  47. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000308/20170103000308_WorkspaceForPackageTest_Podfile +16 -0
  48. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000308/20170103000308_WorkspaceForPackageTest_Podfile_lock +40 -0
  49. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000314/20170103000314_WorkspaceForPackageTest.json +1 -0
  50. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000314/20170103000314_WorkspaceForPackageTest_Podfile +16 -0
  51. data/output/Flappy-Archives/iOS/WorkspaceForPackageTest/20170103000314/20170103000314_WorkspaceForPackageTest_Podfile_lock +40 -0
  52. metadata +223 -0
@@ -0,0 +1,264 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ module Flappy
5
+ module UpdatePod
6
+ def update_pod_if_needed(args, options)
7
+ @podfile_path = check_and_find_podfile
8
+ spec_hash_podfile = read_podfile
9
+
10
+ pod_cmd = initialize_pod_cmd(args, options)
11
+ unless pod_cmd.blank?
12
+ log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Updating pods......')
13
+ log_iOS("pod cmd: #{pod_cmd}")
14
+
15
+ log_iOS_pod(pod_cmd)
16
+ if $?.to_i != 0
17
+ log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Pod update failed')
18
+ exit 1
19
+ else
20
+ log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Pod update succeed')
21
+ end
22
+ end
23
+
24
+ @podfile_lock_path = check_and_find_podfile_lock
25
+ spec_hash_podfile_lock = read_podfile_lock
26
+
27
+ merge_spec_hash(spec_hash_podfile, spec_hash_podfile_lock)
28
+ save_spec_hash_to_file
29
+ save_pod_file_and_lock
30
+ end
31
+
32
+ def save_spec_hash_to_file
33
+ @spec_hash_file_path = File.join(@app_output_archive_info_path, "#{@start_time}_#{@app_dir_name}_Pod_json")
34
+ File.write(@spec_hash_file_path, @spec_hash) unless @spec_hash.blank?
35
+ end
36
+
37
+ def save_pod_file_and_lock
38
+ @dest_pod_file_path = File.join(@app_output_archive_info_path, "#{@start_time}_#{@app_dir_name}_Podfile")
39
+ FileUtils.cp_r(@podfile_path, @dest_pod_file_path) if File.exists?(@podfile_path)
40
+
41
+ @dest_pod_file_lock_path = File.join(@app_output_archive_info_path, "#{@start_time}_#{@app_dir_name}_Podfile_lock")
42
+ FileUtils.cp_r(@podfile_lock_path, @dest_pod_file_lock_path) if File.exists?(@podfile_lock_path)
43
+ end
44
+
45
+
46
+ def merge_spec_hash(spec_hash_podfile, spec_hash_podfile_lock)
47
+ if spec_hash_podfile.blank? || spec_hash_podfile_lock.blank?
48
+ return
49
+ end
50
+ spec_hash_podfile.each do |key_podfile, value_podfile|
51
+ spec_hash_podfile_lock.each do |key_podfile_lock, value_podfile_lock|
52
+ if key_podfile == key_podfile_lock
53
+ spec_hash_merged = value_podfile.merge(value_podfile_lock)
54
+ spec_hash_podfile.store(key_podfile, spec_hash_merged)
55
+ break
56
+ end
57
+ end
58
+ end
59
+
60
+ log_iOS("spec_hash: \n#{spec_hash_podfile}")
61
+ @spec_hash = spec_hash_podfile
62
+ end
63
+
64
+ def initialize_pod_cmd(args, options)
65
+ pod_cmd = ''
66
+
67
+ unless @podfile_path.blank?
68
+ pod_work_dir = File.dirname(@podfile_path)
69
+
70
+ if options[:'update-pod'] || options[:'only-update-souche-pod']
71
+ pod_cmd = "cd #{pod_work_dir}; "
72
+
73
+ if options[:'only-update-souche-pod']
74
+ repo_cmd = update_pod_repos(args, options)
75
+ pod_cmd += repo_cmd unless repo_cmd.blank?
76
+
77
+ # pod repo update之后pod update之前
78
+ if options[:'pod-env-test']
79
+ pod_cmd += "pod_env_test=1 "
80
+ end
81
+
82
+ pod_cmd += "pod update --no-repo-update --verbose"
83
+ else
84
+ # pod repo update之后pod update之前
85
+ if options[:'pod-env-test']
86
+ pod_cmd += "pod_env_test=1 "
87
+ end
88
+
89
+ if options[:'no-repo-update']
90
+ pod_cmd += "pod update --no-repo-update --verbose"
91
+ else
92
+ pod_cmd += "pod update --verbose"
93
+ end
94
+ end
95
+ end
96
+
97
+
98
+ else
99
+ log_iOS('podfile path is empty')
100
+ end
101
+
102
+ pod_cmd
103
+ end
104
+
105
+ ################### read
106
+ def read_podfile
107
+ if @podfile_path.blank?
108
+ return
109
+ end
110
+
111
+ spec_hash = {}
112
+ File.foreach(@podfile_path).with_index do |line, line_num|
113
+ # 突出显示打印匹配的部分
114
+ # puts line.gsub(/^pod .*'$/) { |str| "<<#{str}>>" }
115
+ # 打印匹配的部分
116
+ # line.gsub(/^pod .*'$/) { |str| puts "#{str}" }
117
+ # puts line.scan(/^pod .*'$/)
118
+
119
+ line_trim = line.gsub(/\s+/, "") unless line.blank?
120
+ # matched_string = line_trim.scan(/^pod.*'$/)[0] unless line_trim.blank?
121
+
122
+ matched_list = line_trim.scan(/^pod.*'$/) unless line_trim.blank?
123
+ unless matched_list.nil?
124
+ matched_string = matched_list[0] if matched_list.count > 0
125
+ end
126
+
127
+ unless matched_string.blank?
128
+ name_version = matched_string.split(/'(.*?)'/)
129
+ spec_name = name_version[1]
130
+ podfile_spec_version = name_version[3]
131
+
132
+ unless spec_name.blank?
133
+ version_hash = {}
134
+ unless podfile_spec_version.blank?
135
+ version_hash.store('Podfile', podfile_spec_version)
136
+ else
137
+ version_hash.store('Podfile', '')
138
+ end
139
+ spec_hash.store(spec_name, version_hash)
140
+ end
141
+ end
142
+ end
143
+
144
+ spec_hash
145
+ end
146
+
147
+ def read_podfile_lock
148
+ if @podfile_lock_path.blank?
149
+ return
150
+ end
151
+
152
+ textfile = "#{Dir.tmpdir}/podfile_lock_#{Time.now.strftime('%Y%m%d%H%M%S')}.txt"
153
+ podfile_lock = File.read(@podfile_lock_path)
154
+ File.open(textfile, "w") do |f|
155
+ in_header = true
156
+ podfile_lock.each_line do |line|
157
+ if in_header && /PODS:/ !~ line
158
+ next
159
+ else
160
+ in_header = false
161
+ end
162
+
163
+ break if /DEPENDENCIES:/ =~ line
164
+
165
+ f.write line
166
+ end
167
+ end
168
+
169
+ spec_hash = {}
170
+ if File.exists?(textfile)
171
+ File.foreach(textfile).with_index do |line|
172
+ unless line.blank?
173
+ matched_list = line.scan(/^ - .*$/) unless line.blank?
174
+ unless matched_list.nil?
175
+ matched_string = matched_list[0] if matched_list.count > 0
176
+
177
+ unless matched_string.blank?
178
+ spec_name = matched_string.split(/ - (.*?) \(/)[1]
179
+ podfile_lock_spec_version = matched_string.split(/ \((.*?)\)/)[1]
180
+
181
+ unless spec_name.blank?
182
+ version_hash = {}
183
+ unless podfile_lock_spec_version.blank?
184
+ version_hash.store('Podfile.lock', podfile_lock_spec_version)
185
+ else
186
+ version_hash.store('Podfile.lock', '')
187
+ end
188
+ spec_hash.store(spec_name, version_hash)
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+
196
+ FileUtils.rm_rf(textfile)
197
+
198
+ spec_hash
199
+ end
200
+
201
+ ################### check
202
+ def check_and_find_podfile
203
+ podfile_path = ''
204
+
205
+ Dir.glob("#{@work_dir}/**/[Pp]odfile").each do |name|
206
+ unless File.directory?(name)
207
+ podfile_path = name
208
+ end
209
+ end
210
+
211
+ if podfile_path.blank?
212
+ log_iOS('No Podfile Found')
213
+ else
214
+ log_iOS("Found Podfile: #{podfile_path}")
215
+ end
216
+
217
+ podfile_path
218
+ end
219
+
220
+ def check_and_find_podfile_lock
221
+ podfile_lock_path = ''
222
+
223
+ Dir.glob("#{@work_dir}/**/[Pp]odfile.lock").each do |name|
224
+ unless File.directory?(name)
225
+ podfile_lock_path = name
226
+ end
227
+ end
228
+
229
+ if podfile_lock_path.blank?
230
+ log_iOS('No Podfile.lock Found')
231
+ else
232
+ log_iOS("Found Podfile.lock: #{podfile_lock_path}")
233
+ end
234
+
235
+ podfile_lock_path
236
+ end
237
+
238
+
239
+ def update_pod_repos(args, options)
240
+ if options[:'only-update-souche-pod']
241
+ repos_to_update = []
242
+ repo_path = File.expand_path("~/.cocoapods/repos")
243
+ Dir.glob(repo_path + "/*").each do |name| # 一层
244
+ if File.directory?(name)
245
+ basename = File.basename(name)
246
+ if basename != "master" && basename != ".DS_Store"
247
+ repos_to_update << basename
248
+ end
249
+ end
250
+ end
251
+ log_iOS("repos_to_update: #{repos_to_update}")
252
+
253
+ repo_cmd = ''
254
+ repos_to_update.each { |repo|
255
+ repo_cmd += "pod repo update --verbose #{repo}; " # 只更新souche repo
256
+ }
257
+ else
258
+ repo_cmd = "pod repo update --verbose"
259
+ end
260
+
261
+ repo_cmd
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,105 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative './util/http'
4
+ require_relative './util/config'
5
+ require_relative './util/parser/apk'
6
+ # require_relative './util/parser/ipa'
7
+ require_relative './util/parser/pngcrush'
8
+ # require_relative './util/login'
9
+ # require_relative './util/me'
10
+ require_relative './util/info'
11
+ require_relative './util/build_common'
12
+ require_relative './util/build_apk'
13
+ require_relative './util/publish'
14
+ require_relative './util/mapping'
15
+
16
+ require_relative './util/build_ipa'
17
+ require_relative './util/update_pod'
18
+ require_relative './util/archive_ipa'
19
+ require_relative './util/ipa_info'
20
+ require_relative './util/iOS_env_config'
21
+ require_relative './util/iOS_check'
22
+ require_relative './util/iOS_logger'
23
+ require_relative './util/multi_io'
24
+
25
+ module Flappy
26
+ module Util
27
+ extend ActiveSupport::Concern
28
+
29
+ module ClassMethods
30
+ include Flappy::Http
31
+ include Flappy::Config
32
+ # include FIR::Login
33
+ # include FIR::Me
34
+ include Flappy::Info
35
+ include Flappy::BuildCommon
36
+ # include FIR::BuildIpa
37
+ include Flappy::BuildApk
38
+ include Flappy::Publish
39
+ include Flappy::Mapping
40
+
41
+ include Flappy::BuildIpa
42
+ include Flappy::UpdatePod
43
+ include Flappy::ArchiveIpa
44
+ include Flappy::IpaInfo
45
+ include Flappy::IOSEnvConfig
46
+ include Flappy::IOSChecking
47
+ include Flappy::MultiIO
48
+ include Flappy::IOSLogger
49
+
50
+
51
+ attr_accessor :logger
52
+
53
+ def fetch_user_info(token)
54
+ get fir_api[:user_url], api_token: token
55
+ end
56
+
57
+ # def fetch_user_uuid(token)
58
+ # user_info = fetch_user_info(token)
59
+ # user_info[:uuid]
60
+ # end
61
+
62
+ def check_file_exist(path)
63
+ return if File.file?(path)
64
+
65
+ logger.error 'File does not exist'
66
+ exit 1
67
+ end
68
+
69
+ def check_supported_file(path)
70
+ return if APP_FILE_TYPE.include?(File.extname(path))
71
+
72
+ logger.error 'Unsupported file type'
73
+ exit 1
74
+ end
75
+
76
+ def check_token_cannot_be_blank(token)
77
+ return unless token.blank?
78
+
79
+ logger.error 'Token can not be blank'
80
+ exit 1
81
+ end
82
+
83
+ def check_logined
84
+ return unless current_token.blank?
85
+
86
+ logger.error 'Please use `fir login` first'
87
+ exit 1
88
+ end
89
+
90
+ def logger_info_blank_line
91
+ logger.info 'flappy completed!'
92
+ end
93
+
94
+ def logger_info_dividing_line
95
+ logger.info '✈ -------------------------------------------- ✈'
96
+ end
97
+
98
+ def generate_rqrcode(string, png_file_path)
99
+ qrcode = ::RQRCode::QRCode.new(string.to_s)
100
+ qrcode.as_png(size: 500, border_modules: 2, file: png_file_path)
101
+ png_file_path
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,3 @@
1
+ module Flappy
2
+ VERSION = '0.3.0'
3
+ end
data/lib/flappy-cli.rb ADDED
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ # This file exists for backward compatbility with require 'fir-cli'
3
+ require_relative './flappy'
data/lib/flappy.rb ADDED
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ require 'thor'
4
+ require 'logger'
5
+ require 'yaml'
6
+ require 'rest-client'
7
+ require 'json'
8
+ require 'securerandom'
9
+ require 'fileutils'
10
+ require 'cfpropertylist'
11
+ require 'tempfile'
12
+ require 'rqrcode'
13
+
14
+ # TODO: remove rescue when https://github.com/tajchert/ruby_apk/pull/4 merged
15
+ begin
16
+ require 'ruby_android'
17
+ rescue LoadError
18
+ require 'ruby_apk'
19
+ end
20
+
21
+ require 'flappy/patches'
22
+ require 'flappy/util'
23
+ require 'flappy/version'
24
+ require 'flappy/cli'
25
+
26
+ module Flappy
27
+ include Util
28
+ end
@@ -0,0 +1 @@
1
+ {"AFNetworking"=>{"Podfile"=>"~>3.0", "Podfile.lock"=>"3.1.0"}, "Masonry"=>{"Podfile"=>"0.6.4", "Podfile.lock"=>"0.6.4"}, "MJExtension"=>{"Podfile"=>"3.0.11", "Podfile.lock"=>"3.0.11"}, "FMDB"=>{"Podfile"=>"2.6.2", "Podfile.lock"=>"2.6.2"}, "SCCURLConfig"=>{"Podfile"=>"0.4.8.5", "Podfile.lock"=>"0.4.8.5"}}
@@ -0,0 +1,16 @@
1
+ source 'https://github.com/CocoaPods/Specs.git'
2
+ source 'http://git.souche.com/geliang/cheniu_pod.git'
3
+
4
+ platform :ios, '8.0'
5
+
6
+ target 'WorkspaceForPackageTest' do
7
+
8
+
9
+ pod 'AFNetworking', '~> 3.0'
10
+ pod 'Masonry', '0.6.4'
11
+ pod 'MJExtension', '3.0.11'
12
+ pod 'FMDB', '2.6.2'
13
+ pod 'SCCURLConfig', '0.4.8.5'
14
+
15
+
16
+ end
@@ -0,0 +1,40 @@
1
+ PODS:
2
+ - AFNetworking (3.1.0):
3
+ - AFNetworking/NSURLSession (= 3.1.0)
4
+ - AFNetworking/Reachability (= 3.1.0)
5
+ - AFNetworking/Security (= 3.1.0)
6
+ - AFNetworking/Serialization (= 3.1.0)
7
+ - AFNetworking/UIKit (= 3.1.0)
8
+ - AFNetworking/NSURLSession (3.1.0):
9
+ - AFNetworking/Reachability
10
+ - AFNetworking/Security
11
+ - AFNetworking/Serialization
12
+ - AFNetworking/Reachability (3.1.0)
13
+ - AFNetworking/Security (3.1.0)
14
+ - AFNetworking/Serialization (3.1.0)
15
+ - AFNetworking/UIKit (3.1.0):
16
+ - AFNetworking/NSURLSession
17
+ - FMDB (2.6.2):
18
+ - FMDB/standard (= 2.6.2)
19
+ - FMDB/standard (2.6.2)
20
+ - Masonry (0.6.4)
21
+ - MJExtension (3.0.11)
22
+ - SCCURLConfig (0.4.8.5)
23
+
24
+ DEPENDENCIES:
25
+ - AFNetworking (~> 3.0)
26
+ - FMDB (= 2.6.2)
27
+ - Masonry (= 0.6.4)
28
+ - MJExtension (= 3.0.11)
29
+ - SCCURLConfig (= 0.4.8.5)
30
+
31
+ SPEC CHECKSUMS:
32
+ AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
33
+ FMDB: 854a0341b4726e53276f2a8996f06f1b80f9259a
34
+ Masonry: 281802d04d787ea2973179ee8bcb50500579ede2
35
+ MJExtension: f9ae6ddc0f1c482c3c9af750280ccebd14381958
36
+ SCCURLConfig: 257b8923164231055ac482cbcabe6865a103770b
37
+
38
+ PODFILE CHECKSUM: 66906aca3cbb847c6bfefb70f7dff1a6d7552c31
39
+
40
+ COCOAPODS: 1.1.1
@@ -0,0 +1 @@
1
+ {"AFNetworking"=>{"Podfile"=>"~>3.0", "Podfile.lock"=>"3.1.0"}, "Masonry"=>{"Podfile"=>"0.6.4", "Podfile.lock"=>"0.6.4"}, "MJExtension"=>{"Podfile"=>"3.0.11", "Podfile.lock"=>"3.0.11"}, "FMDB"=>{"Podfile"=>"2.6.2", "Podfile.lock"=>"2.6.2"}, "SCCURLConfig"=>{"Podfile"=>"0.4.8.5", "Podfile.lock"=>"0.4.8.5"}}
@@ -0,0 +1,16 @@
1
+ source 'https://github.com/CocoaPods/Specs.git'
2
+ source 'http://git.souche.com/geliang/cheniu_pod.git'
3
+
4
+ platform :ios, '8.0'
5
+
6
+ target 'WorkspaceForPackageTest' do
7
+
8
+
9
+ pod 'AFNetworking', '~> 3.0'
10
+ pod 'Masonry', '0.6.4'
11
+ pod 'MJExtension', '3.0.11'
12
+ pod 'FMDB', '2.6.2'
13
+ pod 'SCCURLConfig', '0.4.8.5'
14
+
15
+
16
+ end
@@ -0,0 +1,40 @@
1
+ PODS:
2
+ - AFNetworking (3.1.0):
3
+ - AFNetworking/NSURLSession (= 3.1.0)
4
+ - AFNetworking/Reachability (= 3.1.0)
5
+ - AFNetworking/Security (= 3.1.0)
6
+ - AFNetworking/Serialization (= 3.1.0)
7
+ - AFNetworking/UIKit (= 3.1.0)
8
+ - AFNetworking/NSURLSession (3.1.0):
9
+ - AFNetworking/Reachability
10
+ - AFNetworking/Security
11
+ - AFNetworking/Serialization
12
+ - AFNetworking/Reachability (3.1.0)
13
+ - AFNetworking/Security (3.1.0)
14
+ - AFNetworking/Serialization (3.1.0)
15
+ - AFNetworking/UIKit (3.1.0):
16
+ - AFNetworking/NSURLSession
17
+ - FMDB (2.6.2):
18
+ - FMDB/standard (= 2.6.2)
19
+ - FMDB/standard (2.6.2)
20
+ - Masonry (0.6.4)
21
+ - MJExtension (3.0.11)
22
+ - SCCURLConfig (0.4.8.5)
23
+
24
+ DEPENDENCIES:
25
+ - AFNetworking (~> 3.0)
26
+ - FMDB (= 2.6.2)
27
+ - Masonry (= 0.6.4)
28
+ - MJExtension (= 3.0.11)
29
+ - SCCURLConfig (= 0.4.8.5)
30
+
31
+ SPEC CHECKSUMS:
32
+ AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
33
+ FMDB: 854a0341b4726e53276f2a8996f06f1b80f9259a
34
+ Masonry: 281802d04d787ea2973179ee8bcb50500579ede2
35
+ MJExtension: f9ae6ddc0f1c482c3c9af750280ccebd14381958
36
+ SCCURLConfig: 257b8923164231055ac482cbcabe6865a103770b
37
+
38
+ PODFILE CHECKSUM: 66906aca3cbb847c6bfefb70f7dff1a6d7552c31
39
+
40
+ COCOAPODS: 1.1.1