Module: Poise::Helpers::ResourceName

Included in:
ChefspecMatchers, Resource
Defined in:
lib/poise/helpers/resource_name.rb

Overview

A resource mixin to automatically set @resource_name.

Examples:

class MyResource < Chef::Resource
  include Poise::Helpers::ResourceName
  provides(:my_resource)
end

Since:

  • 1.0.0

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.provides(name)

This method returns an undefined value.

Set the DSL name for the the resource class.

Examples:

class MyResource < Chef::Resource
  include Poise::Resource::ResourceName
  provides(:my_resource)
end

Parameters:

  • name (Symbol)

    Name of the resource.

Since:

  • 1.0.0



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/poise/helpers/resource_name.rb', line 54

def provides(name)
  # Patch self.constantize so this can cope with anonymous classes.
  # This does require that the anonymous class define self.name though.
  if self.name && respond_to?(:constantize)
    old_constantize = instance_method(:constantize)
    define_singleton_method(:constantize) do |const_name|
      ( const_name == self.name ) ? self : old_constantize.bind(self).call(const_name)
    end
  end
  # Store the name for later.
  @provides_name = name
  # Call the original if present. The defined? is for old Chef.
  super if defined?(super)
end

.resource_name(auto = true) ⇒ Symbol

Retreive the DSL name for the resource class. If not set explicitly via provides this will try to auto-detect based on the class name.

Parameters:

  • auto (Boolean) (defaults to: true)

    Try to auto-detect based on class name.

Returns:

  • (Symbol)

Since:

  • 1.0.0



74
75
76
77
78
79
80
81
# File 'lib/poise/helpers/resource_name.rb', line 74

def resource_name(auto=true)
  return @provides_name if @provides_name
  @provides_name || if name && name.start_with?('Chef::Resource')
    Chef::Mixin::ConvertToClassName.convert_to_snake_case(name, 'Chef::Resource').to_sym
  elsif name
    Chef::Mixin::ConvertToClassName.convert_to_snake_case(name.split('::').last).to_sym
  end
end

Instance Method Details

#initialize(*args) ⇒ Object

Since:

  • 1.0.0



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/poise/helpers/resource_name.rb', line 31

def initialize(*args)
  super
  # If provides() was explicitly set, unconditionally set @resource_name.
  # This helps when subclassing core Chef resources which set it
  # themselves in #initialize.
  if self.class.resource_name(false)
    @resource_name = self.class.resource_name
  else
    @resource_name ||= self.class.resource_name
  end
end