provide-foundation 0.0.0.dev0__tar.gz → 0.0.0.dev1__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 (222) hide show
  1. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/PKG-INFO +5 -28
  2. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/README.md +2 -27
  3. provide_foundation-0.0.0.dev1/VERSION +1 -0
  4. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/pyproject.toml +29 -4
  5. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/__init__.py +12 -20
  6. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/__init__.py +23 -0
  7. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/base.py +70 -0
  8. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/bzip2.py +157 -0
  9. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/gzip.py +159 -0
  10. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/operations.py +336 -0
  11. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/tar.py +164 -0
  12. provide_foundation-0.0.0.dev1/src/provide/foundation/archive/zip.py +203 -0
  13. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/base.py +2 -2
  14. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/sync.py +19 -4
  15. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/core.py +1 -2
  16. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/__init__.py +2 -0
  17. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/__init__.py +34 -0
  18. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/base.py +173 -0
  19. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/certificate.py +290 -0
  20. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/factory.py +213 -0
  21. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/generator.py +138 -0
  22. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/loader.py +130 -0
  23. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/operations.py +198 -0
  24. provide_foundation-0.0.0.dev1/src/provide/foundation/crypto/certificates/trust.py +107 -0
  25. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/__init__.py +0 -0
  26. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/display.py +84 -0
  27. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/registry.py +160 -0
  28. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/resolver.py +192 -0
  29. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/sets/das.py +128 -0
  30. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/sets/database.py +125 -0
  31. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/sets/http.py +153 -0
  32. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/sets/llm.py +139 -0
  33. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/sets/task_queue.py +107 -0
  34. provide_foundation-0.0.0.dev1/src/provide/foundation/eventsets/types.py +70 -0
  35. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/components.py +7 -133
  36. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/__init__.py +3 -10
  37. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/config/logging.py +6 -6
  38. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/core.py +0 -2
  39. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/custom_processors.py +1 -0
  40. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/factories.py +11 -2
  41. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/processors/main.py +20 -84
  42. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/setup/__init__.py +5 -1
  43. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/setup/coordinator.py +75 -23
  44. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/setup/processors.py +2 -9
  45. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/trace.py +27 -0
  46. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/metrics/otel.py +10 -10
  47. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/process/lifecycle.py +82 -26
  48. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/__init__.py +77 -0
  49. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/archive/__init__.py +24 -0
  50. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/archive/fixtures.py +217 -0
  51. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/common/__init__.py +34 -0
  52. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/common/fixtures.py +263 -0
  53. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/file/__init__.py +40 -0
  54. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/file/fixtures.py +523 -0
  55. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/logger.py +41 -11
  56. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/mocking/__init__.py +46 -0
  57. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/mocking/fixtures.py +331 -0
  58. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/process/__init__.py +48 -0
  59. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/process/fixtures.py +577 -0
  60. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/threading/__init__.py +38 -0
  61. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/threading/fixtures.py +520 -0
  62. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/time/__init__.py +32 -0
  63. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/time/fixtures.py +409 -0
  64. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/transport/__init__.py +30 -0
  65. provide_foundation-0.0.0.dev1/src/provide/foundation/testing/transport/fixtures.py +280 -0
  66. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/__init__.py +58 -0
  67. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/base.py +348 -0
  68. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/cache.py +266 -0
  69. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/downloader.py +213 -0
  70. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/installer.py +254 -0
  71. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/registry.py +223 -0
  72. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/resolver.py +321 -0
  73. provide_foundation-0.0.0.dev1/src/provide/foundation/tools/verifier.py +186 -0
  74. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/tracer/otel.py +7 -11
  75. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/__init__.py +155 -0
  76. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/base.py +171 -0
  77. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/client.py +266 -0
  78. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/config.py +209 -0
  79. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/errors.py +79 -0
  80. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/http.py +232 -0
  81. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/middleware.py +366 -0
  82. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/registry.py +167 -0
  83. provide_foundation-0.0.0.dev1/src/provide/foundation/transport/types.py +45 -0
  84. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/PKG-INFO +5 -28
  85. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/SOURCES.txt +61 -8
  86. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/requires.txt +4 -1
  87. provide_foundation-0.0.0.dev1/tests/test_component_registry_core.py +325 -0
  88. provide_foundation-0.0.0.dev1/tests/test_component_registry_handlers.py +311 -0
  89. provide_foundation-0.0.0.dev1/tests/test_component_registry_sets.py +152 -0
  90. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/tests/test_init_coverage.py +8 -12
  91. provide_foundation-0.0.0.dev0/VERSION +0 -1
  92. provide_foundation-0.0.0.dev0/src/provide/foundation/cli/commands/logs/generate_old.py +0 -569
  93. provide_foundation-0.0.0.dev0/src/provide/foundation/crypto/certificates.py +0 -896
  94. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/__init__.py +0 -44
  95. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/matrix.py +0 -209
  96. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/sets.py +0 -458
  97. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/types.py +0 -56
  98. provide_foundation-0.0.0.dev0/src/provide/foundation/logger/setup/emoji_resolver.py +0 -64
  99. provide_foundation-0.0.0.dev0/tests/test_component_registry.py +0 -882
  100. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/LICENSE +0 -0
  101. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/setup.cfg +0 -0
  102. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/__init__.py +0 -0
  103. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/_version.py +0 -0
  104. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/__init__.py +0 -0
  105. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/__init__.py +0 -0
  106. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/deps.py +0 -0
  107. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/logs/__init__.py +0 -0
  108. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/logs/generate.py +0 -0
  109. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/logs/query.py +0 -0
  110. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/logs/send.py +0 -0
  111. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/commands/logs/tail.py +0 -0
  112. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/decorators.py +0 -0
  113. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/main.py +0 -0
  114. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/testing.py +0 -0
  115. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/cli/utils.py +0 -0
  116. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/__init__.py +0 -0
  117. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/env.py +0 -0
  118. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/loader.py +0 -0
  119. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/manager.py +0 -0
  120. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/schema.py +0 -0
  121. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/types.py +0 -0
  122. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/config/validators.py +0 -0
  123. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/console/__init__.py +0 -0
  124. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/console/input.py +0 -0
  125. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/console/output.py +0 -0
  126. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/context/__init__.py +0 -0
  127. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/context/core.py +0 -0
  128. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/algorithms.py +0 -0
  129. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/checksums.py +0 -0
  130. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/constants.py +0 -0
  131. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/hashing.py +0 -0
  132. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/keys.py +0 -0
  133. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/signatures.py +0 -0
  134. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/crypto/utils.py +0 -0
  135. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/__init__.py +0 -0
  136. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/auth.py +0 -0
  137. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/base.py +0 -0
  138. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/config.py +0 -0
  139. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/context.py +0 -0
  140. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/decorators.py +0 -0
  141. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/handlers.py +0 -0
  142. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/integration.py +0 -0
  143. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/platform.py +0 -0
  144. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/process.py +0 -0
  145. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/resources.py +0 -0
  146. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/runtime.py +0 -0
  147. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/safe_decorators.py +0 -0
  148. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/errors/types.py +0 -0
  149. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/__init__.py +0 -0
  150. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/atomic.py +0 -0
  151. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/directory.py +0 -0
  152. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/formats.py +0 -0
  153. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/lock.py +0 -0
  154. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/safe.py +0 -0
  155. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/file/utils.py +0 -0
  156. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/__init__.py +0 -0
  157. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/click_builder.py +0 -0
  158. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/commands.py +0 -0
  159. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/decorators.py +0 -0
  160. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/info.py +0 -0
  161. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/manager.py +0 -0
  162. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/registry.py +0 -0
  163. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/type_mapping.py +0 -0
  164. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/hub/types.py +0 -0
  165. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/base.py +0 -0
  166. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/config/__init__.py +0 -0
  167. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/config/base.py +0 -0
  168. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/config/telemetry.py +0 -0
  169. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/processors/__init__.py +0 -0
  170. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/processors/trace.py +0 -0
  171. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/ratelimit/__init__.py +0 -0
  172. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/ratelimit/limiters.py +0 -0
  173. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/ratelimit/processor.py +0 -0
  174. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/ratelimit/queue_limiter.py +0 -0
  175. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/logger/setup/testing.py +0 -0
  176. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/metrics/__init__.py +0 -0
  177. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/metrics/simple.py +0 -0
  178. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/__init__.py +0 -0
  179. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/__init__.py +0 -0
  180. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/auth.py +0 -0
  181. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/client.py +0 -0
  182. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/commands.py +0 -0
  183. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/exceptions.py +0 -0
  184. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/formatters.py +0 -0
  185. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/models.py +0 -0
  186. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/otlp.py +0 -0
  187. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/search.py +0 -0
  188. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/observability/openobserve/streaming.py +0 -0
  189. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/platform/__init__.py +0 -0
  190. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/platform/detection.py +0 -0
  191. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/platform/info.py +0 -0
  192. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/process/__init__.py +0 -0
  193. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/process/async_runner.py +0 -0
  194. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/process/runner.py +0 -0
  195. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/setup/__init__.py +0 -0
  196. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/streams/__init__.py +0 -0
  197. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/streams/console.py +0 -0
  198. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/streams/core.py +0 -0
  199. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/streams/file.py +0 -0
  200. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/cli.py +0 -0
  201. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/crypto.py +0 -0
  202. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/fixtures.py +0 -0
  203. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/hub.py +0 -0
  204. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/testing/streams.py +0 -0
  205. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/tracer/__init__.py +0 -0
  206. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/tracer/context.py +0 -0
  207. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/tracer/spans.py +0 -0
  208. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/types.py +0 -0
  209. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/__init__.py +0 -0
  210. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/deps.py +0 -0
  211. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/env.py +0 -0
  212. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/formatting.py +0 -0
  213. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/parsing.py +0 -0
  214. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/rate_limiting.py +0 -0
  215. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/streams.py +0 -0
  216. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide/foundation/utils/timing.py +0 -0
  217. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/dependency_links.txt +0 -0
  218. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/entry_points.txt +0 -0
  219. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/src/provide_foundation.egg-info/top_level.txt +0 -0
  220. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/tests/test_unused_modules.py +0 -0
  221. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/tests/test_version_coverage.py +0 -0
  222. {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev1}/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.dev1
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.dev1
@@ -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
@@ -112,7 +122,21 @@ python_files = ["test_*.py", "*_test.py"]
112
122
  python_classes = ["Test*", "*Tests"]
113
123
  python_functions = ["test_*", "*_test"]
114
124
  markers = [
115
- "serial: run tests serially to avoid conflicts on global state",
125
+ "serial: run tests serially to avoid event loop conflicts",
126
+ "async_unsafe: async tests that must run serially",
127
+ "unit: fast unit tests",
128
+ "integration: integration tests requiring setup",
129
+ "slow: tests taking >1s",
130
+ "fast: tests taking <100ms",
131
+ # Module markers
132
+ "archive: archive module tests",
133
+ "process: process/subprocess tests",
134
+ "network: network/transport tests",
135
+ "config: configuration tests",
136
+ "logger: logging tests",
137
+ # Skip conditions
138
+ "requires_docker: skip if docker not available",
139
+ "requires_network: skip if offline",
116
140
  ]
117
141
  filterwarnings = [
118
142
  "ignore::DeprecationWarning",
@@ -127,7 +151,8 @@ norecursedirs = [
127
151
  "htmlcov", "docs/_build",
128
152
  ".hypothesis", # Added to address the warning
129
153
  ]
130
- addopts = "-ra -q --color=yes --benchmark-columns=min,max,mean,stddev,median,iqr,ops --benchmark-sort=mean"
154
+ # Changed from -ra to -rFE to suppress skipped test output
155
+ addopts = "-rFE -q --color=yes --benchmark-columns=min,max,mean,stddev,median,iqr,ops --benchmark-sort=mean"
131
156
 
132
157
  ################################################################################
133
158
  # Ruff Linter and Formatter Configuration
@@ -39,17 +39,12 @@ from provide.foundation.logger import (
39
39
  setup_logging, # Setup function (backward compatibility)
40
40
  )
41
41
 
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,
42
+ # Event set exports
43
+ from provide.foundation.eventsets.display import show_event_matrix
44
+ from provide.foundation.eventsets.types import (
45
+ EventMapping,
46
+ EventSet,
47
+ FieldMapping,
53
48
  )
54
49
  from provide.foundation.setup import (
55
50
  setup_telemetry,
@@ -93,15 +88,15 @@ def __getattr__(name: str):
93
88
 
94
89
 
95
90
  __all__ = [
96
- # Core Emoji Dictionaries (available for direct use or reference)
97
- "PRIMARY_EMOJI",
98
- "SECONDARY_EMOJI",
99
- "TERTIARY_EMOJI",
91
+ # Event enrichment utilities
92
+ "show_event_matrix",
100
93
  "ConsoleFormatterStr",
101
94
  # New foundation modules
102
95
  "Context",
103
- # Emoji Mapping classes
104
- "EmojiSet",
96
+ # Event set types
97
+ "EventMapping",
98
+ "EventSet",
99
+ "FieldMapping",
105
100
  # Error handling essentials
106
101
  "FoundationError",
107
102
  # Type aliases
@@ -115,8 +110,6 @@ __all__ = [
115
110
  "get_component_registry",
116
111
  "get_hub",
117
112
  "clear_hub",
118
- "FieldToEmojiMapping",
119
- "EmojiSetConfig",
120
113
  # Configuration classes
121
114
  "TelemetryConfig",
122
115
  # Version
@@ -141,7 +134,6 @@ __all__ = [
141
134
  "setup_logger", # Consistent naming
142
135
  "setup_telemetry",
143
136
  # Utilities
144
- "show_emoji_matrix",
145
137
  "shutdown_foundation_telemetry",
146
138
  "timed_block",
147
139
  # 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
@@ -0,0 +1,159 @@
1
+ """GZIP compression implementation."""
2
+
3
+ import gzip
4
+ import shutil
5
+ from io import BytesIO
6
+ from pathlib import Path
7
+ from typing import BinaryIO
8
+
9
+ from attrs import define, field
10
+
11
+ from provide.foundation.archive.base import ArchiveError
12
+ from provide.foundation.file import ensure_parent_dir
13
+ from provide.foundation.file.utils import get_size
14
+ from provide.foundation.logger import get_logger
15
+
16
+ logger = get_logger(__name__)
17
+
18
+
19
+ @define(slots=True)
20
+ class GzipCompressor:
21
+ """
22
+ GZIP compression implementation.
23
+
24
+ Provides GZIP compression and decompression for single files.
25
+ Does not handle bundling - use with TarArchive for .tar.gz files.
26
+ """
27
+
28
+ level: int = field(default=6) # Compression level 1-9 (1=fast, 9=best)
29
+
30
+ @level.validator
31
+ def _validate_level(self, attribute, value):
32
+ if not 1 <= value <= 9:
33
+ raise ValueError(f"Compression level must be 1-9, got {value}")
34
+
35
+ def compress(self, input_stream: BinaryIO, output_stream: BinaryIO) -> None:
36
+ """
37
+ Compress data from input stream to output stream.
38
+
39
+ Args:
40
+ input_stream: Input binary stream
41
+ output_stream: Output binary stream
42
+
43
+ Raises:
44
+ ArchiveError: If compression fails
45
+ """
46
+ try:
47
+ with gzip.GzipFile(fileobj=output_stream, mode='wb', compresslevel=self.level) as gz:
48
+ shutil.copyfileobj(input_stream, gz)
49
+ logger.debug(f"Compressed data with GZIP level {self.level}")
50
+ except Exception as e:
51
+ raise ArchiveError(f"Failed to compress with GZIP: {e}") from e
52
+
53
+ def decompress(self, input_stream: BinaryIO, output_stream: BinaryIO) -> None:
54
+ """
55
+ Decompress data from input stream to output stream.
56
+
57
+ Args:
58
+ input_stream: Input binary stream (gzipped)
59
+ output_stream: Output binary stream
60
+
61
+ Raises:
62
+ ArchiveError: If decompression fails
63
+ """
64
+ try:
65
+ with gzip.GzipFile(fileobj=input_stream, mode='rb') as gz:
66
+ shutil.copyfileobj(gz, output_stream)
67
+ logger.debug("Decompressed GZIP data")
68
+ except Exception as e:
69
+ raise ArchiveError(f"Failed to decompress GZIP: {e}") from e
70
+
71
+ def compress_file(self, input_path: Path, output_path: Path) -> Path:
72
+ """
73
+ Compress a file.
74
+
75
+ Args:
76
+ input_path: Input file path
77
+ output_path: Output file path (should end with .gz)
78
+
79
+ Returns:
80
+ Path to compressed file
81
+
82
+ Raises:
83
+ ArchiveError: If compression fails
84
+ """
85
+ try:
86
+ ensure_parent_dir(output_path)
87
+
88
+ with open(input_path, 'rb') as f_in:
89
+ with gzip.open(output_path, 'wb', compresslevel=self.level) as f_out:
90
+ shutil.copyfileobj(f_in, f_out)
91
+
92
+ logger.debug(f"Compressed {input_path} to {output_path}")
93
+ return output_path
94
+
95
+ except Exception as e:
96
+ raise ArchiveError(f"Failed to compress file: {e}") from e
97
+
98
+ def decompress_file(self, input_path: Path, output_path: Path) -> Path:
99
+ """
100
+ Decompress a file.
101
+
102
+ Args:
103
+ input_path: Input file path (gzipped)
104
+ output_path: Output file path
105
+
106
+ Returns:
107
+ Path to decompressed file
108
+
109
+ Raises:
110
+ ArchiveError: If decompression fails
111
+ """
112
+ try:
113
+ ensure_parent_dir(output_path)
114
+
115
+ with gzip.open(input_path, 'rb') as f_in:
116
+ with open(output_path, 'wb') as f_out:
117
+ shutil.copyfileobj(f_in, f_out)
118
+
119
+ logger.debug(f"Decompressed {input_path} to {output_path}")
120
+ return output_path
121
+
122
+ except Exception as e:
123
+ raise ArchiveError(f"Failed to decompress file: {e}") from e
124
+
125
+ def compress_bytes(self, data: bytes) -> bytes:
126
+ """
127
+ Compress bytes data.
128
+
129
+ Args:
130
+ data: Input bytes
131
+
132
+ Returns:
133
+ Compressed bytes
134
+
135
+ Raises:
136
+ ArchiveError: If compression fails
137
+ """
138
+ try:
139
+ return gzip.compress(data, compresslevel=self.level)
140
+ except Exception as e:
141
+ raise ArchiveError(f"Failed to compress bytes: {e}") from e
142
+
143
+ def decompress_bytes(self, data: bytes) -> bytes:
144
+ """
145
+ Decompress bytes data.
146
+
147
+ Args:
148
+ data: Compressed bytes
149
+
150
+ Returns:
151
+ Decompressed bytes
152
+
153
+ Raises:
154
+ ArchiveError: If decompression fails
155
+ """
156
+ try:
157
+ return gzip.decompress(data)
158
+ except Exception as e:
159
+ raise ArchiveError(f"Failed to decompress bytes: {e}") from e