class Contentful::ResourceBuilder
Transforms a Contentful::Response
into a Contentful::Resource or a Contentful::Error
See example/resource_mapping.rb for advanced usage
Constants
Attributes
Public Class Methods
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
Source
# File lib/contentful/resource_builder.rb, line 56 def run return build_array if array? build_single rescue UnparsableResource => error error end
Starts the parsing process.
@return [Contentful::Resource, Contentful::Error
]
Private Instance Methods
Source
# File lib/contentful/resource_builder.rb, line 151 def array? json.fetch('sys', {}).fetch('type', '') == 'Array' end
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
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
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
Source
# File lib/contentful/resource_builder.rb, line 165 def default_entry_mapping DEFAULT_ENTRY_MAPPING end
The default entry mapping
Source
# File lib/contentful/resource_builder.rb, line 160 def default_resource_mapping DEFAULT_RESOURCE_MAPPING end
The default mapping for detect_resource_class
Source
# File lib/contentful/resource_builder.rb, line 140 def fetch_array_class return SyncPage if sync? ::Contentful::Array end
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
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
Source
# File lib/contentful/resource_builder.rb, line 105 def fetch_errors json.fetch('errors', []) end
Source
# File lib/contentful/resource_builder.rb, line 101 def fetch_includes Includes.from_response(json) end
Source
# File lib/contentful/resource_builder.rb, line 145 def localized? return true if @localized return true if array? && sync? false end
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
Source
# File lib/contentful/resource_builder.rb, line 155 def sync? json.fetch('nextSyncUrl', nil) || json.fetch('nextPageUrl', nil) end