run_loop 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b7bf28b320d229c203aba840fd310fa5d218969
|
4
|
+
data.tar.gz: df2729c85b406bac18cf9dbf82e44cdfa3fdcd48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ca074c5fa9370f9085758386a987fbeef3a534820cae5c7d41b1b0ab9c7a49c16df455684ebcbb323819dc987a46e5c63b6ba2abfa776ef280a48a57a31f180
|
7
|
+
data.tar.gz: 9b2ac244bc05587ecc7393a80c9eeb3c016fc623cbdbb8deafe0d72d1a059217daecbf99c829bbbb5247a41284b20028b06b23edf118f5b43ff9bfb66ae3d7d4
|
data/lib/run_loop/app.rb
CHANGED
@@ -16,6 +16,16 @@ module RunLoop
|
|
16
16
|
@path = File.expand_path(app_bundle_path)
|
17
17
|
end
|
18
18
|
|
19
|
+
# @!visibility private
|
20
|
+
def to_s
|
21
|
+
"#<APP: #{path}>"
|
22
|
+
end
|
23
|
+
|
24
|
+
# @!visibility private
|
25
|
+
def inspect
|
26
|
+
to_s
|
27
|
+
end
|
28
|
+
|
19
29
|
# Is this a valid app?
|
20
30
|
def valid?
|
21
31
|
[File.exist?(path),
|
data/lib/run_loop/cli/simctl.rb
CHANGED
@@ -16,8 +16,13 @@ module RunLoop
|
|
16
16
|
no_commands do
|
17
17
|
def tail_booted
|
18
18
|
device = booted_device
|
19
|
-
|
20
|
-
|
19
|
+
if device.nil?
|
20
|
+
version = Xcode.new.version
|
21
|
+
puts "No simulator for active Xcode (version #{version}) is booted."
|
22
|
+
else
|
23
|
+
log_file = device.simulator_log_file_path
|
24
|
+
exec('tail', *['-F', log_file])
|
25
|
+
end
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
@@ -25,7 +30,8 @@ module RunLoop
|
|
25
30
|
def booted
|
26
31
|
device = booted_device
|
27
32
|
if device.nil?
|
28
|
-
|
33
|
+
version = Xcode.new.version
|
34
|
+
puts "No simulator for active Xcode (version #{version}) is booted."
|
29
35
|
else
|
30
36
|
puts device
|
31
37
|
end
|
data/lib/run_loop/core.rb
CHANGED
@@ -29,7 +29,7 @@ module RunLoop
|
|
29
29
|
SCRIPTS_PATH
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.log_run_loop_options(options,
|
32
|
+
def self.log_run_loop_options(options, xcode)
|
33
33
|
return unless RunLoop::Environment.debug?
|
34
34
|
# Ignore :sim_control b/c it is a ruby object; printing is not useful.
|
35
35
|
ignored_keys = [:sim_control]
|
@@ -41,8 +41,8 @@ module RunLoop
|
|
41
41
|
# Objects that override '==' cannot be printed by awesome_print
|
42
42
|
# https://github.com/michaeldv/awesome_print/issues/154
|
43
43
|
# RunLoop::Version overrides '=='
|
44
|
-
options_to_log[:xcode] =
|
45
|
-
options_to_log[:xcode_path] =
|
44
|
+
options_to_log[:xcode] = xcode.version.to_s
|
45
|
+
options_to_log[:xcode_path] = xcode.developer_dir
|
46
46
|
message = options_to_log.ai({:sort_keys => true})
|
47
47
|
logger = options[:logger]
|
48
48
|
RunLoop::Logging.log_debug(logger, "\n" + message)
|
@@ -87,7 +87,7 @@ module RunLoop
|
|
87
87
|
if sim_control.xcode_version_gte_6?
|
88
88
|
sim_identifier = launch_options[:udid]
|
89
89
|
simulator = sim_control.simulators.find do |simulator|
|
90
|
-
[simulator.instruments_identifier(sim_control.
|
90
|
+
[simulator.instruments_identifier(sim_control.xcode),
|
91
91
|
simulator.udid].include?(sim_identifier)
|
92
92
|
end
|
93
93
|
|
@@ -100,7 +100,7 @@ module RunLoop
|
|
100
100
|
RunLoop::Logging.log_debug(logger, "Simulator instruction set '#{simulator.instruction_set}' is compatible with #{lipo.info}")
|
101
101
|
true
|
102
102
|
else
|
103
|
-
RunLoop::Logging.log_debug(logger, "Xcode #{sim_control.
|
103
|
+
RunLoop::Logging.log_debug(logger, "Xcode #{sim_control.xcode_version} detected; skipping simulator architecture check.")
|
104
104
|
false
|
105
105
|
end
|
106
106
|
end
|
@@ -124,7 +124,7 @@ module RunLoop
|
|
124
124
|
sim_control.quit_sim
|
125
125
|
end
|
126
126
|
|
127
|
-
if !sim_control.
|
127
|
+
if !sim_control.xcode_version_gte_6?
|
128
128
|
# Xcode 5.1.1
|
129
129
|
|
130
130
|
# Will quit the simulator!
|
@@ -134,8 +134,10 @@ module RunLoop
|
|
134
134
|
# CoreSimulator
|
135
135
|
|
136
136
|
udid = launch_options[:udid]
|
137
|
+
xcode = sim_control.xcode
|
138
|
+
|
137
139
|
device = sim_control.simulators.detect do |sim|
|
138
|
-
sim.udid == udid || sim.instruments_identifier == udid
|
140
|
+
sim.udid == udid || sim.instruments_identifier(xcode) == udid
|
139
141
|
end
|
140
142
|
|
141
143
|
if device.nil?
|
@@ -156,7 +158,7 @@ module RunLoop
|
|
156
158
|
|
157
159
|
# Xcode 6.3 instruments cannot launch an app that is already installed on
|
158
160
|
# iOS 8.3 Simulators. See: https://github.com/calabash/calabash-ios/issues/744
|
159
|
-
if sim_control.
|
161
|
+
if sim_control.xcode.version_gte_63?
|
160
162
|
app_bundle_path = launch_options[:bundle_dir_or_bundle_id]
|
161
163
|
bridge = RunLoop::Simctl::Bridge.new(device, app_bundle_path)
|
162
164
|
|
@@ -172,10 +174,18 @@ module RunLoop
|
|
172
174
|
|
173
175
|
logger = options[:logger]
|
174
176
|
sim_control ||= options[:sim_control] || RunLoop::SimControl.new
|
175
|
-
|
177
|
+
|
178
|
+
if options[:xctools]
|
179
|
+
RunLoop.deprecated('1.5.0', %q(
|
180
|
+
RunLoop::XCTools has been replaced with RunLoop::Xcode.
|
181
|
+
The :xctools key will be ignored. It has been replaced by the :xcode key.
|
182
|
+
Please update your sources to pass an instance of RunLoop::Xcode))
|
183
|
+
end
|
184
|
+
|
185
|
+
xcode ||= options[:xcode] || sim_control.xcode
|
176
186
|
|
177
187
|
instruments = RunLoop::Instruments.new
|
178
|
-
instruments.kill_instruments
|
188
|
+
instruments.kill_instruments(xcode)
|
179
189
|
|
180
190
|
device_target = options[:udid] || options[:device_target] || detect_connected_device || 'simulator'
|
181
191
|
if device_target && device_target.to_s.downcase == 'device'
|
@@ -251,9 +261,9 @@ module RunLoop
|
|
251
261
|
self.prepare_simulator(merged_options, sim_control)
|
252
262
|
end
|
253
263
|
|
254
|
-
self.log_run_loop_options(merged_options,
|
264
|
+
self.log_run_loop_options(merged_options, xcode)
|
255
265
|
|
256
|
-
automation_template = automation_template(
|
266
|
+
automation_template = automation_template(instruments)
|
257
267
|
|
258
268
|
RunLoop::Logging.log_header(logger, "Starting on #{device_target} App: #{bundle_dir_or_bundle_id}")
|
259
269
|
|
@@ -388,20 +398,27 @@ module RunLoop
|
|
388
398
|
#
|
389
399
|
# For historical reasons, the most recent non-64b SDK should be used.
|
390
400
|
#
|
391
|
-
# @param [RunLoop::XCTools]
|
401
|
+
# @param [RunLoop::XCTools, RunLoop::XCode] xcode Used to detect the current xcode
|
392
402
|
# version.
|
393
|
-
def self.default_simulator(
|
394
|
-
if
|
395
|
-
'
|
396
|
-
|
403
|
+
def self.default_simulator(xcode=RunLoop::Xcode.new)
|
404
|
+
if xcode.is_a?(RunLoop::XCTools)
|
405
|
+
RunLoop.deprecated('1.5.0',
|
406
|
+
%q(
|
407
|
+
RunLoop::XCTools has been replaced with RunLoop::Xcode.
|
408
|
+
Please update your sources to pass an instance of RunLoop::Xcode))
|
409
|
+
end
|
410
|
+
|
411
|
+
if xcode.version_gte_7?
|
412
|
+
'iPhone 5s (9.0)'
|
413
|
+
elsif xcode.version_gte_64?
|
397
414
|
'iPhone 5s (8.4 Simulator)'
|
398
|
-
elsif
|
415
|
+
elsif xcode.version_gte_63?
|
399
416
|
'iPhone 5s (8.3 Simulator)'
|
400
|
-
elsif
|
417
|
+
elsif xcode.version_gte_62?
|
401
418
|
'iPhone 5s (8.2 Simulator)'
|
402
|
-
elsif
|
419
|
+
elsif xcode.version_gte_61?
|
403
420
|
'iPhone 5s (8.1 Simulator)'
|
404
|
-
elsif
|
421
|
+
elsif xcode.version_gte_6?
|
405
422
|
'iPhone 5s (8.0 Simulator)'
|
406
423
|
else
|
407
424
|
'iPhone Retina (4-inch) - Simulator - iOS 7.1'
|
@@ -409,7 +426,7 @@ module RunLoop
|
|
409
426
|
end
|
410
427
|
|
411
428
|
def self.udid_and_bundle_for_launcher(device_target, options, sim_control=RunLoop::SimControl.new)
|
412
|
-
|
429
|
+
xcode = sim_control.xcode
|
413
430
|
|
414
431
|
bundle_dir_or_bundle_id = options[:app] || RunLoop::Environment.bundle_id || RunLoop::Environment.path_to_app_bundle
|
415
432
|
|
@@ -419,9 +436,9 @@ module RunLoop
|
|
419
436
|
|
420
437
|
udid = nil
|
421
438
|
|
422
|
-
if
|
439
|
+
if xcode.version_gte_51?
|
423
440
|
if device_target.nil? || device_target.empty? || device_target == 'simulator'
|
424
|
-
device_target = self.default_simulator(
|
441
|
+
device_target = self.default_simulator(xcode)
|
425
442
|
end
|
426
443
|
udid = device_target
|
427
444
|
|
@@ -429,6 +446,7 @@ module RunLoop
|
|
429
446
|
bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
|
430
447
|
end
|
431
448
|
else
|
449
|
+
#TODO: this can be removed - Xcode < 5.1.1 not supported.
|
432
450
|
if device_target == 'simulator'
|
433
451
|
|
434
452
|
unless File.exist?(bundle_dir_or_bundle_id)
|
@@ -621,15 +639,25 @@ module RunLoop
|
|
621
639
|
result
|
622
640
|
end
|
623
641
|
|
624
|
-
def self.automation_template(
|
642
|
+
def self.automation_template(instruments, candidate=RunLoop::Environment.trace_template)
|
625
643
|
unless candidate && File.exist?(candidate)
|
626
|
-
candidate = default_tracetemplate
|
644
|
+
candidate = default_tracetemplate(instruments)
|
627
645
|
end
|
628
646
|
candidate
|
629
647
|
end
|
630
648
|
|
631
|
-
def self.default_tracetemplate(
|
632
|
-
|
649
|
+
def self.default_tracetemplate(instruments_arg=RunLoop::Instruments.new)
|
650
|
+
if instruments_arg.is_a?(RunLoop::XCTools)
|
651
|
+
RunLoop.deprecated('1.5.0',
|
652
|
+
%q(
|
653
|
+
RunLoop::XCTools has been replaced with RunLoop::Xcode.
|
654
|
+
Please update your sources to pass an instance of RunLoop::Instruments))
|
655
|
+
instruments = RunLoop::Instruments.new
|
656
|
+
else
|
657
|
+
instruments = instruments_arg
|
658
|
+
end
|
659
|
+
|
660
|
+
templates = instruments.templates
|
633
661
|
|
634
662
|
# xcrun instruments -s templates
|
635
663
|
# Xcode >= 6 will return known, Apple defined tracetemplates as names
|
@@ -641,23 +669,23 @@ module RunLoop
|
|
641
669
|
# behavior when GM is released.
|
642
670
|
#
|
643
671
|
# Xcode 7 Beta versions appear to behavior like Xcode 6 Beta versions.
|
644
|
-
|
645
|
-
return
|
672
|
+
template = templates.find { |name| name == 'Automation' }
|
673
|
+
return template if template
|
646
674
|
|
647
|
-
candidate = templates.
|
675
|
+
candidate = templates.find do |path|
|
648
676
|
path =~ /\/Automation.tracetemplate/ and path =~ /Xcode/
|
649
677
|
end
|
650
678
|
|
651
|
-
if !candidate.
|
652
|
-
return candidate.
|
679
|
+
if !candidate.nil?
|
680
|
+
return candidate.tr("\"", '').strip
|
653
681
|
end
|
654
682
|
|
655
|
-
|
683
|
+
message = ['Expected instruments to report an Automation tracetemplate.',
|
656
684
|
'Please report this as bug: https://github.com/calabash/run_loop/issues',
|
657
685
|
"In the bug report, include the output of:\n",
|
658
686
|
'$ xcrun xcodebuild -version',
|
659
687
|
"$ xcrun instruments -s templates\n"]
|
660
|
-
raise
|
688
|
+
raise message.join("\n")
|
661
689
|
end
|
662
690
|
|
663
691
|
# @deprecated 1.0.5
|
@@ -675,8 +703,8 @@ module RunLoop
|
|
675
703
|
end
|
676
704
|
|
677
705
|
# @deprecated 1.0.0 replaced with Xctools#version
|
678
|
-
def self.xcode_version(
|
679
|
-
|
706
|
+
def self.xcode_version(xcode=RunLoop::Xcode.new)
|
707
|
+
xcode.version
|
680
708
|
end
|
681
709
|
|
682
710
|
# @deprecated since 1.0.0
|
data/lib/run_loop/device.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module RunLoop
|
2
2
|
class Device
|
3
3
|
|
4
|
+
include RunLoop::Regex
|
5
|
+
|
4
6
|
attr_reader :name
|
5
7
|
attr_reader :version
|
6
8
|
attr_reader :udid
|
@@ -40,7 +42,7 @@ module RunLoop
|
|
40
42
|
# passed to instruments.
|
41
43
|
#
|
42
44
|
# @example
|
43
|
-
# RunLoop::Device.device_with_identifier('iPhone 4s (8.3 Simulator')
|
45
|
+
# RunLoop::Device.device_with_identifier('iPhone 4s (8.3 Simulator'))
|
44
46
|
# RunLoop::Device.device_with_identifier('6E43E3CF-25F5-41CC-A833-588F043AE749')
|
45
47
|
# RunLoop::Device.device_with_identifier('denis') # Simulator or device named 'denis'
|
46
48
|
# RunLoop::Device.device_with_identifier('893688959205dc7eb48d603c558ede919ad8dd0c')
|
@@ -50,20 +52,45 @@ module RunLoop
|
|
50
52
|
#
|
51
53
|
# @param [String] udid_or_name A name or udid that identifies the device you
|
52
54
|
# are looking for.
|
53
|
-
# @param [
|
54
|
-
#
|
55
|
-
#
|
55
|
+
# @param [Hash] options Allows callers to pass runtime models that might
|
56
|
+
# optimize performance (via memoization).
|
57
|
+
# @option options [RunLoop::SimControl] :sim_control An instance of
|
58
|
+
# SimControl.
|
59
|
+
# @option options [RunLoop::Instruments] :instruments An instance of
|
60
|
+
# Instruments.
|
61
|
+
#
|
56
62
|
# @return [RunLoop::Device] A device that matches `udid_or_name`.
|
57
63
|
# @raise [ArgumentError] If no matching device can be found.
|
58
|
-
def self.device_with_identifier(udid_or_name,
|
64
|
+
def self.device_with_identifier(udid_or_name, options={})
|
65
|
+
if options.is_a?(RunLoop::SimControl)
|
66
|
+
RunLoop.deprecated('1.5.0', %q(
|
67
|
+
The 'sim_control' argument has been deprecated. It has been replaced by an
|
68
|
+
options hash with two keys: :sim_control and :instruments.
|
69
|
+
Please update your sources.))
|
70
|
+
merged_options = {
|
71
|
+
:sim_control => options,
|
72
|
+
:instruments => RunLoop::Instruments.new
|
73
|
+
}
|
74
|
+
else
|
75
|
+
default_options = {
|
76
|
+
:sim_control => RunLoop::SimControl.new,
|
77
|
+
:instruments => RunLoop::Instruments.new
|
78
|
+
}
|
79
|
+
merged_options = default_options.merge(options)
|
80
|
+
end
|
81
|
+
|
82
|
+
instruments = merged_options[:instruments]
|
83
|
+
sim_control = merged_options[:sim_control]
|
84
|
+
|
85
|
+
xcode = sim_control.xcode
|
59
86
|
simulator = sim_control.simulators.detect do |sim|
|
60
|
-
sim.instruments_identifier == udid_or_name ||
|
87
|
+
sim.instruments_identifier(xcode) == udid_or_name ||
|
61
88
|
sim.udid == udid_or_name
|
62
89
|
end
|
63
90
|
|
64
91
|
return simulator if !simulator.nil?
|
65
92
|
|
66
|
-
physical_device =
|
93
|
+
physical_device = instruments.physical_devices.detect do |device|
|
67
94
|
device.name == udid_or_name ||
|
68
95
|
device.udid == udid_or_name
|
69
96
|
end
|
@@ -73,46 +100,68 @@ module RunLoop
|
|
73
100
|
raise ArgumentError, "Could not find a device with a UDID or name matching '#{udid_or_name}'"
|
74
101
|
end
|
75
102
|
|
103
|
+
# @!visibility private
|
76
104
|
def to_s
|
77
105
|
if simulator?
|
78
|
-
"#<Simulator: #{
|
106
|
+
"#<Simulator: #{name} #{udid} #{instruction_set}>"
|
79
107
|
else
|
80
108
|
"#<Device: #{name} #{udid}>"
|
81
109
|
end
|
82
110
|
end
|
83
111
|
|
112
|
+
# @!visibility private
|
113
|
+
def inspect
|
114
|
+
to_s
|
115
|
+
end
|
116
|
+
|
84
117
|
# Returns and instruments-ready device identifier that is a suitable value
|
85
118
|
# for DEVICE_TARGET environment variable.
|
86
119
|
#
|
120
|
+
# @note As of 1.5.0, the XCTools optional argument has become a non-optional
|
121
|
+
# Xcode argument.
|
122
|
+
#
|
123
|
+
# @param [RunLoop::Xcode, RunLoop::XCTools] xcode The version of the active
|
124
|
+
# Xcode.
|
87
125
|
# @return [String] An instruments-ready device identifier.
|
88
126
|
# @raise [RuntimeError] If trying to obtain a instruments-ready identifier
|
89
127
|
# for a simulator when Xcode < 6.
|
90
|
-
def instruments_identifier(
|
128
|
+
def instruments_identifier(xcode=SIM_CONTROL.xcode)
|
129
|
+
if xcode.is_a?(RunLoop::XCTools)
|
130
|
+
RunLoop.deprecated('1.5.0',
|
131
|
+
%q(
|
132
|
+
RunLoop::XCTools has been replaced with a non-optional RunLoop::Xcode argument.
|
133
|
+
Please update your sources to pass an instance of RunLoop::Xcode))
|
134
|
+
end
|
135
|
+
|
91
136
|
if physical_device?
|
92
|
-
|
137
|
+
udid
|
93
138
|
else
|
94
|
-
|
95
|
-
|
139
|
+
if version == RunLoop::Version.new('7.0.3')
|
140
|
+
version_part = version.to_s
|
141
|
+
else
|
142
|
+
version_part = "#{version.major}.#{version.minor}"
|
96
143
|
end
|
97
|
-
|
98
|
-
|
144
|
+
|
145
|
+
if xcode.version_gte_7?
|
146
|
+
"#{name} (#{version_part})"
|
147
|
+
elsif xcode.version_gte_6?
|
148
|
+
"#{name} (#{version_part} Simulator)"
|
99
149
|
else
|
100
|
-
|
150
|
+
udid
|
101
151
|
end
|
102
|
-
"#{self.name} (#{version_part} Simulator)"
|
103
152
|
end
|
104
153
|
end
|
105
154
|
|
106
155
|
# Is this a physical device?
|
107
156
|
# @return [Boolean] Returns true if this is a device.
|
108
157
|
def physical_device?
|
109
|
-
not
|
158
|
+
not udid[DEVICE_UDID_REGEX, 0].nil?
|
110
159
|
end
|
111
160
|
|
112
161
|
# Is this a simulator?
|
113
162
|
# @return [Boolean] Returns true if this is a simulator.
|
114
163
|
def simulator?
|
115
|
-
not
|
164
|
+
not physical_device?
|
116
165
|
end
|
117
166
|
|
118
167
|
# Return the instruction set for this device.
|
@@ -128,7 +177,7 @@ module RunLoop
|
|
128
177
|
# @raise [RuntimeError] Raises an error if this device is a physical device.
|
129
178
|
# @return [String] An instruction set.
|
130
179
|
def instruction_set
|
131
|
-
if
|
180
|
+
if simulator?
|
132
181
|
if ['iPhone 4s', 'iPhone 5', 'iPad 2', 'iPad Retina'].include?(self.name)
|
133
182
|
'i386'
|
134
183
|
else
|
@@ -171,5 +220,8 @@ module RunLoop
|
|
171
220
|
|
172
221
|
CORE_SIMULATOR_DEVICE_DIR = File.expand_path('~/Library/Developer/CoreSimulator/Devices')
|
173
222
|
CORE_SIMULATOR_LOGS_DIR = File.expand_path('~/Library/Logs/CoreSimulator')
|
223
|
+
|
224
|
+
# TODO Is this a good idea? It speeds up rspec tests by a factor of ~2x...
|
225
|
+
SIM_CONTROL = RunLoop::SimControl.new
|
174
226
|
end
|
175
227
|
end
|
data/lib/run_loop/host_cache.rb
CHANGED
@@ -64,6 +64,16 @@ module RunLoop
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
# @!visibility private
|
68
|
+
def to_s
|
69
|
+
"#<HostCache #{path}>"
|
70
|
+
end
|
71
|
+
|
72
|
+
# @!visibility private
|
73
|
+
def inspect
|
74
|
+
to_s
|
75
|
+
end
|
76
|
+
|
67
77
|
# Reads the current cache.
|
68
78
|
# @return [Hash] A hash representation of the current state of the run-loop.
|
69
79
|
def read
|