stouputils 1.4.8__tar.gz → 1.5.0__tar.gz

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.
Files changed (107) hide show
  1. {stouputils-1.4.8 → stouputils-1.5.0}/PKG-INFO +1 -1
  2. {stouputils-1.4.8 → stouputils-1.5.0}/pyproject.toml +1 -1
  3. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/decorators.py +72 -0
  4. {stouputils-1.4.8 → stouputils-1.5.0}/.gitignore +0 -0
  5. {stouputils-1.4.8 → stouputils-1.5.0}/LICENSE +0 -0
  6. {stouputils-1.4.8 → stouputils-1.5.0}/README.md +0 -0
  7. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/__init__.py +0 -0
  8. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/__main__.py +0 -0
  9. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/all_doctests.py +0 -0
  10. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/__init__.py +0 -0
  11. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/automatic_docs.py +0 -0
  12. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/upscaler/__init__.py +0 -0
  13. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/upscaler/config.py +0 -0
  14. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/upscaler/image.py +0 -0
  15. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/applications/upscaler/video.py +0 -0
  16. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/archive.py +0 -0
  17. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/backup.py +0 -0
  18. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/collections.py +0 -0
  19. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/continuous_delivery/__init__.py +0 -0
  20. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/continuous_delivery/cd_utils.py +0 -0
  21. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/continuous_delivery/github.py +0 -0
  22. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/continuous_delivery/pypi.py +0 -0
  23. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/continuous_delivery/pyproject.py +0 -0
  24. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/ctx.py +0 -0
  25. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/config/get.py +0 -0
  26. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/config/set.py +0 -0
  27. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/__init__.py +0 -0
  28. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/auto_contrast.py +0 -0
  29. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/axis_flip.py +0 -0
  30. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/bias_field_correction.py +0 -0
  31. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/binary_threshold.py +0 -0
  32. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/blur.py +0 -0
  33. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/brightness.py +0 -0
  34. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/canny.py +0 -0
  35. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/clahe.py +0 -0
  36. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/common.py +0 -0
  37. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/contrast.py +0 -0
  38. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/curvature_flow_filter.py +0 -0
  39. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/denoise.py +0 -0
  40. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/histogram_equalization.py +0 -0
  41. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/invert.py +0 -0
  42. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/laplacian.py +0 -0
  43. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/median_blur.py +0 -0
  44. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/noise.py +0 -0
  45. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/normalize.py +0 -0
  46. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/random_erase.py +0 -0
  47. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/resize.py +0 -0
  48. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/rotation.py +0 -0
  49. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/salt_pepper.py +0 -0
  50. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/sharpening.py +0 -0
  51. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/shearing.py +0 -0
  52. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/threshold.py +0 -0
  53. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/translation.py +0 -0
  54. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image/zoom.py +0 -0
  55. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image_augmentation.py +0 -0
  56. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/image_preprocess.py +0 -0
  57. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/prosthesis_detection.py +0 -0
  58. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/data_processing/technique.py +0 -0
  59. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/__init__.py +0 -0
  60. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/dataset.py +0 -0
  61. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/dataset_loader.py +0 -0
  62. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/grouping_strategy.py +0 -0
  63. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/image_loader.py +0 -0
  64. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/dataset/xy_tuple.py +0 -0
  65. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/metric_dictionnary.py +0 -0
  66. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/metric_utils.py +0 -0
  67. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/mlflow_utils.py +0 -0
  68. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/abstract_model.py +0 -0
  69. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/all.py +0 -0
  70. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/base_keras.py +0 -0
  71. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/all.py +0 -0
  72. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/convnext.py +0 -0
  73. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/densenet.py +0 -0
  74. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/efficientnet.py +0 -0
  75. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/mobilenet.py +0 -0
  76. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/resnet.py +0 -0
  77. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/squeezenet.py +0 -0
  78. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/vgg.py +0 -0
  79. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras/xception.py +0 -0
  80. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/__init__.py +0 -0
  81. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/colored_progress_bar.py +0 -0
  82. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/learning_rate_finder.py +0 -0
  83. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/model_checkpoint_v2.py +0 -0
  84. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/progressive_unfreezing.py +0 -0
  85. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/callbacks/warmup_scheduler.py +0 -0
  86. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/losses/__init__.py +0 -0
  87. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/losses/next_generation_loss.py +0 -0
  88. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/keras_utils/visualizations.py +0 -0
  89. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/model_interface.py +0 -0
  90. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/models/sandbox.py +0 -0
  91. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/range_tuple.py +0 -0
  92. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/scripts/augment_dataset.py +0 -0
  93. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/scripts/exhaustive_process.py +0 -0
  94. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/scripts/preprocess_dataset.py +0 -0
  95. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/scripts/routine.py +0 -0
  96. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/data_science/utils.py +0 -0
  97. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/image.py +0 -0
  98. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/__init__.py +0 -0
  99. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/common.py +0 -0
  100. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/downloader.py +0 -0
  101. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/linux.py +0 -0
  102. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/main.py +0 -0
  103. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/installer/windows.py +0 -0
  104. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/io.py +0 -0
  105. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/parallel.py +0 -0
  106. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/print.py +0 -0
  107. {stouputils-1.4.8 → stouputils-1.5.0}/stouputils/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stouputils
3
- Version: 1.4.8
3
+ Version: 1.5.0
4
4
  Summary: Stouputils is a collection of utility modules designed to simplify and enhance the development process. It includes a range of tools for tasks such as execution of doctests, display utilities, decorators, as well as context managers, and many more.
5
5
  Project-URL: Homepage, https://github.com/Stoupy51/stouputils
6
6
  Project-URL: Issues, https://github.com/Stoupy51/stouputils/issues
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
 
6
6
  [project]
7
7
  name = "stouputils"
8
- version = "1.4.8"
8
+ version = "1.5.0"
9
9
  description = "Stouputils is a collection of utility modules designed to simplify and enhance the development process. It includes a range of tools for tasks such as execution of doctests, display utilities, decorators, as well as context managers, and many more."
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.10"
@@ -4,6 +4,7 @@ This module provides decorators for various purposes:
4
4
  - measure_time(): Measure the execution time of a function and print it with the given print function
5
5
  - handle_error(): Handle an error with different log levels
6
6
  - simple_cache(): Easy cache function with parameter caching method
7
+ - retry(): Retry a function when specific exceptions are raised, with configurable delay and max attempts
7
8
  - abstract(): Mark a function as abstract, using LogLevels for error handling
8
9
  - deprecated(): Mark a function as deprecated, using LogLevels for warning handling
9
10
  - silent(): Make a function silent (disable stdout, and stderr if specified) (alternative to stouputils.ctx.Muffle)
@@ -45,6 +46,7 @@ def measure_time(
45
46
  defaults to True (use time.perf_counter_ns)
46
47
  is_generator (bool): Whether the function is a generator or not (default: False)
47
48
  When True, the decorator will yield from the function instead of returning it.
49
+
48
50
  Returns:
49
51
  Callable: Decorator to measure the time of the function.
50
52
 
@@ -224,6 +226,76 @@ def simple_cache(
224
226
  return decorator
225
227
  return decorator(func)
226
228
 
229
+ # Decorator that retries a function when specific exceptions are raised
230
+ def retry(
231
+ func: Callable[..., Any] | None = None,
232
+ *,
233
+ exceptions: tuple[type[BaseException], ...] | type[BaseException] = (Exception,),
234
+ max_attempts: int = 10,
235
+ delay: float = 1.0,
236
+ backoff: float = 1.0
237
+ ) -> Callable[..., Any]:
238
+ """ Decorator that retries a function when specific exceptions are raised.
239
+
240
+ Args:
241
+ func (Callable[..., Any] | None): Function to retry
242
+ exceptions (tuple[type[BaseException], ...]): Exceptions to catch and retry on
243
+ max_attempts (int | None): Maximum number of attempts (None for infinite retries)
244
+ delay (float): Initial delay in seconds between retries (default: 1.0)
245
+ backoff (float): Multiplier for delay after each retry (default: 1.0 for constant delay)
246
+
247
+ Returns:
248
+ Callable[..., Any]: Decorator that retries the function on specified exceptions
249
+
250
+ Examples:
251
+ >>> import os
252
+ >>> @retry(exceptions=PermissionError, max_attempts=3, delay=0.1)
253
+ ... def write_file():
254
+ ... with open("test.txt", "w") as f:
255
+ ... f.write("test")
256
+
257
+ >>> @retry(exceptions=(OSError, IOError), delay=0.5, backoff=2.0)
258
+ ... def network_call():
259
+ ... pass
260
+
261
+ >>> @retry(max_attempts=5, delay=1.0)
262
+ ... def might_fail():
263
+ ... pass
264
+ """
265
+ # Normalize exceptions to tuple
266
+ if not isinstance(exceptions, tuple):
267
+ exceptions = (exceptions,)
268
+
269
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
270
+ @wraps(func)
271
+ def wrapper(*args: tuple[Any, ...], **kwargs: dict[str, Any]) -> Any:
272
+ attempt: int = 0
273
+ current_delay: float = delay
274
+
275
+ while True:
276
+ attempt += 1
277
+ try:
278
+ return func(*args, **kwargs)
279
+ except exceptions as e:
280
+ # Check if we should retry or give up
281
+ if max_attempts != 1 and attempt >= max_attempts:
282
+ raise e
283
+
284
+ # Log retry attempt
285
+ warning(f"{type(e).__name__} encountered while running {_get_func_name(func)}, retrying ({attempt + 1}/{max_attempts}): {e}")
286
+
287
+ # Wait before next attempt
288
+ time.sleep(current_delay)
289
+ current_delay *= backoff
290
+
291
+ wrapper.__name__ = _get_wrapper_name("stouputils.decorators.retry", func)
292
+ return wrapper
293
+
294
+ # Handle both @retry and @retry(exceptions=..., max_attempts=..., delay=...)
295
+ if func is None:
296
+ return decorator
297
+ return decorator(func)
298
+
227
299
  # Decorator that marks a function as abstract
228
300
  def abstract(
229
301
  func: Callable[..., Any] | None = None,
File without changes
File without changes
File without changes
File without changes
File without changes