Commit cc674182 authored by Boris Bügling's avatar Boris Bügling Committed by Samuel Giddins

Use `simctl list` for finding simulators

parent 69bccf61
module Pod
# Metadata about an installed Xcode simulator
class Simulator
attr_reader :id
attr_reader :name
attr_reader :os_name
attr_reader :os_version
def self.match(line, os_name, os_version)
sims = []
@sim_regex.match(line) { |m| sims << Simulator.new(m, os_name, os_version) }
sims
end
def to_s
"#{@name} (#{@id}) - #{@os_name} #{@os_version}"
end
private
@sim_regex = /^\s*(?<sim_name>[^\)]*?) \((?<sim_id>[^\)]*?)\) \((?<sim_state>[^\)]*?)\)$/
def initialize(match_data, os_name, os_version)
@id = match_data['sim_id']
@name = match_data['sim_name']
@os_name = os_name
@os_version = os_version
end
end
# Executes `simctl` commands
class SimControl
extend Executable
executable :xcrun
def initialize
@os_regex = /^-- (?<os_name>.*?) (?<os_version>[0-9].[0-9]) --$/
end
def destination(filter)
sim = simulator(filter)
raise "Simulator #{filter} is not available." if sim.nil?
['-destination', "id=#{sim.id}"]
end
def simulator(filter)
usable_simulators(filter).first
end
def usable_simulators(filter = nil)
os_name = ''
os_version = ''
sims = []
list(['devices']).lines.each do |line|
@os_regex.match(line) do |m|
os_name = m['os_name']
os_version = m['os_version']
end
sims += Simulator.match(line, os_name, os_version)
end
return sims if filter.nil?
sims.select { |sim| sim.name == filter }
end
private
def list(args)
simctl!(['list'] + args)
end
def simctl!(args)
xcrun!(['simctl'] + args)
end
end
end
require 'active_support/core_ext/array' require 'active_support/core_ext/array'
require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/string/inflections'
require 'cocoapods/simctl'
module Pod module Pod
# Validates a Specification. # Validates a Specification.
...@@ -699,11 +700,11 @@ module Pod ...@@ -699,11 +700,11 @@ module Pod
command = %w(clean build -workspace App.xcworkspace -scheme App -configuration Release) command = %w(clean build -workspace App.xcworkspace -scheme App -configuration Release)
case consumer.platform_name case consumer.platform_name
when :ios when :ios
command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + ['-destination', 'name=iPhone 4s'] command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + SimControl.new.destination('iPhone 4s')
when :watchos when :watchos
command += %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + ['-destination', 'name=Apple Watch - 38mm'] command += %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + SimControl.new.destination('Apple Watch - 38mm')
when :tvos when :tvos
command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + ['-destination', 'name=Apple TV 1080p'] command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + SimControl.new.destination('Apple TV 1080p')
end end
output, status = Dir.chdir(validation_dir) { _xcodebuild(command) } output, status = Dir.chdir(validation_dir) { _xcodebuild(command) }
......
...@@ -398,7 +398,8 @@ module Pod ...@@ -398,7 +398,8 @@ module Pod
validator.stubs(:validate_url) validator.stubs(:validate_url)
git = Executable.which(:git) git = Executable.which(:git)
Executable.stubs(:which).with('git').returns(git) Executable.stubs(:which).with('git').returns(git)
Executable.expects(:which).with('xcodebuild').times(4).returns('/usr/bin/xcodebuild') Executable.stubs(:which).with(:xcrun)
Executable.expects(:which).with('xcodebuild').times(2).returns('/usr/bin/xcodebuild')
status = mock status = mock
status.stubs(:success?).returns(false) status.stubs(:success?).returns(false)
validator.stubs(:_xcodebuild).returns(['Output', status]) validator.stubs(:_xcodebuild).returns(['Output', status])
...@@ -409,18 +410,20 @@ module Pod ...@@ -409,18 +410,20 @@ module Pod
end end
it 'runs xcodebuild with correct arguments for code signing' do it 'runs xcodebuild with correct arguments for code signing' do
SimControl.any_instance.stubs(:destination).returns(['-destination', 'id=XXX'])
Validator.any_instance.unstub(:xcodebuild) Validator.any_instance.unstub(:xcodebuild)
validator = Validator.new(podspec_path, SourcesManager.master.map(&:url)) validator = Validator.new(podspec_path, SourcesManager.master.map(&:url))
validator.stubs(:check_file_patterns) validator.stubs(:check_file_patterns)
validator.stubs(:validate_url) validator.stubs(:validate_url)
git = Executable.which(:git) git = Executable.which(:git)
Executable.stubs(:which).with('git').returns(git) Executable.stubs(:which).with('git').returns(git)
Executable.stubs(:which).with(:xcrun)
Executable.expects(:which).with('xcodebuild').times(4).returns('/usr/bin/xcodebuild') Executable.expects(:which).with('xcodebuild').times(4).returns('/usr/bin/xcodebuild')
command = %w(clean build -workspace App.xcworkspace -scheme App -configuration Release) command = %w(clean build -workspace App.xcworkspace -scheme App -configuration Release)
Executable.expects(:capture_command).with('xcodebuild', command, :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command, :capture => :merge).once.returns(['', stub(:success? => true)])
Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + ['-destination', 'name=Apple TV 1080p'], :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + SimControl.new.destination('Apple TV 1080p'), :capture => :merge).once.returns(['', stub(:success? => true)])
Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + ['-destination', 'name=iPhone 4s'], :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + SimControl.new.destination('iPhone 4s'), :capture => :merge).once.returns(['', stub(:success? => true)])
Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + ['-destination', 'name=Apple Watch - 38mm'], :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + SimControl.new.destination('Apple Watch - 38mm'), :capture => :merge).once.returns(['', stub(:success? => true)])
validator.validate validator.validate
end end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment