fastlane_core 0.36.8 → 0.36.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane_core/configuration/config_item.rb +1 -1
- data/lib/fastlane_core/configuration/configuration.rb +7 -3
- data/lib/fastlane_core/configuration/configuration_file.rb +7 -4
- data/lib/fastlane_core/print_table.rb +37 -12
- data/lib/fastlane_core/project.rb +23 -8
- data/lib/fastlane_core/simulator.rb +38 -9
- data/lib/fastlane_core/string_filters.rb +34 -0
- data/lib/fastlane_core/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb03c52b6d68f1d13b5470c5921b9dbe50b88053
|
4
|
+
data.tar.gz: 85e09706d35029e07617b279fb6bc8b724fd98c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93150dbe3b09b674fc298418aed928a461e1ed5b3328d3e1c5a1d9b41396970399419961c4adebfebc13ff579c813f651a3de616e43d0fb8140ce2daea096bb7
|
7
|
+
data.tar.gz: 78dfc200e172ba6ade3ce3eed598e503aac40ec6eaeafebbb23b158224e1bf30fa3f10595e00e8b6147a1d77782b0fd1185dd8fcf997d551d8140a873a45dea4
|
@@ -91,7 +91,7 @@ module FastlaneCore
|
|
91
91
|
return value.to_f
|
92
92
|
else
|
93
93
|
# Special treatment if the user specififed true, false or YES, NO
|
94
|
-
# There is no boolean
|
94
|
+
# There is no boolean type, so we just do it here
|
95
95
|
if %w(YES yes true TRUE).include?(value)
|
96
96
|
return true
|
97
97
|
elsif %w(NO no false FALSE).include?(value)
|
@@ -182,6 +182,9 @@ module FastlaneCore
|
|
182
182
|
return value unless value.nil? # we already have a value
|
183
183
|
return value if option.optional # as this value is not required, just return what we have
|
184
184
|
|
185
|
+
return value unless ask
|
186
|
+
|
187
|
+
# fallback to asking
|
185
188
|
if Helper.is_test? or Helper.is_ci?
|
186
189
|
# Since we don't want to be asked on tests, we'll just call the verify block with no value
|
187
190
|
# to raise the exception that is shown when the user passes an invalid value
|
@@ -190,7 +193,7 @@ module FastlaneCore
|
|
190
193
|
UI.user_error!("No value found for '#{key}'")
|
191
194
|
end
|
192
195
|
|
193
|
-
while
|
196
|
+
while value.nil?
|
194
197
|
Helper.log.info "To not be asked about this value, you can specify it using '#{option.key}'".yellow
|
195
198
|
value = ask("#{option.description}: ")
|
196
199
|
# Also store this value to use it from now on
|
@@ -221,10 +224,11 @@ module FastlaneCore
|
|
221
224
|
true
|
222
225
|
end
|
223
226
|
|
224
|
-
|
227
|
+
# see fetch
|
228
|
+
def values(ask: true)
|
225
229
|
# As the user accesses all values, we need to iterate through them to receive all the values
|
226
230
|
@available_options.each do |option|
|
227
|
-
@values[option.key] = fetch(option.key) unless @values[option.key]
|
231
|
+
@values[option.key] = fetch(option.key, ask: ask) unless @values[option.key]
|
228
232
|
end
|
229
233
|
@values
|
230
234
|
end
|
@@ -32,10 +32,13 @@ module FastlaneCore
|
|
32
32
|
def method_missing(method_sym, *arguments, &block)
|
33
33
|
# First, check if the key is actually available
|
34
34
|
if self.config.all_keys.include? method_sym
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
# This silently prevents a value from having its value set more than once.
|
36
|
+
return unless self.config._values[method_sym].to_s.empty?
|
37
|
+
|
38
|
+
value = arguments.first
|
39
|
+
value = block.call if value.nil? && block_given?
|
40
|
+
|
41
|
+
self.config[method_sym] = value unless value.nil?
|
39
42
|
else
|
40
43
|
# We can't set this value, maybe the tool using this configuration system has its own
|
41
44
|
# way of handling this block, as this might be a special block (e.g. ipa block) that's only
|
@@ -2,22 +2,16 @@ module FastlaneCore
|
|
2
2
|
class PrintTable
|
3
3
|
class << self
|
4
4
|
# This method prints out all the user inputs in a nice table. Useful to summarize the run
|
5
|
-
# You can pass an array to `
|
6
|
-
|
5
|
+
# You can pass an array to `hide_keys` if you don't want certain elements to show up (symbols or strings)
|
6
|
+
# You can pass an array to `mask_keys` if you want to mask certain elements (symbols or strings)
|
7
|
+
def print_values(config: nil, title: nil, hide_keys: [], mask_keys: [])
|
7
8
|
require 'terminal-table'
|
8
|
-
rows = []
|
9
9
|
|
10
|
-
config.
|
11
|
-
|
12
|
-
next if value.nil?
|
13
|
-
next if value.to_s == ""
|
14
|
-
next if hide_keys.include?(config_item.key)
|
15
|
-
|
16
|
-
rows << [config_item.key, value]
|
17
|
-
end
|
10
|
+
options = config.nil? ? {} : config.values(ask: false)
|
11
|
+
rows = self.collect_rows(options: options, hide_keys: hide_keys.map(&:to_s), mask_keys: mask_keys.map(&:to_s), prefix: '')
|
18
12
|
|
19
13
|
params = {}
|
20
|
-
params[:rows] = rows
|
14
|
+
params[:rows] = limit_row_size(rows)
|
21
15
|
params[:title] = title.green if title
|
22
16
|
|
23
17
|
puts ""
|
@@ -26,6 +20,37 @@ module FastlaneCore
|
|
26
20
|
|
27
21
|
return params
|
28
22
|
end
|
23
|
+
|
24
|
+
def limit_row_size(rows, max_length = 100)
|
25
|
+
require 'fastlane_core/string_filters'
|
26
|
+
|
27
|
+
max_key_length = rows.map { |e| e[0].length }.max || 0
|
28
|
+
max_allowed_value_length = max_length - max_key_length - 7
|
29
|
+
rows.map do |e|
|
30
|
+
value = e[1]
|
31
|
+
value = value.truncate(max_allowed_value_length) if value.kind_of? String
|
32
|
+
[e[0], value]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def collect_rows(options: nil, hide_keys: [], mask_keys: [], prefix: '', mask: '********')
|
37
|
+
rows = []
|
38
|
+
|
39
|
+
options.each do |key, value|
|
40
|
+
prefixed_key = "#{prefix}#{key}"
|
41
|
+
next if value.nil?
|
42
|
+
next if value.to_s == ""
|
43
|
+
next if hide_keys.include?(prefixed_key)
|
44
|
+
value = mask if mask_keys.include?(prefixed_key)
|
45
|
+
|
46
|
+
if value.respond_to? :key
|
47
|
+
rows.concat self.collect_rows(options: value, hide_keys: hide_keys, mask_keys: mask_keys, prefix: "#{prefix}#{key}.", mask: mask)
|
48
|
+
else
|
49
|
+
rows << [prefixed_key, value]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
rows
|
53
|
+
end
|
29
54
|
end
|
30
55
|
end
|
31
56
|
end
|
@@ -80,6 +80,14 @@ module FastlaneCore
|
|
80
80
|
self.is_workspace
|
81
81
|
end
|
82
82
|
|
83
|
+
def project_name
|
84
|
+
if is_workspace
|
85
|
+
return File.basename(options[:workspace], ".xcworkspace")
|
86
|
+
else
|
87
|
+
return File.basename(options[:project], ".xcodeproj")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
83
91
|
# Get all available schemes in an array
|
84
92
|
def schemes
|
85
93
|
parsed_info.schemes
|
@@ -109,15 +117,16 @@ module FastlaneCore
|
|
109
117
|
|
110
118
|
if preferred_to_include and preferred.count == 1
|
111
119
|
options[:scheme] = preferred.last
|
120
|
+
elsif automated_scheme_selection? && schemes.include?(project_name)
|
121
|
+
Helper.log.info "Using scheme matching project name (#{project_name}).".yellow
|
122
|
+
options[:scheme] = project_name
|
123
|
+
elsif Helper.is_ci?
|
124
|
+
Helper.log.error "Multiple schemes found but you haven't specified one.".red
|
125
|
+
Helper.log.error "Since this is a CI, please pass one using the `scheme` option".red
|
126
|
+
raise "Multiple schemes found".red
|
112
127
|
else
|
113
|
-
|
114
|
-
|
115
|
-
Helper.log.error "Since this is a CI, please pass one using the `scheme` option".red
|
116
|
-
raise "Multiple schemes found".red
|
117
|
-
else
|
118
|
-
puts "Select Scheme: "
|
119
|
-
options[:scheme] = choose(*(schemes))
|
120
|
-
end
|
128
|
+
puts "Select Scheme: "
|
129
|
+
options[:scheme] = choose(*(schemes))
|
121
130
|
end
|
122
131
|
else
|
123
132
|
Helper.log.error "Couldn't find any schemes in this project, make sure that the scheme is shared if you are using a workspace".red
|
@@ -290,5 +299,11 @@ module FastlaneCore
|
|
290
299
|
end
|
291
300
|
@parsed_info
|
292
301
|
end
|
302
|
+
|
303
|
+
# If scheme not specified, do we want the scheme
|
304
|
+
# matching project name?
|
305
|
+
def automated_scheme_selection?
|
306
|
+
!!ENV["AUTOMATED_SCHEME_SELECTION"]
|
307
|
+
end
|
293
308
|
end
|
294
309
|
end
|
@@ -30,9 +30,9 @@ module FastlaneCore
|
|
30
30
|
else
|
31
31
|
# iPad 2 (0EDE6AFC-3767-425A-9658-AAA30A60F212) (Shutdown)
|
32
32
|
# iPad Air 2 (4F3B8059-03FD-4D72-99C0-6E9BBEE2A9CE) (Shutdown) (unavailable, device type profile not found)
|
33
|
-
match = line.match(/\s+([^\(]+) \(([-0-9A-F]+)\) \((
|
34
|
-
if match && !match[
|
35
|
-
@devices << Device.new(name: match[1],
|
33
|
+
match = line.match(/\s+([^\(]+) \(([-0-9A-F]+)\) \(([^\(]+)\)(.*unavailable.*)?/)
|
34
|
+
if match && !match[4] && os_type == requested_os_type
|
35
|
+
@devices << Device.new(name: match[1], os_version: os_version, udid: match[2], state: match[3])
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -44,6 +44,18 @@ module FastlaneCore
|
|
44
44
|
@devices = nil
|
45
45
|
end
|
46
46
|
|
47
|
+
# Reset all simulators of this type
|
48
|
+
def reset_all
|
49
|
+
all.each(&:reset)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Reset simulator by UDID or name and OS version
|
53
|
+
# Latter is useful when combined with -destination option of xcodebuild
|
54
|
+
def reset(udid: nil, name: nil, os_version: nil)
|
55
|
+
match = all.detect { |device| device.udid == udid || device.name == name && device.os_version == os_version }
|
56
|
+
match.reset if match
|
57
|
+
end
|
58
|
+
|
47
59
|
# The code below works from Xcode 7 on
|
48
60
|
# def all
|
49
61
|
# Helper.log.info "Fetching available devices" if $verbose
|
@@ -68,7 +80,7 @@ module FastlaneCore
|
|
68
80
|
# next unless os_version.include?(requested_os_type)
|
69
81
|
|
70
82
|
# os = os_version.gsub(requested_os_type + " ", "").strip
|
71
|
-
# @devices << Device.new(name: device['name'],
|
83
|
+
# @devices << Device.new(name: device['name'], os_version: os, udid: device['udid'])
|
72
84
|
# end
|
73
85
|
# end
|
74
86
|
|
@@ -88,20 +100,29 @@ module FastlaneCore
|
|
88
100
|
|
89
101
|
class Device
|
90
102
|
attr_accessor :name
|
91
|
-
|
92
103
|
attr_accessor :udid
|
104
|
+
attr_accessor :os_version
|
105
|
+
attr_accessor :ios_version # Preserved for backwards compatibility
|
106
|
+
attr_accessor :state
|
93
107
|
|
94
|
-
|
95
|
-
|
96
|
-
def initialize(name: nil, udid: nil, ios_version: nil)
|
108
|
+
def initialize(name: nil, udid: nil, os_version: nil, state: nil)
|
97
109
|
self.name = name
|
98
110
|
self.udid = udid
|
99
|
-
self.
|
111
|
+
self.os_version = os_version
|
112
|
+
self.ios_version = os_version
|
113
|
+
self.state = state
|
100
114
|
end
|
101
115
|
|
102
116
|
def to_s
|
103
117
|
self.name
|
104
118
|
end
|
119
|
+
|
120
|
+
def reset
|
121
|
+
Helper.log.info "Resetting #{self}"
|
122
|
+
`xcrun simctl shutdown #{self.udid}` if self.state == "Booted"
|
123
|
+
`xcrun simctl erase #{self.udid}`
|
124
|
+
return
|
125
|
+
end
|
105
126
|
end
|
106
127
|
end
|
107
128
|
|
@@ -112,4 +133,12 @@ module FastlaneCore
|
|
112
133
|
end
|
113
134
|
end
|
114
135
|
end
|
136
|
+
|
137
|
+
class SimulatorWatch < Simulator
|
138
|
+
class << self
|
139
|
+
def requested_os_type
|
140
|
+
'watchOS'
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
115
144
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class String
|
2
|
+
# Truncates a given +text+ after a given <tt>length</tt> if +text+ is longer than <tt>length</tt>:
|
3
|
+
#
|
4
|
+
# 'Once upon a time in a world far far away'.truncate(27)
|
5
|
+
# # => "Once upon a time in a wo..."
|
6
|
+
#
|
7
|
+
# Pass a string or regexp <tt>:separator</tt> to truncate +text+ at a natural break:
|
8
|
+
#
|
9
|
+
# 'Once upon a time in a world far far away'.truncate(27, separator: ' ')
|
10
|
+
# # => "Once upon a time in a..."
|
11
|
+
#
|
12
|
+
# 'Once upon a time in a world far far away'.truncate(27, separator: /\s/)
|
13
|
+
# # => "Once upon a time in a..."
|
14
|
+
#
|
15
|
+
# The last characters will be replaced with the <tt>:omission</tt> string (defaults to "...")
|
16
|
+
# for a total length not exceeding <tt>length</tt>:
|
17
|
+
#
|
18
|
+
# 'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)')
|
19
|
+
# # => "And they f... (continued)"
|
20
|
+
def truncate(truncate_at, options = {})
|
21
|
+
return dup unless length > truncate_at
|
22
|
+
|
23
|
+
omission = options[:omission] || '...'
|
24
|
+
length_with_room_for_omission = truncate_at - omission.length
|
25
|
+
stop = \
|
26
|
+
if options[:separator]
|
27
|
+
rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
|
28
|
+
else
|
29
|
+
length_with_room_for_omission
|
30
|
+
end
|
31
|
+
|
32
|
+
"#{self[0, stop]}#{omission}"
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.36.
|
4
|
+
version: 0.36.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -355,6 +355,7 @@ files:
|
|
355
355
|
- lib/fastlane_core/project.rb
|
356
356
|
- lib/fastlane_core/provisioning_profile.rb
|
357
357
|
- lib/fastlane_core/simulator.rb
|
358
|
+
- lib/fastlane_core/string_filters.rb
|
358
359
|
- lib/fastlane_core/ui/disable_colors.rb
|
359
360
|
- lib/fastlane_core/ui/fastlane_runner.rb
|
360
361
|
- lib/fastlane_core/ui/implementations/shell.rb
|
@@ -384,7 +385,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
384
385
|
version: '0'
|
385
386
|
requirements: []
|
386
387
|
rubyforge_project:
|
387
|
-
rubygems_version: 2.4.
|
388
|
+
rubygems_version: 2.4.5.1
|
388
389
|
signing_key:
|
389
390
|
specification_version: 4
|
390
391
|
summary: Contains all shared code/dependencies of the fastlane.tools
|