diff env/lib/python3.9/site-packages/boto/dynamodb2/fields.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/boto/dynamodb2/fields.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,337 @@
+from boto.dynamodb2.types import STRING
+
+
+class BaseSchemaField(object):
+    """
+    An abstract class for defining schema fields.
+
+    Contains most of the core functionality for the field. Subclasses must
+    define an ``attr_type`` to pass to DynamoDB.
+    """
+    attr_type = None
+
+    def __init__(self, name, data_type=STRING):
+        """
+        Creates a Python schema field, to represent the data to pass to
+        DynamoDB.
+
+        Requires a ``name`` parameter, which should be a string name of the
+        field.
+
+        Optionally accepts a ``data_type`` parameter, which should be a
+        constant from ``boto.dynamodb2.types``. (Default: ``STRING``)
+        """
+        self.name = name
+        self.data_type = data_type
+
+    def definition(self):
+        """
+        Returns the attribute definition structure DynamoDB expects.
+
+        Example::
+
+            >>> field.definition()
+            {
+                'AttributeName': 'username',
+                'AttributeType': 'S',
+            }
+
+        """
+        return {
+            'AttributeName': self.name,
+            'AttributeType': self.data_type,
+        }
+
+    def schema(self):
+        """
+        Returns the schema structure DynamoDB expects.
+
+        Example::
+
+            >>> field.schema()
+            {
+                'AttributeName': 'username',
+                'KeyType': 'HASH',
+            }
+
+        """
+        return {
+            'AttributeName': self.name,
+            'KeyType': self.attr_type,
+        }
+
+
+class HashKey(BaseSchemaField):
+    """
+    An field representing a hash key.
+
+    Example::
+
+        >>> from boto.dynamodb2.types import NUMBER
+        >>> HashKey('username')
+        >>> HashKey('date_joined', data_type=NUMBER)
+
+    """
+    attr_type = 'HASH'
+
+
+class RangeKey(BaseSchemaField):
+    """
+    An field representing a range key.
+
+    Example::
+
+        >>> from boto.dynamodb2.types import NUMBER
+        >>> HashKey('username')
+        >>> HashKey('date_joined', data_type=NUMBER)
+
+    """
+    attr_type = 'RANGE'
+
+
+class BaseIndexField(object):
+    """
+    An abstract class for defining schema indexes.
+
+    Contains most of the core functionality for the index. Subclasses must
+    define a ``projection_type`` to pass to DynamoDB.
+    """
+    def __init__(self, name, parts):
+        self.name = name
+        self.parts = parts
+
+    def definition(self):
+        """
+        Returns the attribute definition structure DynamoDB expects.
+
+        Example::
+
+            >>> index.definition()
+            {
+                'AttributeName': 'username',
+                'AttributeType': 'S',
+            }
+
+        """
+        definition = []
+
+        for part in self.parts:
+            definition.append({
+                'AttributeName': part.name,
+                'AttributeType': part.data_type,
+            })
+
+        return definition
+
+    def schema(self):
+        """
+        Returns the schema structure DynamoDB expects.
+
+        Example::
+
+            >>> index.schema()
+            {
+                'IndexName': 'LastNameIndex',
+                'KeySchema': [
+                    {
+                        'AttributeName': 'username',
+                        'KeyType': 'HASH',
+                    },
+                ],
+                'Projection': {
+                    'ProjectionType': 'KEYS_ONLY',
+                }
+            }
+
+        """
+        key_schema = []
+
+        for part in self.parts:
+            key_schema.append(part.schema())
+
+        return {
+            'IndexName': self.name,
+            'KeySchema': key_schema,
+            'Projection': {
+                'ProjectionType': self.projection_type,
+            }
+        }
+
+
+class AllIndex(BaseIndexField):
+    """
+    An index signifying all fields should be in the index.
+
+    Example::
+
+        >>> AllIndex('MostRecentlyJoined', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ])
+
+    """
+    projection_type = 'ALL'
+
+
+class KeysOnlyIndex(BaseIndexField):
+    """
+    An index signifying only key fields should be in the index.
+
+    Example::
+
+        >>> KeysOnlyIndex('MostRecentlyJoined', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ])
+
+    """
+    projection_type = 'KEYS_ONLY'
+
+
+class IncludeIndex(BaseIndexField):
+    """
+    An index signifying only certain fields should be in the index.
+
+    Example::
+
+        >>> IncludeIndex('GenderIndex', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ], includes=['gender'])
+
+    """
+    projection_type = 'INCLUDE'
+
+    def __init__(self, *args, **kwargs):
+        self.includes_fields = kwargs.pop('includes', [])
+        super(IncludeIndex, self).__init__(*args, **kwargs)
+
+    def schema(self):
+        schema_data = super(IncludeIndex, self).schema()
+        schema_data['Projection']['NonKeyAttributes'] = self.includes_fields
+        return schema_data
+
+
+class GlobalBaseIndexField(BaseIndexField):
+    """
+    An abstract class for defining global indexes.
+
+    Contains most of the core functionality for the index. Subclasses must
+    define a ``projection_type`` to pass to DynamoDB.
+    """
+    throughput = {
+        'read': 5,
+        'write': 5,
+    }
+
+    def __init__(self, *args, **kwargs):
+        throughput = kwargs.pop('throughput', None)
+
+        if throughput is not None:
+            self.throughput = throughput
+
+        super(GlobalBaseIndexField, self).__init__(*args, **kwargs)
+
+    def schema(self):
+        """
+        Returns the schema structure DynamoDB expects.
+
+        Example::
+
+            >>> index.schema()
+            {
+                'IndexName': 'LastNameIndex',
+                'KeySchema': [
+                    {
+                        'AttributeName': 'username',
+                        'KeyType': 'HASH',
+                    },
+                ],
+                'Projection': {
+                    'ProjectionType': 'KEYS_ONLY',
+                },
+                'ProvisionedThroughput': {
+                    'ReadCapacityUnits': 5,
+                    'WriteCapacityUnits': 5
+                }
+            }
+
+        """
+        schema_data = super(GlobalBaseIndexField, self).schema()
+        schema_data['ProvisionedThroughput'] = {
+            'ReadCapacityUnits': int(self.throughput['read']),
+            'WriteCapacityUnits': int(self.throughput['write']),
+        }
+        return schema_data
+
+
+class GlobalAllIndex(GlobalBaseIndexField):
+    """
+    An index signifying all fields should be in the index.
+
+    Example::
+
+        >>> GlobalAllIndex('MostRecentlyJoined', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ],
+        ... throughput={
+        ...     'read': 2,
+        ...     'write': 1,
+        ... })
+
+    """
+    projection_type = 'ALL'
+
+
+class GlobalKeysOnlyIndex(GlobalBaseIndexField):
+    """
+    An index signifying only key fields should be in the index.
+
+    Example::
+
+        >>> GlobalKeysOnlyIndex('MostRecentlyJoined', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ],
+        ... throughput={
+        ...     'read': 2,
+        ...     'write': 1,
+        ... })
+
+    """
+    projection_type = 'KEYS_ONLY'
+
+
+class GlobalIncludeIndex(GlobalBaseIndexField, IncludeIndex):
+    """
+    An index signifying only certain fields should be in the index.
+
+    Example::
+
+        >>> GlobalIncludeIndex('GenderIndex', parts=[
+        ...     HashKey('username'),
+        ...     RangeKey('date_joined')
+        ... ],
+        ... includes=['gender'],
+        ... throughput={
+        ...     'read': 2,
+        ...     'write': 1,
+        ... })
+
+    """
+    projection_type = 'INCLUDE'
+
+    def __init__(self, *args, **kwargs):
+        throughput = kwargs.pop('throughput', None)
+        IncludeIndex.__init__(self, *args, **kwargs)
+        if throughput:
+            kwargs['throughput'] = throughput
+        GlobalBaseIndexField.__init__(self, *args, **kwargs)
+
+    def schema(self):
+        # Pick up the includes.
+        schema_data = IncludeIndex.schema(self)
+        # Also the throughput.
+        schema_data.update(GlobalBaseIndexField.schema(self))
+        return schema_data