run_loop 2.5.3 → 2.5.4
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/device.rb +21 -67
- data/lib/run_loop/plist_buddy.rb +103 -24
- data/lib/run_loop/simctl.rb +4 -3
- data/lib/run_loop/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 975468eda0e5cfb4d2432722651b202e8ec800a8
|
4
|
+
data.tar.gz: bf3695bf51d10dbaf295eb34d7b727da45e7996d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf3e3ab2e48f2754cb71d616e19f3a30d02d4d6749b1b471a0cf903318cd57b2d393badc75fc5d1664145755e9f584a2e0d898ea2cbfacda56bb6b590a0a1e33
|
7
|
+
data.tar.gz: 80b1520a789b6998204ff8137a80a26a0fbf9df37da7d7d978422a7562f16eaaca3acc4c727671f7d39f4ef57d48414617b666c279405d8cc8e89d0b7fd1c92a
|
data/lib/run_loop/device.rb
CHANGED
@@ -275,79 +275,44 @@ version: #{version}
|
|
275
275
|
|
276
276
|
# @!visibility private
|
277
277
|
def simulator_root_dir
|
278
|
-
|
279
|
-
|
280
|
-
File.join(CORE_SIMULATOR_DEVICE_DIR, udid)
|
281
|
-
}.call
|
278
|
+
return nil if physical_device?
|
279
|
+
@simulator_root_dir ||= File.join(CORE_SIMULATOR_DEVICE_DIR, udid)
|
282
280
|
end
|
283
281
|
|
284
282
|
# @!visibility private
|
285
283
|
def simulator_accessibility_plist_path
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
284
|
+
return nil if physical_device?
|
285
|
+
|
286
|
+
directory = File.join(simulator_root_dir, "data", "Library", "Preferences")
|
287
|
+
pbuddy.ensure_plist(directory, "com.apple.Accessibility.plist")
|
290
288
|
end
|
291
289
|
|
292
290
|
# @!visibility private
|
293
291
|
def simulator_preferences_plist_path
|
294
292
|
return nil if physical_device?
|
295
293
|
|
296
|
-
|
297
294
|
directory = File.join(simulator_root_dir, "data", "Library", "Preferences")
|
298
|
-
|
299
|
-
if !File.exist?(directory)
|
300
|
-
FileUtils.mkdir_p(directory)
|
301
|
-
end
|
302
|
-
|
303
|
-
plist = File.join(directory, "com.apple.Preferences.plist")
|
304
|
-
|
305
|
-
if !File.exist?(plist)
|
306
|
-
pbuddy.create_plist(plist)
|
307
|
-
end
|
308
|
-
plist
|
295
|
+
pbuddy.ensure_plist(directory, "com.apple.Preferences.plist")
|
309
296
|
end
|
310
297
|
|
311
298
|
# @!visibility private
|
312
299
|
def simulator_log_file_path
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
}.call
|
300
|
+
return nil if physical_device?
|
301
|
+
@simulator_log_file_path ||= File.join(CORE_SIMULATOR_LOGS_DIR, udid,
|
302
|
+
'system.log')
|
317
303
|
end
|
318
304
|
|
319
305
|
# @!visibility private
|
320
306
|
def simulator_device_plist
|
321
|
-
|
322
|
-
|
323
|
-
File.join(simulator_root_dir, 'device.plist')
|
324
|
-
end.call
|
307
|
+
return nil if physical_device?
|
308
|
+
pbuddy.ensure_plist(simulator_root_dir, "device.plist")
|
325
309
|
end
|
326
310
|
|
327
311
|
# @!visibility private
|
328
|
-
def simulator_global_preferences_path
|
312
|
+
def simulator_global_preferences_path
|
329
313
|
return nil if physical_device?
|
330
|
-
|
331
|
-
|
332
|
-
"data/Library/Preferences/.GlobalPreferences.plist")
|
333
|
-
|
334
|
-
return path if File.exist?(path)
|
335
|
-
|
336
|
-
start = Time.now
|
337
|
-
while !File.exist?(path) && (start + timeout) < Time.now
|
338
|
-
sleep(1.0)
|
339
|
-
end
|
340
|
-
|
341
|
-
return path if File.exist?(path)
|
342
|
-
|
343
|
-
raise(RuntimeError, %Q[
|
344
|
-
Timed out waiting for .GlobalPreferences.plist after #{Time.now - start} seconds.
|
345
|
-
|
346
|
-
File does not exist at path:
|
347
|
-
|
348
|
-
#{path}
|
349
|
-
|
350
|
-
])
|
314
|
+
directory = File.join(simulator_root_dir, "data", "Library", "Preferences")
|
315
|
+
pbuddy.ensure_plist(directory, ".GlobalPreferences.plist")
|
351
316
|
end
|
352
317
|
|
353
318
|
# @!visibility private
|
@@ -474,25 +439,14 @@ File does not exist at path:
|
|
474
439
|
|
475
440
|
global_plist = simulator_global_preferences_path
|
476
441
|
|
477
|
-
|
478
|
-
"
|
479
|
-
|
480
|
-
|
481
|
-
global_plist
|
482
|
-
]
|
483
|
-
|
484
|
-
# RunLoop::PlistBuddy cannot add items to arrays.
|
485
|
-
hash = run_shell_command(cmd, {:log_cmd => true})
|
486
|
-
|
487
|
-
if hash[:exit_status] != 0
|
442
|
+
begin
|
443
|
+
pbuddy.unshift_array("AppleLanguages", "string", lang_code,
|
444
|
+
global_plist)
|
445
|
+
rescue RuntimeError => e
|
488
446
|
raise RuntimeError, %Q[
|
489
|
-
Could not update the Simulator languages
|
490
|
-
|
491
|
-
#{cmd.join(" ")}
|
492
|
-
|
493
|
-
failed with this output:
|
447
|
+
Could not update the Simulator languages.
|
494
448
|
|
495
|
-
#{
|
449
|
+
#{e.message}
|
496
450
|
|
497
451
|
]
|
498
452
|
end
|
data/lib/run_loop/plist_buddy.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
module RunLoop
|
2
3
|
# A class for reading and writing property list values.
|
3
4
|
#
|
@@ -6,6 +7,11 @@ module RunLoop
|
|
6
7
|
# is problematic for our purposes.
|
7
8
|
class PlistBuddy
|
8
9
|
|
10
|
+
require "fileutils"
|
11
|
+
require "run_loop/shell"
|
12
|
+
|
13
|
+
include RunLoop::Shell
|
14
|
+
|
9
15
|
# Reads key from file and returns the result.
|
10
16
|
# @param [String] key the key to inspect (may not be nil or empty)
|
11
17
|
# @param [String] file the plist to read
|
@@ -18,11 +24,11 @@ module RunLoop
|
|
18
24
|
raise(ArgumentError, "key '#{key}' must not be nil or empty")
|
19
25
|
end
|
20
26
|
cmd = build_plist_cmd(:print, {:key => key}, file)
|
21
|
-
|
22
|
-
if
|
27
|
+
success, output = execute_plist_cmd(cmd, file, opts)
|
28
|
+
if !success
|
23
29
|
nil
|
24
30
|
else
|
25
|
-
|
31
|
+
output
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
@@ -64,8 +70,16 @@ module RunLoop
|
|
64
70
|
cmd = build_plist_cmd(:add, cmd_args, file)
|
65
71
|
end
|
66
72
|
|
67
|
-
|
68
|
-
|
73
|
+
success, output = execute_plist_cmd(cmd, file, merged)
|
74
|
+
if !success
|
75
|
+
raise RuntimeError, %Q[
|
76
|
+
Encountered an error performing operation on plist:
|
77
|
+
|
78
|
+
#{plist_buddy} -c "#{cmd}" #{file}
|
79
|
+
=> #{output}
|
80
|
+
]
|
81
|
+
end
|
82
|
+
success
|
69
83
|
end
|
70
84
|
|
71
85
|
# Creates an new empty plist at `path`.
|
@@ -85,6 +99,78 @@ module RunLoop
|
|
85
99
|
path
|
86
100
|
end
|
87
101
|
|
102
|
+
# Ensures a plist exists at path by creating necessary directories and
|
103
|
+
# creating an empty plist if none exists.
|
104
|
+
def ensure_plist(directory, name)
|
105
|
+
FileUtils.mkdir_p(directory) if !File.exist?(directory)
|
106
|
+
|
107
|
+
plist = File.join(directory, name)
|
108
|
+
|
109
|
+
create_plist(plist) if !File.exists?(plist)
|
110
|
+
|
111
|
+
plist
|
112
|
+
end
|
113
|
+
|
114
|
+
# Sends an arbitrary command (-c) to PlistBuddy.
|
115
|
+
#
|
116
|
+
# This class does not handle setting data, date, dictionary, or array
|
117
|
+
# or manipulating elements in existing array or dictionary types. This
|
118
|
+
# method is an attempt to bridge this gap.
|
119
|
+
#
|
120
|
+
# When setting/adding bool, real, integer, string values, use #plist_set.
|
121
|
+
#
|
122
|
+
# For reading values, use #plist_read.
|
123
|
+
#
|
124
|
+
# @param [String] cmd The command passed to PlistBuddy with -c
|
125
|
+
# @param [String] file Path the plist file
|
126
|
+
# @param [Hash] opts options for controlling execution
|
127
|
+
# @option opts [Boolean] :verbose (false) controls log level
|
128
|
+
# @raise RuntimeError when running the command fails.
|
129
|
+
# @return Boolean, String Success and the output of running the command.
|
130
|
+
def run_command(cmd, file, opts={})
|
131
|
+
success, output = execute_plist_cmd(cmd, file, opts)
|
132
|
+
if !success
|
133
|
+
raise RuntimeError, %Q[
|
134
|
+
Encountered an error performing operation on plist:
|
135
|
+
|
136
|
+
#{plist_buddy} -c "#{cmd}" #{file}
|
137
|
+
=> #{output}
|
138
|
+
]
|
139
|
+
end
|
140
|
+
return success, output
|
141
|
+
end
|
142
|
+
|
143
|
+
# Add value to the head of an array type.
|
144
|
+
#
|
145
|
+
# @param [String] key The plist key
|
146
|
+
# @param [String] type any allowed plist type
|
147
|
+
# @param [Object] value the value to add
|
148
|
+
# @param [String] path the plist path
|
149
|
+
# @param [Hash] opts options for controlling execution
|
150
|
+
# @option opts [Boolean] :verbose (false) controls log level
|
151
|
+
# @raise RuntimeError when running the command fails.
|
152
|
+
# @raise RuntimeError if attempt to push value onto non-array container.
|
153
|
+
def unshift_array(key, type, value, path, opts={})
|
154
|
+
if !plist_key_exists?(key, path)
|
155
|
+
run_command("Add :#{key} array", path, opts)
|
156
|
+
else
|
157
|
+
key_type = plist_read(key, path).split(" ")[0]
|
158
|
+
if key_type != "Array"
|
159
|
+
raise RuntimeError, %Q[
|
160
|
+
Could not push #{value} onto array:
|
161
|
+
Expected: key #{key} be of type Array
|
162
|
+
Found: had type #{key_type}
|
163
|
+
|
164
|
+
in plist:
|
165
|
+
|
166
|
+
#{path}
|
167
|
+
]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
run_command("Add :#{key}:0 #{type} #{value}", path, opts)
|
172
|
+
end
|
173
|
+
|
88
174
|
private
|
89
175
|
|
90
176
|
# returns the path to the PlistBuddy executable
|
@@ -101,24 +187,17 @@ module RunLoop
|
|
101
187
|
# @return [Boolean,String] `true` if command was successful. If :print'ing
|
102
188
|
# the result, the value of the key. If there is an error, the output of
|
103
189
|
# stderr.
|
104
|
-
def execute_plist_cmd(cmd, opts={})
|
105
|
-
default_opts = {:verbose => false}
|
190
|
+
def execute_plist_cmd(cmd, file, opts={})
|
191
|
+
default_opts = {:verbose => false }
|
106
192
|
merged = default_opts.merge(opts)
|
107
193
|
|
108
|
-
|
194
|
+
merged[:log_cmd] = merged[:verbose]
|
109
195
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
if not err.nil? and err != ''
|
116
|
-
res = err.chomp
|
117
|
-
else
|
118
|
-
res = std.chomp
|
119
|
-
end
|
120
|
-
end
|
121
|
-
res
|
196
|
+
args = [plist_buddy, "-c", cmd, file]
|
197
|
+
|
198
|
+
hash = run_shell_command(args, merged)
|
199
|
+
|
200
|
+
return hash[:exit_status] == 0, hash[:out]
|
122
201
|
end
|
123
202
|
|
124
203
|
# Composes a PlistBuddy command that can be executed as a shell command.
|
@@ -161,13 +240,13 @@ module RunLoop
|
|
161
240
|
unless key
|
162
241
|
raise(ArgumentError, ':key is a required key for :add command')
|
163
242
|
end
|
164
|
-
cmd_part = "
|
243
|
+
cmd_part = "Add :#{key} #{value_type} #{value}"
|
165
244
|
when :print
|
166
245
|
key = args_hash[:key]
|
167
246
|
unless key
|
168
247
|
raise(ArgumentError, ':key is a required key for :print command')
|
169
248
|
end
|
170
|
-
cmd_part = "
|
249
|
+
cmd_part = "Print :#{key}"
|
171
250
|
when :set
|
172
251
|
value = args_hash[:value]
|
173
252
|
unless value
|
@@ -177,13 +256,13 @@ module RunLoop
|
|
177
256
|
unless key
|
178
257
|
raise(ArgumentError, ':key is a required key for :set command')
|
179
258
|
end
|
180
|
-
cmd_part = "
|
259
|
+
cmd_part = "Set :#{key} #{value}"
|
181
260
|
else
|
182
261
|
cmds = [:add, :print, :set]
|
183
262
|
raise(ArgumentError, "expected '#{type}' to be one of '#{cmds}'")
|
184
263
|
end
|
185
264
|
|
186
|
-
|
265
|
+
cmd_part
|
187
266
|
end
|
188
267
|
end
|
189
268
|
end
|
data/lib/run_loop/simctl.rb
CHANGED
@@ -24,7 +24,7 @@ module RunLoop
|
|
24
24
|
"Shutdown" => 1,
|
25
25
|
"Shutting Down" => 2,
|
26
26
|
"Booted" => 3,
|
27
|
-
"Plist Missing" => -1
|
27
|
+
"Plist Missing Key" => -1
|
28
28
|
}.freeze
|
29
29
|
|
30
30
|
# @!visibility private
|
@@ -125,10 +125,11 @@ module RunLoop
|
|
125
125
|
# @!visibility private
|
126
126
|
def simulator_state_as_int(device)
|
127
127
|
plist = device.simulator_device_plist
|
128
|
-
|
128
|
+
|
129
|
+
if pbuddy.plist_key_exists?("state", plist)
|
129
130
|
pbuddy.plist_read("state", plist).to_i
|
130
131
|
else
|
131
|
-
SIM_STATES["Plist Missing"]
|
132
|
+
SIM_STATES["Plist Missing Key"]
|
132
133
|
end
|
133
134
|
end
|
134
135
|
|
data/lib/run_loop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: run_loop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Krukow
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-08-
|
12
|
+
date: 2017-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|