danielutils 0.9.80__tar.gz → 0.9.81__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 (185) hide show
  1. {danielutils-0.9.80/danielutils.egg-info → danielutils-0.9.81}/PKG-INFO +2 -2
  2. {danielutils-0.9.80 → danielutils-0.9.81}/README.md +1 -1
  3. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/__init__.py +2 -1
  4. danielutils-0.9.81/danielutils/context_managers/__init__.py +1 -0
  5. danielutils-0.9.81/danielutils/context_managers/temporary_file.py +34 -0
  6. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/__init__.py +1 -0
  7. danielutils-0.9.81/danielutils/system/layered_command.py +86 -0
  8. {danielutils-0.9.80 → danielutils-0.9.81/danielutils.egg-info}/PKG-INFO +2 -2
  9. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils.egg-info/SOURCES.txt +3 -0
  10. {danielutils-0.9.80 → danielutils-0.9.81}/pyproject.toml +1 -1
  11. {danielutils-0.9.80 → danielutils-0.9.81}/LICENSE +0 -0
  12. {danielutils-0.9.80 → danielutils-0.9.81}/MANIFEST.in +0 -0
  13. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/__init__.py +0 -0
  14. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/database/__init__.py +0 -0
  15. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/database/cached_database.py +0 -0
  16. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/database/database.py +0 -0
  17. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/database/redis_database.py +0 -0
  18. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/multiprogramming/__init__.py +0 -0
  19. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/multiprogramming/multi_id.py +0 -0
  20. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/multiprogramming/worker.py +0 -0
  21. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/multiprogramming/worker_pool.py +0 -0
  22. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/abstractions/repl.py +0 -0
  23. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/aliases.py +0 -0
  24. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/__init__.py +0 -0
  25. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/counter.py +0 -0
  26. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/frange.py +0 -0
  27. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/__init__.py +0 -0
  28. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/factory.py +0 -0
  29. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/tdict.py +0 -0
  30. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/tlist.py +0 -0
  31. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/tset.py +0 -0
  32. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/better_builtins/typed_builtins/ttuple.py +0 -0
  33. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/colors.py +0 -0
  34. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/convenience.py +0 -0
  35. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/conversions/__init__.py +0 -0
  36. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/conversions/main_conversions.py +0 -0
  37. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/conversions/specialized_conversions/__init__.py +0 -0
  38. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/conversions/specialized_conversions/to_hex.py +0 -0
  39. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/conversions/specialized_conversions/to_int.py +0 -0
  40. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/__init__.py +0 -0
  41. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/comparer.py +0 -0
  42. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/default_dict.py +0 -0
  43. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/functions.py +0 -0
  44. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/graph/__init__.py +0 -0
  45. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/graph/binary_node.py +0 -0
  46. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/graph/graph.py +0 -0
  47. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/graph/multinode.py +0 -0
  48. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/graph/node.py +0 -0
  49. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/heap/__init__.py +0 -0
  50. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/heap/heap.py +0 -0
  51. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/heap/max_heap.py +0 -0
  52. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/heap/min_heap.py +0 -0
  53. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/queue/__init__.py +0 -0
  54. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/queue/atomic_queue.py +0 -0
  55. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/queue/priority_queue.py +0 -0
  56. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/queue/queue.py +0 -0
  57. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/stack.py +0 -0
  58. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/trees/__init__.py +0 -0
  59. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/trees/binary_syntax_tree.py +0 -0
  60. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/data_structures/trees/binary_tree.py +0 -0
  61. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/date.py +0 -0
  62. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/date_time.py +0 -0
  63. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/__init__.py +0 -0
  64. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/atomic.py +0 -0
  65. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/attach.py +0 -0
  66. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/chain_decorators.py +0 -0
  67. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/decorate_conditionally.py +0 -0
  68. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/delay_call.py +0 -0
  69. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/deprecate.py +0 -0
  70. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/final.py +0 -0
  71. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/limit_recursion.py +0 -0
  72. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/memo.py +0 -0
  73. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/overload.py +0 -0
  74. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/partially_implemented.py +0 -0
  75. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/processify.py +0 -0
  76. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/property.py +0 -0
  77. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/singleton.py +0 -0
  78. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/threadify.py +0 -0
  79. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/timeout.py +0 -0
  80. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/total_ordering.py +0 -0
  81. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/decorators/validate.py +0 -0
  82. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/exceptions.py +0 -0
  83. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/__init__.py +0 -0
  84. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/areoneof.py +0 -0
  85. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/check_foreach.py +0 -0
  86. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/flatten.py +0 -0
  87. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/isoftype.py +0 -0
  88. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/isoneof.py +0 -0
  89. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/multiloop.py +0 -0
  90. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/powerset.py +0 -0
  91. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/subseteq.py +0 -0
  92. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/functions/types_subseteq.py +0 -0
  93. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/generators/__init__.py +0 -0
  94. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/generators/conditional_generator.py +0 -0
  95. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/generators/generator_from_stream.py +0 -0
  96. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/generators/join_generators.py +0 -0
  97. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/internet.py +0 -0
  98. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/io_.py +0 -0
  99. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/__init__.py +0 -0
  100. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/constants.py +0 -0
  101. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/functions.py +0 -0
  102. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/math_print.py +0 -0
  103. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/math_symbols.py +0 -0
  104. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/polynomial/__init__.py +0 -0
  105. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/math_/polynomial/polinomial.py +0 -0
  106. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/__init__.py +0 -0
  107. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/atomic_class_meta.py +0 -0
  108. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/implicit_data_deleter_meta.py +0 -0
  109. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/instance_cache_meta.py +0 -0
  110. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/interface.py +0 -0
  111. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/metaclasses/overload_meta.py +0 -0
  112. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/mock_/__init__.py +0 -0
  113. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/mock_/mock_database.py +0 -0
  114. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/mock_/mock_module.py +0 -0
  115. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/path.py +0 -0
  116. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/print_.py +0 -0
  117. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/protocols/__init__.py +0 -0
  118. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/protocols/dictable.py +0 -0
  119. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/protocols/evaluable.py +0 -0
  120. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/py.typed +0 -0
  121. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/__init__.py +0 -0
  122. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/class_/__init__.py +0 -0
  123. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/class_/class_reflection.py +0 -0
  124. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/file/__init__.py +0 -0
  125. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/file/file_reflection.py +0 -0
  126. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/function/__init__.py +0 -0
  127. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/function/function_reflections.py +0 -0
  128. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/__init__.py +0 -0
  129. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/callstack.py +0 -0
  130. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/get_traceback.py +0 -0
  131. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/os_.py +0 -0
  132. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/packages.py +0 -0
  133. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/python_version.py +0 -0
  134. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/signals.py +0 -0
  135. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/interpreter/tracer.py +0 -0
  136. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/module/__init__.py +0 -0
  137. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/module/module_reflections.py +0 -0
  138. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/reflection/module/package_reflection.py +0 -0
  139. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/snippets/__init__.py +0 -0
  140. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/snippets/try_get.py +0 -0
  141. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/independent.py +0 -0
  142. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/windows/__init__.py +0 -0
  143. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/windows/utils/__init__.py +0 -0
  144. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/windows/utils/filetime.py +0 -0
  145. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/windows/win32_ctime.py +0 -0
  146. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/system/windows/windows.py +0 -0
  147. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/text.py +0 -0
  148. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/time.py +0 -0
  149. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/tqdm_.py +0 -0
  150. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/__init__.py +0 -0
  151. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/databases/__init__.py +0 -0
  152. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/databases/all.py +0 -0
  153. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/oop/__init__.py +0 -0
  154. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/oop/observer.py +0 -0
  155. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/oop/strategy.py +0 -0
  156. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/__init__.py +0 -0
  157. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/__init__.py +0 -0
  158. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/conditional_variable.py +0 -0
  159. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
  160. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/__init__.py +0 -0
  161. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/bernoulli.py +0 -0
  162. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/binomial.py +0 -0
  163. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +0 -0
  164. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/discrete.py +0 -0
  165. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/geometric.py +0 -0
  166. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/poisson.py +0 -0
  167. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/conditional_variable/discrete/uniform.py +0 -0
  168. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/distributions.py +0 -0
  169. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/expressions/__init__.py +0 -0
  170. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/expressions/accumulation_expression.py +0 -0
  171. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/expressions/probability_expression.py +0 -0
  172. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/funcs/__init__.py +0 -0
  173. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/funcs/covariance.py +0 -0
  174. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/funcs/expected_value.py +0 -0
  175. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/funcs/probability_function.py +0 -0
  176. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/funcs/variance.py +0 -0
  177. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/operator.py +0 -0
  178. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/protocols.py +0 -0
  179. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/supp.py +0 -0
  180. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/university/probability/transformation.py +0 -0
  181. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils/versioned_imports.py +0 -0
  182. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils.egg-info/dependency_links.txt +0 -0
  183. {danielutils-0.9.80 → danielutils-0.9.81}/danielutils.egg-info/top_level.txt +0 -0
  184. {danielutils-0.9.80 → danielutils-0.9.81}/setup.cfg +0 -0
  185. {danielutils-0.9.80 → danielutils-0.9.81}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 0.9.80
3
+ Version: 0.9.81
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.80
44
+ # danielutils v=0.9.81
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.80
7
+ # danielutils v=0.9.81
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
 
@@ -39,4 +39,5 @@ from .print_ import *
39
39
  from .metaclasses import *
40
40
  from .generators import *
41
41
  from .university import *
42
- from .mock_ import *
42
+ from .mock_ import *
43
+ from .context_managers import *
@@ -0,0 +1 @@
1
+ from .temporary_file import *
@@ -0,0 +1,34 @@
1
+ from ..io_ import file_exists, delete_file
2
+
3
+
4
+ class TemporaryFile:
5
+ def __init__(self, path: str):
6
+ if file_exists(path):
7
+ raise RuntimeError(f"Can't create a temporary file if file '{path}' already exists.")
8
+ self.path = path
9
+
10
+ def __enter__(self):
11
+ return self
12
+
13
+ def __exit__(self, exc_type, exc_val, exc_tb):
14
+ self.close()
15
+
16
+ def close(self) -> None:
17
+ delete_file(self.path)
18
+
19
+ def read(self) -> list[str]:
20
+ with open(self.path, 'r') as f:
21
+ return f.readlines()
22
+
23
+ def write(self, lines: list[str]) -> None:
24
+ with open(self.path, 'a') as f:
25
+ f.writelines(lines)
26
+
27
+ def clear(self):
28
+ with open(self.path, 'w') as _:
29
+ pass
30
+
31
+
32
+ __all__ = [
33
+ 'TemporaryFile'
34
+ ]
@@ -1,2 +1,3 @@
1
1
  from .independent import *
2
2
  from .windows import *
3
+ from .layered_command import *
@@ -0,0 +1,86 @@
1
+ import sys, os
2
+ from typing import Optional
3
+ from ..context_managers import TemporaryFile
4
+
5
+
6
+ class LayeredCommand:
7
+ class_flush_stdout: bool = True
8
+ class_raise_on_fail: bool = True
9
+ class_verbose: bool = False
10
+ _cls_prev_instance: Optional['LayeredCommand'] = None
11
+ _id: int = 0
12
+
13
+ def __init__(
14
+ self,
15
+ command: Optional[str] = None,
16
+ instance_flush_stdout: Optional[bool] = None,
17
+ instance_raise_on_fail: Optional[bool] = None,
18
+ instance_verbose: Optional[bool] = None
19
+ ):
20
+ self._command = command if command is not None else ""
21
+ self._instance_flush_stdout = instance_flush_stdout
22
+ self._instance_raise_on_fail = instance_raise_on_fail
23
+ self._instance_verbose = instance_verbose
24
+ self._prev_instance = LayeredCommand._cls_prev_instance
25
+ LayeredCommand._cls_prev_instance = self
26
+ self._executor = os.system
27
+ self._has_entered: bool = False
28
+
29
+ def __enter__(self):
30
+ self._has_entered = True
31
+ return self
32
+
33
+ def __exit__(self, exc_type, exc_val, exc_tb):
34
+ LayeredCommand._cls_prev_instance = self._prev_instance
35
+
36
+ def _build_command(self, *commands: str) -> str:
37
+ res = ""
38
+ if self._prev_instance is not None:
39
+ prev = self._prev_instance._build_command()
40
+ res += f"{prev} & " if prev != "" else ""
41
+ if self._command != "":
42
+ return res + " & ".join([self._command, *commands])
43
+ return res + " & ".join(commands)
44
+
45
+ def _error(self, predicate: bool, command: str, code: int, command_verbose: Optional[bool]) -> None:
46
+ verbose = command_verbose if command_verbose is not None else (
47
+ self._instance_verbose if self._instance_verbose is not None
48
+ else LayeredCommand.class_verbose)
49
+ if predicate:
50
+ if verbose:
51
+ raise RuntimeError(f"command '{command}' failed with exit code {code}")
52
+ sys.exit(1)
53
+
54
+ def execute(self, *commands: str, command_flush_stdout: Optional[bool] = None,
55
+ command_raise_on_fail: bool = None, command_verbose: Optional[bool] = None) -> tuple[int, list[str]]:
56
+ if not self._has_entered:
57
+ raise RuntimeError(
58
+ "LayeredCommand must be used with a context manager. Use as: `with LayeredCommand(...) as l1:`")
59
+ command_flush_stdout = command_flush_stdout if command_flush_stdout is not None else (
60
+ self._instance_flush_stdout if self._instance_flush_stdout is not None
61
+ else LayeredCommand.class_flush_stdout)
62
+ raise_on_fail = command_raise_on_fail if command_raise_on_fail is not None else (
63
+ self._instance_raise_on_fail if self._instance_raise_on_fail is not None
64
+ else LayeredCommand.class_raise_on_fail)
65
+
66
+ command = self._build_command(*commands)
67
+ if command_flush_stdout:
68
+ code = self._executor(command)
69
+ self._error(raise_on_fail and code != 0, command, code, command_verbose)
70
+ return code, []
71
+
72
+ temp_name = f"./alkjgaprgijfpeasjkegnrtlskdjfnbvlkajdertnbolrijk_{LayeredCommand._id}"
73
+ LayeredCommand._id += 1
74
+ with TemporaryFile(temp_name) as temp:
75
+ command += f" >> {temp_name}"
76
+ code = self._executor(command)
77
+ self._error(raise_on_fail and code != 0, command, code, command_verbose)
78
+ return code, temp.read()
79
+
80
+ def __call__(self, *args, **kwargs) -> tuple[int, list[str]]:
81
+ return self.execute(*args, **kwargs)
82
+
83
+
84
+ __all__ = [
85
+ 'LayeredCommand'
86
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: danielutils
3
- Version: 0.9.80
3
+ Version: 0.9.81
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.80
44
+ # danielutils v=0.9.81
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
 
@@ -42,6 +42,8 @@ danielutils/better_builtins/typed_builtins/tdict.py
42
42
  danielutils/better_builtins/typed_builtins/tlist.py
43
43
  danielutils/better_builtins/typed_builtins/tset.py
44
44
  danielutils/better_builtins/typed_builtins/ttuple.py
45
+ danielutils/context_managers/__init__.py
46
+ danielutils/context_managers/temporary_file.py
45
47
  danielutils/conversions/__init__.py
46
48
  danielutils/conversions/main_conversions.py
47
49
  danielutils/conversions/specialized_conversions/__init__.py
@@ -142,6 +144,7 @@ danielutils/snippets/__init__.py
142
144
  danielutils/snippets/try_get.py
143
145
  danielutils/system/__init__.py
144
146
  danielutils/system/independent.py
147
+ danielutils/system/layered_command.py
145
148
  danielutils/system/windows/__init__.py
146
149
  danielutils/system/windows/win32_ctime.py
147
150
  danielutils/system/windows/windows.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "danielutils"
7
- version = "0.9.80"
7
+ version = "0.9.81"
8
8
  authors = [
9
9
  { name = "danielnachumdev", email = "danielnachumdev@gmail.com" },
10
10
  ]
File without changes
File without changes
File without changes
File without changes