class Fourflusher::SimControl

Executes `simctl` commands

Executes `simctl` commands

Executes `simctl` commands

Public Instance Methods

destination(filter, os = :ios, minimum_version = '1.0') click to toggle source
# File lib/fourflusher/xcodebuild.rb, line 6
def destination(filter, os = :ios, minimum_version = '1.0')
  sim = simulator(filter, os, minimum_version)
  filter = "for #{os} #{minimum_version}" if filter == :oldest
  fail "Simulator #{filter} is not available." if sim.nil?
  ['-destination', "id=#{sim.id}"]
end
list(args) click to toggle source
# File lib/fourflusher/simctl.rb, line 9
def list(args)
  simctl!(['list'] + args)
end
simulator(filter, os_name = :ios, minimum_version = '1.0') click to toggle source
# File lib/fourflusher/find.rb, line 96
def simulator(filter, os_name = :ios, minimum_version = '1.0')
  usable_simulators(filter, os_name, minimum_version).first
end
usable_simulators(filter = nil, os = :ios, minimum_version = '1.0') click to toggle source
# File lib/fourflusher/find.rb, line 100
def usable_simulators(filter = nil, os = :ios, minimum_version = '1.0')
  sims = fetch_sims
  oses = sims.map(&:os_name).uniq
  os = os.downcase.to_sym

  unless oses.include?(os)
    fail "Could not find a `#{os}` simulator (valid values: #{oses.join(', ')}). Ensure that "\
      "Xcode -> Window -> Devices has at least one `#{os}` simulator listed or otherwise add one."
  end

  return sims if filter.nil?
  minimum_version = Gem::Version.new(minimum_version)
  sims = sims.select { |sim| sim.os_name == os && sim.compatible?(minimum_version) }

  return [sims.min_by(&:os_version)] if filter == :oldest

  found_sims = sims.select { |sim| sim.name == filter }
  return found_sims if found_sims.count > 0
  sims.select { |sim| sim.name.start_with?(filter) }
end

Private Instance Methods

fetch_sims() click to toggle source

Gets the simulators and transforms the simctl json into Simulator objects

# File lib/fourflusher/find.rb, line 124
def fetch_sims
  device_list = JSON.parse(list(['-j', 'devices']))['devices']
  unless device_list.is_a?(Hash)
    msg = "Expected devices to be of type Hash but instated found #{device_list.class}"
    fail Fourflusher::Informative, msg
  end
  device_list.flat_map do |runtime_str, devices|
    # This format changed with Xcode 10.2.
    if runtime_str.start_with?('com.apple.CoreSimulator.SimRuntime.')
      # Sample string: com.apple.CoreSimulator.SimRuntime.iOS-12-2
      _unused, os_info = runtime_str.split 'com.apple.CoreSimulator.SimRuntime.'
      os_name, os_major_version, os_minor_version = os_info.split '-'
      os_version = "#{os_major_version}.#{os_minor_version}"
    else
      # Sample string: iOS 9.3
      os_name, os_version = runtime_str.split ' '
    end

    devices.map do |device|
      device_is_available = device['isAvailable'] == 'YES' || device['isAvailable'] == true

      if device['availability'] == '(available)' || device_is_available
        Simulator.new(device, os_name, os_version)
      end
    end
  end.compact.sort(&:sim_list_compare)
end
simctl!(args) click to toggle source
# File lib/fourflusher/simctl.rb, line 15
def simctl!(args)
  xcrun!(['simctl'] + args)
end