Ejemplo n.º 1
0
def timedelta_attr_property(required=False, **kwargs):
    """Return a timedelta property that uses a classes attributes for
    'weeks', 'days', 'hours', 'minutes', 'seconds', 'milliseconds', and 'microseconds'.

    Example:

        .. code-block:: python

            @dataclass
            class MyClass:
                days: int = 0
                hours: int = 0
                minutes: int = 0
                seconds: int = 0
                milliseconds: int = 0

                interval: datetime.timedelta = timedelta_helper_property()

    Returns:
        property (field_property): Timedelta property that uses a classes underlying attributes.
    """
    return field_property(timedelta_from_attrs,
                          timedelta_to_attrs,
                          doc='Interval from the set time values',
                          required=required,
                          **kwargs)
Ejemplo n.º 2
0
def seconds_property(attr='seconds', **kwargs):
    """Property for a seconds attribute to turn floating points into milliseconds.

    Args:
        attr (str)['seconds']: Attribute name

    Returns:
        property (field_property): Property that when given a float will set seconds and milliseconds.
    """
    if not attr.startswith('_'):
        attr = '_' + attr

    def fget(self) -> int:
        return getattr(self, attr, 0)

    def fset(self, value: Union[int, float]):
        if isinstance(value, float):
            mill = int((value % 1) * 1000)
            if mill:
                self.milliseconds = mill

        setattr(self, attr, int(value))

    if kwargs.get('default', MISSING) == MISSING and kwargs.get(
            'default_factory', MISSING) == MISSING:
        kwargs['default'] = 0
    return field_property(
        fget,
        fset,
        doc='Seconds in time. If float also set milliseconds',
        **kwargs)
Ejemplo n.º 3
0
def datetime_property(attr,
                      allow_none=True,
                      default=MISSING,
                      default_factory=MISSING,
                      formats: List[str] = None,
                      **kwargs):
    """Create a datetime dataclass property where the underlying datetime is saved to "_attr".

    Args:
        attr (str): Attribute name (example: "created_on"
        allow_none (bool)[True]: Allows the property to be set to None. This is needed if the default is None.
        default (object)[MISSING]: Default value for the dataclass
        default_factory (function)[MISSING]: Function that returns the default value.
        formats (list)[None]: List of string formats to accept.

    Returns:
        property (field_property): Dataclass field property for a datetime.
    """
    if not attr.startswith('_'):
        attr = '_' + attr
    typeref = Union[datetime.datetime, str]
    if allow_none:
        typeref = Union[datetime.datetime, str, None]

    if default == MISSING and default_factory == MISSING and allow_none:
        default = None

    def fget(self):
        return getattr(self, attr)

    def fset(self, value: typeref):
        if value is None and not allow_none:
            raise TypeError('Invalid datetime value given!')
        elif value is not None:
            value = make_datetime(value, formats=formats)
        setattr(self, attr, value)

    return field_property(fget,
                          fset,
                          doc='datetime property {}'.format(attr),
                          default=default,
                          default_factory=default_factory,
                          **kwargs)
Ejemplo n.º 4
0
def weekdays_attr_property(attr,
                           weekday,
                           allow_none=True,
                           required=False,
                           **kwargs):
    """Return a property to access Weekdays.sunday as a property.

    Example:
        .. code-block:: python

            class MyClass:
                weekdays: Weekdays = Weekdays()
                sunday: bool = weekdays_attr_property('sunday')
                monday: bool = weekdays_attr_property('monday')
                tuesday: bool = weekdays_attr_property('tuesday')
                wednesday: bool = weekdays_attr_property('wednesday')
                thursday: bool = weekdays_attr_property('thursday')
                friday: bool = weekdays_attr_property('friday')
                saturday: bool = weekdays_attr_property('saturday')
    """
    def fget(self):
        return getattr(getattr(self, attr), weekday, 0)

    def fset(self, value):
        if value is None and not allow_none:
            raise TypeError('Invalid weekdays value given!')
        setattr(getattr(self, attr), weekday, value)

    def fdel(self):
        delattr(getattr(self, attr), weekday)

    doc = 'Alias for weekdays {} with day {}'.format(attr, weekday)
    return field_property(fget,
                          fset,
                          fdel,
                          doc=doc,
                          required=required,
                          **kwargs)
Ejemplo n.º 5
0
def weekdays_property(attr, allow_none=True, required=False, **kwargs):
    """Return a property for keeping a list of weekdays.

    Example:
        .. code-block:: python

            class MyClass:
                weekdays: Weekdays = weekdays_property('weekdays')

            m = MyClass()
            m.weekdays = 'Sunday'

    """
    if not attr.startswith('_'):
        attr = '_' + attr

    def fget(self):
        return getattr(self, attr)

    def fset(self, value):
        if value is None and not allow_none:
            raise TypeError('Invalid weekdays value given!')
        elif not isinstance(value, Weekdays):
            value = Weekdays(value)
        setattr(self, attr, value)

    def fdel(self):
        delattr(self, attr)

    doc = 'Property to force a Weekdays object'
    return field_property(fget,
                          fset,
                          fdel,
                          doc=doc,
                          required=required,
                          **kwargs)