run_loop 1.4.1 → 1.5.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.
- checksums.yaml +4 -4
- data/lib/run_loop/app.rb +10 -0
- data/lib/run_loop/cli/simctl.rb +9 -3
- data/lib/run_loop/core.rb +65 -37
- data/lib/run_loop/device.rb +71 -19
- data/lib/run_loop/host_cache.rb +10 -0
- data/lib/run_loop/instruments.rb +223 -23
- data/lib/run_loop/ipa.rb +5 -0
- data/lib/run_loop/l10n.rb +117 -0
- data/lib/run_loop/lipo.rb +10 -0
- data/lib/run_loop/regex.rb +19 -0
- data/lib/run_loop/sim_control.rb +63 -54
- data/lib/run_loop/simctl/bridge.rb +6 -1
- data/lib/run_loop/version.rb +5 -1
- data/lib/run_loop/xcode.rb +228 -0
- data/lib/run_loop/xctools.rb +109 -94
- data/lib/run_loop.rb +22 -0
- data/scripts/run_loop_fast_uia.js +7 -1
- data/scripts/run_loop_host.js +8 -2
- data/scripts/run_loop_shared_element.js +7 -1
- metadata +6 -4
data/lib/run_loop/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module RunLoop
|
2
|
-
VERSION = '1.
|
2
|
+
VERSION = '1.5.0'
|
3
3
|
|
4
4
|
# A model of a software release version that can be used to compare two versions.
|
5
5
|
#
|
@@ -84,6 +84,10 @@ module RunLoop
|
|
84
84
|
str
|
85
85
|
end
|
86
86
|
|
87
|
+
def inspect
|
88
|
+
"#<Version #{to_s}>"
|
89
|
+
end
|
90
|
+
|
87
91
|
# Compare this version to another for equality.
|
88
92
|
# @param [Version] other the version to compare against
|
89
93
|
# @return [Boolean] true if this Version is the same as `other`
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module RunLoop
|
4
|
+
|
5
|
+
# A model of the active Xcode version.
|
6
|
+
#
|
7
|
+
# @note All command line tools are run in the context of `xcrun`.
|
8
|
+
#
|
9
|
+
# Throughout this class's documentation, there are references to the
|
10
|
+
# _active version of Xcode_. The active Xcode version is the one returned
|
11
|
+
# by `xcrun xcodebuild`. The current Xcode version can be set using
|
12
|
+
# `xcode-select` or overridden using the `DEVELOPER_DIR`.
|
13
|
+
class Xcode
|
14
|
+
|
15
|
+
include RunLoop::Regex
|
16
|
+
|
17
|
+
# Returns a String representation.
|
18
|
+
def to_s
|
19
|
+
"#<Xcode #{version.to_s}>"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns debug String representation
|
23
|
+
def inspect
|
24
|
+
to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a version instance for `Xcode 7.0`; used to check for the
|
28
|
+
# availability of features and paths to various items on the filesystem.
|
29
|
+
#
|
30
|
+
# @return [RunLoop::Version] 7.0
|
31
|
+
def v70
|
32
|
+
fetch_version(:v70)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns a version instance for `Xcode 6.4`; used to check for the
|
36
|
+
# availability of features and paths to various items on the filesystem.
|
37
|
+
#
|
38
|
+
# @return [RunLoop::Version] 6.4
|
39
|
+
def v64
|
40
|
+
fetch_version(:v64)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a version instance for `Xcode 6.3`; used to check for the
|
44
|
+
# availability of features and paths to various items on the filesystem.
|
45
|
+
#
|
46
|
+
# @return [RunLoop::Version] 6.3
|
47
|
+
def v63
|
48
|
+
fetch_version(:v63)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a version instance for `Xcode 6.2`; used to check for the
|
52
|
+
# availability of features and paths to various items on the filesystem.
|
53
|
+
#
|
54
|
+
# @return [RunLoop::Version] 6.2
|
55
|
+
def v62
|
56
|
+
fetch_version(:v62)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns a version instance for `Xcode 6.1`; used to check for the
|
60
|
+
# availability of features and paths to various items on the filesystem.
|
61
|
+
#
|
62
|
+
# @return [RunLoop::Version] 6.1
|
63
|
+
def v61
|
64
|
+
fetch_version(:v61)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns a version instance for `Xcode 6.0`; used to check for the
|
68
|
+
# availability of features and paths to various items on the filesystem.
|
69
|
+
#
|
70
|
+
# @return [RunLoop::Version] 6.0
|
71
|
+
def v60
|
72
|
+
fetch_version(:v60)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Returns a version instance for `Xcode 5.1`; used to check for the
|
76
|
+
# availability of features and paths to various items on the filesystem.
|
77
|
+
#
|
78
|
+
# @return [RunLoop::Version] 5.1
|
79
|
+
def v51
|
80
|
+
fetch_version(:v51)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns a version instance for `Xcode 5.0`; used to check for the
|
84
|
+
# availability of features and paths to various items on the filesystem.
|
85
|
+
#
|
86
|
+
# @return [RunLoop::Version] 5.0
|
87
|
+
def v50
|
88
|
+
fetch_version(:v50)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Is the active Xcode version 7 or above?
|
92
|
+
#
|
93
|
+
# @return [Boolean] `true` if the current Xcode version is >= 7.0
|
94
|
+
def version_gte_7?
|
95
|
+
version >= v70
|
96
|
+
end
|
97
|
+
|
98
|
+
# Is the active Xcode version 6.4 or above?
|
99
|
+
#
|
100
|
+
# @return [Boolean] `true` if the current Xcode version is >= 6.4
|
101
|
+
def version_gte_64?
|
102
|
+
version >= v64
|
103
|
+
end
|
104
|
+
|
105
|
+
# Is the active Xcode version 6.3 or above?
|
106
|
+
#
|
107
|
+
# @return [Boolean] `true` if the current Xcode version is >= 6.3
|
108
|
+
def version_gte_63?
|
109
|
+
version >= v63
|
110
|
+
end
|
111
|
+
|
112
|
+
# Is the active Xcode version 6.2 or above?
|
113
|
+
#
|
114
|
+
# @return [Boolean] `true` if the current Xcode version is >= 6.2
|
115
|
+
def version_gte_62?
|
116
|
+
version >= v62
|
117
|
+
end
|
118
|
+
|
119
|
+
# Is the active Xcode version 6.1 or above?
|
120
|
+
#
|
121
|
+
# @return [Boolean] `true` if the current Xcode version is >= 6.1
|
122
|
+
def version_gte_61?
|
123
|
+
version >= v61
|
124
|
+
end
|
125
|
+
|
126
|
+
# Is the active Xcode version 6 or above?
|
127
|
+
#
|
128
|
+
# @return [Boolean] `true` if the current Xcode version is >= 6.0
|
129
|
+
def version_gte_6?
|
130
|
+
version >= v60
|
131
|
+
end
|
132
|
+
|
133
|
+
# Is the active Xcode version 5.1 or above?
|
134
|
+
#
|
135
|
+
# @return [Boolean] `true` if the current Xcode version is >= 5.1
|
136
|
+
def version_gte_51?
|
137
|
+
version >= v51
|
138
|
+
end
|
139
|
+
|
140
|
+
# Returns the current version of Xcode.
|
141
|
+
#
|
142
|
+
# @return [RunLoop::Version] The current version of Xcode as reported by
|
143
|
+
# `xcrun xcodebuild -version`.
|
144
|
+
def version
|
145
|
+
@xcode_version ||= lambda do
|
146
|
+
execute_command(['-version']) do |stdout, _, _|
|
147
|
+
version_string = stdout.read.chomp[VERSION_REGEX, 0]
|
148
|
+
RunLoop::Version.new(version_string)
|
149
|
+
end
|
150
|
+
end.call
|
151
|
+
end
|
152
|
+
|
153
|
+
# Is this a beta version of Xcode?
|
154
|
+
#
|
155
|
+
# @note Relies on Xcode beta versions having and app bundle named Xcode-Beta.app
|
156
|
+
# @return [Boolean] True if the Xcode version is beta.
|
157
|
+
def beta?
|
158
|
+
developer_dir[/Xcode-[Bb]eta.app/, 0]
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns the path to the current developer directory.
|
162
|
+
#
|
163
|
+
# From the man pages:
|
164
|
+
#
|
165
|
+
# ```
|
166
|
+
# $ man xcode-select
|
167
|
+
# DEVELOPER_DIR
|
168
|
+
# Overrides the active developer directory. When DEVELOPER_DIR is set,
|
169
|
+
# its value will be used instead of the system-wide active developer
|
170
|
+
# directory.
|
171
|
+
#```
|
172
|
+
#
|
173
|
+
# @return [String] path to current developer directory
|
174
|
+
def developer_dir
|
175
|
+
@xcode_developer_dir ||=
|
176
|
+
if RunLoop::Environment.developer_dir
|
177
|
+
RunLoop::Environment.developer_dir
|
178
|
+
else
|
179
|
+
xcode_select_path
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
attr_reader :xcode_versions
|
186
|
+
|
187
|
+
def xcode_versions
|
188
|
+
@xcode_versions ||= {}
|
189
|
+
end
|
190
|
+
|
191
|
+
def fetch_version(key)
|
192
|
+
ensure_valid_version_key key
|
193
|
+
value = xcode_versions[key]
|
194
|
+
|
195
|
+
return value if value
|
196
|
+
|
197
|
+
string = key.to_s
|
198
|
+
string[0] = ''
|
199
|
+
version_string = string.split(/(?!^)/).join('.')
|
200
|
+
version = RunLoop::Version.new(version_string)
|
201
|
+
xcode_versions[key] = version
|
202
|
+
version
|
203
|
+
end
|
204
|
+
|
205
|
+
def ensure_valid_version_key(key)
|
206
|
+
string = key.to_s
|
207
|
+
if string.length != 3
|
208
|
+
raise "Expected version key '#{key}' to have exactly 3 characters"
|
209
|
+
end
|
210
|
+
|
211
|
+
unless string[/v\d{2}/, 0]
|
212
|
+
raise "Expected version key '#{key}' to match vXX pattern"
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def execute_command(args)
|
217
|
+
Open3.popen3('xcrun', 'xcodebuild', *args) do |_, stdout, stderr, wait_thr|
|
218
|
+
yield stdout, stderr, wait_thr
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def xcode_select_path
|
223
|
+
Open3.popen3('xcode-select', '--print-path') do |_, stdout, _, _|
|
224
|
+
stdout.read.chomp
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
data/lib/run_loop/xctools.rb
CHANGED
@@ -3,6 +3,13 @@ require 'retriable'
|
|
3
3
|
|
4
4
|
module RunLoop
|
5
5
|
|
6
|
+
# @deprecated Since 1.5.0
|
7
|
+
#
|
8
|
+
# The behaviors of this class are in the process of being refactored to other
|
9
|
+
# classes. Please do not implement any new behaviors in this class.
|
10
|
+
#
|
11
|
+
# Callers should be updated ASAP.
|
12
|
+
#
|
6
13
|
# A class for interacting with the Xcode tools.
|
7
14
|
#
|
8
15
|
# @note All command line tools are run in the context of `xcrun`.
|
@@ -15,130 +22,160 @@ module RunLoop
|
|
15
22
|
# @todo Refactor instruments related code to instruments class.
|
16
23
|
class XCTools
|
17
24
|
|
25
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
18
26
|
# Returns a version instance for `Xcode 7.0`; used to check for the
|
19
27
|
# availability of features and paths to various items on the filesystem.
|
20
28
|
#
|
21
29
|
# @return [RunLoop::Version] 7.0
|
22
30
|
def v70
|
23
|
-
|
31
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
32
|
+
xcode.v70
|
24
33
|
end
|
25
34
|
|
35
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
26
36
|
# Returns a version instance for `Xcode 6.4`; used to check for the
|
27
37
|
# availability of features and paths to various items on the filesystem.
|
28
38
|
#
|
29
|
-
# @return [RunLoop::Version] 6.
|
39
|
+
# @return [RunLoop::Version] 6.4
|
30
40
|
def v64
|
31
|
-
|
41
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
42
|
+
xcode.v64
|
32
43
|
end
|
33
44
|
|
45
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
34
46
|
# Returns a version instance for `Xcode 6.3`; used to check for the
|
35
47
|
# availability of features and paths to various items on the filesystem.
|
36
48
|
#
|
37
49
|
# @return [RunLoop::Version] 6.3
|
38
50
|
def v63
|
39
|
-
|
51
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
52
|
+
xcode.v63
|
40
53
|
end
|
41
54
|
|
55
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
42
56
|
# Returns a version instance for `Xcode 6.2`; used to check for the
|
43
57
|
# availability of features and paths to various items on the filesystem.
|
44
58
|
#
|
45
59
|
# @return [RunLoop::Version] 6.2
|
46
60
|
def v62
|
47
|
-
|
61
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
62
|
+
xcode.v62
|
48
63
|
end
|
49
64
|
|
65
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
50
66
|
# Returns a version instance for `Xcode 6.1`; used to check for the
|
51
67
|
# availability of features and paths to various items on the filesystem.
|
52
68
|
#
|
53
69
|
# @return [RunLoop::Version] 6.1
|
54
70
|
def v61
|
55
|
-
|
71
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
72
|
+
xcode.v61
|
56
73
|
end
|
57
74
|
|
75
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
58
76
|
# Returns a version instance for `Xcode 6.0`; used to check for the
|
59
77
|
# availability of features and paths to various items on the filesystem.
|
60
78
|
#
|
61
79
|
# @return [RunLoop::Version] 6.0
|
62
80
|
def v60
|
63
|
-
|
81
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
82
|
+
xcode.v60
|
64
83
|
end
|
65
84
|
|
85
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
66
86
|
# Returns a version instance for `Xcode 5.1`; used to check for the
|
67
87
|
# availability of features and paths to various items on the filesystem.
|
68
88
|
#
|
69
89
|
# @return [RunLoop::Version] 5.1
|
70
90
|
def v51
|
71
|
-
|
91
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
92
|
+
xcode.v51
|
72
93
|
end
|
73
94
|
|
74
|
-
#
|
95
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
96
|
+
# Returns a version instance for `Xcode 5.0`; used to check for the
|
75
97
|
# availability of features and paths to various items on the filesystem.
|
76
98
|
#
|
77
99
|
# @return [RunLoop::Version] 5.0
|
78
100
|
def v50
|
79
|
-
|
101
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
102
|
+
xcode.v50
|
80
103
|
end
|
81
104
|
|
105
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
82
106
|
# Are we running Xcode 6.4 or above?
|
83
107
|
#
|
84
108
|
# @return [Boolean] `true` if the current Xcode version is >= 6.4
|
85
109
|
def xcode_version_gte_64?
|
86
|
-
|
110
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
111
|
+
xcode.version_gte_64?
|
87
112
|
end
|
88
113
|
|
114
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
89
115
|
# Are we running Xcode 6.3 or above?
|
90
116
|
#
|
91
117
|
# @return [Boolean] `true` if the current Xcode version is >= 6.3
|
92
118
|
def xcode_version_gte_63?
|
93
|
-
|
119
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
120
|
+
xcode.version_gte_63?
|
94
121
|
end
|
95
122
|
|
123
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
96
124
|
# Are we running Xcode 6.2 or above?
|
97
125
|
#
|
98
126
|
# @return [Boolean] `true` if the current Xcode version is >= 6.2
|
99
127
|
def xcode_version_gte_62?
|
100
|
-
|
128
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
129
|
+
xcode.version_gte_62?
|
101
130
|
end
|
102
131
|
|
132
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
103
133
|
# Are we running Xcode 6.1 or above?
|
104
134
|
#
|
105
135
|
# @return [Boolean] `true` if the current Xcode version is >= 6.1
|
106
136
|
def xcode_version_gte_61?
|
107
|
-
|
137
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
138
|
+
xcode.version_gte_61?
|
108
139
|
end
|
109
140
|
|
141
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
110
142
|
# Are we running Xcode 6 or above?
|
111
143
|
#
|
112
144
|
# @return [Boolean] `true` if the current Xcode version is >= 6.0
|
113
145
|
def xcode_version_gte_6?
|
114
|
-
|
146
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
147
|
+
xcode.version_gte_6?
|
115
148
|
end
|
116
149
|
|
150
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
117
151
|
# Are we running Xcode 7 or above?
|
118
152
|
#
|
119
153
|
# @return [Boolean] `true` if the current Xcode version is >= 7.0
|
120
154
|
def xcode_version_gte_7?
|
121
|
-
|
155
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
156
|
+
xcode.version_gte_7?
|
122
157
|
end
|
123
158
|
|
159
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
124
160
|
# Are we running Xcode 5.1 or above?
|
125
161
|
#
|
126
162
|
# @return [Boolean] `true` if the current Xcode version is >= 5.1
|
127
163
|
def xcode_version_gte_51?
|
128
|
-
|
164
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
165
|
+
xcode.version_gte_51?
|
129
166
|
end
|
130
167
|
|
168
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
131
169
|
# Returns the current version of Xcode.
|
132
170
|
#
|
133
171
|
# @return [RunLoop::Version] The current version of Xcode as reported by
|
134
172
|
# `xcrun xcodebuild -version`.
|
135
173
|
def xcode_version
|
136
|
-
|
137
|
-
|
138
|
-
RunLoop::Version.new(xcode_build_output)
|
139
|
-
}.call
|
174
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
175
|
+
xcode.version
|
140
176
|
end
|
141
177
|
|
178
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
142
179
|
# Returns the path to the current developer directory.
|
143
180
|
#
|
144
181
|
# From the man pages:
|
@@ -153,25 +190,38 @@ module RunLoop
|
|
153
190
|
#
|
154
191
|
# @return [String] path to current developer directory
|
155
192
|
def xcode_developer_dir
|
156
|
-
|
157
|
-
|
158
|
-
RunLoop::Environment.developer_dir
|
159
|
-
else
|
160
|
-
# fall back to xcode-select
|
161
|
-
`xcode-select --print-path`.chomp
|
162
|
-
end
|
193
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
194
|
+
xcode.developer_dir
|
163
195
|
end
|
164
196
|
|
197
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Xcode
|
165
198
|
# Is this a beta version of Xcode?
|
166
199
|
#
|
167
200
|
# @note Relies on Xcode beta versions having and app bundle named Xcode-Beta.app
|
168
201
|
# @return [Boolean] True if the Xcode version is beta.
|
169
202
|
def xcode_is_beta?
|
170
|
-
|
171
|
-
|
172
|
-
}.call
|
203
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Xcode')
|
204
|
+
xcode.beta?
|
173
205
|
end
|
174
206
|
|
207
|
+
alias_method :version_gte_64?, :xcode_version_gte_64?
|
208
|
+
alias_method :version_gte_63?, :xcode_version_gte_63?
|
209
|
+
alias_method :version_gte_62?, :xcode_version_gte_62?
|
210
|
+
alias_method :version_gte_61?, :xcode_version_gte_61?
|
211
|
+
alias_method :version_gte_6?, :xcode_version_gte_6?
|
212
|
+
alias_method :version_gte_7?, :xcode_version_gte_7?
|
213
|
+
alias_method :version_gte_51?, :xcode_version_gte_51?
|
214
|
+
alias_method :version, :xcode_version
|
215
|
+
alias_method :developer_dir, :xcode_developer_dir
|
216
|
+
alias_method :beta?, :xcode_is_beta?
|
217
|
+
|
218
|
+
# @deprecated Since 1.5.0 - replaced with RunLoop::Instruments.
|
219
|
+
#
|
220
|
+
# @see {RunLoop::Instruments#version}
|
221
|
+
# @see {RunLoop::Instruments#templates}
|
222
|
+
# @see {RunLoop::Instruments#physical_devices}
|
223
|
+
# @see {RunLoop::Instruments#simulators}
|
224
|
+
#
|
175
225
|
# Method for interacting with instruments.
|
176
226
|
#
|
177
227
|
# @example Getting a runnable command for instruments
|
@@ -193,83 +243,29 @@ module RunLoop
|
|
193
243
|
# instruments binary.
|
194
244
|
# @raise [ArgumentError] if invalid `cmd` is passed
|
195
245
|
def instruments(cmd=nil)
|
246
|
+
RunLoop.deprecated('1.5.0', 'Replaced with RunLoop::Instruments')
|
196
247
|
instruments = 'xcrun instruments'
|
197
248
|
return instruments if cmd == nil
|
198
249
|
|
199
|
-
# Xcode 6 GM is spamming "WebKit Threading Violations"
|
200
|
-
stderr_filter = lambda { |stderr|
|
201
|
-
stderr.read.strip.split("\n").each do |line|
|
202
|
-
unless line[/WebKit Threading Violation/, 0]
|
203
|
-
$stderr.puts line
|
204
|
-
end
|
205
|
-
end
|
206
|
-
}
|
207
250
|
case cmd
|
208
251
|
when :version
|
209
|
-
|
210
|
-
# Xcode 6 can print out some very strange output, so we have to retry.
|
211
|
-
Retriable.retriable({:tries => 5}) do
|
212
|
-
Open3.popen3("#{instruments}") do |_, _, stderr, _|
|
213
|
-
version_str = stderr.read.chomp.split(/\s/)[2]
|
214
|
-
RunLoop::Version.new(version_str)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
}.call
|
252
|
+
instruments_instance.version
|
218
253
|
when :sims
|
219
|
-
|
220
|
-
# Instruments 6 spams a lot of error messages. I don't like to
|
221
|
-
# hide them, but they seem to be around to stay (Xcode 6 GM).
|
222
|
-
cmd = "#{instruments} -s devices"
|
223
|
-
Open3.popen3(cmd) do |_, stdout, stderr, _|
|
224
|
-
stderr_filter.call(stderr)
|
225
|
-
devices = stdout.read.chomp.split("\n")
|
226
|
-
devices.select { |device| device.downcase.include?('simulator') }
|
227
|
-
end
|
228
|
-
}.call
|
229
|
-
|
254
|
+
instruments_instance.simulators
|
230
255
|
when :templates
|
231
|
-
|
232
|
-
cmd = "#{instruments} -s templates"
|
233
|
-
if self.xcode_version >= self.v60
|
234
|
-
Open3.popen3(cmd) do |_, stdout, stderr, _|
|
235
|
-
stderr_filter.call(stderr)
|
236
|
-
stdout.read.chomp.split("\n").map { |elm| elm.strip.tr('"', '') }
|
237
|
-
end
|
238
|
-
elsif self.xcode_version >= self.v51
|
239
|
-
`#{cmd}`.split("\n").delete_if do |path|
|
240
|
-
not path =~ /tracetemplate/
|
241
|
-
end.map { |elm| elm.strip }
|
242
|
-
else
|
243
|
-
# prints to $stderr (>_>) - seriously?
|
244
|
-
Open3.popen3(cmd) do |_, _, stderr, _|
|
245
|
-
stderr.read.chomp.split(/(,|\(|")/).map do |elm|
|
246
|
-
elm.strip
|
247
|
-
end.delete_if { |path| not path =~ /tracetemplate/ }
|
248
|
-
end
|
249
|
-
end
|
250
|
-
}.call
|
251
|
-
|
256
|
+
instruments_instance.templates
|
252
257
|
when :devices
|
253
|
-
|
254
|
-
cmd = "#{instruments} -s devices"
|
255
|
-
Open3.popen3(cmd) do |_, stdout, stderr, _|
|
256
|
-
stderr_filter.call(stderr)
|
257
|
-
all = stdout.read.chomp.split("\n")
|
258
|
-
valid = all.select { |device| device =~ /[a-f0-9]{40}/ }
|
259
|
-
valid.map do |device|
|
260
|
-
udid = device[/[a-f0-9]{40}/, 0]
|
261
|
-
version = device[/(\d\.\d(\.\d)?)/, 0]
|
262
|
-
name = device.split('(').first.strip
|
263
|
-
RunLoop::Device.new(name, version, udid)
|
264
|
-
end
|
265
|
-
end
|
266
|
-
}.call
|
258
|
+
instruments_instance.physical_devices
|
267
259
|
else
|
268
260
|
candidates = [:version, :sims, :devices]
|
269
261
|
raise(ArgumentError, "expected '#{cmd}' to be one of '#{candidates}'")
|
270
262
|
end
|
271
263
|
end
|
272
264
|
|
265
|
+
# @deprecated Since 1.5.0 - no replacement.
|
266
|
+
#
|
267
|
+
# All supported Xcode versions accept -s flag.
|
268
|
+
#
|
273
269
|
# Does the instruments `version` accept the -s flag?
|
274
270
|
#
|
275
271
|
# @example
|
@@ -282,6 +278,7 @@ module RunLoop
|
|
282
278
|
#
|
283
279
|
# @return [Boolean] true if the version is >= 5.*
|
284
280
|
def instruments_supports_hyphen_s?(version=instruments(:version))
|
281
|
+
RunLoop.deprecated('1.5.0', 'Not replaced.')
|
285
282
|
@instruments_supports_hyphen_s ||= lambda {
|
286
283
|
if version.is_a? String
|
287
284
|
_version = RunLoop::Version.new(version)
|
@@ -291,5 +288,23 @@ module RunLoop
|
|
291
288
|
_version >= RunLoop::Version.new('5.1')
|
292
289
|
}.call
|
293
290
|
end
|
291
|
+
|
292
|
+
private
|
293
|
+
|
294
|
+
# @!visibility private
|
295
|
+
attr_reader :xcode
|
296
|
+
|
297
|
+
# @!visibility private
|
298
|
+
def xcode
|
299
|
+
@xcode ||= RunLoop::Xcode.new
|
300
|
+
end
|
301
|
+
|
302
|
+
# @!visibility private
|
303
|
+
attr_reader :instruments_instance
|
304
|
+
|
305
|
+
# @!visibility private
|
306
|
+
def instruments_instance
|
307
|
+
@instruments_instance ||= RunLoop::Instruments.new
|
308
|
+
end
|
294
309
|
end
|
295
310
|
end
|
data/lib/run_loop.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'run_loop/regex'
|
1
2
|
require 'run_loop/directory'
|
2
3
|
require 'run_loop/environment'
|
3
4
|
require 'run_loop/logging'
|
5
|
+
require 'run_loop/xcode'
|
6
|
+
require 'run_loop/l10n'
|
4
7
|
require 'run_loop/process_terminator'
|
5
8
|
require 'run_loop/process_waiter'
|
6
9
|
require 'run_loop/lldb'
|
@@ -25,6 +28,25 @@ require 'run_loop/simctl/plists'
|
|
25
28
|
|
26
29
|
module RunLoop
|
27
30
|
|
31
|
+
# Prints a deprecated message that includes the line number.
|
32
|
+
#
|
33
|
+
# @param [String] version Indicates when the feature was deprecated.
|
34
|
+
# @param [String] msg Deprecation message (possibly suggesting alternatives)
|
35
|
+
# @return [void]
|
36
|
+
def self.deprecated(version, msg)
|
37
|
+
|
38
|
+
if RUBY_VERSION < '2.0'
|
39
|
+
stack = Kernel.caller[1..6].join("\n")
|
40
|
+
else
|
41
|
+
stack = Kernel.caller(0, 6)[1..-1].join("\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
msg = "deprecated '#{version}' - #{msg}\n#{stack}"
|
45
|
+
|
46
|
+
$stderr.puts "\033[34mWARN: #{msg}\033[0m"
|
47
|
+
$stderr.flush
|
48
|
+
end
|
49
|
+
|
28
50
|
class TimeoutError < RuntimeError
|
29
51
|
end
|
30
52
|
|
@@ -206,7 +206,13 @@ function isLocationPrompt(alert) {
|
|
206
206
|
["OK", /Would Like to Access Your Photos/],
|
207
207
|
["OK", /Would Like to Access Your Contacts/],
|
208
208
|
["OK", /Location Accuracy/],
|
209
|
-
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/]
|
209
|
+
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/],
|
210
|
+
["OK", /Access the Microphone/],
|
211
|
+
["OK", /enviarle notificaiones/],
|
212
|
+
["OK", /Would Like to Access Your Calendar/],
|
213
|
+
["OK", /Would Like to Access Your Reminders/],
|
214
|
+
["OK", /Would Like to Access Your Motion Activity/],
|
215
|
+
["OK", /Would Like to Access the Camera/]
|
210
216
|
],
|
211
217
|
ans, exp,
|
212
218
|
txt;
|
data/scripts/run_loop_host.js
CHANGED
@@ -224,7 +224,13 @@ function isLocationPrompt(alert) {
|
|
224
224
|
["OK", /Would Like to Access Your Photos/],
|
225
225
|
["OK", /Would Like to Access Your Contacts/],
|
226
226
|
["OK", /Location Accuracy/],
|
227
|
-
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/]
|
227
|
+
["OK", /запрашивает разрешение на использование Ващей текущей пгеопозиции/],
|
228
|
+
["OK", /Access the Microphone/],
|
229
|
+
["OK", /enviarle notificaiones/],
|
230
|
+
["OK", /Would Like to Access Your Calendar/],
|
231
|
+
["OK", /Would Like to Access Your Reminders/],
|
232
|
+
["OK", /Would Like to Access Your Motion Activity/],
|
233
|
+
["OK", /Would Like to Access the Camera/]
|
228
234
|
],
|
229
235
|
ans, exp,
|
230
236
|
txt;
|
@@ -326,4 +332,4 @@ while (true) {
|
|
326
332
|
Log.result("success", _result);
|
327
333
|
target.delay(0.1);
|
328
334
|
}
|
329
|
-
}
|
335
|
+
}
|