class LeapCli::Leapfile

Attributes

environment[R]
platform_directory_path[R]
provider_directory_path[R]
valid[R]

Public Class Methods

new() click to toggle source
# File lib/leap_cli/leapfile.rb, line 20
def initialize
end

Public Instance Methods

environment_filter() click to toggle source

The way the Leapfile handles pinning of environment (self.environment) is a little tricky. If self.environment is nil, then there is no pin. If self.environment is 'default', then there is a pin to the default environment. The problem is that an environment of nil is used to indicate the default environment in node properties.

This method returns the environment tag as needed when filtering nodes.

# File lib/leap_cli/leapfile.rb, line 31
def environment_filter
  if self.environment == 'default'
    nil
  else
    self.environment
  end
end
load(search_directory=nil) click to toggle source
# File lib/leap_cli/leapfile.rb, line 39
def load(search_directory=nil)
  directory = File.expand_path(find_in_directory_tree('Leapfile', search_directory))
  if directory == '/'
    return nil
  else
    #
    # set up paths
    #
    @provider_directory_path = directory
    begin
      # load leaprc first, so that we can potentially access which environment is pinned in Leapfile
      # but also load leaprc last, so that it can override what is set in Leapfile.
      read_settings(leaprc_path)
    rescue StandardError
    end
    read_settings(directory + '/Leapfile')
    read_settings(leaprc_path)
    @platform_directory_path = File.expand_path(@platform_directory_path || '../leap_platform', @provider_directory_path)

    #
    # load the platform
    #
    platform_class = "#{@platform_directory_path}/lib/leap/platform"
    platform_definition = "#{@platform_directory_path}/platform.rb"
    unless File.exist?(platform_definition)
      Util.bail! "ERROR: The file `#{platform_file}` does not exist. Please check the value of `@platform_directory_path` in `Leapfile` or `~/.leaprc`."
    end
    begin
      require platform_class
      require platform_definition
    rescue LoadError
      Util.log "The leap_platform at #{platform_directory_path} is not compatible with this version of leap_cli"
      Util.log "You can either:" do
        Util.log "Upgrade leap_platform to version " + LeapCli::COMPATIBLE_PLATFORM_VERSION.first
        Util.log "Or, downgrade leap_cli to version 1.8"
      end
      Util.bail!
    rescue StandardError => exc
      Util.bail! exc.to_s
    end
    begin
      Leap::Platform.validate!(LeapCli::VERSION, LeapCli::COMPATIBLE_PLATFORM_VERSION, self)
    rescue StandardError => exc
      Util.bail! exc.to_s
    end
    leapfile_extensions = "#{@platform_directory_path}/lib/leap_cli/leapfile_extensions.rb"
    if File.exist?(leapfile_extensions)
      require leapfile_extensions
    end

    #
    # validate
    #
    instance_variables.each do |var|
      var = var.to_s.sub('@', '')
      if !self.respond_to?(var)
        LeapCli.log :warning, "the variable `#{var}` is set in .leaprc or Leapfile, but it is not supported."
      end
    end
    @valid = validate
    return @valid
  end
end
set(property, value) click to toggle source
# File lib/leap_cli/leapfile.rb, line 103
def set(property, value)
  edit_leaprc(property, value)
end
unset(property) click to toggle source
# File lib/leap_cli/leapfile.rb, line 107
def unset(property)
  edit_leaprc(property)
end
valid?() click to toggle source
# File lib/leap_cli/leapfile.rb, line 111
def valid?
  !!@valid
end

Private Instance Methods

edit_leaprc(property, value=nil) click to toggle source

adds or removes a line to .leaprc for this particular provider directory. if value is nil, the line is removed. if not nil, it is added or replaced.

# File lib/leap_cli/leapfile.rb, line 121
def edit_leaprc(property, value=nil)
  file_path = leaprc_path
  lines = []
  if File.exist?(file_path)
    regexp = /self\.#{Regexp.escape(property)} = .*? if @provider_directory_path == '#{Regexp.escape(@provider_directory_path)}'/
    File.readlines(file_path).each do |line|
      unless line =~ regexp
        lines << line
      end
    end
  end
  unless value.nil?
    lines << "self.#{property} = #{value.inspect} if @provider_directory_path == '#{@provider_directory_path}'\n"
  end
  File.open(file_path, 'w') do |f|
    f.write(lines.join)
  end
rescue Errno::EACCES, IOError => exc
  Util::bail! :error, "trying to save ~/.leaprc (#{exc})."
end
find_in_directory_tree(filename, directory_tree=nil) click to toggle source
# File lib/leap_cli/leapfile.rb, line 153
def find_in_directory_tree(filename, directory_tree=nil)
  search_dir = directory_tree || Dir.pwd
  while search_dir != "/"
    Dir.foreach(search_dir) do |f|
      return search_dir if f == filename
    end
    search_dir = File.dirname(search_dir)
  end
  return search_dir
end
leaprc_path() click to toggle source
# File lib/leap_cli/leapfile.rb, line 142
def leaprc_path
  File.join(ENV['HOME'], '.leaprc')
end
method_missing(method, *args) click to toggle source
# File lib/leap_cli/leapfile.rb, line 164
def method_missing(method, *args)
  if method =~ /=$/
    self.instance_variable_set('@' + method.to_s.sub('=',''), args.first)
  else
    self.instance_variable_get('@' + method.to_s)
  end
end
read_settings(file) click to toggle source
# File lib/leap_cli/leapfile.rb, line 146
def read_settings(file)
  if File.exist? file
    LeapCli.log 2, :read, file
    instance_eval(File.read(file), file)
  end
end