wiederverwendbar 0.8.4__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wiederverwendbar/__init__.py +1 -1
- wiederverwendbar/functions/get_pretty_str.py +9 -0
- wiederverwendbar/logger/log_levels.py +5 -0
- wiederverwendbar/pydantic/file_config.py +20 -4
- wiederverwendbar/sqlalchemy/base.py +18 -5
- wiederverwendbar/sqlalchemy/db.py +46 -8
- wiederverwendbar/sqlalchemy/settings.py +6 -0
- wiederverwendbar/task_manger/task.py +1 -4
- wiederverwendbar/task_manger/task_manager.py +14 -19
- wiederverwendbar/warnings.py +6 -0
- {wiederverwendbar-0.8.4.dist-info → wiederverwendbar-0.8.6.dist-info}/METADATA +14 -14
- {wiederverwendbar-0.8.4.dist-info → wiederverwendbar-0.8.6.dist-info}/RECORD +14 -12
- {wiederverwendbar-0.8.4.dist-info → wiederverwendbar-0.8.6.dist-info}/WHEEL +0 -0
- {wiederverwendbar-0.8.4.dist-info → wiederverwendbar-0.8.6.dist-info}/entry_points.txt +0 -0
wiederverwendbar/__init__.py
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
import json
|
2
|
+
import sys
|
3
|
+
from warnings import warn
|
2
4
|
from pathlib import Path
|
3
|
-
from typing import Any, Union
|
5
|
+
from typing import Any, Union, Literal
|
4
6
|
|
5
7
|
from pydantic import BaseModel, create_model
|
6
8
|
|
9
|
+
from wiederverwendbar.warnings import FileNotFoundWarning
|
10
|
+
|
7
11
|
|
8
12
|
class FileConfig(BaseModel):
|
9
13
|
def __init__(self,
|
10
14
|
file_path: Union[Path, str, None] = None,
|
11
15
|
file_postfix: str = ".json",
|
12
|
-
file_must_exist: bool =
|
16
|
+
file_must_exist: Union[bool, Literal["yes_print", "yes_warn", "yes_raise", "no"]] = "no",
|
13
17
|
**overwrite_data: Any):
|
14
18
|
if file_path is None:
|
15
19
|
file_path = Path(Path.cwd() / self.__class__.__name__.lower()).with_suffix(file_postfix)
|
@@ -17,6 +21,7 @@ class FileConfig(BaseModel):
|
|
17
21
|
file_path = Path(file_path)
|
18
22
|
if file_path.suffix == "":
|
19
23
|
file_path = file_path.with_suffix(file_postfix)
|
24
|
+
file_path = file_path.absolute()
|
20
25
|
|
21
26
|
# read data from file
|
22
27
|
if file_path.is_file():
|
@@ -25,8 +30,19 @@ class FileConfig(BaseModel):
|
|
25
30
|
elif file_path.is_dir():
|
26
31
|
raise ValueError(f"{self.__class__.__name__} file path '{file_path}' is a directory.")
|
27
32
|
else:
|
28
|
-
if file_must_exist:
|
29
|
-
|
33
|
+
if file_must_exist is True:
|
34
|
+
file_must_exist = "yes_raise"
|
35
|
+
elif file_must_exist is False:
|
36
|
+
file_must_exist = "no"
|
37
|
+
msg = f"{self.__class__.__name__} file '{file_path}' not found."
|
38
|
+
if file_must_exist == "yes_print":
|
39
|
+
print(msg)
|
40
|
+
sys.exit(1)
|
41
|
+
elif file_must_exist == "yes_warn":
|
42
|
+
warn(msg, FileNotFoundWarning)
|
43
|
+
sys.exit(1)
|
44
|
+
elif file_must_exist == "yes_raise":
|
45
|
+
raise FileNotFoundError(msg)
|
30
46
|
data = {}
|
31
47
|
|
32
48
|
# overwrite data
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import warnings
|
1
2
|
from typing import Any, Optional, Callable, Union, TYPE_CHECKING
|
2
3
|
|
3
4
|
from sqlalchemy import inspect
|
@@ -6,6 +7,7 @@ from sqlalchemy.orm import Session, QueryableAttribute
|
|
6
7
|
from sqlalchemy.orm.exc import DetachedInstanceError
|
7
8
|
|
8
9
|
from wiederverwendbar.default import Default
|
10
|
+
from wiederverwendbar.functions.get_pretty_str import get_pretty_str
|
9
11
|
from wiederverwendbar.sqlalchemy.raise_has_not_attr import raise_has_not_attr
|
10
12
|
|
11
13
|
if TYPE_CHECKING:
|
@@ -141,7 +143,18 @@ class Base:
|
|
141
143
|
super().__init__(*args, **kwargs)
|
142
144
|
|
143
145
|
def __str__(self):
|
144
|
-
|
146
|
+
out = f"{self.__class__.__name__}("
|
147
|
+
for attr_name in self.__str_columns__:
|
148
|
+
if type(attr_name) is tuple:
|
149
|
+
attr_view_name = attr_name[0]
|
150
|
+
attr_name = attr_name[1]
|
151
|
+
else:
|
152
|
+
attr_view_name = attr_name
|
153
|
+
if not hasattr(self, attr_name):
|
154
|
+
warnings.warn(f"Attribute '{attr_name}' is not set for {self}.")
|
155
|
+
out += f"{attr_view_name}={get_pretty_str(getattr(self, attr_name))}, "
|
156
|
+
out = out[:-2] + ")"
|
157
|
+
return out
|
145
158
|
|
146
159
|
def __repr__(self):
|
147
160
|
return self.__str__()
|
@@ -247,7 +260,7 @@ class Base:
|
|
247
260
|
@classmethod
|
248
261
|
def new(cls,
|
249
262
|
session: Optional[Session] = None,
|
250
|
-
**kwargs) -> "Base":
|
263
|
+
**kwargs) -> Union["Base", Any]:
|
251
264
|
session_created, session = cls.session(session=session)
|
252
265
|
|
253
266
|
# noinspection PyArgumentList
|
@@ -279,7 +292,7 @@ class Base:
|
|
279
292
|
@classmethod
|
280
293
|
def get_all(cls,
|
281
294
|
*criterion: Union[ColumnExpressionArgument[bool], bool],
|
282
|
-
order_by: Union[str, QueryableAttribute, None] = None,
|
295
|
+
order_by: Union[str, QueryableAttribute, Any, None] = None,
|
283
296
|
order_desc: bool = False,
|
284
297
|
rows_per_page: Optional[int] = None,
|
285
298
|
page: int = 1,
|
@@ -287,7 +300,7 @@ class Base:
|
|
287
300
|
as_dict: bool = False,
|
288
301
|
dict_columns: Union[list[DictColumn], Default] = Default(),
|
289
302
|
session: Optional[Session] = None,
|
290
|
-
**kwargs: Any) -> list[Union["Base", None, dict[str, Any]]]:
|
303
|
+
**kwargs: Any) -> list[Union["Base", None, dict[str, Any], Any]]:
|
291
304
|
session_created, session = cls.session(session=session)
|
292
305
|
|
293
306
|
# get order by
|
@@ -351,7 +364,7 @@ class Base:
|
|
351
364
|
as_dict: bool = False,
|
352
365
|
dict_columns: Union[list[DictColumn], Default] = Default(),
|
353
366
|
session: Optional[Session] = None,
|
354
|
-
**kwargs: Any) -> Union["Base", None, dict[str, Any]]:
|
367
|
+
**kwargs: Any) -> Union["Base", None, dict[str, Any], Any]:
|
355
368
|
session_created, session = cls.session(session=session)
|
356
369
|
|
357
370
|
if criterion:
|
@@ -42,7 +42,9 @@ class SqlalchemyDb:
|
|
42
42
|
username: Optional[str] = None,
|
43
43
|
password: Optional[str] = None,
|
44
44
|
echo: Optional[bool] = None,
|
45
|
-
|
45
|
+
test_on_startup: Optional[bool] = None,
|
46
|
+
sqlite_check_if_file_exist: Optional[bool] = None,
|
47
|
+
sqlite_handle_foreign_keys: Optional[bool] = None,
|
46
48
|
settings: Optional[SqlalchemySettings] = None):
|
47
49
|
"""
|
48
50
|
Create a new Sqlalchemy Database
|
@@ -54,6 +56,8 @@ class SqlalchemyDb:
|
|
54
56
|
:param username: User to connect to database
|
55
57
|
:param password: Password to connect to database
|
56
58
|
:param echo: Echo SQL queries to console
|
59
|
+
:param test_on_startup: Test the database connection on startup.
|
60
|
+
:param sqlite_check_if_file_exist: Check if SQLite file exists before connecting to it.
|
57
61
|
:param sqlite_handle_foreign_keys: Enable SQLite Foreign Keys
|
58
62
|
:param settings: Sqlalchemy Settings
|
59
63
|
"""
|
@@ -67,16 +71,24 @@ class SqlalchemyDb:
|
|
67
71
|
self._username: Optional[str] = username or self.settings.db_username
|
68
72
|
self._password: Optional[str] = password or self.settings.db_password
|
69
73
|
self._echo: bool = echo or self.settings.db_echo
|
74
|
+
self._test_on_startup: bool = test_on_startup or self.settings.db_test_on_startup
|
75
|
+
self._sqlite_check_if_file_exist: bool = sqlite_check_if_file_exist or self.settings.db_sqlite_check_if_file_exist
|
70
76
|
self._sqlite_handle_foreign_keys: bool = sqlite_handle_foreign_keys or self.settings.db_sqlite_handle_foreign_keys
|
71
77
|
|
72
78
|
logger.debug(f"Create {self}")
|
73
79
|
|
74
80
|
self.engine = create_engine(self.connection_string, echo=self.echo)
|
75
|
-
if self.protocol == "sqlite"
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
81
|
+
if self.protocol == "sqlite":
|
82
|
+
if self.sqlite_check_if_file_exist:
|
83
|
+
self.listen("connect", self._sqlite_check_if_file_exist_func)
|
84
|
+
if self.sqlite_handle_foreign_keys:
|
85
|
+
self.listen("connect", self._sqlite_handle_foreign_keys_func)
|
86
|
+
self._session_maker = sessionmaker(bind=self.engine)
|
87
|
+
self._Base: DeclarativeMeta = declarative_base(metaclass=DeclarativeMeta)
|
88
|
+
self.session_maker.configure(binds={self._Base: self.engine})
|
89
|
+
|
90
|
+
if self.test_on_startup:
|
91
|
+
self.test()
|
80
92
|
|
81
93
|
def __str__(self):
|
82
94
|
return f"{self.__class__.__name__}({self.connection_string_printable})"
|
@@ -117,10 +129,27 @@ class SqlalchemyDb:
|
|
117
129
|
def echo(self) -> bool:
|
118
130
|
return self._echo
|
119
131
|
|
132
|
+
@property
|
133
|
+
def test_on_startup(self) -> bool:
|
134
|
+
return self._test_on_startup
|
135
|
+
|
136
|
+
@property
|
137
|
+
def sqlite_check_if_file_exist(self) -> bool:
|
138
|
+
return self._sqlite_check_if_file_exist
|
139
|
+
|
120
140
|
@property
|
121
141
|
def sqlite_handle_foreign_keys(self) -> bool:
|
122
142
|
return self._sqlite_handle_foreign_keys
|
123
143
|
|
144
|
+
@property
|
145
|
+
def session_maker(self) -> sessionmaker:
|
146
|
+
return self._session_maker
|
147
|
+
|
148
|
+
# noinspection PyPep8Naming
|
149
|
+
@property
|
150
|
+
def Base(self) -> Any:
|
151
|
+
return self._Base
|
152
|
+
|
124
153
|
def get_connection_string(self, printable: bool = False) -> str:
|
125
154
|
"""
|
126
155
|
Get the Connection String
|
@@ -173,6 +202,10 @@ class SqlalchemyDb:
|
|
173
202
|
|
174
203
|
return self.get_connection_string(printable=True)
|
175
204
|
|
205
|
+
def test(self):
|
206
|
+
self.engine.connect()
|
207
|
+
print()
|
208
|
+
|
176
209
|
def create_all(self,
|
177
210
|
tables: Optional[Sequence[Table]] = None,
|
178
211
|
check_first: bool = True) -> None:
|
@@ -231,8 +264,13 @@ class SqlalchemyDb:
|
|
231
264
|
|
232
265
|
return event.listens_for(self.engine, identifier, *args, **kw)
|
233
266
|
|
234
|
-
|
235
|
-
|
267
|
+
def _sqlite_check_if_file_exist_func(self, connection, _connection_record):
|
268
|
+
if self.file is not None:
|
269
|
+
if not self.file.is_file():
|
270
|
+
raise FileNotFoundError(f"Database file does not exist: {self.file}")
|
271
|
+
|
272
|
+
# noinspection PyMethodMayBeStatic
|
273
|
+
def _sqlite_handle_foreign_keys_func(self, connection, _connection_record):
|
236
274
|
if not isinstance(connection, sqlite3.Connection):
|
237
275
|
raise RuntimeError(f"Connection is not a sqlite3.Connection: {connection}")
|
238
276
|
cursor = connection.cursor()
|
@@ -34,6 +34,12 @@ class SqlalchemySettings(PrintableSettings):
|
|
34
34
|
db_echo: bool = Field(default=False,
|
35
35
|
title="Database echo.",
|
36
36
|
description="Echo SQL queries to console")
|
37
|
+
db_test_on_startup: bool = Field(default=True,
|
38
|
+
title="Test Database on Startup",
|
39
|
+
description="Test database connection on startup")
|
40
|
+
db_sqlite_check_if_file_exist: bool = Field(default=True,
|
41
|
+
title="Database SQLite Check If File Exist",
|
42
|
+
description="Check if file exists in SQLite")
|
37
43
|
db_sqlite_handle_foreign_keys: bool = Field(default=True,
|
38
44
|
title="Database SQLite Handle Foreign Keys",
|
39
45
|
description="Handle foreign keys in SQLite")
|
@@ -59,16 +59,13 @@ class Task:
|
|
59
59
|
raise ValueError("Manager object is required.")
|
60
60
|
manager.add_task(self)
|
61
61
|
|
62
|
-
def __str__(self):
|
63
|
-
return f"{self.manager.name}.{self.name}"
|
64
|
-
|
65
62
|
def init(self, manager):
|
66
63
|
self.manager = manager
|
67
64
|
self.trigger.init(manager)
|
68
65
|
self.set_next_run()
|
69
66
|
|
70
67
|
# log task creation
|
71
|
-
self.manager.logger.debug(f"
|
68
|
+
self.manager.logger.debug(f"Task created.")
|
72
69
|
|
73
70
|
@property
|
74
71
|
def last_run(self) -> Optional[datetime]:
|
@@ -8,9 +8,6 @@ from typing import Any, Optional
|
|
8
8
|
from wiederverwendbar.task_manger.task import Task
|
9
9
|
from wiederverwendbar.task_manger.trigger import Trigger
|
10
10
|
|
11
|
-
LOGGER = logging.getLogger(__name__)
|
12
|
-
|
13
|
-
|
14
11
|
class TaskManager:
|
15
12
|
lock = threading.Lock()
|
16
13
|
|
@@ -20,7 +17,8 @@ class TaskManager:
|
|
20
17
|
daemon: bool = False,
|
21
18
|
keep_done_tasks: bool = False,
|
22
19
|
loop_delay: Optional[float] = None,
|
23
|
-
logger: Optional[logging.Logger] = None
|
20
|
+
logger: Optional[logging.Logger] = None,
|
21
|
+
log_self: bool = True):
|
24
22
|
if name is None:
|
25
23
|
name = self.__class__.__name__
|
26
24
|
self.name = name
|
@@ -29,7 +27,7 @@ class TaskManager:
|
|
29
27
|
self._stopped: bool = False
|
30
28
|
self._creation_time: datetime = datetime.now()
|
31
29
|
self._keep_done_tasks = keep_done_tasks
|
32
|
-
self.logger = logger or
|
30
|
+
self.logger = logger or logging.getLogger(self.name)
|
33
31
|
|
34
32
|
# create workers
|
35
33
|
if worker_count is None:
|
@@ -48,9 +46,6 @@ class TaskManager:
|
|
48
46
|
loop_delay = 0.001
|
49
47
|
self._loop_delay = loop_delay
|
50
48
|
|
51
|
-
def __str__(self):
|
52
|
-
return f"{self.__class__.__name__}({self.name})"
|
53
|
-
|
54
49
|
def __del__(self):
|
55
50
|
if not self.stopped:
|
56
51
|
self.stop()
|
@@ -96,14 +91,14 @@ class TaskManager:
|
|
96
91
|
:return: None
|
97
92
|
"""
|
98
93
|
|
99
|
-
self.logger.debug(f"
|
94
|
+
self.logger.debug(f"Starting manager ...")
|
100
95
|
|
101
96
|
# start workers
|
102
97
|
for worker in self._workers:
|
103
|
-
self.logger.debug(f"
|
98
|
+
self.logger.debug(f"Starting worker '{worker.name}' ...")
|
104
99
|
worker.start()
|
105
100
|
|
106
|
-
self.logger.debug(f"
|
101
|
+
self.logger.debug(f"Manager started.")
|
107
102
|
|
108
103
|
def stop(self) -> None:
|
109
104
|
"""
|
@@ -112,7 +107,7 @@ class TaskManager:
|
|
112
107
|
:return: None
|
113
108
|
"""
|
114
109
|
|
115
|
-
self.logger.debug(f"
|
110
|
+
self.logger.debug(f"Stopping manager ...")
|
116
111
|
|
117
112
|
# set stopped flag
|
118
113
|
with self.lock:
|
@@ -121,10 +116,10 @@ class TaskManager:
|
|
121
116
|
# wait for workers to finish
|
122
117
|
for worker in self._workers:
|
123
118
|
if worker.is_alive():
|
124
|
-
self.logger.debug(f"
|
119
|
+
self.logger.debug(f"Waiting for worker '{worker.name}' to finish ...")
|
125
120
|
worker.join()
|
126
121
|
|
127
|
-
self.logger.debug(f"
|
122
|
+
self.logger.debug(f"Manager stopped.")
|
128
123
|
|
129
124
|
def loop(self, stay_in_loop: Optional[bool] = None) -> None:
|
130
125
|
"""
|
@@ -155,7 +150,7 @@ class TaskManager:
|
|
155
150
|
time.sleep(loop_delay)
|
156
151
|
continue
|
157
152
|
|
158
|
-
self.logger.debug(f"
|
153
|
+
self.logger.debug(f"Running task '{current_task.name}' ...")
|
159
154
|
|
160
155
|
with self.lock:
|
161
156
|
if current_task.time_measurement_before_run:
|
@@ -165,7 +160,7 @@ class TaskManager:
|
|
165
160
|
# run task
|
166
161
|
current_task.payload()
|
167
162
|
|
168
|
-
self.logger.debug(f"
|
163
|
+
self.logger.debug(f"Task '{current_task.name}' successfully run.")
|
169
164
|
|
170
165
|
with self.lock:
|
171
166
|
if not current_task.time_measurement_before_run:
|
@@ -174,7 +169,7 @@ class TaskManager:
|
|
174
169
|
if not current_task.is_done:
|
175
170
|
self._tasks.append(current_task)
|
176
171
|
else:
|
177
|
-
self.logger.debug(f"
|
172
|
+
self.logger.debug(f"Task '{current_task.name}' is done.")
|
178
173
|
if self._keep_done_tasks:
|
179
174
|
self._tasks.append(current_task)
|
180
175
|
|
@@ -192,7 +187,7 @@ class TaskManager:
|
|
192
187
|
task.init(self)
|
193
188
|
with self.lock:
|
194
189
|
self._tasks.append(task)
|
195
|
-
self.logger.debug(f"
|
190
|
+
self.logger.debug(f"Task '{task.name}' added.")
|
196
191
|
|
197
192
|
def remove_task(self, task: Task):
|
198
193
|
"""
|
@@ -204,7 +199,7 @@ class TaskManager:
|
|
204
199
|
|
205
200
|
with self.lock:
|
206
201
|
self._tasks.remove(task)
|
207
|
-
self.logger.debug(f"
|
202
|
+
self.logger.debug(f"Task '{task.name}' removed.")
|
208
203
|
|
209
204
|
def task(self,
|
210
205
|
name: Optional[str] = None,
|
@@ -1,49 +1,49 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: wiederverwendbar
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.6
|
4
4
|
Summary: A collection of scripts, classes and tools they are \"wiederverwendbar\".
|
5
5
|
Author-Email: Julius Koenig <info@bastelquartier.de>
|
6
6
|
License: GPL-3.0
|
7
7
|
Requires-Python: >=3.9
|
8
|
-
Requires-Dist: pydantic>=2.11.
|
8
|
+
Requires-Dist: pydantic>=2.11.5
|
9
9
|
Requires-Dist: pydantic-settings>=2.9.1
|
10
10
|
Requires-Dist: devtools>=0.12.2
|
11
11
|
Provides-Extra: full
|
12
12
|
Requires-Dist: rich>=14.0.0; extra == "full"
|
13
|
-
Requires-Dist: typer>=0.
|
13
|
+
Requires-Dist: typer>=0.16.0; extra == "full"
|
14
14
|
Requires-Dist: pythonping>=1.1.4; extra == "full"
|
15
15
|
Requires-Dist: mongoengine>=0.29.1; extra == "full"
|
16
|
-
Requires-Dist: nicegui>=2.
|
17
|
-
Requires-Dist: uvicorn>=0.34.
|
16
|
+
Requires-Dist: nicegui>=2.19.0; extra == "full"
|
17
|
+
Requires-Dist: uvicorn>=0.34.3; extra == "full"
|
18
18
|
Requires-Dist: fastapi>=0.115.12; extra == "full"
|
19
|
-
Requires-Dist: starlette-admin[i18n]>=0.
|
19
|
+
Requires-Dist: starlette-admin[i18n]>=0.15.1; extra == "full"
|
20
20
|
Requires-Dist: pillow>=11.2.1; extra == "full"
|
21
21
|
Requires-Dist: blinker>=1.9.0; extra == "full"
|
22
|
-
Requires-Dist: kombu>=5.5.
|
22
|
+
Requires-Dist: kombu>=5.5.4; extra == "full"
|
23
23
|
Requires-Dist: nest-asyncio>=1.6.0; extra == "full"
|
24
|
-
Requires-Dist: sqlalchemy>=2.0.
|
24
|
+
Requires-Dist: sqlalchemy>=2.0.41; extra == "full"
|
25
25
|
Provides-Extra: rich
|
26
26
|
Requires-Dist: rich>=14.0.0; extra == "rich"
|
27
27
|
Provides-Extra: typer
|
28
|
-
Requires-Dist: typer>=0.
|
28
|
+
Requires-Dist: typer>=0.16.0; extra == "typer"
|
29
29
|
Provides-Extra: mongoengine
|
30
30
|
Requires-Dist: mongoengine>=0.29.1; extra == "mongoengine"
|
31
31
|
Requires-Dist: blinker>=1.9.0; extra == "mongoengine"
|
32
32
|
Provides-Extra: uvicorn
|
33
|
-
Requires-Dist: uvicorn>=0.34.
|
33
|
+
Requires-Dist: uvicorn>=0.34.3; extra == "uvicorn"
|
34
34
|
Provides-Extra: fastapi
|
35
35
|
Requires-Dist: fastapi>=0.115.12; extra == "fastapi"
|
36
36
|
Provides-Extra: nicegui
|
37
|
-
Requires-Dist: nicegui>=2.
|
37
|
+
Requires-Dist: nicegui>=2.19.0; extra == "nicegui"
|
38
38
|
Provides-Extra: starlette-admin
|
39
|
-
Requires-Dist: starlette-admin[i18n]>=0.
|
39
|
+
Requires-Dist: starlette-admin[i18n]>=0.15.1; extra == "starlette-admin"
|
40
40
|
Requires-Dist: pillow>=11.2.1; extra == "starlette-admin"
|
41
|
-
Requires-Dist: kombu>=5.5.
|
41
|
+
Requires-Dist: kombu>=5.5.4; extra == "starlette-admin"
|
42
42
|
Requires-Dist: nest-asyncio>=1.6.0; extra == "starlette-admin"
|
43
43
|
Provides-Extra: fuctions
|
44
44
|
Requires-Dist: pythonping>=1.1.4; extra == "fuctions"
|
45
45
|
Provides-Extra: sqlalchemy
|
46
|
-
Requires-Dist: sqlalchemy>=2.0.
|
46
|
+
Requires-Dist: sqlalchemy>=2.0.41; extra == "sqlalchemy"
|
47
47
|
Description-Content-Type: text/markdown
|
48
48
|
|
49
49
|
# wiederverwendbar
|
@@ -1,7 +1,7 @@
|
|
1
|
-
wiederverwendbar-0.8.
|
2
|
-
wiederverwendbar-0.8.
|
3
|
-
wiederverwendbar-0.8.
|
4
|
-
wiederverwendbar/__init__.py,sha256=
|
1
|
+
wiederverwendbar-0.8.6.dist-info/METADATA,sha256=zQ-6Wgc3BqZMgcz_hVwr-wmVw8AH3T18Y1vYAPQmVIo,2012
|
2
|
+
wiederverwendbar-0.8.6.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
3
|
+
wiederverwendbar-0.8.6.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
|
4
|
+
wiederverwendbar/__init__.py,sha256=_HswkZyK44st-yq5YH55yG3k1EjhaE6FRMN3MVgy_uc,156
|
5
5
|
wiederverwendbar/before_after_wrap.py,sha256=8rjyRrDpwbzrsKkY7vbIgtitgLjlF8Lwx8YNvcJWwgY,10425
|
6
6
|
wiederverwendbar/default.py,sha256=MQBBpJMh8Tz4FUwxszVm7M3j6qbW2JH-5jKSjbvsUUk,49
|
7
7
|
wiederverwendbar/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -46,6 +46,7 @@ wiederverwendbar/functions/datetime.py,sha256=Wf7KJKerb5opdqgm06FjbRBC7ZVvr1WcW0
|
|
46
46
|
wiederverwendbar/functions/download_file.py,sha256=vNpaNpQ_YL9-D81Leey_RYv_OcPsUEZM5gAgo48tzXQ,5487
|
47
47
|
wiederverwendbar/functions/eval.py,sha256=zINxAfZ2mlNC4m36S2CQT2H4oTHyfBb-MJdZdgMfS0k,4537
|
48
48
|
wiederverwendbar/functions/find_class_method.py,sha256=QAE66bf75gkRrwhiD5spnNG-cX1trdQh6pQhNir79bc,470
|
49
|
+
wiederverwendbar/functions/get_pretty_str.py,sha256=pM4itXdiozjD3PQblAxhhkOLO7TY3pDYnmiqlZVJnWw,205
|
49
50
|
wiederverwendbar/functions/run_command.py,sha256=7j9cE0mqNVmu0MOojw7plEMttYZqYMsUgc8kOYS2v5I,1902
|
50
51
|
wiederverwendbar/functions/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
52
|
wiederverwendbar/functions/security/hashed_password.py,sha256=8qNOzvf4g7Z7YHDfdq6YSq6ZpYkseDogbcU4sxi3GGQ,3470
|
@@ -59,7 +60,7 @@ wiederverwendbar/logger/handlers/rich_console_handler.py,sha256=C2bFR0-yc4NqMCU-
|
|
59
60
|
wiederverwendbar/logger/handlers/stream_console_handler.py,sha256=-mPYV3d3xKx9CizdEaIEgLh6_OABbsj8SJ6cBm8P99Q,573
|
60
61
|
wiederverwendbar/logger/handlers/tar_rotating_file_handler.py,sha256=Ci2f4Mvy9f1DacNJiA_P0loWwI4y4oEW9fP0D1iMd8w,2500
|
61
62
|
wiederverwendbar/logger/helper.py,sha256=bI3Qi6aCugmmRkuB5dJGSkKxpr-0bX8TaZtwdk6IS4c,1292
|
62
|
-
wiederverwendbar/logger/log_levels.py,sha256=
|
63
|
+
wiederverwendbar/logger/log_levels.py,sha256=M8NOL8nRRtin2fOhAzaJL5XdPP03GCfBHHGp-BTzeVM,322
|
63
64
|
wiederverwendbar/logger/logger.py,sha256=yb-0aD3_mYHdwC-xnbg3oPegM_q4H0S-q14mlVedfVA,2860
|
64
65
|
wiederverwendbar/logger/settings.py,sha256=w2gGbx447UsnjB1uZ5hjt_J28PGrnMNxQp5qveVmifo,5876
|
65
66
|
wiederverwendbar/logger/singleton.py,sha256=3FWKLSIF7aGOUR2TlBHfO2BHFwYvzGa5hrtsD6Im2GE,3260
|
@@ -87,7 +88,7 @@ wiederverwendbar/mongoengine/settings.py,sha256=Kgc2VTWvXa5CcZdxOsVBx9HdcaWeOLG3
|
|
87
88
|
wiederverwendbar/mongoengine/singleton.py,sha256=xeh0OQM8q79ffn9Yz8tyNcjzZg68TD6xpfIZRT_M0mU,183
|
88
89
|
wiederverwendbar/post_init.py,sha256=7w1iQbOlRpydDJT3Ti0v8_OmjwjVTIQjOZUVPEIvrpw,474
|
89
90
|
wiederverwendbar/pydantic/__init__.py,sha256=lQRcyAOXBZfq-jTd-n7zpzC9HxsbiLgMvU8bKuFbSW8,335
|
90
|
-
wiederverwendbar/pydantic/file_config.py,sha256=
|
91
|
+
wiederverwendbar/pydantic/file_config.py,sha256=qX5wVS7TvNGjyzo9wRzBK92c73ux8X75pIoMUyPoRgA,2794
|
91
92
|
wiederverwendbar/pydantic/indexable_model.py,sha256=o9Ej9Z0oVWxYOJQdqJsik0C3LWi0dnLjoDB00VMs24g,775
|
92
93
|
wiederverwendbar/pydantic/printable_settings.py,sha256=CSN8n1NUnviOMc6wgnvIdcQlbti71oCTAq8fbFLjP_4,879
|
93
94
|
wiederverwendbar/pydantic/security/__init__.py,sha256=l-DRf-vueyP-M4pePTzQgCYZcBMb_0Fg5flwN-0dBWc,83
|
@@ -96,10 +97,10 @@ wiederverwendbar/pydantic/singleton.py,sha256=4YMBcKiTik2KmuN97CUCmy_ldhfyeDzrsU
|
|
96
97
|
wiederverwendbar/route.py,sha256=moYlZ5IvV_uDroSggxe80-sR3_nlNsl9Bp69CcCfK8Y,12061
|
97
98
|
wiederverwendbar/singleton.py,sha256=6QqeQpzx4UhBZnvto5_yUs7hpmzt_-dyE169RuwsTa8,6866
|
98
99
|
wiederverwendbar/sqlalchemy/__init__.py,sha256=gkt99fc9wIxaSjrl1xNhmPLrlJNZhrY-sJ5yIezREGM,888
|
99
|
-
wiederverwendbar/sqlalchemy/base.py,sha256=
|
100
|
-
wiederverwendbar/sqlalchemy/db.py,sha256=
|
100
|
+
wiederverwendbar/sqlalchemy/base.py,sha256=wNL0vnDuCwM7bLm8imLGAtGxz5uWWsg4d9n64HZZKT4,15057
|
101
|
+
wiederverwendbar/sqlalchemy/db.py,sha256=u3nHJh8pxnOMALldp72sohe1XZ-ZfksZZVpE5qIxHgc,9610
|
101
102
|
wiederverwendbar/sqlalchemy/raise_has_not_attr.py,sha256=GdmbSC8EoBCkpuZQGLp3zzQ0iScsj2XfFZC9OZtWbkA,403
|
102
|
-
wiederverwendbar/sqlalchemy/settings.py,sha256=
|
103
|
+
wiederverwendbar/sqlalchemy/settings.py,sha256=RM-bFg_Ga0AUko4JWOvCZLcfoB91kKpn1TqVzgxAm_k,2579
|
103
104
|
wiederverwendbar/sqlalchemy/singleton.py,sha256=LVH1gRl1U1My-cx-Y1M4G-czgCWzAmuVyRz9EYWmGMM,179
|
104
105
|
wiederverwendbar/sqlalchemy/types.py,sha256=1Hb2Y5QacH079iKpN0fV5XALxLYQj7CFYqs5tC3FlFM,1911
|
105
106
|
wiederverwendbar/starlette_admin/__init__.py,sha256=SRuEMG5_2ns78Arw3KJsMMYg4N3RylCJmc5HfhBKAjg,3425
|
@@ -157,8 +158,8 @@ wiederverwendbar/starlette_admin/settings/admin.py,sha256=moEgCDUpf2eQ2o7e2SaeMk
|
|
157
158
|
wiederverwendbar/starlette_admin/settings/settings.py,sha256=3T1EcFNATDI45o99MIlzmfs-1XYzUWB6p9C7L4zvJ0A,7378
|
158
159
|
wiederverwendbar/task_manger/__init__.py,sha256=A46SQ_MJiMdcZ7HU2ePEsv0xGdek9gnW1X4Q1QXtB7E,354
|
159
160
|
wiederverwendbar/task_manger/singleton.py,sha256=HQ6XwVmBmCEVAzTLeloMU-vf3JnctBUXDGC2SaEL2vw,183
|
160
|
-
wiederverwendbar/task_manger/task.py,sha256=
|
161
|
-
wiederverwendbar/task_manger/task_manager.py,sha256=
|
161
|
+
wiederverwendbar/task_manger/task.py,sha256=NanEdg28Bn6JwG6mwrL0qLZIcGI6XQzVbctwXa0-j14,2961
|
162
|
+
wiederverwendbar/task_manger/task_manager.py,sha256=FuB0Lf2ff4KaVtPp7G585uF7GjjMFszY7oGGNSOIfSI,6871
|
162
163
|
wiederverwendbar/task_manger/trigger.py,sha256=biTQv3_S7d14CkPXKjDQxL6XbTet7-PVRwofsCBs3Wc,9906
|
163
164
|
wiederverwendbar/threading/__init__.py,sha256=jFeP8mQws_JVwxL8W1fCsWPUcFqO-l39yQ8d9P3AqtQ,508
|
164
165
|
wiederverwendbar/threading/extended_thread.py,sha256=CJi2fmpHBZD9jo5B8_85Ax8jo1pM5n9cjEVuG6Guxg8,23409
|
@@ -167,4 +168,5 @@ wiederverwendbar/typer/typer_resolve_defaults.py,sha256=2KD09rxKaur2TbJ3BCcLxbrc
|
|
167
168
|
wiederverwendbar/uvicorn/__init__.py,sha256=9F7gT-8QyxS41xWKEIHMLUBV9ZTBKZJj8tHPqhMzoHA,126
|
168
169
|
wiederverwendbar/uvicorn/server.py,sha256=04WpB8AUtVkYhoS6qsBVJHOtTNkISQVg_mLVtYmK-1Y,5657
|
169
170
|
wiederverwendbar/uvicorn/settings.py,sha256=IAjlpWR-KH7098jIgH_t46yG17YPbH8MoEmMdn0hgNo,2217
|
170
|
-
wiederverwendbar
|
171
|
+
wiederverwendbar/warnings.py,sha256=6P1wn-OkrDCo5zg_hL28nt5b9w4ZXo4qXwlpW9B_QWI,110
|
172
|
+
wiederverwendbar-0.8.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|