Source code for basilisk.fields
"""
This module contains serializable fields ready to use in NoSQL store models.
"""
import json
from six import text_type
[docs]class MapField(object):
"""
This is a base class for all NoSQL store fields. It supports data-based initialisation,
default values and prepping values to serialization.
"""
__slots__ = ('_type', '_default', '_name', '_key')
def __init__(self, **kwargs):
"""
This method sets basic properties for a field's instance.
:param kwargs: may contain deserializing function 'type' (default unicode),
default for default value (None), key determining whether a field is model's
primary key and name (but that's better used by NoSQLModelCreator).
"""
self._type = kwargs.get('type', lambda data: data if isinstance(data, str) else data.decode('utf-8'))
self._default = kwargs.get('default', None)
self._name = kwargs.get('name', None)
self._key = kwargs.get('key', False)
[docs] def get_default(self):
"""
It returns field's default value. Surprise surprise.
:returns: field's default value.
"""
return self._default
[docs] def is_primary(self):
"""
Is the field model's primary key.
:returns: boolean.
"""
return self._key
[docs] def set_name(self, name):
"""
It sets field's name to make it self-conscious.
:param name: field name as in model.
:returns: self
"""
self._name = name
return self
[docs] def get_name(self):
"""
Returns field's name.
:returns: this field's name.
"""
return self._name
@staticmethod
[docs] def serialize(data):
"""
Let's prepare the data to writing it in NoSQL store. By default it returns data
without any changes.
:param data: input data
:returns: data ready to be written in NoSQL store.
"""
return data
[docs] def pythonize(self, data):
"""
This function pythonizes data coming from NoSQL store.
:param data: data fetched from NoSQL store.
:returns: data in Python format.
"""
return self._type(data) if self._type else data
[docs]class JsonMapField(MapField):
"""
This class enables keeping JSON as field value.
"""
def __init__(self, **kwargs):
"""
Set the default value to empty dict.
:param kwargs:
"""
if 'default' not in kwargs:
kwargs['default'] = {}
super(JsonMapField, self).__init__(**kwargs)
@staticmethod
[docs] def serialize(data):
"""
This function dumps data to JSON.
:param data: input data.
:returns: data dumped to JSON.
"""
return json.dumps(data)
[docs] def pythonize(self, data):
"""
This function loads JSON data to Python objects.
:param data: data fetched from NoSQL store.
:returns: data in Python format.
"""
if isinstance(data, text_type):
return json.loads(data)
return json.loads(text_type(data, 'utf-8'), 'utf-8')