module XcTools::XcodeBuild

Constants

Error
Info
NilOutputError

Public Class Methods

info(*args) click to toggle source
# File lib/xctools/xcode_build.rb, line 23
def self.info(*args)
  output = execute_xcodebuild('-list', *args)
  info = parse_info_output(output)
  Info.new(info)
end
parse_info_output(output) click to toggle source
# File lib/xctools/xcode_build.rb, line 29
def self.parse_info_output(output)
  lines = output.split(/\n/)

  project_name = parse_info_project_name(lines.first)

  info, _ = lines.drop(1).reduce([{}, nil]) do |(info, group), line|
    parse_info_line(line, info, group)
  end

  info.each do |_, values|
    values.delete('')
    values.uniq!
  end

  info.merge(project: project_name)
end
parse_info_project_name(line) click to toggle source
# File lib/xctools/xcode_build.rb, line 46
def self.parse_info_project_name(line)
  $1 if line =~ /\"(.+)\"\:/
end
parse_settings_output(output) click to toggle source
# File lib/xctools/xcode_build.rb, line 68
def self.parse_settings_output(output)
  lines = output.split(/\n/)

  lines.reduce([{}, nil]) do |(settings, target), line|
    parse_settings_line(line, settings, target)
  end.first
end
parse_xcode_version(output) click to toggle source
# File lib/xctools/xcode_build.rb, line 95
def self.parse_xcode_version(output)
  $1 if output =~ /([\d+\.?]+)/
end
settings(*args) click to toggle source
# File lib/xctools/xcode_build.rb, line 62
def self.settings(*args)
  output = execute_xcodebuild('-showBuildSettings', *args)
  settings = parse_settings_output(output)
  Settings.new(settings)
end
version() click to toggle source
# File lib/xctools/xcode_build.rb, line 90
def self.version
  output = `xcodebuild -version`
  parse_xcode_version(output)
end

Private Class Methods

args_from_options(options = {}) click to toggle source
# File lib/xctools/xcode_build.rb, line 110
def self.args_from_options(options = {})
  options
    .reject { |_, value| value.nil? }
    .map { |key, value| "-#{key} '#{value}'" }
end
execute_xcodebuild(*args) click to toggle source
# File lib/xctools/xcode_build.rb, line 99
def self.execute_xcodebuild(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  cmd_args = (args + args_from_options(options)).join(' ')
  output = `xcodebuild #{cmd_args} 2>&1`
  fail Error, $1 if output =~ /^xcodebuild\: error\: (.+)$/
  fail NilOutputError unless output =~ /\S/

  output
end
parse_info_line(line, info, group) click to toggle source
# File lib/xctools/xcode_build.rb, line 50
def self.parse_info_line(line, info, group)
  if line =~ /\:$/
    group = line.strip[0...-1].downcase.gsub(/\s+/, '_')
    info[group] = []
  else
    info[group] << line.strip unless group.nil? || line =~ /\.$/
  end

  [info, group]
end
parse_settings_line(line, settings, target) click to toggle source
# File lib/xctools/xcode_build.rb, line 76
def self.parse_settings_line(line, settings, target)
  case line
  when /Build settings for action build and target \"?([^":]+)/
    target = $1
    settings[target] = {}
  else
    key, value = line.split(/\=/).map(&:strip)
    settings[target][key] = value if target
  end

  [settings, target]
end