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)
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)
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)
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)
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)