Property-like classes with expiration/change monitoring
Project description
STATEFUL
Maintainer: aachn3 n45t31@protonmail.com
Site: https://gitlab.com/pyutil/stateful
Version: 3.0.1
About
This package provides a property-like class exposing two additional methods: refresh and commit. Both are hooked into the GET/SET descriptors to constantly monitor for changes made on object fields and either persist or reload the values manually or on a per-call basis.
Table of Contents
Project Structure
+core
+state
-PropertyState
*expired(property): bool
*changed(property): bool
*lock(property): threading.RLock
-ObjectState
*auto_commit: bool
*atomic(property): bool
*invalidate < - > -
*register < obj_property: property, aliases: list<str> > -
*unregister < obj_property: property > -
*operator[] < key: [str, property] > .PropertyState
*get < key: [str, property] > [.PropertyState, null]
*keys < - > list<property>
*values < - > list<.PropertyState>
*items < - > list<property, .PropertyState>
*aliases < - > list<str, .PropertyState>
+property
*FALLBACK_METHOD: object
-stateful_property
*state_class: class<.state.PropertyState>
*fget < owner: * > *
*fset < owner: *, value: * > -
*fdel < owner: * > -
*frefresh < owner: * > -
*fcommit < owner: * > -
*auto_commit: bool
*raw: bool
*getter < fget ... > -
*setter < fset ... > -
*deleter < fdel ... > -
*refresher < frefresh ... > -
*committer < fcommit ... > -
*GET descriptor < owner: *, cls: * > *
*SET descriptor < owner: *, value: * > -
*DEL descriptor < owner: * > -
*NAME descriptor < owner: * > -
*touch < owner: * > -
*refresh < owner: * > -
*commit < owner: * > -
*fallback_refresher < owner: * > -
*fallback_committer < owner: * > -
-StatefulPropertyWrapper
*expired: bool
*changed: bool
*value: *
+object
-StatefulObject
*state(property): .state.ObjectState
*expired(property): list<str>
*get_properties < property_spec: [str, list<str>, null] > list<.property.stateful_property>
*refresh < property_spec: [str, list<str>, null], force: bool > -
*commit < property_spec: [str, list<str>, null], force: bool > -
+util
+environ
-EnvironmentVariableState(..core.state.PropertyState)
-environment_variable(..core.property.stateful_property)
*varname: str
*decoder < env_var: str > value: *
*encoder < value: * > env_var: str
*value(property): *
*fallback_getter < owner: * > *
*fallback_setter < owner: * > -
*fallback_deleter < owner: * > -
*fallback_refresher < owner: * > -
*fallback_committer < owner: * > -
+timer
-Timer
*period: datetime.timedelta
*iterator < - > list<datetime.datetime>
-TimedPropertyState(..core.state.PropertyState)
*timer(property): .Timer
*expired(property): bool
-timed_property(..core.property.stateful_property)
*timespec(property): dict<str, [int, float]>
-TimedStatefulObject(..core.object.StatefulObject)
*timespec(property): dict<str, [int, float]>
Usage
Code samples
Manually load REST API data, change data subset and re-send to API
import json
from stateful import StatefulObject, stateful_property
from requests import request
from .config import URI, auth
class ApiConnector(StatefulObject):
@stateful_property
def data(self)->dict:
return self._json
@data.refresh
def data(self):
self._json = request("get", URI, auth=auth).json()
@data.commit
def data(self):
request("put", URI, auth=auth, body_data=json.dumps(self._json))
api = ApiConnector()
api.invalidate()
del response.data["_auth"]
for entry in response.data["form"]:
del entry["_auth"]
api.commit()
Continuously fetch current system workload with polling time set to 30s.
from stateful import TimedStatefulObject, timed_property
import psutil
class Workload(TimedStatefulObject):
def __init__(self):
super().__init__(timespec={"seconds": 30})
@timed_property
def _data(self):
return self._payload
@_data.refresh
def _data(self):
self._payload = {
"mem": psutil.virtual_memory(),
"cpu": psutil.cpu_percent(5),
}
@property
def memory(self):
return self._data["mem"]
@property
def cpu(self):
return self._data["cpu"]
Testing library functionality
Unit tests
Format: None
Integration tests
Format: None
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stat3ful-3.0.0.tar.gz.
File metadata
- Download URL: stat3ful-3.0.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c9cbdacb5cd1f163982dae4036829374e859c709404d3876710d1b7b2ba5328
|
|
| MD5 |
67674c65d055ad0ac083d02d6bea2ef0
|
|
| BLAKE2b-256 |
421ec24faedc2de57eebb1f0df4941b9e6f42988e3e914e8b9e3735e5bdc91f1
|
File details
Details for the file stat3ful-3.0.0-py3-none-any.whl.
File metadata
- Download URL: stat3ful-3.0.0-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9bd03e0baf4169a6478b0c55b118ac33e7cef4c038510c6c2aab81169ee300d
|
|
| MD5 |
44b8f06a93f7f74742fd6cae08c2e59f
|
|
| BLAKE2b-256 |
b579fdba0f1c0cc798fedf90264ae5c98e280a2a58d09c37a4e62ad837c3200c
|