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.
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/PKG-INFO +5 -28
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/README.md +2 -27
- provide_foundation-0.0.0.dev2/VERSION +1 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/pyproject.toml +30 -4
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/__init__.py +41 -23
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/__init__.py +23 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/base.py +70 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/bzip2.py +157 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/gzip.py +159 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/operations.py +334 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/tar.py +164 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/archive/zip.py +203 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/__init__.py +2 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/deps.py +13 -7
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/__init__.py +1 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/query.py +1 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/send.py +1 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/tail.py +1 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/decorators.py +11 -10
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/main.py +1 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/testing.py +2 -35
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/utils.py +21 -17
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/__init__.py +35 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/base.py +2 -2
- provide_foundation-0.0.0.dev2/src/provide/foundation/config/converters.py +479 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/config/defaults.py +67 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/env.py +4 -19
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/loader.py +9 -3
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/sync.py +19 -4
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/input.py +5 -5
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/output.py +35 -13
- provide_foundation-0.0.0.dev2/src/provide/foundation/context/__init__.py +16 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/context/core.py +85 -109
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/core.py +1 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/__init__.py +2 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/__init__.py +34 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/base.py +173 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/certificate.py +290 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/factory.py +213 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/generator.py +138 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/loader.py +130 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/operations.py +198 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/crypto/certificates/trust.py +107 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/__init__.py +2 -3
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/decorators.py +0 -231
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/types.py +0 -97
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/__init__.py +0 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/display.py +84 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/registry.py +160 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/resolver.py +192 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/das.py +128 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/database.py +125 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/http.py +153 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/llm.py +139 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/sets/task_queue.py +107 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/eventsets/types.py +70 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/directory.py +13 -22
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/lock.py +3 -1
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/components.py +202 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/config.py +151 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/discovery.py +62 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/handlers.py +81 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/lifecycle.py +194 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/manager.py +4 -4
- provide_foundation-0.0.0.dev2/src/provide/foundation/hub/processors.py +44 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/integrations/__init__.py +11 -0
- {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
- {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
- {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
- {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
- provide_foundation-0.0.0.dev2/src/provide/foundation/integrations/openobserve/config.py +37 -0
- {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
- {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
- {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
- {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
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/__init__.py +3 -10
- provide_foundation-0.0.0.dev2/src/provide/foundation/logger/config/logging.py +164 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/logger/config/telemetry.py +108 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/core.py +0 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/custom_processors.py +1 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/factories.py +11 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/main.py +20 -84
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/__init__.py +5 -1
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/coordinator.py +76 -24
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/processors.py +2 -9
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/trace.py +27 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/otel.py +10 -10
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/observability/__init__.py +2 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/__init__.py +9 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/process/exit.py +47 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/lifecycle.py +115 -59
- provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/__init__.py +35 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/circuit.py +164 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/decorators.py +220 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/fallback.py +193 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/resilience/retry.py +325 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/streams/config.py +79 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/console.py +7 -8
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/core.py +6 -3
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/file.py +12 -2
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/__init__.py +84 -2
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/archive/__init__.py +24 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/archive/fixtures.py +217 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/cli.py +30 -17
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/common/__init__.py +32 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/common/fixtures.py +236 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/__init__.py +40 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/content_fixtures.py +316 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/directory_fixtures.py +107 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/fixtures.py +52 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/file/special_fixtures.py +153 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/logger.py +212 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/mocking/__init__.py +46 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/mocking/fixtures.py +331 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/__init__.py +48 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/async_fixtures.py +405 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/fixtures.py +56 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/process/subprocess_fixtures.py +209 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/__init__.py +38 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/basic_fixtures.py +101 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/data_fixtures.py +99 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/execution_fixtures.py +263 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/fixtures.py +54 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/threading/sync_fixtures.py +97 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/time/__init__.py +32 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/time/fixtures.py +409 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/transport/__init__.py +30 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/testing/transport/fixtures.py +280 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/__init__.py +58 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/base.py +348 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/cache.py +268 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/downloader.py +224 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/installer.py +254 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/registry.py +223 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/resolver.py +321 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/tools/verifier.py +186 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/otel.py +7 -11
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/spans.py +2 -2
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/__init__.py +155 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/base.py +171 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/client.py +266 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/config.py +140 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/errors.py +79 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/http.py +232 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/middleware.py +360 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/registry.py +167 -0
- provide_foundation-0.0.0.dev2/src/provide/foundation/transport/types.py +45 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/deps.py +14 -12
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/parsing.py +49 -4
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/PKG-INFO +5 -28
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/SOURCES.txt +96 -18
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/requires.txt +4 -1
- provide_foundation-0.0.0.dev2/tests/test_component_registry_core.py +325 -0
- provide_foundation-0.0.0.dev2/tests/test_component_registry_handlers.py +311 -0
- provide_foundation-0.0.0.dev2/tests/test_component_registry_sets.py +152 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_init_coverage.py +8 -12
- provide_foundation-0.0.0.dev0/VERSION +0 -1
- provide_foundation-0.0.0.dev0/src/provide/foundation/cli/commands/logs/generate_old.py +0 -569
- provide_foundation-0.0.0.dev0/src/provide/foundation/context/__init__.py +0 -12
- provide_foundation-0.0.0.dev0/src/provide/foundation/crypto/certificates.py +0 -896
- provide_foundation-0.0.0.dev0/src/provide/foundation/hub/components.py +0 -640
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/config/logging.py +0 -394
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/config/telemetry.py +0 -188
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/__init__.py +0 -44
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/matrix.py +0 -209
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/sets.py +0 -458
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/emoji/types.py +0 -56
- provide_foundation-0.0.0.dev0/src/provide/foundation/logger/setup/emoji_resolver.py +0 -64
- provide_foundation-0.0.0.dev0/src/provide/foundation/testing/logger.py +0 -106
- provide_foundation-0.0.0.dev0/tests/test_component_registry.py +0 -882
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/LICENSE +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/setup.cfg +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/_version.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/cli/commands/logs/generate.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/manager.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/schema.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/types.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/config/validators.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/console/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/algorithms.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/checksums.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/constants.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/hashing.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/keys.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/signatures.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/crypto/utils.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/auth.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/base.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/config.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/context.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/handlers.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/integration.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/platform.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/process.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/resources.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/runtime.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/errors/safe_decorators.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/atomic.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/formats.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/safe.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/file/utils.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/click_builder.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/commands.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/decorators.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/info.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/registry.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/type_mapping.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/hub/types.py +0 -0
- {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
- {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
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/base.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/config/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/config/base.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/processors/trace.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/limiters.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/processor.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/ratelimit/queue_limiter.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/logger/setup/testing.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/metrics/simple.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/detection.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/platform/info.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/async_runner.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/process/runner.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/setup/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/streams/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/crypto.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/fixtures.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/hub.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/testing/streams.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/tracer/context.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/types.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/__init__.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/env.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/formatting.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/rate_limiting.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/streams.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/utils/timing.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/dependency_links.txt +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/entry_points.txt +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide_foundation.egg-info/top_level.txt +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_unused_modules.py +0 -0
- {provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/tests/test_version_coverage.py +0 -0
- {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.
|
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">
|
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">
|
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",
|
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
|
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
|
-
|
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
|
{provide_foundation-0.0.0.dev0 → provide_foundation-0.0.0.dev2}/src/provide/foundation/__init__.py
RENAMED
@@ -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
|
-
#
|
43
|
-
from provide.foundation.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
#
|
97
|
-
"
|
98
|
-
"SECONDARY_EMOJI",
|
99
|
-
"TERTIARY_EMOJI",
|
104
|
+
# Event enrichment utilities
|
105
|
+
"show_event_matrix",
|
100
106
|
"ConsoleFormatterStr",
|
101
107
|
# New foundation modules
|
102
|
-
"
|
103
|
-
#
|
104
|
-
|
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
|