module PantographCore::Helper

Public Class Methods

backticks(command, print: true) click to toggle source

Runs a given command using backticks (`) and prints them out using the UI.command method

# File pantograph_core/lib/pantograph_core/helper.rb, line 283
def self.backticks(command, print: true)
  UI.command(command) if print
  result = `#{command}`
  UI.command_output(result) if print
  return result
end
buildlog_path() click to toggle source

Logs base directory

# File pantograph_core/lib/pantograph_core/helper.rb, line 121
def self.buildlog_path
  return ENV["PANT_BUILDLOG_PATH"] || "~/Library/Logs"
end
bundler?() click to toggle source

@return [boolean] true if executing with bundler (like 'bundle exec pantograph [action]')

# File pantograph_core/lib/pantograph_core/helper.rb, line 29
def self.bundler?
  # Bundler environment variable
  ['BUNDLE_BIN_PATH', 'BUNDLE_GEMFILE'].each do |current|
    return true if ENV.key?(current)
  end
  return false
end
ci?() click to toggle source

@return [boolean] true if building in a known CI environment

# File pantograph_core/lib/pantograph_core/helper.rb, line 68
def self.ci?
  # Check for Jenkins, Travis CI, ... environment variables
  ci_vars = [
    'JENKINS_HOME',
    'JENKINS_URL',
    'TRAVIS',
    'CIRCLECI',
    'CI',
    'APPCENTER_BUILD_ID',
    'TEAMCITY_VERSION',
    'GO_PIPELINE_NAME',
    'bamboo_buildKey',
    'GITLAB_CI', 'XCS',
    'TF_BUILD',
    'GITHUB_ACTION',
    'GITHUB_ACTIONS'
  ]

  ci_vars.any? { |var| ENV.key?(var) }
end
colors_disabled?() click to toggle source

Do we want to disable the colored output?

# File pantograph_core/lib/pantograph_core/helper.rb, line 111
def self.colors_disabled?
  PantographCore::Env.truthy?("PANTOGRAPH_DISABLE_COLORS")
end
contained_pantograph?() click to toggle source

Do we run from a bundled pantograph, which contains Ruby and OpenSSL? Usually this means the pantograph directory is ~/.pantograph/bin/ We set this value via the environment variable `PANTOGRAPH_SELF_CONTAINED`

# File pantograph_core/lib/pantograph_core/helper.rb, line 40
def self.contained_pantograph?
  ENV["PANTOGRAPH_SELF_CONTAINED"].to_s == "true" && !self.homebrew?
end
executable?(cmd_path) click to toggle source

checks if a given path is an executable file

# File pantograph_core/lib/pantograph_core/helper.rb, line 364
def self.executable?(cmd_path)
  # no executable files on Windows, so existing is enough there
  cmd_path && !File.directory?(cmd_path) && (File.executable?(cmd_path) || (self.windows? && File.exist?(cmd_path)))
end
gem_path(gem_name) click to toggle source

DEPRECATED: Use the `ROOT` constant from the appropriate tool module instead e.g. File.join(Sigh::ROOT, 'lib', 'assets', 'resign.sh')

Path to the installed gem to load resources (e.g. resign.sh)

# File pantograph_core/lib/pantograph_core/helper.rb, line 405
def self.gem_path(gem_name)
  UI.deprecated('`Helper.gem_path` is deprecated. Use the `ROOT` constant from the appropriate tool module instead.')

  if !Helper.test? && Gem::Specification.find_all_by_name(gem_name).any?
    return Gem::Specification.find_by_name(gem_name).gem_dir
  else
    return './'
  end
end
hide_loading_indicator() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 354
def self.hide_loading_indicator
  if self.should_show_loading_indicator? && @require_pantograph_spinner
    @require_pantograph_spinner.success
  end
end
homebrew?() click to toggle source

returns true if pantograph was installed via Homebrew

# File pantograph_core/lib/pantograph_core/helper.rb, line 45
def self.homebrew?
  ENV["PANTOGRAPH_INSTALLED_VIA_HOMEBREW"].to_s == "true"
end
is_ci?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 389
def self.is_ci?
  ci?
end
is_mac?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 393
def self.is_mac?
  self.mac?
end
is_test?() click to toggle source

Use Helper.test?, Helper.ci?, Helper.mac? or Helper.windows? instead (legacy calls)

# File pantograph_core/lib/pantograph_core/helper.rb, line 385
def self.is_test?
  self.test?
end
is_windows?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 397
def self.is_windows?
  self.windows?
end
itms_path() click to toggle source

@return the full path to the iTMSTransporter executable

# File pantograph_core/lib/pantograph_core/helper.rb, line 209
def self.itms_path
  return ENV["PANTOGRAPH_ITUNES_TRANSPORTER_PATH"] if PantographCore::Env.truthy?("PANTOGRAPH_ITUNES_TRANSPORTER_PATH")

  if self.mac?
    # First check for manually install iTMSTransporter
    user_local_itms_path = "/usr/local/itms"
    return user_local_itms_path if File.exist?(user_local_itms_path)

    # Then check for iTMSTransporter in the Xcode path
    [
      "../Applications/Application Loader.app/Contents/MacOS/itms",
      "../Applications/Application Loader.app/Contents/itms",
      "../SharedFrameworks/ContentDeliveryServices.framework/Versions/A/itms" # For Xcode 11
    ].each do |path|
      result = File.expand_path(File.join(self.xcode_path, path))
      return result if File.exist?(result)
    end
    UI.user_error!("Could not find transporter at #{self.xcode_path}. Please make sure you set the correct path to your Xcode installation.")
  elsif self.windows?
    [
      "C:/Program Files (x86)/itms"
    ].each do |path|
      return path if File.exist?(path)
    end
    UI.user_error!("Could not find transporter at usual locations. Please use environment variable `PANTOGRAPH_ITUNES_TRANSPORTER_PATH` to specify your installation path.")
  else
    # not Mac or Windows
    return ''
  end
end
json_file?(filename) click to toggle source

checks if given file is a valid json file base taken from: stackoverflow.com/a/26235831/1945875

# File pantograph_core/lib/pantograph_core/helper.rb, line 371
def self.json_file?(filename)
  return false unless File.exist?(filename)
  begin
    JSON.parse(File.read(filename))
    return true
  rescue JSON::ParserError
    return false
  end
end
keychain_path(keychain_name) click to toggle source

keychain

# File pantograph_core/lib/pantograph_core/helper.rb, line 243
def self.keychain_path(keychain_name)
  # Existing code expects that a keychain name will be expanded into a default path to Library/Keychains
  # in the user's home directory. However, this will not allow the user to pass an absolute path
  # for the keychain value
  #
  # So, if the passed value can't be resolved as a file in Library/Keychains, just use it as-is
  # as the keychain path.
  #
  # We need to expand each path because File.exist? won't handle directories including ~ properly
  #
  # We also try to append `-db` at the end of the file path, as with Sierra the default Keychain name
  # has changed for some users: https://github.com/urbanquakers/pantograph/issues/5649

  # Remove the ".keychain" at the end of the keychain name
  name = keychain_name.sub(/\.keychain$/, "")

  possible_locations = [
    File.join(Dir.home, 'Library', 'Keychains', name),
    name
  ].map { |path| File.expand_path(path) }

  # Transforms ["thing"] to ["thing-db", "thing.keychain-db", "thing", "thing.keychain"]
  keychain_paths = []
  possible_locations.each do |location|
    keychain_paths << "#{location}-db"
    keychain_paths << "#{location}.keychain-db"
    keychain_paths << location
    keychain_paths << "#{location}.keychain"
  end

  keychain_path = keychain_paths.find { |path| File.file?(path) }
  UI.user_error!("Could not locate the provided keychain. Tried:\n\t#{keychain_paths.join("\n\t")}") unless keychain_path
  keychain_path
end
linux?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 101
def self.linux?
  (/linux/ =~ RUBY_PLATFORM) != nil
end
log() click to toggle source

This method is deprecated, use the `UI` class urbanquakers.github.io/pantograph/advanced/#user-input-and-output

# File pantograph_core/lib/pantograph_core/helper.rb, line 417
def self.log
  UI.deprecated("Helper.log is deprecated. Use `UI` class instead")
  UI.current.log
end
mac?() click to toggle source

Is the currently running computer a Mac?

# File pantograph_core/lib/pantograph_core/helper.rb, line 106
def self.mac?
  (/darwin/ =~ RUBY_PLATFORM) != nil
end
mac_stock_terminal?() click to toggle source

Does the user use the Mac stock terminal

# File pantograph_core/lib/pantograph_core/helper.rb, line 116
def self.mac_stock_terminal?
  PantographCore::Env.truthy?("TERM_PROGRAM_VERSION")
end
operating_system() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 89
def self.operating_system
  return "macOS"   if RUBY_PLATFORM.downcase.include?("darwin")
  return "Windows" if RUBY_PLATFORM.downcase.include?("mswin")
  return "Linux"   if RUBY_PLATFORM.downcase.include?("linux")
  return "Unknown"
end
pantograph_enabled?() click to toggle source

pantograph

# File pantograph_core/lib/pantograph_core/helper.rb, line 15
def self.pantograph_enabled?
  # This is called from the root context on the first start
  @enabled ||= !PantographCore::PantographFolder.path.nil?
end
pantograph_enabled_folder_path() click to toggle source

Checks if pantograph is enabled for this project and returns the folder where the configuration lives

# File pantograph_core/lib/pantograph_core/helper.rb, line 21
def self.pantograph_enabled_folder_path
  pantograph_enabled? ? PantographCore::PantographFolder.path : '.'
end
rubygems?() click to toggle source

returns true if pantograph was installed via RubyGems

# File pantograph_core/lib/pantograph_core/helper.rb, line 50
def self.rubygems?
  !self.bundler? && !self.contained_pantograph? && !self.homebrew?
end
sh_enabled?() click to toggle source

@return true if it is enabled to execute external commands

# File pantograph_core/lib/pantograph_core/helper.rb, line 63
def self.sh_enabled?
  !self.test?
end
should_show_loading_indicator?() click to toggle source

loading indicator

# File pantograph_core/lib/pantograph_core/helper.rb, line 335
def self.should_show_loading_indicator?
  return false if PantographCore::Env.truthy?("PANTOGRAPH_DISABLE_ANIMATION")
  return false if Helper.ci?
  return true
end
show_loading_indicator(text = nil) click to toggle source

Show/Hide loading indicator

# File pantograph_core/lib/pantograph_core/helper.rb, line 342
def self.show_loading_indicator(text = nil)
  if self.should_show_loading_indicator?
    # we set the default here, instead of at the parameters
    # as we don't want to `UI.message` a rocket that's just there for the loading indicator
    text ||= "🚀"
    @require_pantograph_spinner = TTY::Spinner.new("[:spinner] #{text} ", format: :dots)
    @require_pantograph_spinner.auto_spin
  else
    UI.message(text) if text
  end
end
strip_ansi_colors(str) click to toggle source

removes ANSI colors from string

# File pantograph_core/lib/pantograph_core/helper.rb, line 291
def self.strip_ansi_colors(str)
  str.gsub(/\e\[([;\d]+)?m/, '')
end
test?() click to toggle source

@return true if the currently running program is a unit test

# File pantograph_core/lib/pantograph_core/helper.rb, line 58
def self.test?
  Object.const_defined?("SpecHelper")
end
transporter_java_executable_path() click to toggle source

iTMSTransporter

# File pantograph_core/lib/pantograph_core/helper.rb, line 182
def self.transporter_java_executable_path
  return File.join(self.transporter_java_path, 'bin', 'java')
end
transporter_java_ext_dir() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 186
def self.transporter_java_ext_dir
  return File.join(self.transporter_java_path, 'lib', 'ext')
end
transporter_java_jar_path() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 190
def self.transporter_java_jar_path
  return File.join(self.itms_path, 'lib', 'itmstransporter-launcher.jar')
end
transporter_java_path() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 198
def self.transporter_java_path
  return File.join(self.itms_path, 'java')
end
transporter_path() click to toggle source

@return the full path to the iTMSTransporter executable

# File pantograph_core/lib/pantograph_core/helper.rb, line 203
def self.transporter_path
  return File.join(self.itms_path, 'bin', 'iTMSTransporter') unless Helper.windows?
  return File.join(self.itms_path, 'iTMSTransporter')
end
transporter_user_dir() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 194
def self.transporter_user_dir
  return File.join(self.itms_path, 'bin')
end
windows?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 96
def self.windows?
  # taken from: https://stackoverflow.com/a/171011/1945875
  (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
end
with_env_values(hash) { || ... } click to toggle source

Executes the provided block after adjusting the ENV to have the provided keys and values set as defined in hash. After the block completes, restores the ENV to its previous state.

# File pantograph_core/lib/pantograph_core/helper.rb, line 319
def self.with_env_values(hash, &block)
  old_vals = ENV.select { |k, v| hash.include?(k) }
  hash.each do |k, v|
    ENV[k] = hash[k]
  end
  yield
ensure
  hash.each do |k, v|
    ENV.delete(k) unless old_vals.include?(k)
    ENV[k] = old_vals[k]
  end
end
xcode_at_least?(version) click to toggle source

@return true if Xcode version is higher than 8.3

# File pantograph_core/lib/pantograph_core/helper.rb, line 173
def self.xcode_at_least?(version)
  PantographCore::UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if xcode_version.nil?
  v = xcode_version
  Gem::Version.new(v) >= Gem::Version.new(version)
end
xcode_path() click to toggle source

@return the full path to the Xcode developer tools of the currently

running system
# File pantograph_core/lib/pantograph_core/helper.rb, line 130
def self.xcode_path
  return "" unless self.mac?

  if self.xcode_server?
    # Xcode server always creates a link here
    xcode_server_xcode_path = "/Library/Developer/XcodeServer/CurrentXcodeSymlink/Contents/Developer"
    UI.verbose("We're running as XcodeServer, setting path to #{xcode_server_xcode_path}")
    return xcode_server_xcode_path
  end

  return `xcode-select -p`.delete("\n") + "/"
end
xcode_server?() click to toggle source
# File pantograph_core/lib/pantograph_core/helper.rb, line 143
def self.xcode_server?
  # XCS is set by Xcode Server
  return ENV["XCS"].to_i == 1
end
xcode_version() click to toggle source

@return The version of the currently used Xcode installation (e.g. “7.0”)

# File pantograph_core/lib/pantograph_core/helper.rb, line 149
def self.xcode_version
  return nil unless self.mac?
  return @xcode_version if @xcode_version && @developer_dir == ENV['DEVELOPER_DIR']

  xcodebuild_path = "#{xcode_path}/usr/bin/xcodebuild"

  xcode_build_installed = File.exist?(xcodebuild_path)
  unless xcode_build_installed
    UI.verbose("Couldn't find xcodebuild at #{xcodebuild_path}, check that it exists")
    return nil
  end

  begin
    output = `DEVELOPER_DIR='' "#{xcodebuild_path}" -version`
    @xcode_version = output.split("\n").first.split(' ')[1]
    @developer_dir = ENV['DEVELOPER_DIR']
  rescue => ex
    UI.error(ex)
    UI.user_error!("Error detecting currently used Xcode installation, please ensure that you have Xcode installed and set it using `sudo xcode-select -s [path]`")
  end
  @xcode_version
end
zip_directory(path, output_path, contents_only: false, overwrite: false, print: true) click to toggle source

Zips directory

# File pantograph_core/lib/pantograph_core/helper.rb, line 296
def self.zip_directory(path, output_path, contents_only: false, overwrite: false, print: true)
  if overwrite
    overwrite_command = " && rm -f '#{output_path}'"
  else
    overwrite_command = ""
  end

  if contents_only
    command = "cd '#{path}'#{overwrite_command} && zip -r '#{output_path}' *"
  else
    containing_path = File.expand_path("..", path)
    contents_path = File.basename(path)

    command = "cd '#{containing_path}'#{overwrite_command} && zip -r '#{output_path}' '#{contents_path}'"
  end

  UI.command(command) unless print
  Helper.backticks(command, print: print)
end