class Contentful::ResourceBuilder

Transforms a Contentful::Response into a Contentful::Resource or a Contentful::Error See example/resource_mapping.rb for advanced usage

Constants

BUILDABLES

Buildable Resources

DEFAULT_ENTRY_MAPPING

Default Entry Mapping @see _ README for more information on Entry Mapping

DEFAULT_RESOURCE_MAPPING

Default Resource Mapping @see _ README for more information on Resource Mapping

Attributes

default_locale[R]
depth[R]
endpoint[R]
entry_mapping[R]
json[R]
localized[R]
query[R]
resource[R]
resource_mapping[R]

Public Class Methods

new(json, configuration = {}, localized = false, depth = 0, errors = [], query = {}) click to toggle source
# File lib/contentful/resource_builder.rb, line 38
def initialize(json, configuration = {}, localized = false, depth = 0, errors = [], query = {})
  @json = json
  @default_locale = configuration.fetch(:default_locale, ::Contentful::Client::DEFAULT_CONFIGURATION[:default_locale])
  @resource_mapping = default_resource_mapping.merge(configuration.fetch(:resource_mapping, {}))
  @entry_mapping = default_entry_mapping.merge(configuration.fetch(:entry_mapping, {}))
  @includes_for_single = configuration.fetch(:includes_for_single, Includes.new)
  @localized = localized
  @depth = depth
  @endpoint = configuration.fetch(:endpoint, nil)
  @configuration = configuration
  @resource_cache = configuration[:_entries_cache] || {}
  @errors = errors
  @query = query
end

Public Instance Methods

run() click to toggle source

Starts the parsing process.

@return [Contentful::Resource, Contentful::Error]

# File lib/contentful/resource_builder.rb, line 56
def run
  return build_array if array?
  build_single
rescue UnparsableResource => error
  error
end

Private Instance Methods

array?() click to toggle source
# File lib/contentful/resource_builder.rb, line 151
def array?
  json.fetch('sys', {}).fetch('type', '') == 'Array'
end
build_array() click to toggle source
# File lib/contentful/resource_builder.rb, line 65
def build_array
  includes = fetch_includes || @includes_for_single
  errors = fetch_errors || @errors

  result = json['items'].map do |item|
    next if Support.unresolvable?(item, errors)
    build_item(item, includes, errors)
  end
  array_class = fetch_array_class
  array_class.new(json.merge('items' => result), @configuration, endpoint, query)
end
build_item(item, includes = Includes.new, errors = []) click to toggle source
# File lib/contentful/resource_builder.rb, line 83
def build_item(item, includes = Includes.new, errors = [])
  item_type = BUILDABLES.detect { |b| b == item['sys']['type'] }
  fail UnparsableResource, 'Item type is not known, could not parse' if item_type.nil?
  item_class = resource_class(item)

  reuse_entries = @configuration.fetch(:reuse_entries, false)
  resource_cache = @resource_cache ? @resource_cache : {}

  id = "#{item['sys']['type']}:#{item['sys']['id']}"
  resource = if reuse_entries && resource_cache.key?(id)
               resource_cache[id]
             else
               item_class.new(item, @configuration, localized?, includes, resource_cache, depth, errors)
             end

  resource
end
build_single() click to toggle source
# File lib/contentful/resource_builder.rb, line 77
def build_single
  return if Support.unresolvable?(json, @errors)
  includes = @includes_for_single
  build_item(json, includes, @errors)
end
default_entry_mapping() click to toggle source

The default entry mapping

# File lib/contentful/resource_builder.rb, line 165
def default_entry_mapping
  DEFAULT_ENTRY_MAPPING
end
default_resource_mapping() click to toggle source

The default mapping for detect_resource_class

# File lib/contentful/resource_builder.rb, line 160
def default_resource_mapping
  DEFAULT_RESOURCE_MAPPING
end
fetch_array_class() click to toggle source
# File lib/contentful/resource_builder.rb, line 140
def fetch_array_class
  return SyncPage if sync?
  ::Contentful::Array
end
fetch_custom_resource_class(item) click to toggle source
# File lib/contentful/resource_builder.rb, line 114
def fetch_custom_resource_class(item)
  case item['sys']['type']
  when 'Entry'
    resource_class = entry_mapping[item['sys']['contentType']['sys']['id']]
    return resource_class unless resource_class.nil?

    fetch_custom_resource_mapping(item, 'Entry', Entry)
  when 'Asset'
    fetch_custom_resource_mapping(item, 'Asset', Asset)
  when 'DeletedEntry'
    fetch_custom_resource_mapping(item, 'DeletedEntry', DeletedEntry)
  when 'DeletedAsset'
    fetch_custom_resource_mapping(item, 'DeletedAsset', DeletedAsset)
  end
end
fetch_custom_resource_mapping(item, type, default_class) click to toggle source
# File lib/contentful/resource_builder.rb, line 130
def fetch_custom_resource_mapping(item, type, default_class)
  resources = resource_mapping[type]
  return default_class if resources.nil?

  return resources if resources.is_a?(Class)
  return resources[item] if resources.respond_to?(:call)

  default_class
end
fetch_errors() click to toggle source
# File lib/contentful/resource_builder.rb, line 105
def fetch_errors
  json.fetch('errors', [])
end
fetch_includes() click to toggle source
# File lib/contentful/resource_builder.rb, line 101
def fetch_includes
  Includes.from_response(json)
end
localized?() click to toggle source
# File lib/contentful/resource_builder.rb, line 145
def localized?
  return true if @localized
  return true if array? && sync?
  false
end
resource_class(item) click to toggle source
# File lib/contentful/resource_builder.rb, line 109
def resource_class(item)
  return fetch_custom_resource_class(item) if %w[Entry DeletedEntry Asset DeletedAsset].include?(item['sys']['type'])
  resource_mapping[item['sys']['type']]
end
sync?() click to toggle source
# File lib/contentful/resource_builder.rb, line 155
def sync?
  json.fetch('nextSyncUrl', nil) || json.fetch('nextPageUrl', nil)
end