run_loop 1.3.3 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ace0ffcefdc1632ffec13c3608f5d84420cce172
4
- data.tar.gz: 294ebbb3b34bede8f8c41408247409b2ef6a48d2
3
+ metadata.gz: cea6224dea61d80b7d0462a2e902a68b31941b38
4
+ data.tar.gz: 9d30691d96a4040031389cc8ec13839945274122
5
5
  SHA512:
6
- metadata.gz: 0e38a71730596365f003c8a6a2398c1a39414b5b7e75e6bfbb5889d8cfadbb16dc2b8592ab2c2f8935c6ebdcad426693e8defd1bff651928d02dc69517eb71c2
7
- data.tar.gz: d32ea5410e120089858552ca42d43f31060bf3786a3bd9b8c7e658c004d66f1e1a1c5428b2c217b2a22a83f81c2fe39182b392741be53596790817c7e2b9c633
6
+ metadata.gz: 23d44bd5653d1bcf93cfbc298f9b97177269f296a309c042abd5150356ffb997ba6a53dd83de7203b9623a2bf0155bc50619096adf4606d94291e3c6c2007418
7
+ data.tar.gz: 0f1c02ae73981bb9dcd0799181152f234673aeb172909ecac90ae14ff263efa6fc5171c4c7ae21295fbd21173642e193dbaf4a73bd3d695ed813fdf9bb575f58
data/lib/run_loop/app.rb CHANGED
@@ -46,7 +46,7 @@ module RunLoop
46
46
  end
47
47
 
48
48
  # Inspects the app's Info.plist for the executable name.
49
- # @return [String] The value of CFBundleIdentifier.
49
+ # @return [String] The value of CFBundleExecutable.
50
50
  # @raise [RuntimeError] If the plist cannot be read or the
51
51
  # CFBundleExecutable is empty or does not exist.
52
52
  def executable_name
@@ -0,0 +1,68 @@
1
+ module RunLoop
2
+
3
+ # @!visibility private
4
+ # A class for managing an on-disk cache.
5
+ class Cache
6
+
7
+ require 'fileutils'
8
+
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ def clear
14
+ raise NotImplementedError, 'Subclasses must implement #clear'
15
+ end
16
+
17
+ def refresh
18
+ raise NotImplementedError, 'Subclasses must implement #refresh'
19
+ end
20
+
21
+ # Reads the current cache.
22
+ # @return [Hash] A hash representation of the cache on disk.
23
+ def read
24
+ if File.exist? path
25
+ File.open(path) do |file|
26
+ Marshal.load(file)
27
+ end
28
+ else
29
+ write({})
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :path
36
+
37
+ # @!visibility private
38
+ #
39
+ # Writes `hash` as a serial object. The existing data is overwritten.
40
+ #
41
+ # @param [Hash] hash The hash to write.
42
+ # @raise [ArgumentError] The `hash` parameter must not be nil and it must
43
+ # be a Hash.
44
+ # @raise [TypeError] If the hash contains objects that cannot be written
45
+ # by Marshal.dump.
46
+ #
47
+ # @return [Hash] Returns the `hash` argument.
48
+ def write(hash)
49
+ if hash.nil?
50
+ raise ArgumentError, 'Expected the hash parameter to be non-nil'
51
+ end
52
+
53
+ unless hash.is_a?(Hash)
54
+ raise ArgumentError, "Expected #{hash} to a Hash, but it is a #{hash.class}"
55
+ end
56
+
57
+ directory = File.dirname(path)
58
+ unless File.exist?(directory)
59
+ FileUtils.mkdir_p(directory)
60
+ end
61
+
62
+ File.open(path, 'w') do |file|
63
+ Marshal.dump(hash, file)
64
+ end
65
+ hash
66
+ end
67
+ end
68
+ end
@@ -31,6 +31,37 @@ module RunLoop
31
31
  end
32
32
  end
33
33
 
34
+ desc 'refresh', 'EXPERIMENTAL: Terminate CoreSimulatorService daemons'
35
+
36
+ method_option 'debug',
37
+ :desc => 'Enable debug logging.',
38
+ :aliases => '-v',
39
+ :required => false,
40
+ :default => false,
41
+ :type => :boolean
42
+
43
+ def refresh
44
+ debug = options[:debug]
45
+ original_value = ENV['DEBUG']
46
+
47
+ ENV['DEBUG'] = '1' if debug
48
+
49
+ RunLoop::SimControl.terminate_all_sims
50
+
51
+ begin
52
+ process_name = 'com.apple.CoreSimulator.CoreSimulatorService'
53
+ pids = RunLoop::ProcessWaiter.new(process_name, {:timeout => 0.2}).pids
54
+ if debug && pids.empty?
55
+ puts 'There are no CoreSimulatorServices processes running'
56
+ end
57
+ pids.each do |pid|
58
+ RunLoop::ProcessTerminator.new(pid, 'KILL', process_name).kill_process
59
+ end
60
+ ensure
61
+ ENV['DEBUG'] = original_value if debug
62
+ end
63
+ end
64
+
34
65
  no_commands do
35
66
  def sim_control
36
67
  @sim_control ||= RunLoop::SimControl.new
data/lib/run_loop/core.rb CHANGED
@@ -391,7 +391,9 @@ module RunLoop
391
391
  # @param [RunLoop::XCTools] xcode_tools Used to detect the current xcode
392
392
  # version.
393
393
  def self.default_simulator(xcode_tools=RunLoop::XCTools.new)
394
- if xcode_tools.xcode_version_gte_64?
394
+ if xcode_tools.xcode_version_gte_7?
395
+ 'iPhone 5s (9.0 Simulator)'
396
+ elsif xcode_tools.xcode_version_gte_64?
395
397
  'iPhone 5s (8.4 Simulator)'
396
398
  elsif xcode_tools.xcode_version_gte_63?
397
399
  'iPhone 5s (8.3 Simulator)'
@@ -637,13 +639,18 @@ module RunLoop
637
639
  #
638
640
  # Xcode 6 Beta versions also return paths, but revert to 'normal'
639
641
  # behavior when GM is released.
642
+ #
643
+ # Xcode 7 Beta versions appear to behavior like Xcode 6 Beta versions.
640
644
  res = templates.select { |name| name == 'Automation' }.first
641
645
  return res if res
642
646
 
643
- res = templates.select do |path|
647
+ candidate = templates.select do |path|
644
648
  path =~ /\/Automation.tracetemplate/ and path =~ /Xcode/
645
- end.first.tr("\"", '').strip
646
- return res if res
649
+ end
650
+
651
+ if !candidate.empty? && !candidate.first.nil?
652
+ return candidate.first.tr("\"", '').strip
653
+ end
647
654
 
648
655
  msgs = ['Expected instruments to report an Automation tracetemplate.',
649
656
  'Please report this as bug: https://github.com/calabash/run_loop/issues',
@@ -64,7 +64,6 @@ module RunLoop
64
64
  return simulator if !simulator.nil?
65
65
 
66
66
  physical_device = sim_control.xctools.instruments(:devices).detect do |device|
67
- puts device
68
67
  device.name == udid_or_name ||
69
68
  device.udid == udid_or_name
70
69
  end
@@ -76,9 +75,9 @@ module RunLoop
76
75
 
77
76
  def to_s
78
77
  if simulator?
79
- "Simulator: #{instruments_identifier} #{udid} #{instruction_set}"
78
+ "#<Simulator: #{instruments_identifier} #{udid} #{instruction_set}>"
80
79
  else
81
- "Device: #{name} #{udid}"
80
+ "#<Device: #{name} #{udid}>"
82
81
  end
83
82
  end
84
83
 
@@ -93,7 +92,7 @@ module RunLoop
93
92
  self.udid
94
93
  else
95
94
  unless xcode_tools.xcode_version_gte_6?
96
- raise "Expected Xcode >= 6, but found version #{xcode_tools.version} - cannot create an identifier"
95
+ raise "Expected Xcode >= 6, but found version #{xcode_tools.xcode_version} - cannot create an identifier"
97
96
  end
98
97
  if self.version == RunLoop::Version.new('7.0.3')
99
98
  version_part = self.version.to_s
@@ -1,12 +1,6 @@
1
1
  module RunLoop
2
2
  class Environment
3
3
 
4
- # Returns the user's Unix uid.
5
- # @return [Integer] The user's Unix uid as an integer.
6
- def self.uid
7
- `id -u`.strip.to_i
8
- end
9
-
10
4
  # Returns true if debugging is enabled.
11
5
  def self.debug?
12
6
  ENV['DEBUG'] == '1'
@@ -22,9 +22,15 @@ module RunLoop
22
22
 
23
23
  # The directory where the cache is stored.
24
24
  # @return [String] Expanded path to the default cache directory.
25
+ # @raise [RuntimeError] When the ~/.run_loop exists, but is not a directory.
25
26
  def self.default_directory
26
- uid = RunLoop::Environment.uid
27
- File.expand_path("/tmp/com.xamarin.calabash.run-loop_host-cache_#{uid}")
27
+ run_loop_dir = File.expand_path('~/.run-loop')
28
+ if !File.exist?(run_loop_dir)
29
+ FileUtils.mkdir(run_loop_dir)
30
+ elsif !File.directory?(run_loop_dir)
31
+ raise "Expected '#{run_loop_dir}' to be a directory.\nRunLoop requires this directory to cache files."
32
+ end
33
+ run_loop_dir
28
34
  end
29
35
 
30
36
  # The default cache.
@@ -61,8 +67,8 @@ module RunLoop
61
67
  # Reads the current cache.
62
68
  # @return [Hash] A hash representation of the current state of the run-loop.
63
69
  def read
64
- if File.exist? @path
65
- File.open(@path) do |file|
70
+ if File.exist? path
71
+ File.open(path) do |file|
66
72
  Marshal.load(file)
67
73
  end
68
74
  else
@@ -91,7 +97,7 @@ module RunLoop
91
97
  raise ArgumentError, "Expected #{hash} to a Hash, but it is a #{hash.class}"
92
98
  end
93
99
 
94
- File.open(@path, 'w+') do |file|
100
+ File.open(path, 'w+') do |file|
95
101
  Marshal.dump(hash, file)
96
102
  end
97
103
  true
@@ -0,0 +1,112 @@
1
+ module RunLoop
2
+ # A model of the an .ipa - a application binary for iOS devices.
3
+ class Ipa
4
+
5
+
6
+ # The path to this .ipa.
7
+ # @!attribute [r] path
8
+ # @return [String] A path to this .ipa.
9
+ attr_reader :path
10
+
11
+ # The bundle identifier of this ipa.
12
+ # @!attribute [r] bundle_identifier
13
+ # @return [String] The bundle identifier of this ipa; obtained by inspecting
14
+ # the app's Info.plist.
15
+ attr_reader :bundle_identifier
16
+
17
+ # Create a new ipa instance.
18
+ # @param [String] path_to_ipa The path the .ipa file.
19
+ # @return [Calabash::Ipa] A new ipa instance.
20
+ # @raise [RuntimeError] If the file does not exist.
21
+ # @raise [RuntimeError] If the file does not end in .ipa.
22
+ def initialize(path_to_ipa)
23
+ unless File.exist? path_to_ipa
24
+ raise "Expected an ipa at '#{path_to_ipa}'"
25
+ end
26
+
27
+ unless path_to_ipa.end_with?('.ipa')
28
+ raise "Expected '#{path_to_ipa}' to be an .ipa"
29
+ end
30
+ @path = path_to_ipa
31
+ end
32
+
33
+ # @!visibility private
34
+ def to_s
35
+ "#<IPA: #{bundle_identifier}: '#{path}'>"
36
+ end
37
+
38
+ # The bundle identifier of this ipa.
39
+ # @return [String] A string representation of this ipa's CFBundleIdentifier
40
+ # @raise [RuntimeError] If ipa does not expand into a Payload/<app name>.app
41
+ # directory.
42
+ # @raise [RuntimeError] If an Info.plist does exist in the .app.
43
+ def bundle_identifier
44
+ if bundle_dir.nil? || !File.exist?(bundle_dir)
45
+ raise "Expected a '#{File.basename(path).split('.').first}.app'\nat path '#{payload_dir}'"
46
+ end
47
+
48
+ @bundle_identifier ||= lambda {
49
+ info_plist_path = File.join(bundle_dir, 'Info.plist')
50
+ unless File.exist? info_plist_path
51
+ raise "Expected an 'Info.plist' at '#{bundle_dir}'"
52
+ end
53
+ identifier = plist_buddy.plist_read('CFBundleIdentifier', info_plist_path)
54
+
55
+ unless identifier
56
+ raise "Expected key 'CFBundleIdentifier' in '#{info_plist_path}'"
57
+ end
58
+ identifier
59
+ }.call
60
+ end
61
+
62
+ # Inspects the app's Info.plist for the executable name.
63
+ # @return [String] The value of CFBundleExecutable.
64
+ # @raise [RuntimeError] If the plist cannot be read or the
65
+ # CFBundleExecutable is empty or does not exist.
66
+ def executable_name
67
+ if bundle_dir.nil? || !File.exist?(bundle_dir)
68
+ raise "Expected a '#{File.basename(path).split('.').first}.app'\nat path '#{payload_dir}'"
69
+ end
70
+
71
+ @executable_name ||= lambda {
72
+ info_plist_path = File.join(bundle_dir, 'Info.plist')
73
+ unless File.exist? info_plist_path
74
+ raise "Expected an 'Info.plist' at '#{bundle_dir}'"
75
+ end
76
+ name = plist_buddy.plist_read('CFBundleExecutable', info_plist_path)
77
+
78
+ unless name
79
+ raise "Expected key 'CFBundleExecutable' in '#{info_plist_path}'"
80
+ end
81
+ name
82
+ }.call
83
+ end
84
+
85
+ private
86
+
87
+ def tmpdir
88
+ @tmpdir ||= Dir.mktmpdir
89
+ end
90
+
91
+ def payload_dir
92
+ @payload_dir ||= lambda {
93
+ FileUtils.cp(path, tmpdir)
94
+ zip_path = File.join(tmpdir, File.basename(path))
95
+ Dir.chdir(tmpdir) do
96
+ system('unzip', *['-q', zip_path])
97
+ end
98
+ File.join(tmpdir, 'Payload')
99
+ }.call
100
+ end
101
+
102
+ def bundle_dir
103
+ @bundle_dir ||= lambda {
104
+ Dir.glob(File.join(payload_dir, '*')).detect {|f| File.directory?(f) && f.end_with?('.app')}
105
+ }.call
106
+ end
107
+
108
+ def plist_buddy
109
+ @plist_buddy ||= RunLoop::PlistBuddy.new
110
+ end
111
+ end
112
+ end
@@ -20,6 +20,16 @@ module RunLoop
20
20
  @xctools ||= RunLoop::XCTools.new
21
21
  end
22
22
 
23
+ # @!visibility private
24
+ # Are we running Xcode 7 or above?
25
+ #
26
+ # This is a convenience method.
27
+ #
28
+ # @return [Boolean] `true` if the current Xcode version is >= 7.0
29
+ def xcode_version_gte_7?
30
+ xctools.xcode_version_gte_7?
31
+ end
32
+
23
33
  # @!visibility private
24
34
  # Are we running Xcode 6 or above?
25
35
  #
@@ -69,26 +79,19 @@ module RunLoop
69
79
  end
70
80
 
71
81
  # If it is not already running, launch the simulator for the current version
72
- # of Xcode.
82
+ # of Xcode. Launches the simulator in the background so it does not
83
+ # steal focus.
73
84
  #
74
85
  # @param [Hash] opts Optional controls.
75
86
  # @option opts [Float] :post_launch_wait (2.0) How long to sleep after the
76
87
  # simulator has launched.
77
- # @option opts [Boolean] :hide_after (false) If true, will attempt to Hide
78
- # the simulator after it is launched. This is useful `only when testing
79
- # gem features` that require the simulator be launched repeated and you are
80
- # tired of your editor losing focus. :)
81
88
  #
82
89
  # @todo Consider migrating apple script call to xctools.
83
90
  def launch_sim(opts={})
84
91
  unless sim_is_running?
85
- default_opts = {:post_launch_wait => RunLoop::Environment.sim_post_launch_wait || 2.0,
86
- :hide_after => false}
92
+ default_opts = {:post_launch_wait => RunLoop::Environment.sim_post_launch_wait || 2.0}
87
93
  merged_opts = default_opts.merge(opts)
88
- `xcrun open -a "#{sim_app_path}"`
89
- if merged_opts[:hide_after]
90
- `xcrun /usr/bin/osascript -e 'tell application "System Events" to keystroke "h" using command down'`
91
- end
94
+ `xcrun open -g -a "#{sim_app_path}"`
92
95
  sleep(merged_opts[:post_launch_wait]) if merged_opts[:post_launch_wait]
93
96
  end
94
97
  end
@@ -101,14 +104,9 @@ module RunLoop
101
104
  # simulator has quit.
102
105
  # @option opts [Float] :post_launch_wait (2.0) How long to sleep after the
103
106
  # simulator has launched.
104
- # @option opts [Boolean] :hide_after (false) If true, will attempt to Hide
105
- # the simulator after it is launched. This is useful `only when testing
106
- # gem features` that require the simulator be launched repeated and you are
107
- # tired of your editor losing focus. :)
108
107
  def relaunch_sim(opts={})
109
108
  default_opts = {:post_quit_wait => 1.0,
110
- :post_launch_wait => RunLoop::Environment.sim_post_launch_wait || 2.0,
111
- :hide_after => false}
109
+ :post_launch_wait => RunLoop::Environment.sim_post_launch_wait || 2.0}
112
110
  merged_opts = default_opts.merge(opts)
113
111
  quit_sim(merged_opts)
114
112
  launch_sim(merged_opts)
@@ -132,7 +130,13 @@ module RunLoop
132
130
  # SimControl.new.quit_sim({:post_quit_wait => 0.5})
133
131
 
134
132
  processes =
135
- ['iPhone Simulator.app', 'iOS Simulator.app',
133
+ [
134
+ # Xcode < 5.1
135
+ 'iPhone Simulator.app',
136
+ # 7.0 < Xcode <= 6.0
137
+ 'iOS Simulator.app',
138
+ # Xcode >= 7.0
139
+ 'Simulator.app',
136
140
 
137
141
  # Multiple launchd_sim processes have been causing problems. This
138
142
  # is a first pass at investigating what it would mean to kill the
@@ -190,17 +194,11 @@ module RunLoop
190
194
  # simulator has launched. Waits longer than normal because we need the
191
195
  # simulator directories to be repopulated. **NOTE:** This option is ignored
192
196
  # in Xcode 6.
193
- # @option opts [Boolean] :hide_after (false) If true, will attempt to Hide
194
- # the simulator after it is launched. This is useful `only when testing
195
- # gem features` that require the simulator be launched repeated and you are
196
- # tired of your editor losing focus. :) **NOTE:** This option is ignored
197
- # in Xcode 6.
198
197
  # @option opts [String] :sim_udid (nil) The udid of the simulator to reset.
199
198
  # **NOTE:** This option is ignored in Xcode < 6.
200
199
  def reset_sim_content_and_settings(opts={})
201
200
  default_opts = {:post_quit_wait => 1.0,
202
201
  :post_launch_wait => RunLoop::Environment.sim_post_launch_wait || 3.0,
203
- :hide_after => false,
204
202
  :sim_udid => nil}
205
203
  merged_opts = default_opts.merge(opts)
206
204
 
@@ -606,7 +604,8 @@ module RunLoop
606
604
  #
607
605
  # @return [String, nil] The pid as a String or nil if no process is found.
608
606
  def sim_pid
609
- `xcrun ps x -o pid,command | grep "#{sim_name}" | grep -v grep`.strip.split(' ').first
607
+ process_name = "MacOS/#{sim_name}"
608
+ `xcrun ps x -o pid,command | grep "#{process_name}" | grep -v grep`.strip.split(' ').first
610
609
  end
611
610
 
612
611
  # @!visibility private
@@ -621,7 +620,9 @@ module RunLoop
621
620
  # launching the current simulator.
622
621
  def sim_name
623
622
  @sim_name ||= lambda {
624
- if xcode_version_gte_6?
623
+ if xcode_version_gte_7?
624
+ 'Simulator'
625
+ elsif xcode_version_gte_6?
625
626
  'iOS Simulator'
626
627
  else
627
628
  'iPhone Simulator'
@@ -639,7 +640,9 @@ module RunLoop
639
640
  def sim_app_path
640
641
  @sim_app_path ||= lambda {
641
642
  dev_dir = xctools.xcode_developer_dir
642
- if xcode_version_gte_6?
643
+ if xcode_version_gte_7?
644
+ "#{dev_dir}/Applications/Simulator.app"
645
+ elsif xcode_version_gte_6?
643
646
  "#{dev_dir}/Applications/iOS Simulator.app"
644
647
  else
645
648
  "#{dev_dir}/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app"
@@ -27,10 +27,7 @@ module RunLoop::Simctl
27
27
  @pbuddy = RunLoop::PlistBuddy.new
28
28
 
29
29
  @sim_control = RunLoop::SimControl.new
30
- @path_to_ios_sim_app_bundle = lambda {
31
- dev_dir = @sim_control.xctools.xcode_developer_dir
32
- "#{dev_dir}/Applications/iOS Simulator.app"
33
- }.call
30
+ @path_to_ios_sim_app_bundle = @sim_control.send(:sim_app_path)
34
31
 
35
32
  @app = RunLoop::App.new(app_bundle_path)
36
33
 
@@ -175,35 +172,43 @@ module RunLoop::Simctl
175
172
  end
176
173
 
177
174
  def terminate_core_simulator_processes
178
- debug_logging = RunLoop::Environment.debug?
179
175
  [
180
- # Probably no.
181
- #'com.apple.CoreSimulator.CoreSimulatorService',
182
- #'com.apple.CoreSimulator.SimVerificationService',
176
+ # Pattern.
177
+ # [ '< process name >', < send term first > ]
178
+
179
+ # No. This process is a daemon, and requires 'KILL' to terminate.
180
+ # Killing the process is fast, but it takes a long time to restart.
181
+ # ['com.apple.CoreSimulator.CoreSimulatorService', false],
182
+
183
+ # Probably do not need to quit this, but it is tempting to do so.
184
+ #['com.apple.CoreSimulator.SimVerificationService', false],
183
185
 
184
186
  # Started by Xamarin Studio, this is the parent process of the
185
187
  # processes launched by Xamarin's interaction with
186
188
  # CoreSimulatorBridge
187
- 'csproxy',
189
+ ['csproxy', true],
188
190
 
189
191
  # Yes.
190
- 'SimulatorBridge',
191
- 'configd_sim',
192
- 'launchd_sim',
192
+ ['SimulatorBridge', true],
193
+ ['configd_sim', true],
194
+ ['launchd_sim', true],
193
195
 
194
196
  # Yes, but does not always appear.
195
- 'CoreSimulatorBridge'
196
- ].each do |name|
197
+ ['CoreSimulatorBridge', true]
198
+ ].each do |pair|
199
+ name = pair[0]
200
+ send_term = pair[1]
197
201
  pids = RunLoop::ProcessWaiter.new(name).pids
198
202
  pids.each do |pid|
199
- if debug_logging
200
- puts "Sending 'TERM' to #{name} '#{pid}'"
203
+
204
+ if send_term
205
+ term = RunLoop::ProcessTerminator.new(pid, 'TERM', name)
206
+ killed = term.kill_process
207
+ else
208
+ killed = false
201
209
  end
202
- term = RunLoop::ProcessTerminator.new(pid, 'TERM', name)
203
- unless term.kill_process
204
- if debug_logging
205
- puts "Sending 'KILL' to #{name} '#{pid}'"
206
- end
210
+
211
+ unless killed
207
212
  term = RunLoop::ProcessTerminator.new(pid, 'KILL', name)
208
213
  term.kill_process
209
214
  end
@@ -371,13 +376,14 @@ module RunLoop::Simctl
371
376
  end
372
377
 
373
378
  def launch_simulator
374
- args = ['open', '-a', @path_to_ios_sim_app_bundle, '--args', '-CurrentDeviceUDID', device.udid]
379
+ args = ['open', '-g', '-a', @path_to_ios_sim_app_bundle, '--args', '-CurrentDeviceUDID', device.udid]
375
380
  pid = spawn('xcrun', *args)
376
381
  Process.detach(pid)
377
382
 
378
383
  # @todo Does not always appear?
379
384
  # RunLoop::ProcessWaiter.new('CoreSimulatorBridge', WAIT_FOR_APP_LAUNCH_OPTS).wait_for_any
380
- RunLoop::ProcessWaiter.new('iOS Simulator', WAIT_FOR_APP_LAUNCH_OPTS).wait_for_any
385
+ sim_name = @sim_control.send(:sim_name)
386
+ RunLoop::ProcessWaiter.new(sim_name, WAIT_FOR_APP_LAUNCH_OPTS).wait_for_any
381
387
  RunLoop::ProcessWaiter.new('SimulatorBridge', WAIT_FOR_APP_LAUNCH_OPTS).wait_for_any
382
388
  wait_for_device_state 'Booted'
383
389
  sleep(SIM_POST_LAUNCH_WAIT)
@@ -1,5 +1,5 @@
1
1
  module RunLoop
2
- VERSION = '1.3.3'
2
+ VERSION = '1.4.0'
3
3
 
4
4
  # A model of a software release version that can be used to compare two versions.
5
5
  #
@@ -15,6 +15,14 @@ module RunLoop
15
15
  # @todo Refactor instruments related code to instruments class.
16
16
  class XCTools
17
17
 
18
+ # Returns a version instance for `Xcode 7.0`; used to check for the
19
+ # availability of features and paths to various items on the filesystem.
20
+ #
21
+ # @return [RunLoop::Version] 7.0
22
+ def v70
23
+ @xc70 ||= RunLoop::Version.new('7.0')
24
+ end
25
+
18
26
  # Returns a version instance for `Xcode 6.4`; used to check for the
19
27
  # availability of features and paths to various items on the filesystem.
20
28
  #
@@ -106,6 +114,13 @@ module RunLoop
106
114
  @xcode_gte_6 ||= xcode_version >= v60
107
115
  end
108
116
 
117
+ # Are we running Xcode 6 or above?
118
+ #
119
+ # @return [Boolean] `true` if the current Xcode version is >= 6.0
120
+ def xcode_version_gte_7?
121
+ @xcode_gte_6 ||= xcode_version >= v70
122
+ end
123
+
109
124
  # Are we running Xcode 5.1 or above?
110
125
  #
111
126
  # @return [Boolean] `true` if the current Xcode version is >= 5.1
data/lib/run_loop.rb CHANGED
@@ -11,10 +11,12 @@ require 'run_loop/version'
11
11
  require 'run_loop/xctools'
12
12
  require 'run_loop/plist_buddy'
13
13
  require 'run_loop/app'
14
+ require 'run_loop/ipa'
14
15
  require 'run_loop/sim_control'
15
16
  require 'run_loop/device'
16
17
  require 'run_loop/instruments'
17
18
  require 'run_loop/lipo'
19
+ require 'run_loop/cache/cache'
18
20
  require 'run_loop/host_cache'
19
21
  require 'run_loop/patches/awesome_print'
20
22
  require 'run_loop/patches/retriable'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: run_loop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Krukow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-11 00:00:00.000000000 Z
11
+ date: 2015-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -284,6 +284,7 @@ files:
284
284
  - bin/run-loop
285
285
  - lib/run_loop.rb
286
286
  - lib/run_loop/app.rb
287
+ - lib/run_loop/cache/cache.rb
287
288
  - lib/run_loop/cli/cli.rb
288
289
  - lib/run_loop/cli/errors.rb
289
290
  - lib/run_loop/cli/instruments.rb
@@ -296,6 +297,7 @@ files:
296
297
  - lib/run_loop/fifo.rb
297
298
  - lib/run_loop/host_cache.rb
298
299
  - lib/run_loop/instruments.rb
300
+ - lib/run_loop/ipa.rb
299
301
  - lib/run_loop/lipo.rb
300
302
  - lib/run_loop/lldb.rb
301
303
  - lib/run_loop/logging.rb
@@ -342,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
342
344
  version: '0'
343
345
  requirements: []
344
346
  rubyforge_project:
345
- rubygems_version: 2.4.5
347
+ rubygems_version: 2.4.7
346
348
  signing_key:
347
349
  specification_version: 4
348
350
  summary: The bridge between Calabash iOS and Xcode command-line tools like instruments