danielutils 0.9.82__tar.gz → 0.9.83__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 (190) hide show
  1. {danielutils-0.9.82/danielutils.egg-info → danielutils-0.9.83}/PKG-INFO +2 -2
  2. {danielutils-0.9.82 → danielutils-0.9.83}/README.md +1 -1
  3. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/__init__.py +1 -2
  4. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/__init__.py +1 -0
  5. danielutils-0.9.83/danielutils/functions/parallel_for.py +37 -0
  6. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/math_/__init__.py +0 -1
  7. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/print_.py +51 -15
  8. danielutils-0.9.83/danielutils/progress_bar/__init__.py +3 -0
  9. danielutils-0.9.83/danielutils/progress_bar/ascii_progress_bar.py +104 -0
  10. danielutils-0.9.83/danielutils/progress_bar/progress_bar.py +54 -0
  11. danielutils-0.9.82/danielutils/tqdm_.py → danielutils-0.9.83/danielutils/progress_bar/progress_bar_pool.py +19 -24
  12. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/layered_command.py +14 -6
  13. {danielutils-0.9.82 → danielutils-0.9.83/danielutils.egg-info}/PKG-INFO +2 -2
  14. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils.egg-info/SOURCES.txt +5 -3
  15. {danielutils-0.9.82 → danielutils-0.9.83}/pyproject.toml +1 -1
  16. danielutils-0.9.82/danielutils/math_/polynomial/__init__.py +0 -1
  17. danielutils-0.9.82/danielutils/math_/polynomial/polinomial.py +0 -33
  18. {danielutils-0.9.82 → danielutils-0.9.83}/LICENSE +0 -0
  19. {danielutils-0.9.82 → danielutils-0.9.83}/MANIFEST.in +0 -0
  20. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/__init__.py +0 -0
  21. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/database/__init__.py +0 -0
  22. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/database/cached_database.py +0 -0
  23. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/database/database.py +0 -0
  24. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/database/redis_database.py +0 -0
  25. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
  26. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
  27. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/multiprogramming/worker.py +0 -0
  28. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
  29. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/abstractions/repl.py +0 -0
  30. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/aliases.py +0 -0
  31. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/__init__.py +0 -0
  32. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/counter.py +0 -0
  33. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/frange.py +0 -0
  34. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
  35. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
  36. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
  37. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
  38. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
  39. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
  40. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/colors.py +0 -0
  41. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/context_managers/__init__.py +0 -0
  42. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/context_managers/attr_context.py +0 -0
  43. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/context_managers/temporary_file.py +0 -0
  44. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/convenience.py +0 -0
  45. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/conversions/__init__.py +0 -0
  46. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/conversions/main_conversions.py +0 -0
  47. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
  48. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
  49. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
  50. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/__init__.py +0 -0
  51. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/comparer.py +0 -0
  52. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/default_dict.py +0 -0
  53. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/functions.py +0 -0
  54. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/graph/__init__.py +0 -0
  55. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/graph/binary_node.py +0 -0
  56. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/graph/graph.py +0 -0
  57. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/graph/multinode.py +0 -0
  58. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/graph/node.py +0 -0
  59. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/heap/__init__.py +0 -0
  60. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/heap/heap.py +0 -0
  61. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/heap/max_heap.py +0 -0
  62. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/heap/min_heap.py +0 -0
  63. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/queue/__init__.py +0 -0
  64. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/queue/atomic_queue.py +0 -0
  65. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/queue/priority_queue.py +0 -0
  66. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/queue/queue.py +0 -0
  67. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/stack.py +0 -0
  68. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/trees/__init__.py +0 -0
  69. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
  70. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/data_structures/trees/binary_tree.py +0 -0
  71. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/date.py +0 -0
  72. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/date_time.py +0 -0
  73. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/__init__.py +0 -0
  74. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/atomic.py +0 -0
  75. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/attach.py +0 -0
  76. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/chain_decorators.py +0 -0
  77. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/decorate_conditionally.py +0 -0
  78. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/delay_call.py +0 -0
  79. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/deprecate.py +0 -0
  80. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/final.py +0 -0
  81. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/limit_recursion.py +0 -0
  82. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/memo.py +0 -0
  83. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/overload.py +0 -0
  84. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/partially_implemented.py +0 -0
  85. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/processify.py +0 -0
  86. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/property.py +0 -0
  87. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/singleton.py +0 -0
  88. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/threadify.py +0 -0
  89. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/timeout.py +0 -0
  90. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/total_ordering.py +0 -0
  91. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/decorators/validate.py +0 -0
  92. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/exceptions.py +0 -0
  93. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/areoneof.py +0 -0
  94. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/check_foreach.py +0 -0
  95. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/flatten.py +0 -0
  96. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/isoftype.py +0 -0
  97. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/isoneof.py +0 -0
  98. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/multiloop.py +0 -0
  99. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/powerset.py +0 -0
  100. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/subseteq.py +0 -0
  101. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/functions/types_subseteq.py +0 -0
  102. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/generators/__init__.py +0 -0
  103. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/generators/conditional_generator.py +0 -0
  104. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/generators/generator_from_stream.py +0 -0
  105. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/generators/join_generators.py +0 -0
  106. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/internet.py +0 -0
  107. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/io_.py +0 -0
  108. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/math_/constants.py +0 -0
  109. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/math_/functions.py +0 -0
  110. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/math_/math_print.py +0 -0
  111. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/math_/math_symbols.py +0 -0
  112. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/__init__.py +0 -0
  113. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/atomic_class_meta.py +0 -0
  114. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
  115. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/instance_cache_meta.py +0 -0
  116. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/interface.py +0 -0
  117. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/metaclasses/overload_meta.py +0 -0
  118. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/mock_/__init__.py +0 -0
  119. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/mock_/mock_database.py +0 -0
  120. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/mock_/mock_module.py +0 -0
  121. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/path.py +0 -0
  122. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/protocols/__init__.py +0 -0
  123. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/protocols/dictable.py +0 -0
  124. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/protocols/evaluable.py +0 -0
  125. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/py.typed +0 -0
  126. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/__init__.py +0 -0
  127. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/class_/__init__.py +0 -0
  128. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/class_/class_reflection.py +0 -0
  129. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/file/__init__.py +0 -0
  130. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/file/file_reflection.py +0 -0
  131. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/function/__init__.py +0 -0
  132. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/function/function_reflections.py +0 -0
  133. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/__init__.py +0 -0
  134. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/callstack.py +0 -0
  135. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/get_traceback.py +0 -0
  136. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/os_.py +0 -0
  137. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/packages.py +0 -0
  138. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/python_version.py +0 -0
  139. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/signals.py +0 -0
  140. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/interpreter/tracer.py +0 -0
  141. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/module/__init__.py +0 -0
  142. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/module/module_reflections.py +0 -0
  143. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/reflection/module/package_reflection.py +0 -0
  144. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/snippets/__init__.py +0 -0
  145. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/snippets/try_get.py +0 -0
  146. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/__init__.py +0 -0
  147. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/independent.py +0 -0
  148. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/windows/__init__.py +0 -0
  149. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/windows/utils/__init__.py +0 -0
  150. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/windows/utils/filetime.py +0 -0
  151. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/windows/win32_ctime.py +0 -0
  152. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/system/windows/windows.py +0 -0
  153. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/text.py +0 -0
  154. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/time.py +0 -0
  155. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/__init__.py +0 -0
  156. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/databases/__init__.py +0 -0
  157. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/databases/all.py +0 -0
  158. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/oop/__init__.py +0 -0
  159. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/oop/observer.py +0 -0
  160. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/oop/strategy.py +0 -0
  161. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/__init__.py +0 -0
  162. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
  163. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
  164. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
  165. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
  166. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
  167. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
  168. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
  169. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
  170. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
  171. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
  172. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
  173. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/distributions.py +0 -0
  174. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/expressions/__init__.py +0 -0
  175. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
  176. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/expressions/probability_expression.py +0 -0
  177. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/funcs/__init__.py +0 -0
  178. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/funcs/covariance.py +0 -0
  179. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/funcs/expected_value.py +0 -0
  180. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/funcs/probability_function.py +0 -0
  181. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/funcs/variance.py +0 -0
  182. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/operator.py +0 -0
  183. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/protocols.py +0 -0
  184. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/supp.py +0 -0
  185. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/university/probability/transformation.py +0 -0
  186. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils/versioned_imports.py +0 -0
  187. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils.egg-info/dependency_links.txt +0 -0
  188. {danielutils-0.9.82 → danielutils-0.9.83}/danielutils.egg-info/top_level.txt +0 -0
  189. {danielutils-0.9.82 → danielutils-0.9.83}/setup.cfg +0 -0
  190. {danielutils-0.9.82 → danielutils-0.9.83}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 0.9.82
3
+ Version: 0.9.83
4
4
  Summary: A python utils library for things I find useful
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -41,7 +41,7 @@ License-File: LICENSE
41
41
  [![Python 3.10.11](https://img.shields.io/badge/python-3.10.11-blue.svg)](https://www.python.org/downloads/release/python-31011/)
42
42
  [![gitleaks](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml)
43
43
  [![CodeQL](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql)
44
- # danielutils v=0.9.82
44
+ # danielutils v=0.9.83
45
45
  A utils library for things that I find useful for my coding workflow.\
46
46
  Feel free to use and / or contribute / improve my code :)
47
47
 
@@ -4,7 +4,7 @@
4
4
  [![Python 3.10.11](https://img.shields.io/badge/python-3.10.11-blue.svg)](https://www.python.org/downloads/release/python-31011/)
5
5
  [![gitleaks](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml)
6
6
  [![CodeQL](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql)
7
- # danielutils v=0.9.82
7
+ # danielutils v=0.9.83
8
8
  A utils library for things that I find useful for my coding workflow.\
9
9
  Feel free to use and / or contribute / improve my code :)
10
10
 
@@ -17,9 +17,8 @@ from .protocols import *
17
17
 
18
18
  from .reflection import *
19
19
  from .decorators import *
20
-
21
20
  # ========== NEEDS REFLECTION ==========
22
- from .tqdm_ import *
21
+ from .progress_bar import *
23
22
  # ========== NEEDS DECORATORS ==========
24
23
  from .colors import *
25
24
  # ========== NEEDS BOTH ==========
@@ -7,3 +7,4 @@ from .powerset import *
7
7
  from .multiloop import *
8
8
  from .flatten import *
9
9
  from .subseteq import *
10
+ from .parallel_for import *
@@ -0,0 +1,37 @@
1
+ import threading
2
+ from typing import TypeVar, Callable
3
+
4
+ T = TypeVar("T")
5
+ Consumer = Callable[[T], None]
6
+
7
+
8
+ def parallel_for(func: Consumer[T], *args: T, wait: bool = True) -> None:
9
+ """
10
+ This function will run 'func' in parallel with the given args individually
11
+ Args:
12
+ func: function to run in parallel
13
+ *args: args to call the function each time
14
+ wait: whether to wait for all the threads to join before returning
15
+
16
+ Returns:
17
+
18
+ """
19
+ # this is safer... What if some other threads that were running will also end in the meantime?
20
+ threads = [threading.Thread(target=func, args=[arg]) for arg in args]
21
+ for t in threads:
22
+ t.start()
23
+ if wait:
24
+ for t in threads:
25
+ t.join()
26
+ # before = threading.active_count()
27
+ # for arg in args:
28
+ # threadify(func)(arg)
29
+ #
30
+ # if wait:
31
+ # while threading.active_count() > before:
32
+ # pass
33
+
34
+
35
+ __all__ = [
36
+ 'parallel_for'
37
+ ]
@@ -1,3 +1,2 @@
1
1
  from .constants import *
2
2
  from .functions import *
3
- from .polynomial import *
@@ -1,7 +1,9 @@
1
1
  import sys
2
+ from typing import IO
2
3
  from .functions.areoneof import areoneof
3
4
  from .math_.math_print import mprint_parse_one
4
5
  from .decorators import atomic, deprecate
6
+ from .colors import warning
5
7
 
6
8
 
7
9
  def mprint(*args, sep: str = " ", end: str = "\n", stream=sys.stdout) -> None:
@@ -21,7 +23,7 @@ def mprint(*args, sep: str = " ", end: str = "\n", stream=sys.stdout) -> None:
21
23
  """
22
24
  if not areoneof(args, [str]):
23
25
  raise TypeError("s must be a string")
24
- stream.write(sep.join([mprint_parse_one(s) for s in args])+end)
26
+ stream.write(sep.join([mprint_parse_one(s) for s in args]) + end)
25
27
 
26
28
 
27
29
  @deprecate("The built-in 'print' function has an argument called 'file', use this instead")
@@ -37,7 +39,7 @@ def sprint(*args, sep: str = " ", end: str = "\n", stream=sys.stdout) -> None:
37
39
  Returns:
38
40
  None
39
41
  """
40
- stream.write(sep.join(args)+end)
42
+ stream.write(sep.join(args) + end)
41
43
 
42
44
 
43
45
  @atomic
@@ -55,25 +57,59 @@ def aprint(*args, sep=" ", end="\n") -> None:
55
57
  print(*args, sep=sep, end=end)
56
58
 
57
59
 
58
- @atomic
59
- def bprint(*args, sep=" ", end="\n", stream=sys.stdout) -> None:
60
- """A function that writes a string representation of the given arguments to the specified stream.
60
+ class BetterPrinter:
61
+ def __init__(self, thread_safe: bool = False):
62
+ if thread_safe:
63
+ self.__call__ = atomic(self.__call__)
64
+ self._current_row: int = 0
65
+ self.rows: list[str] = []
61
66
 
62
- Args:
63
- *args: The arguments to print.
64
- sep (str, optional): The separator to use between the arguments. Defaults to " ".
65
- end (str, optional): The string to append to the end of the printed arguments. Defaults to "\n".
66
- stream (file object, optional): The stream to write the output to. Defaults to sys.stdout.
67
+ def clear(self, stream: IO = sys.stdout, flush: bool = True) -> None:
68
+ if not stream.isatty():
69
+ warning(f"Cannot clear because {stream} is not a terminal stream")
70
+ return
71
+ self.write("\033[2J", stream=stream, flush=flush)
72
+ self.rows.pop()
73
+
74
+ def clear_line(self) -> None:
75
+ self.write("\033[2K", end="")
76
+ self.rows.pop()
77
+
78
+ def move_up(self, num_lines: int = 1) -> None:
79
+ self.write(f"\033[{num_lines}A", end="")
80
+ self.rows.pop()
81
+ self._current_row -= 1
82
+
83
+ def write(self, *args, sep: str = " ", end: str = "\n", stream: IO = sys.stdout, flush: bool = True):
84
+ text = sep.join(args) + end
85
+ self._current_row += text.count("\n")
86
+ self.rows.extend([f"{s}\n" for s in text.splitlines() if len(s) > 0])
87
+ stream.write(text)
88
+ if flush:
89
+ stream.flush()
90
+
91
+ def __call__(self, *args, **kwargs) -> None:
92
+ self.write(*args, **kwargs)
93
+
94
+ @property
95
+ def current_row(self) -> int:
96
+ return self._current_row
97
+
98
+ def insert(self, text: str, row: int) -> None:
99
+ self.rows.insert(row, text)
100
+ num_rows = len(self.rows)
101
+ self.clear()
102
+ self.write(*self.rows)
103
+ for _ in range(num_rows):
104
+ self.rows.pop()
67
105
 
68
- Returns:
69
- None
70
- """
71
- stream.write(sep.join(args)+end)
72
106
 
107
+ bprint = BetterPrinter()
73
108
 
74
109
  __all__ = [
75
110
  "sprint",
76
111
  "mprint",
77
112
  "aprint",
78
- "bprint"
113
+ "bprint",
114
+ 'BetterPrinter'
79
115
  ]
@@ -0,0 +1,3 @@
1
+ from .progress_bar import *
2
+ from .progress_bar_pool import *
3
+ from .ascii_progress_bar import *
@@ -0,0 +1,104 @@
1
+ import time
2
+ from typing import Optional, Iterable, Sized
3
+
4
+ from .progress_bar import ProgressBar
5
+ from ..print_ import bprint
6
+
7
+
8
+ class AsciiProgressBar(ProgressBar):
9
+
10
+ def __init__(
11
+ self,
12
+ iterable: Iterable,
13
+ position: int,
14
+ *,
15
+ total: Optional[float] = None,
16
+ desc: str = "",
17
+ leave: bool = True,
18
+ num_bars: int = 1,
19
+ ncols: int = 50,
20
+ **kwargs
21
+ ):
22
+ self.iterable: Iterable = iterable
23
+ if isinstance(self.iterable, Sized):
24
+ total_ = len(self.iterable)
25
+ if total is not None:
26
+ total_ = total
27
+ ProgressBar.__init__(self, total_, position)
28
+ self.num_bars: int = num_bars
29
+ self.leave: bool = leave
30
+ self.desc: str = desc
31
+ self.initial_value: float = 0
32
+ self.current_value: float = 0
33
+ self.ncols: int = ncols
34
+ self.unit: str = "it"
35
+ self.pbar_format = "{l_bar} |{bar}| {n_fmt:.2f}/{total_fmt:.2f}{unit}" \
36
+ " [{elapsed:.2f}<{remaining}, {rate_fmt:.2f}{unit}{postfix}]"
37
+ self.__dict__.update(kwargs)
38
+ self.initial_start_time = time.time()
39
+ self.prev_update: float = self.initial_start_time
40
+ self.delta: float = 0
41
+ self.prev_value: float = self.initial_value
42
+ self.bprint_row_index = bprint.current_row
43
+
44
+ def __iter__(self):
45
+ self.bprint_row_index = bprint.current_row
46
+ for v in self.iterable:
47
+ self.update(1)
48
+ yield v
49
+ bprint.move_up()
50
+ bprint.clear_line()
51
+ if self.position > 0:
52
+ self.reset()
53
+ else:
54
+ self.draw()
55
+
56
+ def draw(self) -> None:
57
+ percent = self.current_value / self.total
58
+ num_to_fill = int(percent * self.ncols)
59
+ progress_str = num_to_fill * "#" + (self.ncols - num_to_fill) * " "
60
+ to_print = self.pbar_format.format(
61
+ l_bar=self.desc,
62
+ bar=progress_str,
63
+ n_fmt=self.current_value,
64
+ total_fmt=self.total,
65
+ elapsed=self.prev_update - self.initial_start_time,
66
+ remaining="?",
67
+ rate_fmt=(self.current_value - self.prev_value) /
68
+ self.delta if self.delta != 0 else 0,
69
+ postfix="/s",
70
+ unit=self.unit
71
+ )
72
+ bprint(to_print)
73
+
74
+ def update(self, amount: float = 1):
75
+ self.prev_value = self.current_value
76
+ self.current_value = min(
77
+ self.current_value + amount, self.total) # type:ignore
78
+ current_time = time.time()
79
+ self.delta = current_time - self.prev_update
80
+ self.prev_update = current_time
81
+ self.draw()
82
+
83
+ def _write(self, *args: str, sep: str = " ", end: str = "\n") -> None:
84
+ bprint.move_up()
85
+ bprint.clear_line()
86
+ if not end.endswith("\n"):
87
+ end += "\n"
88
+ bprint(sep.join(map(str, args)), end=end)
89
+ self.draw()
90
+
91
+ def reset(self) -> None:
92
+ self.current_value = self.initial_value
93
+ self.initial_start_time = time.time()
94
+ self.delta = 0
95
+ self.prev_value = self.initial_value
96
+ for _ in range(self.num_writes):
97
+ bprint.move_up()
98
+ bprint.clear_line()
99
+ self.num_writes = 0
100
+
101
+
102
+ __all__ = [
103
+ 'AsciiProgressBar'
104
+ ]
@@ -0,0 +1,54 @@
1
+ import math
2
+ import time
3
+ from abc import ABC, abstractmethod
4
+ from typing import Optional, Type, List, Iterable
5
+
6
+ try:
7
+ from tqdm import tqdm
8
+ except ImportError:
9
+ from ..mock_ import MockImportObject
10
+
11
+ tqdm = MockImportObject("`tqdm` is not installed") # type:ignore
12
+
13
+
14
+ class ProgressBar(ABC):
15
+ """An interface
16
+
17
+ Args:
18
+ ABC (_type_): _description_
19
+ """
20
+ DEFAULT_BAR_FORMAT = "{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}"
21
+
22
+ @abstractmethod
23
+ def __init__(self, total, position: int, unit="it", bar_format: str = DEFAULT_BAR_FORMAT, **kwargs) -> None:
24
+ self.total = total
25
+ self.position = position
26
+ self.unit = unit
27
+ self.bar_format = bar_format
28
+ self.num_writes = 0
29
+
30
+ @abstractmethod
31
+ def update(self, amount: float = 1) -> None:
32
+ """A function to update the progress-bar's value by a positive relative amount
33
+ """
34
+
35
+ @abstractmethod
36
+ def _write(self, *args: str, sep: str = " ", end: str = "\n") -> None: ...
37
+
38
+ def write(self, *args: str, sep: str = " ", end: str = "\n") -> None:
39
+ """A function to write additional text with the progress bar
40
+ """
41
+ self._write(*args, sep=sep, end=end)
42
+ self.num_writes += 1
43
+
44
+ @abstractmethod
45
+ def reset(self) -> None:
46
+ """A function to reset the progress-bar's progress
47
+ """
48
+
49
+
50
+ ProgressBar.register(tqdm)
51
+
52
+ __all__ = [
53
+ 'ProgressBar',
54
+ ]
@@ -1,51 +1,46 @@
1
- from typing import Optional, List as List
2
- from .reflection import get_python_version
3
-
4
- if get_python_version() >= (3, 9):
5
- from builtins import list as List # type:ignore
6
- try:
7
- from tqdm import tqdm
8
- except ImportError:
9
- from .mock_ import MockImportObject
10
-
11
- tqdm = MockImportObject("`tqdm` is not installed") # type:ignore
1
+ from typing import Type, List, Optional
2
+ from .progress_bar import ProgressBar
12
3
 
13
4
 
14
5
  class ProgressBarPool:
15
- """
16
- My attempt at creating a progress bar pool using tqdm
17
- """
18
-
19
- def __init__(self, num_of_bars: int = 1, *, global_options: Optional[dict] = None,
20
- individual_options: Optional[List[Optional[dict]]] = None) -> None:
21
- self.bars: List[tqdm] = []
6
+ def __init__(
7
+ self,
8
+ pbar_class: Type[ProgressBar],
9
+ num_of_bars: int = 1,
10
+ global_options: Optional[dict] = None,
11
+ individual_options: Optional[List[Optional[dict]]] = None
12
+ ) -> None:
13
+ self.bars: List[ProgressBar] = []
22
14
  if global_options is None:
23
15
  global_options = {}
24
16
  if individual_options is None:
25
17
  individual_options = [{} for _ in range(num_of_bars)]
26
18
  if len(individual_options) != num_of_bars:
27
- raise ValueError("")
19
+ raise ValueError(
20
+ "must supply the same number of options as there are bars")
28
21
  for i in range(num_of_bars):
29
22
  if individual_options[i] is None:
30
23
  individual_options[i] = {}
24
+ max_desc_length: int = max([len(individual_options[i].get("desc", f"pbar {i}")) for i in range(num_of_bars)])
31
25
  for i in range(num_of_bars):
32
26
  final_options: dict = global_options.copy()
33
27
  final_options.update(individual_options[i]) # type:ignore
34
28
  if "desc" not in final_options:
35
29
  final_options["desc"] = f"pbar {i}"
36
- t = tqdm(
30
+ final_options["desc"] = final_options["desc"].ljust(max_desc_length, " ")
31
+ t = pbar_class(
37
32
  position=i,
38
33
  **final_options
39
34
  )
40
35
  self.bars.append(t)
41
36
 
37
+ def __getitem__(self, index: int) -> ProgressBar:
38
+ return self.bars[index]
39
+
42
40
  def write(self, *args, sep=" ", end="\n") -> None:
43
- """
44
- prints texts to the console **while** using tqdm progress bars
45
- """
46
41
  self.bars[0].write(sep.join((str(a) for a in args)), end=end)
47
42
 
48
43
 
49
44
  __all__ = [
50
- "ProgressBarPool"
45
+ "ProgressBarPool",
51
46
  ]
@@ -12,6 +12,14 @@ class LayeredCommand:
12
12
  _class_prev_instance: Optional['LayeredCommand'] = None
13
13
  _id: int = 0
14
14
 
15
+ @property
16
+ def prev(self):
17
+ return self._prev_instance
18
+
19
+ @prev.setter
20
+ def prev(self, value: Optional['LayeredCommand'] = None):
21
+ self._prev_instance = value
22
+
15
23
  def __init__(
16
24
  self,
17
25
  command: Optional[str] = None,
@@ -37,17 +45,17 @@ class LayeredCommand:
37
45
  self._open()
38
46
  return self
39
47
 
48
+ def __exit__(self, exc_type, exc_val, exc_tb):
49
+ if self.prev is self._cur_class_prev_instance:
50
+ LayeredCommand._class_prev_instance = self.prev
51
+
40
52
  def _open(self) -> None:
41
53
  self._has_entered = True
42
54
 
43
- def __exit__(self, exc_type, exc_val, exc_tb):
44
- if self._prev_instance is self._cur_class_prev_instance:
45
- LayeredCommand._class_prev_instance = self._prev_instance
46
-
47
55
  def _build_command(self, *commands: str) -> str:
48
56
  res = ""
49
- if self._prev_instance is not None:
50
- prev = self._prev_instance._build_command()
57
+ if self.prev is not None:
58
+ prev = self.prev._build_command()
51
59
  res += f"{prev} & " if prev != "" else ""
52
60
  if self._command != "":
53
61
  return res + " & ".join([self._command, *commands])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 0.9.82
3
+ Version: 0.9.83
4
4
  Summary: A python utils library for things I find useful
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -41,7 +41,7 @@ License-File: LICENSE
41
41
  [![Python 3.10.11](https://img.shields.io/badge/python-3.10.11-blue.svg)](https://www.python.org/downloads/release/python-31011/)
42
42
  [![gitleaks](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/gitleaks.yml)
43
43
  [![CodeQL](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/danielnachumdev/danielutils/actions/workflows/github-code-scanning/codeql)
44
- # danielutils v=0.9.82
44
+ # danielutils v=0.9.83
45
45
  A utils library for things that I find useful for my coding workflow.\
46
46
  Feel free to use and / or contribute / improve my code :)
47
47
 
@@ -17,7 +17,6 @@ danielutils/print_.py
17
17
  danielutils/py.typed
18
18
  danielutils/text.py
19
19
  danielutils/time.py
20
- danielutils/tqdm_.py
21
20
  danielutils/versioned_imports.py
22
21
  danielutils.egg-info/PKG-INFO
23
22
  danielutils.egg-info/SOURCES.txt
@@ -97,6 +96,7 @@ danielutils/functions/flatten.py
97
96
  danielutils/functions/isoftype.py
98
97
  danielutils/functions/isoneof.py
99
98
  danielutils/functions/multiloop.py
99
+ danielutils/functions/parallel_for.py
100
100
  danielutils/functions/powerset.py
101
101
  danielutils/functions/subseteq.py
102
102
  danielutils/functions/types_subseteq.py
@@ -109,8 +109,6 @@ danielutils/math_/constants.py
109
109
  danielutils/math_/functions.py
110
110
  danielutils/math_/math_print.py
111
111
  danielutils/math_/math_symbols.py
112
- danielutils/math_/polynomial/__init__.py
113
- danielutils/math_/polynomial/polinomial.py
114
112
  danielutils/metaclasses/__init__.py
115
113
  danielutils/metaclasses/atomic_class_meta.py
116
114
  danielutils/metaclasses/implicit_data_deleter_meta.py
@@ -120,6 +118,10 @@ danielutils/metaclasses/overload_meta.py
120
118
  danielutils/mock_/__init__.py
121
119
  danielutils/mock_/mock_database.py
122
120
  danielutils/mock_/mock_module.py
121
+ danielutils/progress_bar/__init__.py
122
+ danielutils/progress_bar/ascii_progress_bar.py
123
+ danielutils/progress_bar/progress_bar.py
124
+ danielutils/progress_bar/progress_bar_pool.py
123
125
  danielutils/protocols/__init__.py
124
126
  danielutils/protocols/dictable.py
125
127
  danielutils/protocols/evaluable.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "danielutils"
7
- version = "0.9.82"
7
+ version = "0.9.83"
8
8
  authors = [
9
9
  { name = "danielnachumdev", email = "danielnachumdev@gmail.com" },
10
10
  ]
@@ -1 +0,0 @@
1
- from .polinomial import *
@@ -1,33 +0,0 @@
1
- from typing import TypeVar, List as List
2
- from copy import deepcopy
3
- from fractions import Fraction
4
- from ...reflection import get_python_version
5
-
6
- if get_python_version() >= (3, 9):
7
- from builtins import list as List
8
- from builtins import dict as Dict
9
- from ...print_ import mprint
10
-
11
- Number = TypeVar("Number", int, float, Fraction, complex)
12
-
13
-
14
- class Polynomial:
15
- def __init__(self, coefficients: List[Number], powers: List[Number]):
16
- self._coefficients = coefficients
17
- self._powers = powers
18
-
19
- @property
20
- def coefficients(self) -> List[Fraction]:
21
- return deepcopy(self._coefficients)
22
-
23
- @property
24
- def powers(self) -> List[Fraction]:
25
- return deepcopy(self._powers)
26
-
27
- def __len__(self):
28
- return len(self.coefficients)
29
-
30
-
31
- __all__ = [
32
- "Polynomial"
33
- ]
File without changes
File without changes