Source code for contentful.resource_builder
from .array import Array
from .entry import Entry
from .asset import Asset
from .space import Space
from .content_type import ContentType
from .deleted_asset import DeletedAsset
from .deleted_entry import DeletedEntry
from .locale import Locale
from .sync_page import SyncPage
from .utils import unresolvable
"""
contentful.resource_builder
~~~~~~~~~~~~~~~~~~~~~~~~~~~
This module implements the Resource Builder class.
:copyright: (c) 2016 by Contentful GmbH.
:license: MIT, see LICENSE for more details.
"""
[docs]class ResourceBuilder(object):
"""Creates objects of the proper Resource Type"""
def __init__(
self,
default_locale,
localized,
json,
includes_for_single=None,
errors_for_single=None,
reuse_entries=False,
resources=None,
depth=0,
max_depth=20):
self.default_locale = default_locale
self.localized = localized
self.json = json
self.includes_for_single = includes_for_single
self.errors_for_single = errors_for_single
self.reuse_entries = reuse_entries
self.depth = depth
self.max_depth = max_depth
if resources is None:
resources = {} if self.reuse_entries else None
self.resources = resources
[docs] def build(self):
"""Creates the objects from the JSON response"""
if self.json['sys']['type'] == 'Array':
if any(k in self.json for k in ['nextSyncUrl', 'nextPageUrl']):
return SyncPage(
self.json,
default_locale=self.default_locale,
localized=True
)
return self._build_array()
return self._build_single()
def _build_single(self):
includes = []
errors = []
if self.includes_for_single is not None:
includes = self.includes_for_single
if self.errors_for_single is not None:
errors = self.errors_for_single
return self._build_item(
self.json,
includes=includes,
errors=errors
)
def _build_array(self):
includes = self._includes()
errors = self._errors()
items = [self._build_item(
item,
includes=includes,
errors=errors
) for item in self.json['items']
if not unresolvable(item, self._errors())]
return Array(self.json, items)
def _build_item(self, item, includes=None, errors=None):
if includes is None:
includes = []
if errors is None:
errors = []
buildables = {
'Entry': Entry,
'Asset': Asset,
'ContentType': ContentType,
'Space': Space,
'DeletedEntry': DeletedEntry,
'DeletedAsset': DeletedAsset,
'Locale': Locale
}
resource = self._resource_from_cache(item) if self.reuse_entries else None
if resource is not None:
return resource
if item['sys']['type'] in buildables:
return buildables[item['sys']['type']](
item,
default_locale=self.default_locale,
localized=self.localized,
includes=includes,
errors=errors,
resources=self.resources,
depth=self.depth,
max_depth=self.max_depth
)
def _resource_from_cache(self, item):
cache_key = "{0}:{1}:{2}".format(
item['sys']['type'],
item['sys']['id'],
item['sys'].get('locale', '*')
)
if self.resources and cache_key in self.resources:
return self.resources[cache_key]
def _includes(self):
includes = list(self.json['items'])
for e in ['Entry', 'Asset']:
if e in self.json.get('includes', {}):
includes += [item for item in self.json['includes'].get(e, [])
if not unresolvable(item, self._errors())]
return includes
def _errors(self):
errors = []
if self.errors_for_single is not None:
errors = self.errors_for_single
errors += self.json.get('errors', [])
return errors