module PoiseLanguages::Command::Mixin::Resource

A mixin for resources that run language commands. Also available as a parameterized mixin via `include PoiseLanguages::Command::Mixin::Resource(name)`.

@example

class MyLangThing
  include PoiseLanguages::Command::Mixin::Resource(:mylang)
  # ...
end

Private Instance Methods

default_language_command_runtime(name, default_binary) click to toggle source

Compute the path to the default runtime binary.

@api private @param name [Symbol] Language name. @return [String]

# File lib/poise_languages/command/mixin.rb, line 92
def default_language_command_runtime(name, default_binary)
  parent = send(:"parent_#{name}")
  if parent
    parent.send(:"#{name}_binary")
  else
    PoiseLanguages::Utils.which(default_binary || name.to_s)
  end
end
language_command_runtime(name, runtime, default_binary, val=Poise::NOT_PASSED) click to toggle source

Implementation of the $name accessor.

@api private @param name [Symbol] Language name. @param runtime [Symbol] Language runtime resource name. @param val [String, Chef::Resource, Poise::NOT_PASSED, nil] Accessor value. @return [String]

# File lib/poise_languages/command/mixin.rb, line 54
def language_command_runtime(name, runtime, default_binary, val=Poise::NOT_PASSED)
  unless val == Poise::NOT_PASSED
    path_arg = parent_arg = nil
    # Figure out which property we are setting.
    if val.is_a?(String)
      # Check if it is a runtime resource.
      begin
        parent_arg = run_context.resource_collection.find("#{runtime}[#{val}]")
      rescue Chef::Exceptions::ResourceNotFound
        # Check if something looks like a path, defined as containing
        # either / or \. While a single word could be a path, I think the
        # UX win of better error messages should take priority.
        might_be_path = val =~ %r{/|\\}
        if might_be_path
          Chef::Log.debug("[#{self}] #{runtime}[#{val}] not found, treating it as a path")
          path_arg = val
        else
          # Surface the error up to the user.
          raise
        end
      end
    else
      parent_arg = val
    end
    # Set both attributes.
    send(:"parent_#{name}", parent_arg)
    set_or_return(name, path_arg, kind_of: [String, NilClass])
  else
    # Getter behavior. Using the ivar directly is kind of gross but oh well.
    instance_variable_get(:"@#{name}") || default_language_command_runtime(name, default_binary)
  end
end
language_command_runtime_from_parent(name, resource) click to toggle source

Inherit language parent from another resource.

@api private @param name [Symbol] Language name. @param resource [Chef::Resource] Resource to inherit from. @return [void]

# File lib/poise_languages/command/mixin.rb, line 107
def language_command_runtime_from_parent(name, resource)
  parent = resource.send(:"parent_#{name}")
  if parent
    send(:"parent_#{name}", parent)
  else
    path = resource.send(name)
    if path
      send(name, path)
    end
  end
end