Git Product home page Git Product logo

pynamodb-attributes's Introduction

This Python 3 library contains compound and high-level PynamoDB attributes:

  • FloatAttribute – same as NumberAttribute but whose value is typed as float
  • IntegerAttribute – same as NumberAttribute but whose value is typed as int (rather than float)
  • IntegerSetAttribute – same as NumberSetAttribute but whose value is typed as int (rather than float)
  • UnicodeDelimitedTupleAttribute - a delimiter-separated value, useful for storing composite keys
  • UnicodeEnumAttribute - serializes a string-valued Enum into a Unicode (S-typed) attribute
  • UnicodeProtobufEnumAttribute - serializes a Protobuf enum into a Unicode (S-typed) attribute
  • IntegerEnumAttribute - serializes a int-valued Enum into a number (N-typed) attribute
  • TimedeltaAttribute, TimedeltaMsAttribute, TimedeltaUsAttribute – serializes timedeltas as integer seconds, milliseconds (ms) or microseconds (µs)
  • TimestampAttribute, TimestampMsAttribute, TimestampUsAttribute – serializes datetimes as Unix epoch seconds, milliseconds (ms) or microseconds (µs)
  • IntegerDateAttribute - serializes date as an integer representing the Gregorian date (e.g. 20181231)
  • UUIDAttribute - serializes a UUID Python object as a S type attribute (e.g. 'a8098c1a-f86e-11da-bd1a-00112444be1e')
  • UnicodeDatetimeAttribute - ISO8601 datetime strings with offset information

Testing

The tests in this repository use an in-memory implementation of dynamodb. To run the tests locally, make sure DynamoDB Local is running. It is available as a standalone binary, through package managers (e.g. Homebrew) or as a Docker container:

docker run -d -p 8000:8000 amazon/dynamodb-local

Afterwards, run tests as usual:

pytest tests

pynamodb-attributes's People

Contributors

dschaller avatar fsouza avatar garrettheel avatar hallie avatar ikonst avatar knap1930 avatar mxr avatar nazariojl avatar nishinishidayo avatar nolanlum avatar roytangrb avatar th0114nd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pynamodb-attributes's Issues

`range_key_condition` Doesn't work with TimestampMSAttribute

The table:

class EventTypeIndex(GlobalSecondaryIndex):
    class Meta:
        index_name = "EventTypeIndex"
        projection = AllProjection()

    event_type = UnicodeEnumAttribute(
        LogEventTypeEnum,
        hash_key=True,
        unknown_value=LogEventTypeEnum.GENERIC,
        default_for_new=LogEventTypeEnum.GENERIC,
    )


class Logs(Model):
    class Meta:
        table_name = "Logs"
        region = Session().get_config_variable("region")
        billing_mode = PAY_PER_REQUEST_BILLING_MODE

    user_id = NumberAttribute(hash_key=True)
    timestamp = TimestampMsAttribute(range_key=True)

    event_type = UnicodeEnumAttribute(
        LogEventTypeEnum, unknown_value=LogEventTypeEnum.GENERIC, default_for_new=LogEventTypeEnum.GENERIC
    )
    event_type_index = EventTypeIndex()
    content = UnicodeAttribute(null=True)

The crash :

[i for i in Logs.query(hash_key=9152, range_key_condition=Logs.timestamp.between(0, 9999999999999999))]
Traceback (most recent call last):
  File "/Users/seluj78/Applications/PyCharm Professional Edition.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
    coro = func()
           ^^^^^^
  File "<input>", line 1, in <module>
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/attributes.py", line 176, in between
    return Path(self).between(lower, upper)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/expressions/operand.py", line 79, in between
    return Between(self, self._to_operand(lower), self._to_operand(upper))
                         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/expressions/operand.py", line 45, in _to_operand
    return Path(value) if isinstance(value, Attribute) else self._to_value(value)
                                                            ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/expressions/operand.py", line 328, in _to_value
    return Value(value, attribute=self.attribute)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/expressions/operand.py", line 200, in __init__
    (self.attr_type, value) = Value.__serialize(value, attribute)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb/expressions/operand.py", line 221, in __serialize
    return attribute.attr_type, attribute.serialize(value)
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/seluj78/Projects/Datascientest/hub-backend/.venv/lib/python3.11/site-packages/pynamodb_attributes/timestamp.py", line 26, in serialize
    return str(int(value.timestamp() * self._multiplier))
                   ^^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'timestamp'

List of a UnicodeEnumAttribute

Hi,

First of all, thank you very much for this lib, it's really useful !

I cannot find a way to make a UnicodeEnumAttribute work in a ListAttribute, and I was wondering if it was a bug or not.

Cheers !

    flags = ListAttribute(of=UnicodeEnumAttribute, null=True, default=[])  # Raises TypeError: __init__() missing 1 required positional argument: 'enum_type'
    flags = ListAttribute(of=UnicodeEnumAttribute(UserFlagEnum), null=True, default=[])  # Raises TypeError: issubclass() arg 1 must be a class

Python 3.9 deprecates `_field_types` from `NamedTuple`

The removal of _field_type from typing.NamedTuple causes the following error when using UnicodeDelimitedTupleAttribute.

self = <pynamodb_attributes.unicode_delimited_tuple.UnicodeDelimitedTupleAttribute object at 0x110d8a460>, value = 'US.San Francisco.94107'

    def deserialize(self, value: str) -> T:
        fields = getattr(self.tuple_type, '_fields', None)
        field_types = getattr(self.tuple_type, '_field_types', None)
        if fields and field_types:
            values = value.split(self.delimiter, maxsplit=len(fields))
            return self.tuple_type(**{f: field_types[f](v) for f, v in zip(fields, values)})
        else:
>           return self.tuple_type(value.split(self.delimiter))
E           TypeError: <lambda>() missing 1 required positional argument: 'city'

pynamodb_attributes/unicode_delimited_tuple.py:48: TypeError

Suggest adding "ArrowAttribute"

Arrow is often used to handle dates & times in Python.
I suggest making "ArrowAttribute" and if it's okay, I will work some.
ex.
deserialize: int(dynamodb 'N' type) -> arrow
serialize: arrow-> int(dynamodb 'N' type)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.