class Restfolia::ResourceCreator

Public: Factory of Resources. It transforms all JSON objects in Resources.

Examples

factory = Restfolia::ResourceCreator.new
resource = factory.create(:attr_test => "test",
                          :attr_tags => ["tag1", "tag2"],
                          :attr_array_obj => [{:nested => "nested"}],
                          :links => [{:href => "http://service.com",
                                      :rel => "contacts",
                                      :type => "application/json"},
                                     {:href => "http://another.com",
                                      :rel => "relations",
                                      :type => "application/json"}
                                    ])
resource.attr_test  # => "test"
resource.attr_tags  # => ["tag1", "tag2"]
resource.attr_array_obj  # => [#<Restfolia::Resource ...>]

Public Instance Methods

create(json) click to toggle source

Public: creates Resource looking recursively for JSON objects and transforming in Resources. To create Resource, this method use resource_class.new(json).

json - Hash or Array parsed from Response body.

Returns if json is Hash, returns Resource from resource_class if json is Array, returns an Array of Resource from resource_class. Raises ArgumentError if json is not a Hash or Array.

# File lib/restfolia/resource_creator.rb, line 46
def create(json)
  if json.is_a?(Array)
    json.inject([]) do |result, json_hash|
      result << create_resource(json_hash)
    end
  elsif json.is_a?(Hash)
    create_resource(json)
  else
    raise(ArgumentError, "JSON parameter have to be a Hash or Array object", caller)
  end
end

Protected Instance Methods

attributes_to_dont_parse() click to toggle source

Internal: By default, returns :links or :link. You can use this method to override and returns a custom rule, can be an Array or any object that responds to include?.

Examples

class Restfolia::ResourceCreator
  def attributes_to_dont_parse
    [:links, :link, :_links].freeze
  end
end

Returns attributes to be ignored when creating Resource.

# File lib/restfolia/resource_creator.rb, line 110
def attributes_to_dont_parse
  [:links, :link, 'links', 'link'].freeze
end
create_resource(json_hash) click to toggle source

Internals: creates Resource looking recursively for JSON objects and transforming in Resources. To create Resource, this method use resource_class.new(json).

json_hash - Hash parsed from Response body.

Returns Resource from resource_class. Raises ArgumentError if json is not a Hash.

# File lib/restfolia/resource_creator.rb, line 68
def create_resource(json_hash)
  unless json_hash.is_a?(Hash)
    raise(ArgumentError, "JSON parameter have to be a Hash object", caller)
  end

  json_parsed = {}
  json_hash.each do |attr, value|
    json_parsed[attr] = look_for_resource(attr, value)
  end
  resource_class.new(json_parsed)
end
look_for_resource(attr_name, value) click to toggle source

Internal: Check if value is eligible to become a Restfolia::Resource. It attr_name exist in attributes_to_dont_parse, it returns value. If value is Array object, looks inner contents, using rules below. If value is Hash object, it becomes a Restfolia::Resource. Else return itself.

attr_name - attribute name from parsed hash. value - object to be checked.

Returns value itself or Resource.

# File lib/restfolia/resource_creator.rb, line 124
def look_for_resource(attr_name, value)
  return value if attributes_to_dont_parse.include?(attr_name)

  if value.is_a?(Array)
    value = value.inject([]) do |resources, array_obj|
      resources << look_for_resource(attr_name, array_obj)
    end
  elsif value.is_a?(Hash)

    value.each do |attr, v|
      value[attr] = look_for_resource(attr, v)
    end

    value = resource_class.new(value)
  end
  value
end
resource_class() click to toggle source

Internal: By default, returns Restfolia::Resource. You can use this method to override and returns a custom Resource.

Examples

# using a custom Resource
class Restfolia::ResourceCreator
  def resource_class
    OpenStruct  #dont forget to require 'ostruct'
  end
end

Returns class of Resource to be constructed.

# File lib/restfolia/resource_creator.rb, line 93
def resource_class
  Restfolia::Resource
end