Module: ActiveRemote::Attributes::ClassMethods

Defined in:
lib/active_remote/attributes.rb

Instance Method Summary collapse

Instance Method Details

#attribute(name, options = {}) ⇒ Object

Defines an attribute

For each attribute that is defined, a getter and setter will be added as an instance method to the model. An ActiveRemote::AttributeDefinition instance will be added to result of the attributes class method.

Examples:

Define an attribute.

attribute :name


92
93
94
95
96
97
98
# File 'lib/active_remote/attributes.rb', line 92

def attribute(name, options = {})
  if (dangerous_attribute_method_name = dangerous_attribute?(name))
    raise ::ActiveRemote::DangerousAttributeError, %(an attribute method named "#{dangerous_attribute_method_name}" would conflict with an existing method)
  else
    attribute!(name, options)
  end
end

#attribute!(name, options = {}) ⇒ Object

Defines an attribute without checking for conflicts

Allows you to define an attribute whose methods will conflict with an existing method. For example, Ruby’s Timeout library adds a timeout method to Object. Attempting to define a timeout attribute using .attribute will raise a DangerousAttributeError, but .attribute! will not.

Examples:

Define a dangerous attribute.

attribute! :timeout


111
112
113
114
115
116
117
118
119
120
# File 'lib/active_remote/attributes.rb', line 111

def attribute!(name, options = {})
  ::ActiveRemote::AttributeDefinition.new(name, options).tap do |attribute_definition|
    attribute_name = attribute_definition.name.to_s
    # Force active model to generate attribute methods
    remove_instance_variable("@attribute_methods_generated") if instance_variable_defined?("@attribute_methods_generated")
    define_attribute_methods([attribute_definition.name]) unless attribute_names.include?(attribute_name)
    attributes[attribute_name] = attribute_definition
    build_default_attributes_hash
  end
end

#attribute_namesObject

Returns an Array of attribute names as Strings

Examples:

Get attribute names

Person.attribute_names


127
128
129
# File 'lib/active_remote/attributes.rb', line 127

def attribute_names
  attributes.keys
end

#attributesObject

Returns a Hash of AttributeDefinition instances

Examples:

Get attribute definitions

Person.attributes


136
137
138
# File 'lib/active_remote/attributes.rb', line 136

def attributes
  @attributes ||= ::ActiveSupport::HashWithIndifferentAccess.new
end

#dangerous_attribute?(name) ⇒ Boolean

Determine if a given attribute name is dangerous

Some attribute names can cause conflicts with existing methods on an object. For example, an attribute named “timeout” would conflict with the timeout method that Ruby’s Timeout library mixes into Object.

Examples:

Testing a harmless attribute

Person.dangerous_attribute? :name #=> false

Testing a dangerous attribute

Person.dangerous_attribute? :timeout #=> "timeout"

Returns:

  • (Boolean)


153
154
155
156
157
158
159
# File 'lib/active_remote/attributes.rb', line 153

def dangerous_attribute?(name)
  return false if attribute_names.include?(name.to_s)

  attribute_methods(name).detect do |method_name|
    allocate.respond_to?(method_name, true)
  end
end

#inspectObject

Returns the class name plus its attribute names

Examples:

Inspect the model’s definition.

Person.inspect


166
167
168
169
170
# File 'lib/active_remote/attributes.rb', line 166

def inspect
  inspected_attributes = attribute_names.sort
  attributes_list = "(#{inspected_attributes.join(', ')})" unless inspected_attributes.empty?
  "#{name}#{attributes_list}"
end