diff env/lib/python3.7/site-packages/boto/sdb/db/property.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/sdb/db/property.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,704 +0,0 @@
-# Copyright (c) 2006,2007,2008 Mitch Garnaat http://garnaat.org/
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish, dis-
-# tribute, sublicense, and/or sell copies of the Software, and to permit
-# persons to whom the Software is furnished to do so, subject to the fol-
-# lowing conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-
-import datetime
-from boto.sdb.db.key import Key
-from boto.utils import Password
-from boto.sdb.db.query import Query
-import re
-import boto
-import boto.s3.key
-from boto.sdb.db.blob import Blob
-from boto.compat import six, long_type
-
-
-class Property(object):
-
-    data_type = str
-    type_name = ''
-    name = ''
-    verbose_name = ''
-
-    def __init__(self, verbose_name=None, name=None, default=None,
-                 required=False, validator=None, choices=None, unique=False):
-        self.verbose_name = verbose_name
-        self.name = name
-        self.default = default
-        self.required = required
-        self.validator = validator
-        self.choices = choices
-        if self.name:
-            self.slot_name = '_' + self.name
-        else:
-            self.slot_name = '_'
-        self.unique = unique
-
-    def __get__(self, obj, objtype):
-        if obj:
-            obj.load()
-            return getattr(obj, self.slot_name)
-        else:
-            return None
-
-    def __set__(self, obj, value):
-        self.validate(value)
-
-        # Fire off any on_set functions
-        try:
-            if obj._loaded and hasattr(obj, "on_set_%s" % self.name):
-                fnc = getattr(obj, "on_set_%s" % self.name)
-                value = fnc(value)
-        except Exception:
-            boto.log.exception("Exception running on_set_%s" % self.name)
-
-        setattr(obj, self.slot_name, value)
-
-    def __property_config__(self, model_class, property_name):
-        self.model_class = model_class
-        self.name = property_name
-        self.slot_name = '_' + self.name
-
-    def default_validator(self, value):
-        if isinstance(value, six.string_types) or value == self.default_value():
-            return
-        if not isinstance(value, self.data_type):
-            raise TypeError('Validation Error, %s.%s expecting %s, got %s' % (self.model_class.__name__, self.name, self.data_type, type(value)))
-
-    def default_value(self):
-        return self.default
-
-    def validate(self, value):
-        if self.required and value is None:
-            raise ValueError('%s is a required property' % self.name)
-        if self.choices and value and value not in self.choices:
-            raise ValueError('%s not a valid choice for %s.%s' % (value, self.model_class.__name__, self.name))
-        if self.validator:
-            self.validator(value)
-        else:
-            self.default_validator(value)
-        return value
-
-    def empty(self, value):
-        return not value
-
-    def get_value_for_datastore(self, model_instance):
-        return getattr(model_instance, self.name)
-
-    def make_value_from_datastore(self, value):
-        return value
-
-    def get_choices(self):
-        if callable(self.choices):
-            return self.choices()
-        return self.choices
-
-
-def validate_string(value):
-    if value is None:
-        return
-    elif isinstance(value, six.string_types):
-        if len(value) > 1024:
-            raise ValueError('Length of value greater than maxlength')
-    else:
-        raise TypeError('Expecting String, got %s' % type(value))
-
-
-class StringProperty(Property):
-
-    type_name = 'String'
-
-    def __init__(self, verbose_name=None, name=None, default='',
-                 required=False, validator=validate_string,
-                 choices=None, unique=False):
-        super(StringProperty, self).__init__(verbose_name, name, default, required,
-                          validator, choices, unique)
-
-
-class TextProperty(Property):
-
-    type_name = 'Text'
-
-    def __init__(self, verbose_name=None, name=None, default='',
-                 required=False, validator=None, choices=None,
-                 unique=False, max_length=None):
-        super(TextProperty, self).__init__(verbose_name, name, default, required,
-                          validator, choices, unique)
-        self.max_length = max_length
-
-    def validate(self, value):
-        value = super(TextProperty, self).validate(value)
-        if not isinstance(value, six.string_types):
-            raise TypeError('Expecting Text, got %s' % type(value))
-        if self.max_length and len(value) > self.max_length:
-            raise ValueError('Length of value greater than maxlength %s' % self.max_length)
-
-
-class PasswordProperty(StringProperty):
-    """
-
-    Hashed property whose original value can not be
-    retrieved, but still can be compared.
-
-    Works by storing a hash of the original value instead
-    of the original value.  Once that's done all that
-    can be retrieved is the hash.
-
-    The comparison
-
-       obj.password == 'foo'
-
-    generates a hash of 'foo' and compares it to the
-    stored hash.
-
-    Underlying data type for hashing, storing, and comparing
-    is boto.utils.Password.  The default hash function is
-    defined there ( currently sha512 in most cases, md5
-    where sha512 is not available )
-
-    It's unlikely you'll ever need to use a different hash
-    function, but if you do, you can control the behavior
-    in one of two ways:
-
-      1) Specifying hashfunc in PasswordProperty constructor
-
-         import hashlib
-
-         class MyModel(model):
-             password = PasswordProperty(hashfunc=hashlib.sha224)
-
-      2) Subclassing Password and PasswordProperty
-
-         class SHA224Password(Password):
-             hashfunc=hashlib.sha224
-
-         class SHA224PasswordProperty(PasswordProperty):
-             data_type=MyPassword
-             type_name="MyPassword"
-
-         class MyModel(Model):
-             password = SHA224PasswordProperty()
-
-    """
-    data_type = Password
-    type_name = 'Password'
-
-    def __init__(self, verbose_name=None, name=None, default='', required=False,
-                 validator=None, choices=None, unique=False, hashfunc=None):
-
-        """
-           The hashfunc parameter overrides the default hashfunc in boto.utils.Password.
-
-           The remaining parameters are passed through to StringProperty.__init__"""
-
-        super(PasswordProperty, self).__init__(verbose_name, name, default, required,
-                                validator, choices, unique)
-        self.hashfunc = hashfunc
-
-    def make_value_from_datastore(self, value):
-        p = self.data_type(value, hashfunc=self.hashfunc)
-        return p
-
-    def get_value_for_datastore(self, model_instance):
-        value = super(PasswordProperty, self).get_value_for_datastore(model_instance)
-        if value and len(value):
-            return str(value)
-        else:
-            return None
-
-    def __set__(self, obj, value):
-        if not isinstance(value, self.data_type):
-            p = self.data_type(hashfunc=self.hashfunc)
-            p.set(value)
-            value = p
-        super(PasswordProperty, self).__set__(obj, value)
-
-    def __get__(self, obj, objtype):
-        return self.data_type(super(PasswordProperty, self).__get__(obj, objtype), hashfunc=self.hashfunc)
-
-    def validate(self, value):
-        value = super(PasswordProperty, self).validate(value)
-        if isinstance(value, self.data_type):
-            if len(value) > 1024:
-                raise ValueError('Length of value greater than maxlength')
-        else:
-            raise TypeError('Expecting %s, got %s' % (type(self.data_type), type(value)))
-
-
-class BlobProperty(Property):
-    data_type = Blob
-    type_name = "blob"
-
-    def __set__(self, obj, value):
-        if value != self.default_value():
-            if not isinstance(value, Blob):
-                oldb = self.__get__(obj, type(obj))
-                id = None
-                if oldb:
-                    id = oldb.id
-                b = Blob(value=value, id=id)
-                value = b
-        super(BlobProperty, self).__set__(obj, value)
-
-
-class S3KeyProperty(Property):
-
-    data_type = boto.s3.key.Key
-    type_name = 'S3Key'
-    validate_regex = "^s3:\/\/([^\/]*)\/(.*)$"
-
-    def __init__(self, verbose_name=None, name=None, default=None,
-                 required=False, validator=None, choices=None, unique=False):
-        super(S3KeyProperty, self).__init__(verbose_name, name, default, required,
-                          validator, choices, unique)
-
-    def validate(self, value):
-        value = super(S3KeyProperty, self).validate(value)
-        if value == self.default_value() or value == str(self.default_value()):
-            return self.default_value()
-        if isinstance(value, self.data_type):
-            return
-        match = re.match(self.validate_regex, value)
-        if match:
-            return
-        raise TypeError('Validation Error, expecting %s, got %s' % (self.data_type, type(value)))
-
-    def __get__(self, obj, objtype):
-        value = super(S3KeyProperty, self).__get__(obj, objtype)
-        if value:
-            if isinstance(value, self.data_type):
-                return value
-            match = re.match(self.validate_regex, value)
-            if match:
-                s3 = obj._manager.get_s3_connection()
-                bucket = s3.get_bucket(match.group(1), validate=False)
-                k = bucket.get_key(match.group(2))
-                if not k:
-                    k = bucket.new_key(match.group(2))
-                    k.set_contents_from_string("")
-                return k
-        else:
-            return value
-
-    def get_value_for_datastore(self, model_instance):
-        value = super(S3KeyProperty, self).get_value_for_datastore(model_instance)
-        if value:
-            return "s3://%s/%s" % (value.bucket.name, value.name)
-        else:
-            return None
-
-
-class IntegerProperty(Property):
-
-    data_type = int
-    type_name = 'Integer'
-
-    def __init__(self, verbose_name=None, name=None, default=0, required=False,
-                 validator=None, choices=None, unique=False, max=2147483647, min=-2147483648):
-        super(IntegerProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-        self.max = max
-        self.min = min
-
-    def validate(self, value):
-        value = int(value)
-        value = super(IntegerProperty, self).validate(value)
-        if value > self.max:
-            raise ValueError('Maximum value is %d' % self.max)
-        if value < self.min:
-            raise ValueError('Minimum value is %d' % self.min)
-        return value
-
-    def empty(self, value):
-        return value is None
-
-    def __set__(self, obj, value):
-        if value == "" or value is None:
-            value = 0
-        return super(IntegerProperty, self).__set__(obj, value)
-
-
-class LongProperty(Property):
-
-    data_type = long_type
-    type_name = 'Long'
-
-    def __init__(self, verbose_name=None, name=None, default=0, required=False,
-                 validator=None, choices=None, unique=False):
-        super(LongProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-
-    def validate(self, value):
-        value = long_type(value)
-        value = super(LongProperty, self).validate(value)
-        min = -9223372036854775808
-        max = 9223372036854775807
-        if value > max:
-            raise ValueError('Maximum value is %d' % max)
-        if value < min:
-            raise ValueError('Minimum value is %d' % min)
-        return value
-
-    def empty(self, value):
-        return value is None
-
-
-class BooleanProperty(Property):
-
-    data_type = bool
-    type_name = 'Boolean'
-
-    def __init__(self, verbose_name=None, name=None, default=False, required=False,
-                 validator=None, choices=None, unique=False):
-        super(BooleanProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-
-    def empty(self, value):
-        return value is None
-
-
-class FloatProperty(Property):
-
-    data_type = float
-    type_name = 'Float'
-
-    def __init__(self, verbose_name=None, name=None, default=0.0, required=False,
-                 validator=None, choices=None, unique=False):
-        super(FloatProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-
-    def validate(self, value):
-        value = float(value)
-        value = super(FloatProperty, self).validate(value)
-        return value
-
-    def empty(self, value):
-        return value is None
-
-
-class DateTimeProperty(Property):
-    """This class handles both the datetime.datetime object
-    And the datetime.date objects. It can return either one,
-    depending on the value stored in the database"""
-
-    data_type = datetime.datetime
-    type_name = 'DateTime'
-
-    def __init__(self, verbose_name=None, auto_now=False, auto_now_add=False, name=None,
-                 default=None, required=False, validator=None, choices=None, unique=False):
-        super(DateTimeProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-        self.auto_now = auto_now
-        self.auto_now_add = auto_now_add
-
-    def default_value(self):
-        if self.auto_now or self.auto_now_add:
-            return self.now()
-        return super(DateTimeProperty, self).default_value()
-
-    def validate(self, value):
-        if value is None:
-            return
-        if isinstance(value, datetime.date):
-            return value
-        return super(DateTimeProperty, self).validate(value)
-
-    def get_value_for_datastore(self, model_instance):
-        if self.auto_now:
-            setattr(model_instance, self.name, self.now())
-        return super(DateTimeProperty, self).get_value_for_datastore(model_instance)
-
-    def now(self):
-        return datetime.datetime.utcnow()
-
-
-class DateProperty(Property):
-
-    data_type = datetime.date
-    type_name = 'Date'
-
-    def __init__(self, verbose_name=None, auto_now=False, auto_now_add=False, name=None,
-                 default=None, required=False, validator=None, choices=None, unique=False):
-        super(DateProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-        self.auto_now = auto_now
-        self.auto_now_add = auto_now_add
-
-    def default_value(self):
-        if self.auto_now or self.auto_now_add:
-            return self.now()
-        return super(DateProperty, self).default_value()
-
-    def validate(self, value):
-        value = super(DateProperty, self).validate(value)
-        if value is None:
-            return
-        if not isinstance(value, self.data_type):
-            raise TypeError('Validation Error, expecting %s, got %s' % (self.data_type, type(value)))
-
-    def get_value_for_datastore(self, model_instance):
-        if self.auto_now:
-            setattr(model_instance, self.name, self.now())
-        val = super(DateProperty, self).get_value_for_datastore(model_instance)
-        if isinstance(val, datetime.datetime):
-            val = val.date()
-        return val
-
-    def now(self):
-        return datetime.date.today()
-
-
-class TimeProperty(Property):
-    data_type = datetime.time
-    type_name = 'Time'
-
-    def __init__(self, verbose_name=None, name=None,
-                 default=None, required=False, validator=None, choices=None, unique=False):
-        super(TimeProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-
-    def validate(self, value):
-        value = super(TimeProperty, self).validate(value)
-        if value is None:
-            return
-        if not isinstance(value, self.data_type):
-            raise TypeError('Validation Error, expecting %s, got %s' % (self.data_type, type(value)))
-
-
-class ReferenceProperty(Property):
-
-    data_type = Key
-    type_name = 'Reference'
-
-    def __init__(self, reference_class=None, collection_name=None,
-                 verbose_name=None, name=None, default=None, required=False, validator=None, choices=None, unique=False):
-        super(ReferenceProperty, self).__init__(verbose_name, name, default, required, validator, choices, unique)
-        self.reference_class = reference_class
-        self.collection_name = collection_name
-
-    def __get__(self, obj, objtype):
-        if obj:
-            value = getattr(obj, self.slot_name)
-            if value == self.default_value():
-                return value
-            # If the value is still the UUID for the referenced object, we need to create
-            # the object now that is the attribute has actually been accessed.  This lazy
-            # instantiation saves unnecessary roundtrips to SimpleDB
-            if isinstance(value, six.string_types):
-                value = self.reference_class(value)
-                setattr(obj, self.name, value)
-            return value
-
-    def __set__(self, obj, value):
-        """Don't allow this object to be associated to itself
-        This causes bad things to happen"""
-        if value is not None and (obj.id == value or (hasattr(value, "id") and obj.id == value.id)):
-            raise ValueError("Can not associate an object with itself!")
-        return super(ReferenceProperty, self).__set__(obj, value)
-
-    def __property_config__(self, model_class, property_name):
-        super(ReferenceProperty, self).__property_config__(model_class, property_name)
-        if self.collection_name is None:
-            self.collection_name = '%s_%s_set' % (model_class.__name__.lower(), self.name)
-        if hasattr(self.reference_class, self.collection_name):
-            raise ValueError('duplicate property: %s' % self.collection_name)
-        setattr(self.reference_class, self.collection_name,
-                _ReverseReferenceProperty(model_class, property_name, self.collection_name))
-
-    def check_uuid(self, value):
-        # This does a bit of hand waving to "type check" the string
-        t = value.split('-')
-        if len(t) != 5:
-            raise ValueError
-
-    def check_instance(self, value):
-        try:
-            obj_lineage = value.get_lineage()
-            cls_lineage = self.reference_class.get_lineage()
-            if obj_lineage.startswith(cls_lineage):
-                return
-            raise TypeError('%s not instance of %s' % (obj_lineage, cls_lineage))
-        except:
-            raise ValueError('%s is not a Model' % value)
-
-    def validate(self, value):
-        if self.validator:
-            self.validator(value)
-        if self.required and value is None:
-            raise ValueError('%s is a required property' % self.name)
-        if value == self.default_value():
-            return
-        if not isinstance(value, six.string_types):
-            self.check_instance(value)
-
-
-class _ReverseReferenceProperty(Property):
-    data_type = Query
-    type_name = 'query'
-
-    def __init__(self, model, prop, name):
-        self.__model = model
-        self.__property = prop
-        self.collection_name = prop
-        self.name = name
-        self.item_type = model
-
-    def __get__(self, model_instance, model_class):
-        """Fetches collection of model instances of this collection property."""
-        if model_instance is not None:
-            query = Query(self.__model)
-            if isinstance(self.__property, list):
-                props = []
-                for prop in self.__property:
-                    props.append("%s =" % prop)
-                return query.filter(props, model_instance)
-            else:
-                return query.filter(self.__property + ' =', model_instance)
-        else:
-            return self
-
-    def __set__(self, model_instance, value):
-        """Not possible to set a new collection."""
-        raise ValueError('Virtual property is read-only')
-
-
-class CalculatedProperty(Property):
-
-    def __init__(self, verbose_name=None, name=None, default=None,
-                 required=False, validator=None, choices=None,
-                 calculated_type=int, unique=False, use_method=False):
-        super(CalculatedProperty, self).__init__(verbose_name, name, default, required,
-                          validator, choices, unique)
-        self.calculated_type = calculated_type
-        self.use_method = use_method
-
-    def __get__(self, obj, objtype):
-        value = self.default_value()
-        if obj:
-            try:
-                value = getattr(obj, self.slot_name)
-                if self.use_method:
-                    value = value()
-            except AttributeError:
-                pass
-        return value
-
-    def __set__(self, obj, value):
-        """Not possible to set a new AutoID."""
-        pass
-
-    def _set_direct(self, obj, value):
-        if not self.use_method:
-            setattr(obj, self.slot_name, value)
-
-    def get_value_for_datastore(self, model_instance):
-        if self.calculated_type in [str, int, bool]:
-            value = self.__get__(model_instance, model_instance.__class__)
-            return value
-        else:
-            return None
-
-
-class ListProperty(Property):
-
-    data_type = list
-    type_name = 'List'
-
-    def __init__(self, item_type, verbose_name=None, name=None, default=None, **kwds):
-        if default is None:
-            default = []
-        self.item_type = item_type
-        super(ListProperty, self).__init__(verbose_name, name, default=default, required=True, **kwds)
-
-    def validate(self, value):
-        if self.validator:
-            self.validator(value)
-        if value is not None:
-            if not isinstance(value, list):
-                value = [value]
-
-        if self.item_type in six.integer_types:
-            item_type = six.integer_types
-        elif self.item_type in six.string_types:
-            item_type = six.string_types
-        else:
-            item_type = self.item_type
-
-        for item in value:
-            if not isinstance(item, item_type):
-                if item_type == six.integer_types:
-                    raise ValueError('Items in the %s list must all be integers.' % self.name)
-                else:
-                    raise ValueError('Items in the %s list must all be %s instances' %
-                                     (self.name, self.item_type.__name__))
-        return value
-
-    def empty(self, value):
-        return value is None
-
-    def default_value(self):
-        return list(super(ListProperty, self).default_value())
-
-    def __set__(self, obj, value):
-        """Override the set method to allow them to set the property to an instance of the item_type instead of requiring a list to be passed in"""
-        if self.item_type in six.integer_types:
-            item_type = six.integer_types
-        elif self.item_type in six.string_types:
-            item_type = six.string_types
-        else:
-            item_type = self.item_type
-        if isinstance(value, item_type):
-            value = [value]
-        elif value is None:  # Override to allow them to set this to "None" to remove everything
-            value = []
-        return super(ListProperty, self).__set__(obj, value)
-
-
-class MapProperty(Property):
-
-    data_type = dict
-    type_name = 'Map'
-
-    def __init__(self, item_type=str, verbose_name=None, name=None, default=None, **kwds):
-        if default is None:
-            default = {}
-        self.item_type = item_type
-        super(MapProperty, self).__init__(verbose_name, name, default=default, required=True, **kwds)
-
-    def validate(self, value):
-        value = super(MapProperty, self).validate(value)
-        if value is not None:
-            if not isinstance(value, dict):
-                raise ValueError('Value must of type dict')
-
-        if self.item_type in six.integer_types:
-            item_type = six.integer_types
-        elif self.item_type in six.string_types:
-            item_type = six.string_types
-        else:
-            item_type = self.item_type
-
-        for key in value:
-            if not isinstance(value[key], item_type):
-                if item_type == six.integer_types:
-                    raise ValueError('Values in the %s Map must all be integers.' % self.name)
-                else:
-                    raise ValueError('Values in the %s Map must all be %s instances' %
-                                     (self.name, self.item_type.__name__))
-        return value
-
-    def empty(self, value):
-        return value is None
-
-    def default_value(self):
-        return {}