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

Use fourflusher gem for simulator search

parent c7addd88
...@@ -107,6 +107,7 @@ PATH ...@@ -107,6 +107,7 @@ PATH
cocoapods-try (~> 0.5.1) cocoapods-try (~> 0.5.1)
colored (~> 1.2) colored (~> 1.2)
escape (~> 0.0.4) escape (~> 0.0.4)
fourflusher (~> 0.2.0)
molinillo (~> 0.4.0) molinillo (~> 0.4.0)
nap (~> 1.0) nap (~> 1.0)
xcodeproj (~> 0.28.2) xcodeproj (~> 0.28.2)
...@@ -138,6 +139,7 @@ GEM ...@@ -138,6 +139,7 @@ GEM
diffy (3.1.0) diffy (3.1.0)
escape (0.0.4) escape (0.0.4)
ffi (1.9.6) ffi (1.9.6)
fourflusher (0.2.0)
fuzzy_match (2.0.4) fuzzy_match (2.0.4)
i18n (0.7.0) i18n (0.7.0)
inch (0.7.0) inch (0.7.0)
......
...@@ -44,6 +44,7 @@ Gem::Specification.new do |s| ...@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
s.add_runtime_dependency 'escape', '~> 0.0.4' s.add_runtime_dependency 'escape', '~> 0.0.4'
s.add_runtime_dependency 'activesupport', '>= 4.0.2' s.add_runtime_dependency 'activesupport', '>= 4.0.2'
s.add_runtime_dependency 'nap', '~> 1.0' s.add_runtime_dependency 'nap', '~> 1.0'
s.add_runtime_dependency 'fourflusher', '~> 0.2.0'
s.add_development_dependency 'bundler', '~> 1.3' s.add_development_dependency 'bundler', '~> 1.3'
s.add_development_dependency 'rake', '~> 10.0' s.add_development_dependency 'rake', '~> 10.0'
......
...@@ -49,7 +49,6 @@ module Pod ...@@ -49,7 +49,6 @@ module Pod
autoload :Project, 'cocoapods/project' autoload :Project, 'cocoapods/project'
autoload :Resolver, 'cocoapods/resolver' autoload :Resolver, 'cocoapods/resolver'
autoload :Sandbox, 'cocoapods/sandbox' autoload :Sandbox, 'cocoapods/sandbox'
autoload :SimControl, 'cocoapods/simctl'
autoload :SourcesManager, 'cocoapods/sources_manager' autoload :SourcesManager, 'cocoapods/sources_manager'
autoload :Target, 'cocoapods/target' autoload :Target, 'cocoapods/target'
autoload :Validator, 'cocoapods/validator' autoload :Validator, 'cocoapods/validator'
......
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 'fourflusher'
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) + SimControl.new.destination('iPhone 4s') command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + Fourflusher::SimControl.new.destination('iPhone 4s')
when :watchos when :watchos
command += %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + SimControl.new.destination('Apple Watch - 38mm') command += %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + Fourflusher::SimControl.new.destination('Apple Watch - 38mm')
when :tvos when :tvos
command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + SimControl.new.destination('Apple TV 1080p') command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + Fourflusher::SimControl.new.destination('Apple TV 1080p')
end end
output, status = Dir.chdir(validation_dir) { _xcodebuild(command) } output, status = Dir.chdir(validation_dir) { _xcodebuild(command) }
......
require File.expand_path('../../spec_helper', __FILE__)
module Pod
SIMCTL_OUTPUT = <<-EOF
-- iOS 9.2 --
iPhone 4s (C0404A23-2D2D-4208-8CEC-774194D06759) (Shutdown)
iPhone 5 (7A0F62DD-8330-44F0-9828-AC8B1BC9BF05) (Shutdown)
iPhone 5s (51C1CB50-FBCB-47ED-B8FF-68C816BF0932) (Shutdown)
iPhone 6 (6F4E143A-6914-476E-90BF-51B680B8E2EF) (Shutdown)
iPhone 6 Plus (BEB9BFE9-AF1A-4FEA-9FA5-CAFD5243CA42) (Shutdown)
iPhone 6s (98DB904B-DF98-4F3C-AB21-A4D133604BA4) (Shutdown)
iPhone 6s Plus (65838307-4C03-4DD3-84E4-A6477CFD3490) (Shutdown)
iPad 2 (349C1313-6C9C-48C6-8849-DAB18BE2F15C) (Shutdown)
iPad Retina (30909168-4C90-48CD-B142-86DCF7B1372A) (Shutdown)
iPad Air (A8B5F651-C215-459C-95C6-663194F2277B) (Shutdown)
iPad Air 2 (BFDB363E-D514-490C-A1D6-AC86402089BA) (Shutdown)
iPad Pro (AE5DA548-66F6-4FCE-AA6D-5E6E17CD721E) (Shutdown)
-- tvOS 9.1 --
Apple TV 1080p (C5A44868-685C-4D72-BEBD-102246C870F7) (Shutdown)
-- watchOS 2.1 --
Apple Watch - 38mm (FE557B65-A044-44C3-96AC-2EAC395A6090) (Shutdown)
Apple Watch - 42mm (C9138FAE-6812-4BB5-A463-76520C116AF4) (Shutdown)
EOF
describe SimControl do
describe 'In general' do
before do
@ctrl = SimControl.new
@ctrl.stubs(:list).returns(SIMCTL_OUTPUT)
end
it 'can find all usable simulators' do
sims = @ctrl.usable_simulators
sims.count.should == 15
end
it 'can find a specific simulator' do
sim = @ctrl.simulator('iPhone 4s')
sim.id.should == 'C0404A23-2D2D-4208-8CEC-774194D06759'
sim.name.should == 'iPhone 4s'
sim.os_name.should == 'iOS'
sim.os_version.should == '9.2'
end
it 'can construct the destination argument for a specific simulator' do
destination = @ctrl.destination('iPhone 4s')
destination.should == ['-destination', 'id=C0404A23-2D2D-4208-8CEC-774194D06759']
end
end
end
describe Simulator do
describe 'In general' do
it 'can parse a line of simctl output' do
line = SIMCTL_OUTPUT.lines[1]
sim = Simulator.match(line, 'iOS', '8.0').first
sim.id.should == 'C0404A23-2D2D-4208-8CEC-774194D06759'
sim.name.should == 'iPhone 4s'
sim.os_name.should == 'iOS'
sim.os_version.should == '8.0'
end
it 'returns an empty list on invalid input' do
sim = Simulator.match('¯\_(ツ)_/¯', 'iOS', '8.0')
sim.should == []
end
it 'has a meaningful string conversion' do
line = SIMCTL_OUTPUT.lines[1]
sim = Simulator.match(line, 'iOS', '8.0')
sim.first.to_s.should == 'iPhone 4s (C0404A23-2D2D-4208-8CEC-774194D06759) - iOS 8.0'
end
end
end
end
...@@ -399,7 +399,7 @@ module Pod ...@@ -399,7 +399,7 @@ module Pod
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.stubs(:which).with(:xcrun)
Executable.expects(:which).with('xcodebuild').times(2).returns('/usr/bin/xcodebuild') Executable.expects(:which).with('xcodebuild').times(4).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])
...@@ -410,7 +410,7 @@ module Pod ...@@ -410,7 +410,7 @@ 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']) Fourflusher::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)
...@@ -421,9 +421,9 @@ module Pod ...@@ -421,9 +421,9 @@ module Pod
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) + 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 appletvsimulator) + Fourflusher::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) + SimControl.new.destination('iPhone 4s'), :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + Fourflusher::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) + SimControl.new.destination('Apple Watch - 38mm'), :capture => :merge).once.returns(['', stub(:success? => true)]) Executable.expects(:capture_command).with('xcodebuild', command + %w(CODE_SIGN_IDENTITY=- -sdk watchsimulator) + Fourflusher::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