provide-foundation 0.0.0.dev0__tar.gz → 0.0.0.dev2__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 (252) hide show
  1. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/PKG-INFO +5 -28
  2. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/README.md +2 -27
  3. provide_foundation-0.0.0.dev2/VERSION +1 -0
  4. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/pyproject.toml +30 -4
  5. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/__init__.py +41 -23
  6. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/__init__.py +23 -0
  7. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/base.py +70 -0
  8. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/bzip2.py +157 -0
  9. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/gzip.py +159 -0
  10. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/operations.py +334 -0
  11. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/tar.py +164 -0
  12. provide_foundation-0.0.0.dev2/src/provide/foundation/archive/zip.py +203 -0
  13. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/__init__.py +2 -2
  14. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/deps.py +13 -7
  15. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/__init__.py +1 -1
  16. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/query.py +1 -1
  17. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/send.py +1 -1
  18. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/tail.py +1 -1
  19. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/decorators.py +11 -10
  20. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/main.py +1 -1
  21. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/testing.py +2 -35
  22. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/utils.py +21 -17
  23. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/__init__.py +35 -2
  24. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/base.py +2 -2
  25. provide_foundation-0.0.0.dev2/src/provide/foundation/config/converters.py +479 -0
  26. provide_foundation-0.0.0.dev2/src/provide/foundation/config/defaults.py +67 -0
  27. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/env.py +4 -19
  28. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/loader.py +9 -3
  29. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/sync.py +19 -4
  30. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/input.py +5 -5
  31. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/output.py +35 -13
  32. provide_foundation-0.0.0.dev2/src/provide/foundation/context/__init__.py +16 -0
  33. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/context/core.py +85 -109
  34. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/core.py +1 -2
  35. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/__init__.py +2 -0
  36. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/__init__.py +34 -0
  37. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/base.py +173 -0
  38. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/certificate.py +290 -0
  39. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/factory.py +213 -0
  40. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/generator.py +138 -0
  41. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/loader.py +130 -0
  42. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/operations.py +198 -0
  43. provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/trust.py +107 -0
  44. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/__init__.py +2 -3
  45. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/decorators.py +0 -231
  46. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/types.py +0 -97
  47. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/__init__.py +0 -0
  48. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/display.py +84 -0
  49. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/registry.py +160 -0
  50. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/resolver.py +192 -0
  51. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/das.py +128 -0
  52. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/database.py +125 -0
  53. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/http.py +153 -0
  54. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/llm.py +139 -0
  55. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/task_queue.py +107 -0
  56. provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/types.py +70 -0
  57. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/directory.py +13 -22
  58. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/lock.py +3 -1
  59. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/components.py +202 -0
  60. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/config.py +151 -0
  61. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/discovery.py +62 -0
  62. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/handlers.py +81 -0
  63. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/lifecycle.py +194 -0
  64. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/manager.py +4 -4
  65. provide_foundation-0.0.0.dev2/src/provide/foundation/hub/processors.py +44 -0
  66. provide_foundation-0.0.0.dev2/src/provide/foundation/integrations/__init__.py +11 -0
  67. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/__init__.py +10 -7
  68. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/auth.py +1 -1
  69. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/client.py +12 -12
  70. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/commands.py +3 -3
  71. provide_foundation-0.0.0.dev2/src/provide/foundation/integrations/openobserve/config.py +37 -0
  72. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/formatters.py +1 -1
  73. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/otlp.py +1 -1
  74. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/search.py +2 -2
  75. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/streaming.py +4 -4
  76. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/__init__.py +3 -10
  77. provide_foundation-0.0.0.dev2/src/provide/foundation/logger/config/logging.py +164 -0
  78. provide_foundation-0.0.0.dev2/src/provide/foundation/logger/config/telemetry.py +108 -0
  79. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/core.py +0 -2
  80. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/custom_processors.py +1 -0
  81. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/factories.py +11 -2
  82. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/main.py +20 -84
  83. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/__init__.py +5 -1
  84. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/coordinator.py +76 -24
  85. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/processors.py +2 -9
  86. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/trace.py +27 -0
  87. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/otel.py +10 -10
  88. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/observability/__init__.py +2 -2
  89. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/__init__.py +9 -0
  90. provide_foundation-0.0.0.dev2/src/provide/foundation/process/exit.py +47 -0
  91. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/lifecycle.py +115 -59
  92. provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/__init__.py +35 -0
  93. provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/circuit.py +164 -0
  94. provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/decorators.py +220 -0
  95. provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/fallback.py +193 -0
  96. provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/retry.py +325 -0
  97. provide_foundation-0.0.0.dev2/src/provide/foundation/streams/config.py +79 -0
  98. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/console.py +7 -8
  99. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/core.py +6 -3
  100. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/file.py +12 -2
  101. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/__init__.py +84 -2
  102. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/archive/__init__.py +24 -0
  103. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/archive/fixtures.py +217 -0
  104. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/cli.py +30 -17
  105. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/common/__init__.py +32 -0
  106. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/common/fixtures.py +236 -0
  107. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/__init__.py +40 -0
  108. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/content_fixtures.py +316 -0
  109. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/directory_fixtures.py +107 -0
  110. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/fixtures.py +52 -0
  111. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/special_fixtures.py +153 -0
  112. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/logger.py +212 -0
  113. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/mocking/__init__.py +46 -0
  114. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/mocking/fixtures.py +331 -0
  115. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/__init__.py +48 -0
  116. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/async_fixtures.py +405 -0
  117. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/fixtures.py +56 -0
  118. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/subprocess_fixtures.py +209 -0
  119. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/__init__.py +38 -0
  120. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/basic_fixtures.py +101 -0
  121. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/data_fixtures.py +99 -0
  122. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/execution_fixtures.py +263 -0
  123. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/fixtures.py +54 -0
  124. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/sync_fixtures.py +97 -0
  125. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/time/__init__.py +32 -0
  126. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/time/fixtures.py +409 -0
  127. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/transport/__init__.py +30 -0
  128. provide_foundation-0.0.0.dev2/src/provide/foundation/testing/transport/fixtures.py +280 -0
  129. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/__init__.py +58 -0
  130. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/base.py +348 -0
  131. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/cache.py +268 -0
  132. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/downloader.py +224 -0
  133. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/installer.py +254 -0
  134. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/registry.py +223 -0
  135. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/resolver.py +321 -0
  136. provide_foundation-0.0.0.dev2/src/provide/foundation/tools/verifier.py +186 -0
  137. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/otel.py +7 -11
  138. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/spans.py +2 -2
  139. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/__init__.py +155 -0
  140. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/base.py +171 -0
  141. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/client.py +266 -0
  142. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/config.py +140 -0
  143. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/errors.py +79 -0
  144. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/http.py +232 -0
  145. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/middleware.py +360 -0
  146. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/registry.py +167 -0
  147. provide_foundation-0.0.0.dev2/src/provide/foundation/transport/types.py +45 -0
  148. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/deps.py +14 -12
  149. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/parsing.py +49 -4
  150. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/PKG-INFO +5 -28
  151. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/SOURCES.txt +96 -18
  152. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/requires.txt +4 -1
  153. provide_foundation-0.0.0.dev2/tests/test_component_registry_core.py +325 -0
  154. provide_foundation-0.0.0.dev2/tests/test_component_registry_handlers.py +311 -0
  155. provide_foundation-0.0.0.dev2/tests/test_component_registry_sets.py +152 -0
  156. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_init_coverage.py +8 -12
  157. provide_foundation-0.0.0.dev0/VERSION +0 -1
  158. provide_foundation-0.0.0.dev0/src/provide/foundation/cli/commands/logs/generate_old.py +0 -569
  159. provide_foundation-0.0.0.dev0/src/provide/foundation/context/__init__.py +0 -12
  160. provide_foundation-0.0.0.dev0/src/provide/foundation/crypto/certificates.py +0 -896
  161. provide_foundation-0.0.0.dev0/src/provide/foundation/hub/components.py +0 -640
  162. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/config/logging.py +0 -394
  163. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/config/telemetry.py +0 -188
  164. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/__init__.py +0 -44
  165. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/matrix.py +0 -209
  166. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/sets.py +0 -458
  167. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/types.py +0 -56
  168. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/setup/emoji_resolver.py +0 -64
  169. provide_foundation-0.0.0.dev0/src/provide/foundation/testing/logger.py +0 -106
  170. provide_foundation-0.0.0.dev0/tests/test_component_registry.py +0 -882
  171. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/LICENSE +0 -0
  172. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/setup.cfg +0 -0
  173. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/__init__.py +0 -0
  174. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/_version.py +0 -0
  175. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/__init__.py +0 -0
  176. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/generate.py +0 -0
  177. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/manager.py +0 -0
  178. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/schema.py +0 -0
  179. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/types.py +0 -0
  180. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/validators.py +0 -0
  181. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/__init__.py +0 -0
  182. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/algorithms.py +0 -0
  183. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/checksums.py +0 -0
  184. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/constants.py +0 -0
  185. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/hashing.py +0 -0
  186. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/keys.py +0 -0
  187. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/signatures.py +0 -0
  188. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/utils.py +0 -0
  189. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/auth.py +0 -0
  190. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/base.py +0 -0
  191. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/config.py +0 -0
  192. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/context.py +0 -0
  193. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/handlers.py +0 -0
  194. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/integration.py +0 -0
  195. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/platform.py +0 -0
  196. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/process.py +0 -0
  197. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/resources.py +0 -0
  198. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/runtime.py +0 -0
  199. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/safe_decorators.py +0 -0
  200. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/__init__.py +0 -0
  201. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/atomic.py +0 -0
  202. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/formats.py +0 -0
  203. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/safe.py +0 -0
  204. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/utils.py +0 -0
  205. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/__init__.py +0 -0
  206. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/click_builder.py +0 -0
  207. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/commands.py +0 -0
  208. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/decorators.py +0 -0
  209. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/info.py +0 -0
  210. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/registry.py +0 -0
  211. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/type_mapping.py +0 -0
  212. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/types.py +0 -0
  213. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/exceptions.py +0 -0
  214. {provide_foundation-0.0.0.dev0/src/provide/foundation/observability → provide_foundation-0.0.0.dev2/src/provide/foundation/integrations}/openobserve/models.py +0 -0
  215. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/base.py +0 -0
  216. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/config/__init__.py +0 -0
  217. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/config/base.py +0 -0
  218. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/__init__.py +0 -0
  219. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/trace.py +0 -0
  220. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/__init__.py +0 -0
  221. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/limiters.py +0 -0
  222. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/processor.py +0 -0
  223. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/queue_limiter.py +0 -0
  224. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/testing.py +0 -0
  225. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/__init__.py +0 -0
  226. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/simple.py +0 -0
  227. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/__init__.py +0 -0
  228. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/detection.py +0 -0
  229. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/info.py +0 -0
  230. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/async_runner.py +0 -0
  231. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/runner.py +0 -0
  232. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/setup/__init__.py +0 -0
  233. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/__init__.py +0 -0
  234. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/crypto.py +0 -0
  235. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/fixtures.py +0 -0
  236. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/hub.py +0 -0
  237. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/streams.py +0 -0
  238. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/__init__.py +0 -0
  239. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/context.py +0 -0
  240. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/types.py +0 -0
  241. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/__init__.py +0 -0
  242. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/env.py +0 -0
  243. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/formatting.py +0 -0
  244. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/rate_limiting.py +0 -0
  245. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/streams.py +0 -0
  246. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/timing.py +0 -0
  247. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/dependency_links.txt +0 -0
  248. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/entry_points.txt +0 -0
  249. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/top_level.txt +0 -0
  250. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_unused_modules.py +0 -0
  251. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_version_coverage.py +0 -0
  252. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_version_simple.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: provide-foundation
3
- Version: 0.0.0.dev0
3
+ Version: 0.0.0.dev2
4
4
  Summary: Foundation Telemetry: An opinionated, developer-friendly telemetry wrapper for Python.
5
5
  Author-email: Tim Perkins <code@tim.life>
6
6
  Maintainer-email: "provide.io" <code@provide.io>
@@ -29,13 +29,15 @@ Provides-Extra: cli
29
29
  Requires-Dist: click>=8.1.7; extra == "cli"
30
30
  Provides-Extra: crypto
31
31
  Requires-Dist: cryptography>=45.0.7; extra == "crypto"
32
+ Provides-Extra: transport
33
+ Requires-Dist: httpx>=0.27.0; extra == "transport"
32
34
  Provides-Extra: opentelemetry
33
35
  Requires-Dist: opentelemetry-api>=1.22.0; extra == "opentelemetry"
34
36
  Requires-Dist: opentelemetry-sdk>=1.22.0; extra == "opentelemetry"
35
37
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.22.0; extra == "opentelemetry"
36
38
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.22.0; extra == "opentelemetry"
37
39
  Provides-Extra: all
38
- Requires-Dist: provide-foundation[cli,crypto,opentelemetry]; extra == "all"
40
+ Requires-Dist: provide-foundation[cli,crypto,opentelemetry,transport]; extra == "all"
39
41
  Dynamic: license-file
40
42
 
41
43
  # provide.foundation
@@ -439,31 +441,6 @@ Complete working examples are available in the [examples/](examples/) directory:
439
441
 
440
442
  ---
441
443
 
442
- ## Performance
443
-
444
- - **Logging**: 14,000+ messages/second with emoji processing and structured logging
445
- - **Configuration**: Lazy loading with multi-source caching for optimal performance
446
- - **File Operations**: Atomic writes with format detection prevent corruption
447
- - **Process Management**: Efficient streaming with async support and backpressure handling
448
- - **Cryptography**: Hardware-accelerated operations with secure algorithm defaults
449
- - **Platform Detection**: Cached system information for minimal overhead
450
-
451
- ---
452
-
453
- ## Contributing
454
-
455
- We welcome contributions! Please see:
456
- - [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup and guidelines
457
- - [GitHub Issues](https://github.com/provide-io/provide-foundation/issues) - Bug reports and feature requests
458
-
459
- ---
460
-
461
- ## License
462
-
463
- MIT License - see [LICENSE](LICENSE) file for details.
464
-
465
- ---
466
-
467
444
  <p align="center">
468
- Built by <a href="https://provide.io">Provide</a>
445
+ Built by <a href="https://provide.io">provide.io</a>
469
446
  </p>
@@ -399,31 +399,6 @@ Complete working examples are available in the [examples/](examples/) directory:
399
399
 
400
400
  ---
401
401
 
402
- ## Performance
403
-
404
- - **Logging**: 14,000+ messages/second with emoji processing and structured logging
405
- - **Configuration**: Lazy loading with multi-source caching for optimal performance
406
- - **File Operations**: Atomic writes with format detection prevent corruption
407
- - **Process Management**: Efficient streaming with async support and backpressure handling
408
- - **Cryptography**: Hardware-accelerated operations with secure algorithm defaults
409
- - **Platform Detection**: Cached system information for minimal overhead
410
-
411
- ---
412
-
413
- ## Contributing
414
-
415
- We welcome contributions! Please see:
416
- - [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup and guidelines
417
- - [GitHub Issues](https://github.com/provide-io/provide-foundation/issues) - Bug reports and feature requests
418
-
419
- ---
420
-
421
- ## License
422
-
423
- MIT License - see [LICENSE](LICENSE) file for details.
424
-
425
- ---
426
-
427
402
  <p align="center">
428
- Built by <a href="https://provide.io">Provide</a>
429
- </p>
403
+ Built by <a href="https://provide.io">provide.io</a>
404
+ </p>
@@ -0,0 +1 @@
1
+ 0.0.0.dev2
@@ -52,6 +52,9 @@ cli = [
52
52
  crypto = [
53
53
  "cryptography>=45.0.7",
54
54
  ]
55
+ transport = [
56
+ "httpx>=0.27.0",
57
+ ]
55
58
  opentelemetry = [
56
59
  "opentelemetry-api>=1.22.0",
57
60
  "opentelemetry-sdk>=1.22.0",
@@ -59,7 +62,7 @@ opentelemetry = [
59
62
  "opentelemetry-exporter-otlp-proto-http>=1.22.0",
60
63
  ]
61
64
  all = [
62
- "provide-foundation[cli,crypto,opentelemetry]",
65
+ "provide-foundation[cli,crypto,transport,opentelemetry]",
63
66
  ]
64
67
 
65
68
  [project.scripts]
@@ -68,13 +71,17 @@ foundation = "provide.foundation.cli.main:cli [cli]"
68
71
  [dependency-groups]
69
72
  dev = [
70
73
  "bandit>=1.8.3",
74
+ "cryptography>=45.0.7",
75
+ "h2>=4.3.0",
71
76
  "hypothesis>=6.131.28",
72
77
  "mypy>=1.8.0",
73
78
  "psutil>=7.0.0",
74
- "pyrefly>=0.16.2", "pytest>=7.4.0",
79
+ "pyrefly>=0.16.2",
80
+ "pytest>=7.4.0",
75
81
  "pytest-asyncio>=0.21.0",
76
82
  "pytest-benchmark>=4.0.0",
77
83
  "pytest-cov>=4.1.0",
84
+ "pytest-httpx>=0.35.0",
78
85
  "pytest-mock>=3.15.0",
79
86
  "pytest-xdist>=3.3.0",
80
87
  "pyyaml>=6.0.2",
@@ -94,6 +101,9 @@ docs = [
94
101
  "mkdocs-section-index>=0.3.0",
95
102
  "mike>=2.0.0",
96
103
  ]
104
+ protobuf = [
105
+ "protobuf>=6.32.0",
106
+ ]
97
107
 
98
108
  ################################################################################
99
109
  # Pytest Configuration
@@ -105,6 +115,7 @@ log_cli_level = "DEBUG"
105
115
 
106
116
  asyncio_mode = "auto"
107
117
  asyncio_default_fixture_loop_scope = "function"
118
+ asyncio_default_test_loop_scope = "function"
108
119
 
109
120
  testpaths = ["tests"]
110
121
  pythonpath = ["src", "."]
@@ -112,7 +123,21 @@ python_files = ["test_*.py", "*_test.py"]
112
123
  python_classes = ["Test*", "*Tests"]
113
124
  python_functions = ["test_*", "*_test"]
114
125
  markers = [
115
- "serial: run tests serially to avoid conflicts on global state",
126
+ "serial: run tests serially to avoid event loop conflicts",
127
+ "async_unsafe: async tests that must run serially",
128
+ "unit: fast unit tests",
129
+ "integration: integration tests requiring setup",
130
+ "slow: tests taking >1s",
131
+ "fast: tests taking <100ms",
132
+ # Module markers
133
+ "archive: archive module tests",
134
+ "process: process/subprocess tests",
135
+ "network: network/transport tests",
136
+ "config: configuration tests",
137
+ "logger: logging tests",
138
+ # Skip conditions
139
+ "requires_docker: skip if docker not available",
140
+ "requires_network: skip if offline",
116
141
  ]
117
142
  filterwarnings = [
118
143
  "ignore::DeprecationWarning",
@@ -127,7 +152,8 @@ norecursedirs = [
127
152
  "htmlcov", "docs/_build",
128
153
  ".hypothesis", # Added to address the warning
129
154
  ]
130
- addopts = "-ra -q --color=yes --benchmark-columns=min,max,mean,stddev,median,iqr,ops --benchmark-sort=mean"
155
+ # Changed from -ra to -rFE to suppress skipped test output
156
+ addopts = "-rFE -q --color=yes --benchmark-columns=min,max,mean,stddev,median,iqr,ops --benchmark-sort=mean --dist loadscope"
131
157
 
132
158
  ################################################################################
133
159
  # Ruff Linter and Formatter Configuration
@@ -9,12 +9,12 @@ Primary public interface for the library, re-exporting common components.
9
9
  # Export config module for easy access
10
10
  # New foundation components
11
11
  # Make the errors module available for detailed imports
12
- from provide.foundation import config, errors, platform, process
12
+ from provide.foundation import config, errors, platform, process, resilience
13
13
  from provide.foundation._version import __version__
14
14
 
15
15
  # Console I/O functions (always available - handles click dependency internally)
16
16
  from provide.foundation.console import perr, pin, pout
17
- from provide.foundation.context import Context
17
+ from provide.foundation.context import CLIContext, Context
18
18
 
19
19
  # Error handling exports - only the essentials
20
20
  from provide.foundation.errors import (
@@ -27,6 +27,19 @@ from provide.foundation.errors import (
27
27
  with_error_handling,
28
28
  )
29
29
 
30
+ # Resilience exports
31
+ from provide.foundation.resilience import (
32
+ retry,
33
+ circuit_breaker,
34
+ fallback,
35
+ RetryPolicy,
36
+ RetryExecutor,
37
+ BackoffStrategy,
38
+ CircuitBreaker,
39
+ CircuitState,
40
+ FallbackChain,
41
+ )
42
+
30
43
  # Hub and Registry exports (public API)
31
44
  from provide.foundation.hub.components import ComponentCategory, get_component_registry
32
45
  from provide.foundation.hub.manager import Hub, clear_hub, get_hub
@@ -39,17 +52,12 @@ from provide.foundation.logger import (
39
52
  setup_logging, # Setup function (backward compatibility)
40
53
  )
41
54
 
42
- # Emoji exports
43
- from provide.foundation.logger.emoji.matrix import (
44
- PRIMARY_EMOJI,
45
- SECONDARY_EMOJI,
46
- TERTIARY_EMOJI,
47
- show_emoji_matrix,
48
- )
49
- from provide.foundation.logger.emoji.types import (
50
- EmojiSet,
51
- EmojiSetConfig,
52
- FieldToEmojiMapping,
55
+ # Event set exports
56
+ from provide.foundation.eventsets.display import show_event_matrix
57
+ from provide.foundation.eventsets.types import (
58
+ EventMapping,
59
+ EventSet,
60
+ FieldMapping,
53
61
  )
54
62
  from provide.foundation.setup import (
55
63
  setup_telemetry,
@@ -93,15 +101,16 @@ def __getattr__(name: str):
93
101
 
94
102
 
95
103
  __all__ = [
96
- # Core Emoji Dictionaries (available for direct use or reference)
97
- "PRIMARY_EMOJI",
98
- "SECONDARY_EMOJI",
99
- "TERTIARY_EMOJI",
104
+ # Event enrichment utilities
105
+ "show_event_matrix",
100
106
  "ConsoleFormatterStr",
101
107
  # New foundation modules
102
- "Context",
103
- # Emoji Mapping classes
104
- "EmojiSet",
108
+ "CLIContext",
109
+ "Context", # Backward compatibility
110
+ # Event set types
111
+ "EventMapping",
112
+ "EventSet",
113
+ "FieldMapping",
105
114
  # Error handling essentials
106
115
  "FoundationError",
107
116
  # Type aliases
@@ -115,8 +124,6 @@ __all__ = [
115
124
  "get_component_registry",
116
125
  "get_hub",
117
126
  "clear_hub",
118
- "FieldToEmojiMapping",
119
- "EmojiSetConfig",
120
127
  # Configuration classes
121
128
  "TelemetryConfig",
122
129
  # Version
@@ -136,12 +143,23 @@ __all__ = [
136
143
  "pout",
137
144
  "platform",
138
145
  "process",
146
+ # Resilience patterns
147
+ "retry",
148
+ "circuit_breaker",
149
+ "fallback",
150
+ "RetryPolicy",
151
+ "RetryExecutor",
152
+ "BackoffStrategy",
153
+ "CircuitBreaker",
154
+ "CircuitState",
155
+ "FallbackChain",
156
+ # Backward compatibility (deprecated)
139
157
  "retry_on_error",
158
+ "resilience", # The resilience module for detailed imports
140
159
  "setup_logging", # Backward compatibility
141
160
  "setup_logger", # Consistent naming
142
161
  "setup_telemetry",
143
162
  # Utilities
144
- "show_emoji_matrix",
145
163
  "shutdown_foundation_telemetry",
146
164
  "timed_block",
147
165
  # Rate limiting utilities
@@ -0,0 +1,23 @@
1
+ """Archive operations for provide-foundation.
2
+
3
+ This module provides clean, composable archive operations without complex abstractions.
4
+ Tools for creating, extracting, and manipulating archives in various formats.
5
+ """
6
+
7
+ from provide.foundation.archive.base import ArchiveError, BaseArchive
8
+ from provide.foundation.archive.bzip2 import Bzip2Compressor
9
+ from provide.foundation.archive.gzip import GzipCompressor
10
+ from provide.foundation.archive.operations import ArchiveOperations, OperationChain
11
+ from provide.foundation.archive.tar import TarArchive
12
+ from provide.foundation.archive.zip import ZipArchive
13
+
14
+ __all__ = [
15
+ "ArchiveError",
16
+ "ArchiveOperations",
17
+ "BaseArchive",
18
+ "Bzip2Compressor",
19
+ "GzipCompressor",
20
+ "OperationChain",
21
+ "TarArchive",
22
+ "ZipArchive",
23
+ ]
@@ -0,0 +1,70 @@
1
+ """Base classes and interfaces for archive operations."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from pathlib import Path
5
+
6
+ from provide.foundation.errors import FoundationError
7
+
8
+
9
+ class ArchiveError(FoundationError):
10
+ """Base exception for archive-related errors."""
11
+ pass
12
+
13
+
14
+ class BaseArchive(ABC):
15
+ """
16
+ Abstract base class for all archive implementations.
17
+
18
+ This defines the common interface that all archive implementations
19
+ must follow, ensuring consistency across different archive formats.
20
+ """
21
+
22
+ @abstractmethod
23
+ def create(self, source: Path, output: Path) -> Path:
24
+ """
25
+ Create an archive from source path.
26
+
27
+ Args:
28
+ source: Source file or directory to archive
29
+ output: Output archive file path
30
+
31
+ Returns:
32
+ Path to the created archive file
33
+
34
+ Raises:
35
+ ArchiveError: If archive creation fails
36
+ """
37
+ pass
38
+
39
+ @abstractmethod
40
+ def extract(self, archive: Path, output: Path) -> Path:
41
+ """
42
+ Extract an archive to output path.
43
+
44
+ Args:
45
+ archive: Archive file to extract
46
+ output: Output directory for extracted contents
47
+
48
+ Returns:
49
+ Path to the extraction directory
50
+
51
+ Raises:
52
+ ArchiveError: If extraction fails
53
+ """
54
+ pass
55
+
56
+ @abstractmethod
57
+ def validate(self, archive: Path) -> bool:
58
+ """
59
+ Validate that an archive is properly formed.
60
+
61
+ Args:
62
+ archive: Archive file to validate
63
+
64
+ Returns:
65
+ True if archive is valid, False otherwise
66
+
67
+ Raises:
68
+ ArchiveError: If validation cannot be performed
69
+ """
70
+ pass
@@ -0,0 +1,157 @@
1
+ """BZIP2 compression implementation."""
2
+
3
+ import bz2
4
+ import shutil
5
+ from pathlib import Path
6
+ from typing import BinaryIO
7
+
8
+ from attrs import define, field
9
+
10
+ from provide.foundation.archive.base import ArchiveError
11
+ from provide.foundation.file import ensure_parent_dir
12
+ from provide.foundation.logger import get_logger
13
+
14
+ logger = get_logger(__name__)
15
+
16
+
17
+ @define(slots=True)
18
+ class Bzip2Compressor:
19
+ """
20
+ BZIP2 compression implementation.
21
+
22
+ Provides BZIP2 compression and decompression for single files.
23
+ Does not handle bundling - use with TarArchive for .tar.bz2 files.
24
+ """
25
+
26
+ level: int = field(default=9) # Compression level 1-9 (1=fast, 9=best)
27
+
28
+ @level.validator
29
+ def _validate_level(self, attribute, value):
30
+ if not 1 <= value <= 9:
31
+ raise ValueError(f"Compression level must be 1-9, got {value}")
32
+
33
+ def compress(self, input_stream: BinaryIO, output_stream: BinaryIO) -> None:
34
+ """
35
+ Compress data from input stream to output stream.
36
+
37
+ Args:
38
+ input_stream: Input binary stream
39
+ output_stream: Output binary stream
40
+
41
+ Raises:
42
+ ArchiveError: If compression fails
43
+ """
44
+ try:
45
+ with bz2.BZ2File(output_stream, 'wb', compresslevel=self.level) as bz:
46
+ shutil.copyfileobj(input_stream, bz)
47
+ logger.debug(f"Compressed data with BZIP2 level {self.level}")
48
+ except Exception as e:
49
+ raise ArchiveError(f"Failed to compress with BZIP2: {e}") from e
50
+
51
+ def decompress(self, input_stream: BinaryIO, output_stream: BinaryIO) -> None:
52
+ """
53
+ Decompress data from input stream to output stream.
54
+
55
+ Args:
56
+ input_stream: Input binary stream (bzip2 compressed)
57
+ output_stream: Output binary stream
58
+
59
+ Raises:
60
+ ArchiveError: If decompression fails
61
+ """
62
+ try:
63
+ with bz2.BZ2File(input_stream, 'rb') as bz:
64
+ shutil.copyfileobj(bz, output_stream)
65
+ logger.debug("Decompressed BZIP2 data")
66
+ except Exception as e:
67
+ raise ArchiveError(f"Failed to decompress BZIP2: {e}") from e
68
+
69
+ def compress_file(self, input_path: Path, output_path: Path) -> Path:
70
+ """
71
+ Compress a file.
72
+
73
+ Args:
74
+ input_path: Input file path
75
+ output_path: Output file path (should end with .bz2)
76
+
77
+ Returns:
78
+ Path to compressed file
79
+
80
+ Raises:
81
+ ArchiveError: If compression fails
82
+ """
83
+ try:
84
+ ensure_parent_dir(output_path)
85
+
86
+ with open(input_path, 'rb') as f_in:
87
+ with bz2.open(output_path, 'wb', compresslevel=self.level) as f_out:
88
+ shutil.copyfileobj(f_in, f_out)
89
+
90
+ logger.debug(f"Compressed {input_path} to {output_path}")
91
+ return output_path
92
+
93
+ except Exception as e:
94
+ raise ArchiveError(f"Failed to compress file: {e}") from e
95
+
96
+ def decompress_file(self, input_path: Path, output_path: Path) -> Path:
97
+ """
98
+ Decompress a file.
99
+
100
+ Args:
101
+ input_path: Input file path (bzip2 compressed)
102
+ output_path: Output file path
103
+
104
+ Returns:
105
+ Path to decompressed file
106
+
107
+ Raises:
108
+ ArchiveError: If decompression fails
109
+ """
110
+ try:
111
+ ensure_parent_dir(output_path)
112
+
113
+ with bz2.open(input_path, 'rb') as f_in:
114
+ with open(output_path, 'wb') as f_out:
115
+ shutil.copyfileobj(f_in, f_out)
116
+
117
+ logger.debug(f"Decompressed {input_path} to {output_path}")
118
+ return output_path
119
+
120
+ except Exception as e:
121
+ raise ArchiveError(f"Failed to decompress file: {e}") from e
122
+
123
+ def compress_bytes(self, data: bytes) -> bytes:
124
+ """
125
+ Compress bytes data.
126
+
127
+ Args:
128
+ data: Input bytes
129
+
130
+ Returns:
131
+ Compressed bytes
132
+
133
+ Raises:
134
+ ArchiveError: If compression fails
135
+ """
136
+ try:
137
+ return bz2.compress(data, compresslevel=self.level)
138
+ except Exception as e:
139
+ raise ArchiveError(f"Failed to compress bytes: {e}") from e
140
+
141
+ def decompress_bytes(self, data: bytes) -> bytes:
142
+ """
143
+ Decompress bytes data.
144
+
145
+ Args:
146
+ data: Compressed bytes
147
+
148
+ Returns:
149
+ Decompressed bytes
150
+
151
+ Raises:
152
+ ArchiveError: If decompression fails
153
+ """
154
+ try:
155
+ return bz2.decompress(data)
156
+ except Exception as e:
157
+ raise ArchiveError(f"Failed to decompress bytes: {e}") from e