fastapi-rtk 1.0.19__py3-none-any.whl → 1.0.20__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.
@@ -5,7 +5,7 @@ import inspect
5
5
  import traceback as tb
6
6
  import typing
7
7
 
8
- from .prettify_dict import prettify_dict
8
+ from .formatter import prettify_dict
9
9
 
10
10
  __all__ = ["AsyncTaskRunner"]
11
11
 
@@ -180,13 +180,15 @@ class AsyncTaskRunner:
180
180
  contextvars.ContextVar("_runner_stack", default=None)
181
181
  )
182
182
 
183
- def __init__(self, run_tasks_even_if_exception=False):
183
+ def __init__(self, id: str | None = None, run_tasks_even_if_exception=False):
184
184
  """
185
185
  Initializes the AsyncTaskRunner.
186
186
 
187
187
  Args:
188
+ id (str | None, optional): An optional identifier for the runner instance. Defaults to None.
188
189
  run_tasks_even_if_exception (bool, optional): Whether to run tasks even if an exception occurs in the context. Defaults to False.
189
190
  """
191
+ self.id = id
190
192
  self.run_tasks_even_if_exception = run_tasks_even_if_exception
191
193
 
192
194
  @typing.overload
@@ -287,6 +289,29 @@ class AsyncTaskRunner:
287
289
  stack = cls._get_current_runner_stack("get_current_runner")
288
290
  return stack[-1]
289
291
 
292
+ @classmethod
293
+ def get_runner(cls, id: str):
294
+ """
295
+ Retrieves the AsyncTaskRunner instance with the specified ID from the context stack.
296
+
297
+ Args:
298
+ id (str): The ID of the AsyncTaskRunner to retrieve.
299
+
300
+ Raises:
301
+ RuntimeError: If called outside of a context.
302
+ ValueError: If no AsyncTaskRunner with the specified ID is found.
303
+
304
+ Returns:
305
+ AsyncTaskRunner: The AsyncTaskRunner instance with the specified ID.
306
+ """
307
+ stack = cls._get_current_runner_stack("get_runner_by_id")
308
+ for runner in reversed(stack):
309
+ if runner.id == id:
310
+ return runner
311
+ raise ValueError(
312
+ f"No AsyncTaskRunner with id '{id}' found in the current context."
313
+ )
314
+
290
315
  async def __aenter__(self):
291
316
  self._handle_enter_stack()
292
317
  return self
@@ -1,6 +1,7 @@
1
+ import math
1
2
  import typing
2
3
 
3
- __all__ = ["prettify_dict"]
4
+ __all__ = ["prettify_dict", "format_file_size"]
4
5
 
5
6
 
6
7
  def prettify_dict(d: typing.Dict[str, typing.Any], indent: int = 0) -> str:
@@ -22,3 +23,24 @@ def prettify_dict(d: typing.Dict[str, typing.Any], indent: int = 0) -> str:
22
23
  else:
23
24
  result += f"{value}\n"
24
25
  return result
26
+
27
+
28
+ def format_file_size(size_bytes: int):
29
+ """
30
+ Format a file size in bytes to a human-readable string.
31
+
32
+ Args:
33
+ size_bytes (int): The file size in bytes.
34
+
35
+ Returns:
36
+ str: The formatted file size.
37
+ """
38
+ if size_bytes == 0:
39
+ return "0B"
40
+ size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
41
+ i = int(math.floor(math.log(size_bytes, 1024)))
42
+ p = math.pow(1024, i)
43
+ s = round(size_bytes / p, 2)
44
+ if s.is_integer():
45
+ s = int(s)
46
+ return f"{s} {size_name[i]}"
@@ -6,7 +6,7 @@ from concurrent.futures import ThreadPoolExecutor
6
6
 
7
7
  from fastapi.concurrency import run_in_threadpool
8
8
 
9
- from .prettify_dict import prettify_dict
9
+ from .formatter import prettify_dict
10
10
 
11
11
  P = typing.ParamSpec("P")
12
12
  T = typing.TypeVar("T")
@@ -149,7 +149,8 @@ def run_function_in_threadpool(
149
149
  with ThreadPoolExecutor(
150
150
  max_workers=max_workers, **(thread_pool_kwargs or {})
151
151
  ) as executor:
152
- future = executor.submit(func, *args, **kwargs)
152
+ ctx = contextvars.copy_context()
153
+ future = executor.submit(ctx.run, func, *args, **kwargs)
153
154
  return future.result()
154
155
 
155
156
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-rtk
3
- Version: 1.0.19
3
+ Version: 1.0.20
4
4
  Summary: A package that provides a set of tools to build a FastAPI application with a Class-Based CRUD API.
5
5
  Project-URL: Homepage, https://codeberg.org/datatactics/fastapi-rtk
6
6
  Project-URL: Issues, https://codeberg.org/datatactics/fastapi-rtk/issues
@@ -1,5 +1,5 @@
1
- fastapi_rtk/__init__.py,sha256=Lg6Er5blOMcbtQSRJMNWbRQ1VX4PWEPMVFm2ie5r8mA,6183
2
- fastapi_rtk/_version.py,sha256=3HJlki3WDXw4aYwHo9LB3tzME44RgDb7PUJ_5NVNfA4,23
1
+ fastapi_rtk/__init__.py,sha256=TGDmH62gymFCC6yFdAsiVHcdOvy4_tdDCzAK4WzEHH8,6264
2
+ fastapi_rtk/_version.py,sha256=D3FIR1OP9p54JyJSpU5wDfDWvaAjk2k-IH5FzjX_kCA,23
3
3
  fastapi_rtk/apis.py,sha256=6X_Lhl98m7lKrDRybg2Oe24pLFLJ29eCOQSwCAvpKhY,172
4
4
  fastapi_rtk/config.py,sha256=9PZF9E5i1gxmnsZEprZZKxVHSk0dFEklJSplX9NEqdo,14036
5
5
  fastapi_rtk/const.py,sha256=sEj_cYeerj9pVwbCu0k5Sy1EYpdr1EHzUjqqbnporgc,4905
@@ -16,12 +16,12 @@ fastapi_rtk/mixins.py,sha256=78RqwrRJFOz6KAxf-GSNOmRdr7R3b-ws7OIENYlzRQQ,238
16
16
  fastapi_rtk/models.py,sha256=lQSqe-r0H7jWBVdqXjEi_bNL1cGQr0YWnyI1ToS_coc,178
17
17
  fastapi_rtk/routers.py,sha256=5gMGyH4Any9TwB3Fz23QDkmrX8MouzCxVgoAIcBqnTI,18988
18
18
  fastapi_rtk/schemas.py,sha256=mdIX93QRaQBLrQz-kBvG5wyKoi8H6OQpFuTBO9-mCK4,17894
19
- fastapi_rtk/setting.py,sha256=vpjnio0mp_yZhDajZaBl6uOFmrBYl-sqB0L_lSkBpfk,19529
19
+ fastapi_rtk/setting.py,sha256=mLIm-6DoVSEiXn2VUT-JByNVXujeIlyBFBUlPKTw7ys,19753
20
20
  fastapi_rtk/types.py,sha256=-LPnTIbHvqJW81__gab3EWrhjNmznHhptz0BtXkEAHQ,3612
21
21
  fastapi_rtk/version.py,sha256=D2cmQf2LNeHOiEfcNzVOOfcAmuLvPEmGEtZv5G54D0c,195
22
22
  fastapi_rtk/api/__init__.py,sha256=MwFR7HHppnhbjZGg3sOdQ6nqy9uxnHHXvicpswNFMNA,245
23
23
  fastapi_rtk/api/base_api.py,sha256=42I9v3b25lqxNAMDGEtajA5-btIDSyUWF0xMDgGkA8c,8078
24
- fastapi_rtk/api/model_rest_api.py,sha256=cRjMg_v5TsXCare8Tg7b5qQssB6fGo7RpaoGWQvdoO8,106572
24
+ fastapi_rtk/api/model_rest_api.py,sha256=B29CA1pOoCyoyKbknPmnIfgbYBLAWKD8pRdBlPh0RA4,111332
25
25
  fastapi_rtk/auth/__init__.py,sha256=iX7O41NivBYDfdomEaqm4lUx9KD17wI4g3EFLF6kUTw,336
26
26
  fastapi_rtk/auth/auth.py,sha256=F2qZoR7go_7FnvVJrDxUCd6vtRz5XW8yyOv143MWPts,20664
27
27
  fastapi_rtk/auth/hashers/__init__.py,sha256=uBThFj2VPPSMSioxYTktNiM4-mVgtDAjTpKA3ZzWxxs,110
@@ -58,9 +58,9 @@ fastapi_rtk/backends/sqla/extensions/audit/types.py,sha256=2RuEvmq8CeVDOY0T_AtS0
58
58
  fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py,sha256=d8ODg17-NEPqyjNpDPlLANEIoYTliX2VkDFW2os1EYA,1814
59
59
  fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py,sha256=L1WgO7UzWuAgsf93iK7mmsL89DMUaRGUCEKX7CM7kz8,3846
60
60
  fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py,sha256=sckNoxPE8ApKCLgBZzE_2dokXrM6mIXvMguHZvyJzIM,3891
61
- fastapi_rtk/bases/__init__.py,sha256=v3tMVuX20UbvjI_mTWpDAePWAA38e3pjlYEiICgY4j8,440
61
+ fastapi_rtk/bases/__init__.py,sha256=Te9rcmi1AGG72iZCzGyvc5qEIVyIexN7ViFdb59a2RA,494
62
62
  fastapi_rtk/bases/db.py,sha256=D27BhF89J0OaLHjALDCa85eNf35lBaTz6VV7EDa4wuM,18711
63
- fastapi_rtk/bases/file_manager.py,sha256=n6yRY0jh60itXZt0R3oaSN-2Q_CTRswX1BghE7GN4Sk,8791
63
+ fastapi_rtk/bases/file_manager.py,sha256=A5Tt_BYQQc3cNYzWxJ5tCKcQe3HOxhXcrBoyWx6wtnc,11557
64
64
  fastapi_rtk/bases/filter.py,sha256=XmWTcLaIcBj9pKF1PMAKdwSnZNpdT8Df3uLeUIOGUDE,1840
65
65
  fastapi_rtk/bases/interface.py,sha256=Cq9Duxa3w-tw342P424h88fc0_X1DoxCdTa3rAN-6jM,45380
66
66
  fastapi_rtk/bases/model.py,sha256=nUZf0AVs0Mzqh2u_ALiRNYN1bfOU9PzYLvEFHDQ57Y0,1692
@@ -85,40 +85,40 @@ fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako,sha256=xm
85
85
  fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py,sha256=KXb0a5c_3zutlTgyTP6MofCL0jinixLZMdG5aYd0E_U,7529
86
86
  fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako,sha256=o02Ul3GmWdWkOiLZiKInBcAuCN3OjgxCzdj5Y1gvgVY,1324
87
87
  fastapi_rtk/file_managers/__init__.py,sha256=RZzSSUDq_cIv4MeVePRBGR0mbEiJua7WKccfE6IAawk,198
88
- fastapi_rtk/file_managers/file_manager.py,sha256=YJzKWtwVOiIYS4-W0CfadYhhWLydNRJ7D_T9vdzcIdU,2612
89
- fastapi_rtk/file_managers/image_manager.py,sha256=S2mcBuXOzXWlPhmq1in76kRmNKGYrIeEqDMs-c5KXo8,573
90
- fastapi_rtk/file_managers/s3_file_manager.py,sha256=wjSyAoNrpDa5-SS__hK6Grajm1ZLOQZX9mXptjPd4lY,5538
91
- fastapi_rtk/file_managers/s3_image_manager.py,sha256=YLPARdmffA_prMPmm5Mzupaz0IakxWgWL7hWaLSznm0,352
88
+ fastapi_rtk/file_managers/file_manager.py,sha256=eEoaoh1pw0negbNNo7z8adijwCR_Y6ZWlbIeWK-9ZB0,2668
89
+ fastapi_rtk/file_managers/image_manager.py,sha256=4Tq1m0cdEYXGPJdjXJoEJWERs1vL6Ejfwyd_MBHp71U,628
90
+ fastapi_rtk/file_managers/s3_file_manager.py,sha256=Rb5rEet2R72VFUHMPITJugVLhsTjxVh4oqrL7TjKZVo,6424
91
+ fastapi_rtk/file_managers/s3_image_manager.py,sha256=FBwdGu9FWDPjrUQVTvTyZNnyZvS5-hd-fkxQLOsLa80,533
92
92
  fastapi_rtk/lang/__init__.py,sha256=zJejpbIXx1O-nSuWwrCYgr5f5EtwjYW6kh8jRy_Yo0U,68
93
93
  fastapi_rtk/lang/babel.cfg,sha256=ahkzg8wUKyl9G9UqkgAyWEtRlCnaWkjStM5c4FhKuUE,18
94
94
  fastapi_rtk/lang/lazy_text.py,sha256=UnCBmauuIQe5_hDoEnItyl3u6Hz5NnXAV-AAU3GpfKU,3888
95
- fastapi_rtk/lang/messages.pot,sha256=kJFwHKaDgk0On6rION9mxJwbkqukIBcVWHgKJaGlGsg,5650
95
+ fastapi_rtk/lang/messages.pot,sha256=wepxsZG8S9k5sAsBBDLeC9E9LQOfDT9ZpkUBoDeSOZI,5807
96
96
  fastapi_rtk/lang/babel/__init__.py,sha256=Pa1gbGSJbeMBcEMsPjvvtjl28cVy0VzWYiCSf5RsYzQ,101
97
97
  fastapi_rtk/lang/babel/cli.py,sha256=YyjguB--oPEKYP_i3FdEour1gT9AgvkXODgGrpLTWCY,1105
98
98
  fastapi_rtk/lang/babel/config.py,sha256=aKXlIRjDo0mg05widqRBA25ZgUXT5ECbxJV23jHaCOI,382
99
- fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo,sha256=HhU9aLPhvtuXhziG4jGlAjHet7HW5xVmgmH3R6PH7Tw,2976
100
- fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po,sha256=kj04JGVwjWrRBz132184hSeaDg_xlByvKJjk0ZAITvA,7023
101
- fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo,sha256=Oi0vH4JgE6QmBcbhcgiU8t4yUTWbRX1jrvncp3fGmnQ,2782
102
- fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po,sha256=GcgnXbNEQyhPM_E1urhOyhsZJxfSl2JMjMC7rBbMzas,6781
99
+ fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo,sha256=IbhJFhW178IXf2x6vdjHfe_zaVv4Bmqx47rTjkpVmTs,2976
100
+ fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po,sha256=8Pk2BIvZ-59XO0lbGGZC5iFREapCwDnTG4tQEz1KRr0,7277
101
+ fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo,sha256=WpjjrlYvMW9eIDkaR4TsxlkNfjBt_MvMmB-pfLxZi2g,2782
102
+ fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po,sha256=qxKDx7Q0xgKe48w9pH1MGFWVY-c7oNMrWCASKT4PTNc,7017
103
103
  fastapi_rtk/security/__init__.py,sha256=XkYZ_GO2opdyQS_LJwbCH1C6SUkNfLUvLkpFhcO7ZlI,86
104
104
  fastapi_rtk/security/sqla/__init__.py,sha256=qKh1mGQezDtMzvRzxzfHZRyKVaks-O7PXrOx16ekSZA,88
105
105
  fastapi_rtk/security/sqla/apis.py,sha256=8Qtd1G73i2TaA9Euo63naaB8d_I9r4EHL8DWtWNJEfs,10699
106
106
  fastapi_rtk/security/sqla/models.py,sha256=rEXpbljTMlTkiDp0VIxRXant8xN-WTjpqgQkr-ElXeM,7865
107
107
  fastapi_rtk/security/sqla/security_manager.py,sha256=ui0g2cH8Z-YjDuqszcstyj6Li8U4IpuVV4bAVaD69Lc,31395
108
- fastapi_rtk/utils/__init__.py,sha256=0X4BwrVDl4S3mB7DLyHaZVednefMjRIjBIDT3yv_CHM,1875
109
- fastapi_rtk/utils/async_task_runner.py,sha256=HzykQSdeAmNjZfVB5vUDVwrSCVFr8__67ACQk60pSsk,15545
108
+ fastapi_rtk/utils/__init__.py,sha256=_FbWJg5OwHqHdoDfJnGcp54oVKIvAMwEkfOOrsv0-Tw,1891
109
+ fastapi_rtk/utils/async_task_runner.py,sha256=ISKDmF8SJS9sVAwrGEzvUwL7D_c0mmTiYi3GJ3J67kA,16473
110
110
  fastapi_rtk/utils/class_factory.py,sha256=jlVw8yCh-tYsMnR5Hm8fgxtL0kvXwnhe6DPJA1sUh7k,598
111
111
  fastapi_rtk/utils/csv_json_converter.py,sha256=7szrPiB7DrK5S-s2GaHVCmEP9_OXk9RFwbZmRtAKM5A,14036
112
112
  fastapi_rtk/utils/deep_merge.py,sha256=PHtKJgXfCngOBGVliX9aVlEFcwCxr-GlzU-w6vjgAIs,2426
113
113
  fastapi_rtk/utils/extender_mixin.py,sha256=eu22VAZJIf-r_uD-zVn_2IzvknfuUkmEHn9oo-0KU0k,1388
114
114
  fastapi_rtk/utils/flask_appbuilder_utils.py,sha256=nPLQIczDZgKElMtqBRSo_aPJZMOnPs7fRyjqKUtPDbo,2276
115
+ fastapi_rtk/utils/formatter.py,sha256=bLMAo6-NmD7bp64VkkenoybWTAvbMyOHX55FRfINjVI,1224
115
116
  fastapi_rtk/utils/hooks.py,sha256=iGE8HTfDDVfQm7yeD3WqPB8_I1FXFGpBdl3ngyjaRbY,901
116
117
  fastapi_rtk/utils/lazy.py,sha256=SlVYQ-RHRcp6pGmcslVNc5lKs5GOSjqLcRsQsSWIB0s,10352
117
118
  fastapi_rtk/utils/merge_schema.py,sha256=AStYAS_t2idD63_YQri8sBcRM1jaq0kapjYUpI27syg,1398
118
119
  fastapi_rtk/utils/multiple_async_contexts.py,sha256=-juAliUeG4XI1J-p31KknsJvzvM5vX0gXVXst_xZUIo,557
119
- fastapi_rtk/utils/prettify_dict.py,sha256=VKve-52fE9usIzflD3mNtvql_p5F2jq9HYBTJF_1MX0,662
120
120
  fastapi_rtk/utils/pydantic.py,sha256=c4TGu6fP5qmsMJcEerhgq3R1iTpJn_1oA91d43GaVlo,2408
121
- fastapi_rtk/utils/run_utils.py,sha256=2aieVAGp4e7vByzkwnmXk5c-crLl-Ia1rwdHl6LRQ34,6237
121
+ fastapi_rtk/utils/run_utils.py,sha256=gmp-lWgCsSWcP5Hg_Q1mXyBbRYKHNPb1dzAlC7IZZD4,6283
122
122
  fastapi_rtk/utils/self_dependencies.py,sha256=SjX8BOC3UvuLxfElo1MMgugCX8ZEgsCgLy0g011a4UU,4102
123
123
  fastapi_rtk/utils/smartdefaultdict.py,sha256=UdA_N1eQ3TooE9_ci0O_5QKUjGkQfo-c2BwEX5OkXfY,645
124
124
  fastapi_rtk/utils/sqla.py,sha256=To4PhsO5orPJVqjdLh5C9y_xPgiy8-zhrJdSqhR_tsc,690
@@ -126,8 +126,8 @@ fastapi_rtk/utils/timezone.py,sha256=62S0pPWuDFFXxV1YTFCsc4uKiSP_Ba36Fv7S3gYjfhs
126
126
  fastapi_rtk/utils/update_signature.py,sha256=PIzZgNpGEwvDNgQ3G51Zi-QhVV3mbxvUvSwDwf_-yYs,2209
127
127
  fastapi_rtk/utils/use_default_when_none.py,sha256=H2HqhKy_8eYk3i1xijEjuaKak0oWkMIkrdz6T7DK9QU,469
128
128
  fastapi_rtk/utils/werkzeug.py,sha256=1Gv-oyqSmhVGrmNbB9fDqpqJzPpANOzWf4zMMrhW9UA,3245
129
- fastapi_rtk-1.0.19.dist-info/METADATA,sha256=xyDBHTBp6IWYzxhAauSuMMa_IaWocWHO7xrAfjwZCqo,1302
130
- fastapi_rtk-1.0.19.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
131
- fastapi_rtk-1.0.19.dist-info/entry_points.txt,sha256=UuTkxSVIokSlVN28TMhoxzRRUaPxlVRSH3Gsx6yip60,53
132
- fastapi_rtk-1.0.19.dist-info/licenses/LICENSE,sha256=NDrWi4Qwcxal3u1r2lBWGA6TVh3OeW7yMan098mQz98,1073
133
- fastapi_rtk-1.0.19.dist-info/RECORD,,
129
+ fastapi_rtk-1.0.20.dist-info/METADATA,sha256=3HSGbdKbJ8IG24nA3D8HxptAVRj9NtYieA-3tF5GSZY,1302
130
+ fastapi_rtk-1.0.20.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
131
+ fastapi_rtk-1.0.20.dist-info/entry_points.txt,sha256=UuTkxSVIokSlVN28TMhoxzRRUaPxlVRSH3Gsx6yip60,53
132
+ fastapi_rtk-1.0.20.dist-info/licenses/LICENSE,sha256=NDrWi4Qwcxal3u1r2lBWGA6TVh3OeW7yMan098mQz98,1073
133
+ fastapi_rtk-1.0.20.dist-info/RECORD,,