provide-foundation 0.0.0.dev0__py3-none-any.whl
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/__init__.py +15 -0
- provide/foundation/__init__.py +155 -0
- provide/foundation/_version.py +58 -0
- provide/foundation/cli/__init__.py +67 -0
- provide/foundation/cli/commands/__init__.py +3 -0
- provide/foundation/cli/commands/deps.py +71 -0
- provide/foundation/cli/commands/logs/__init__.py +63 -0
- provide/foundation/cli/commands/logs/generate.py +357 -0
- provide/foundation/cli/commands/logs/generate_old.py +569 -0
- provide/foundation/cli/commands/logs/query.py +174 -0
- provide/foundation/cli/commands/logs/send.py +166 -0
- provide/foundation/cli/commands/logs/tail.py +112 -0
- provide/foundation/cli/decorators.py +262 -0
- provide/foundation/cli/main.py +65 -0
- provide/foundation/cli/testing.py +220 -0
- provide/foundation/cli/utils.py +210 -0
- provide/foundation/config/__init__.py +106 -0
- provide/foundation/config/base.py +295 -0
- provide/foundation/config/env.py +369 -0
- provide/foundation/config/loader.py +311 -0
- provide/foundation/config/manager.py +387 -0
- provide/foundation/config/schema.py +284 -0
- provide/foundation/config/sync.py +281 -0
- provide/foundation/config/types.py +78 -0
- provide/foundation/config/validators.py +80 -0
- provide/foundation/console/__init__.py +29 -0
- provide/foundation/console/input.py +364 -0
- provide/foundation/console/output.py +178 -0
- provide/foundation/context/__init__.py +12 -0
- provide/foundation/context/core.py +356 -0
- provide/foundation/core.py +20 -0
- provide/foundation/crypto/__init__.py +182 -0
- provide/foundation/crypto/algorithms.py +111 -0
- provide/foundation/crypto/certificates.py +896 -0
- provide/foundation/crypto/checksums.py +301 -0
- provide/foundation/crypto/constants.py +57 -0
- provide/foundation/crypto/hashing.py +265 -0
- provide/foundation/crypto/keys.py +188 -0
- provide/foundation/crypto/signatures.py +144 -0
- provide/foundation/crypto/utils.py +164 -0
- provide/foundation/errors/__init__.py +96 -0
- provide/foundation/errors/auth.py +73 -0
- provide/foundation/errors/base.py +81 -0
- provide/foundation/errors/config.py +103 -0
- provide/foundation/errors/context.py +299 -0
- provide/foundation/errors/decorators.py +484 -0
- provide/foundation/errors/handlers.py +360 -0
- provide/foundation/errors/integration.py +105 -0
- provide/foundation/errors/platform.py +37 -0
- provide/foundation/errors/process.py +140 -0
- provide/foundation/errors/resources.py +133 -0
- provide/foundation/errors/runtime.py +160 -0
- provide/foundation/errors/safe_decorators.py +133 -0
- provide/foundation/errors/types.py +276 -0
- provide/foundation/file/__init__.py +79 -0
- provide/foundation/file/atomic.py +157 -0
- provide/foundation/file/directory.py +134 -0
- provide/foundation/file/formats.py +236 -0
- provide/foundation/file/lock.py +175 -0
- provide/foundation/file/safe.py +179 -0
- provide/foundation/file/utils.py +170 -0
- provide/foundation/hub/__init__.py +88 -0
- provide/foundation/hub/click_builder.py +310 -0
- provide/foundation/hub/commands.py +42 -0
- provide/foundation/hub/components.py +640 -0
- provide/foundation/hub/decorators.py +244 -0
- provide/foundation/hub/info.py +32 -0
- provide/foundation/hub/manager.py +446 -0
- provide/foundation/hub/registry.py +279 -0
- provide/foundation/hub/type_mapping.py +54 -0
- provide/foundation/hub/types.py +28 -0
- provide/foundation/logger/__init__.py +41 -0
- provide/foundation/logger/base.py +22 -0
- provide/foundation/logger/config/__init__.py +16 -0
- provide/foundation/logger/config/base.py +40 -0
- provide/foundation/logger/config/logging.py +394 -0
- provide/foundation/logger/config/telemetry.py +188 -0
- provide/foundation/logger/core.py +239 -0
- provide/foundation/logger/custom_processors.py +172 -0
- provide/foundation/logger/emoji/__init__.py +44 -0
- provide/foundation/logger/emoji/matrix.py +209 -0
- provide/foundation/logger/emoji/sets.py +458 -0
- provide/foundation/logger/emoji/types.py +56 -0
- provide/foundation/logger/factories.py +56 -0
- provide/foundation/logger/processors/__init__.py +13 -0
- provide/foundation/logger/processors/main.py +254 -0
- provide/foundation/logger/processors/trace.py +113 -0
- provide/foundation/logger/ratelimit/__init__.py +31 -0
- provide/foundation/logger/ratelimit/limiters.py +294 -0
- provide/foundation/logger/ratelimit/processor.py +203 -0
- provide/foundation/logger/ratelimit/queue_limiter.py +305 -0
- provide/foundation/logger/setup/__init__.py +29 -0
- provide/foundation/logger/setup/coordinator.py +138 -0
- provide/foundation/logger/setup/emoji_resolver.py +64 -0
- provide/foundation/logger/setup/processors.py +85 -0
- provide/foundation/logger/setup/testing.py +39 -0
- provide/foundation/logger/trace.py +38 -0
- provide/foundation/metrics/__init__.py +119 -0
- provide/foundation/metrics/otel.py +122 -0
- provide/foundation/metrics/simple.py +165 -0
- provide/foundation/observability/__init__.py +53 -0
- provide/foundation/observability/openobserve/__init__.py +79 -0
- provide/foundation/observability/openobserve/auth.py +72 -0
- provide/foundation/observability/openobserve/client.py +307 -0
- provide/foundation/observability/openobserve/commands.py +357 -0
- provide/foundation/observability/openobserve/exceptions.py +41 -0
- provide/foundation/observability/openobserve/formatters.py +298 -0
- provide/foundation/observability/openobserve/models.py +134 -0
- provide/foundation/observability/openobserve/otlp.py +320 -0
- provide/foundation/observability/openobserve/search.py +222 -0
- provide/foundation/observability/openobserve/streaming.py +235 -0
- provide/foundation/platform/__init__.py +44 -0
- provide/foundation/platform/detection.py +193 -0
- provide/foundation/platform/info.py +157 -0
- provide/foundation/process/__init__.py +39 -0
- provide/foundation/process/async_runner.py +373 -0
- provide/foundation/process/lifecycle.py +406 -0
- provide/foundation/process/runner.py +390 -0
- provide/foundation/setup/__init__.py +101 -0
- provide/foundation/streams/__init__.py +44 -0
- provide/foundation/streams/console.py +57 -0
- provide/foundation/streams/core.py +65 -0
- provide/foundation/streams/file.py +104 -0
- provide/foundation/testing/__init__.py +166 -0
- provide/foundation/testing/cli.py +227 -0
- provide/foundation/testing/crypto.py +163 -0
- provide/foundation/testing/fixtures.py +49 -0
- provide/foundation/testing/hub.py +23 -0
- provide/foundation/testing/logger.py +106 -0
- provide/foundation/testing/streams.py +54 -0
- provide/foundation/tracer/__init__.py +49 -0
- provide/foundation/tracer/context.py +115 -0
- provide/foundation/tracer/otel.py +135 -0
- provide/foundation/tracer/spans.py +174 -0
- provide/foundation/types.py +32 -0
- provide/foundation/utils/__init__.py +97 -0
- provide/foundation/utils/deps.py +195 -0
- provide/foundation/utils/env.py +491 -0
- provide/foundation/utils/formatting.py +483 -0
- provide/foundation/utils/parsing.py +235 -0
- provide/foundation/utils/rate_limiting.py +112 -0
- provide/foundation/utils/streams.py +67 -0
- provide/foundation/utils/timing.py +93 -0
- provide_foundation-0.0.0.dev0.dist-info/METADATA +469 -0
- provide_foundation-0.0.0.dev0.dist-info/RECORD +149 -0
- provide_foundation-0.0.0.dev0.dist-info/WHEEL +5 -0
- provide_foundation-0.0.0.dev0.dist-info/entry_points.txt +2 -0
- provide_foundation-0.0.0.dev0.dist-info/licenses/LICENSE +201 -0
- provide_foundation-0.0.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
"""
|
2
|
+
Utility modules for provide.foundation.
|
3
|
+
|
4
|
+
Common utilities that can be used across the foundation and by other packages.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from provide.foundation.utils.deps import (
|
8
|
+
DependencyStatus,
|
9
|
+
check_optional_deps,
|
10
|
+
get_available_features,
|
11
|
+
get_optional_dependencies,
|
12
|
+
has_dependency,
|
13
|
+
require_dependency,
|
14
|
+
)
|
15
|
+
from provide.foundation.utils.env import (
|
16
|
+
EnvPrefix,
|
17
|
+
get_bool,
|
18
|
+
get_dict,
|
19
|
+
get_float,
|
20
|
+
get_int,
|
21
|
+
get_list,
|
22
|
+
get_path,
|
23
|
+
get_str,
|
24
|
+
parse_duration,
|
25
|
+
parse_size,
|
26
|
+
require,
|
27
|
+
)
|
28
|
+
from provide.foundation.utils.formatting import (
|
29
|
+
format_duration,
|
30
|
+
format_number,
|
31
|
+
format_percentage,
|
32
|
+
format_size,
|
33
|
+
format_table,
|
34
|
+
indent,
|
35
|
+
pluralize,
|
36
|
+
strip_ansi,
|
37
|
+
to_camel_case,
|
38
|
+
to_kebab_case,
|
39
|
+
to_snake_case,
|
40
|
+
truncate,
|
41
|
+
wrap_text,
|
42
|
+
)
|
43
|
+
from provide.foundation.utils.parsing import (
|
44
|
+
auto_parse,
|
45
|
+
parse_bool,
|
46
|
+
parse_dict,
|
47
|
+
parse_list,
|
48
|
+
parse_typed_value,
|
49
|
+
)
|
50
|
+
from provide.foundation.utils.rate_limiting import TokenBucketRateLimiter
|
51
|
+
from provide.foundation.utils.timing import timed_block
|
52
|
+
|
53
|
+
__all__ = [
|
54
|
+
"EnvPrefix",
|
55
|
+
# Parsing utilities
|
56
|
+
"auto_parse",
|
57
|
+
# Dependency checking utilities
|
58
|
+
"check_optional_deps",
|
59
|
+
"DependencyStatus",
|
60
|
+
"format_duration",
|
61
|
+
"format_number",
|
62
|
+
"format_percentage",
|
63
|
+
# Formatting utilities
|
64
|
+
"format_size",
|
65
|
+
"format_table",
|
66
|
+
"get_available_features",
|
67
|
+
# Environment utilities
|
68
|
+
"get_bool",
|
69
|
+
"get_dict",
|
70
|
+
"get_float",
|
71
|
+
"get_int",
|
72
|
+
"get_list",
|
73
|
+
"get_optional_dependencies",
|
74
|
+
"get_path",
|
75
|
+
"get_str",
|
76
|
+
"has_dependency",
|
77
|
+
"indent",
|
78
|
+
"parse_bool",
|
79
|
+
"parse_dict",
|
80
|
+
"parse_duration",
|
81
|
+
"parse_list",
|
82
|
+
"parse_size",
|
83
|
+
"parse_typed_value",
|
84
|
+
"pluralize",
|
85
|
+
"require",
|
86
|
+
"require_dependency",
|
87
|
+
"strip_ansi",
|
88
|
+
# Timing utilities
|
89
|
+
"timed_block",
|
90
|
+
"to_camel_case",
|
91
|
+
# Rate limiting utilities
|
92
|
+
"TokenBucketRateLimiter",
|
93
|
+
"to_kebab_case",
|
94
|
+
"to_snake_case",
|
95
|
+
"truncate",
|
96
|
+
"wrap_text",
|
97
|
+
]
|
@@ -0,0 +1,195 @@
|
|
1
|
+
"""Optional dependency checking utilities."""
|
2
|
+
|
3
|
+
from typing import NamedTuple
|
4
|
+
|
5
|
+
from provide.foundation.logger import get_logger
|
6
|
+
|
7
|
+
log = get_logger(__name__)
|
8
|
+
|
9
|
+
|
10
|
+
class DependencyStatus(NamedTuple):
|
11
|
+
"""Status of an optional dependency."""
|
12
|
+
|
13
|
+
name: str
|
14
|
+
available: bool
|
15
|
+
version: str | None
|
16
|
+
description: str
|
17
|
+
|
18
|
+
|
19
|
+
def _check_click() -> DependencyStatus:
|
20
|
+
"""Check click availability."""
|
21
|
+
try:
|
22
|
+
import click
|
23
|
+
|
24
|
+
# Use importlib.metadata to avoid deprecation warning
|
25
|
+
try:
|
26
|
+
from importlib.metadata import version
|
27
|
+
|
28
|
+
ver = version("click")
|
29
|
+
except Exception:
|
30
|
+
ver = "unknown"
|
31
|
+
return DependencyStatus(
|
32
|
+
name="click",
|
33
|
+
available=True,
|
34
|
+
version=ver,
|
35
|
+
description="CLI features (console I/O, command building)",
|
36
|
+
)
|
37
|
+
except ImportError:
|
38
|
+
return DependencyStatus(
|
39
|
+
name="click",
|
40
|
+
available=False,
|
41
|
+
version=None,
|
42
|
+
description="CLI features (console I/O, command building)",
|
43
|
+
)
|
44
|
+
|
45
|
+
|
46
|
+
def _check_cryptography() -> DependencyStatus:
|
47
|
+
"""Check cryptography availability."""
|
48
|
+
try:
|
49
|
+
import cryptography
|
50
|
+
|
51
|
+
return DependencyStatus(
|
52
|
+
name="cryptography",
|
53
|
+
available=True,
|
54
|
+
version=cryptography.__version__,
|
55
|
+
description="Crypto features (keys, certificates, signatures)",
|
56
|
+
)
|
57
|
+
except ImportError:
|
58
|
+
return DependencyStatus(
|
59
|
+
name="cryptography",
|
60
|
+
available=False,
|
61
|
+
version=None,
|
62
|
+
description="Crypto features (keys, certificates, signatures)",
|
63
|
+
)
|
64
|
+
|
65
|
+
|
66
|
+
def _check_opentelemetry() -> DependencyStatus:
|
67
|
+
"""Check OpenTelemetry availability."""
|
68
|
+
try:
|
69
|
+
import opentelemetry
|
70
|
+
|
71
|
+
try:
|
72
|
+
from importlib.metadata import version
|
73
|
+
|
74
|
+
ver = version("opentelemetry-api")
|
75
|
+
except Exception:
|
76
|
+
ver = "unknown"
|
77
|
+
return DependencyStatus(
|
78
|
+
name="opentelemetry",
|
79
|
+
available=True,
|
80
|
+
version=ver,
|
81
|
+
description="Enhanced telemetry and tracing",
|
82
|
+
)
|
83
|
+
except ImportError:
|
84
|
+
return DependencyStatus(
|
85
|
+
name="opentelemetry",
|
86
|
+
available=False,
|
87
|
+
version=None,
|
88
|
+
description="Enhanced telemetry and tracing",
|
89
|
+
)
|
90
|
+
|
91
|
+
|
92
|
+
def get_optional_dependencies() -> list[DependencyStatus]:
|
93
|
+
"""Get status of all optional dependencies.
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
List of dependency status objects
|
97
|
+
"""
|
98
|
+
return [
|
99
|
+
_check_click(),
|
100
|
+
_check_cryptography(),
|
101
|
+
_check_opentelemetry(),
|
102
|
+
]
|
103
|
+
|
104
|
+
|
105
|
+
def check_optional_deps(
|
106
|
+
*, quiet: bool = False, return_status: bool = False
|
107
|
+
) -> list[DependencyStatus] | None:
|
108
|
+
"""Check and display optional dependency status.
|
109
|
+
|
110
|
+
Args:
|
111
|
+
quiet: If True, don't print status (just return it)
|
112
|
+
return_status: If True, return the status list
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
Optional list of dependency statuses if return_status=True
|
116
|
+
"""
|
117
|
+
deps = get_optional_dependencies()
|
118
|
+
|
119
|
+
if not quiet:
|
120
|
+
print("📦 provide-foundation Optional Dependencies Status")
|
121
|
+
print("=" * 50)
|
122
|
+
|
123
|
+
available_count = sum(1 for dep in deps if dep.available)
|
124
|
+
total_count = len(deps)
|
125
|
+
|
126
|
+
for dep in deps:
|
127
|
+
status_icon = "✅" if dep.available else "❌"
|
128
|
+
version_info = f" (v{dep.version})" if dep.version else ""
|
129
|
+
print(f" {status_icon} {dep.name}{version_info}")
|
130
|
+
print(f" {dep.description}")
|
131
|
+
if not dep.available:
|
132
|
+
print(
|
133
|
+
f" Install with: pip install 'provide-foundation[{dep.name}]'"
|
134
|
+
)
|
135
|
+
print()
|
136
|
+
|
137
|
+
print(
|
138
|
+
f"📊 Summary: {available_count}/{total_count} optional dependencies available"
|
139
|
+
)
|
140
|
+
|
141
|
+
if available_count == total_count:
|
142
|
+
print("🎉 All optional features are available!")
|
143
|
+
elif available_count == 0:
|
144
|
+
print(
|
145
|
+
"💡 Install optional features with: pip install 'provide-foundation[all]'"
|
146
|
+
)
|
147
|
+
else:
|
148
|
+
missing = [dep.name for dep in deps if not dep.available]
|
149
|
+
print(f"💡 Missing features: {', '.join(missing)}")
|
150
|
+
|
151
|
+
if return_status:
|
152
|
+
return deps
|
153
|
+
return None
|
154
|
+
|
155
|
+
|
156
|
+
def has_dependency(name: str) -> bool:
|
157
|
+
"""Check if a specific optional dependency is available.
|
158
|
+
|
159
|
+
Args:
|
160
|
+
name: Name of the dependency to check
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
True if dependency is available
|
164
|
+
"""
|
165
|
+
deps = get_optional_dependencies()
|
166
|
+
for dep in deps:
|
167
|
+
if dep.name == name:
|
168
|
+
return dep.available
|
169
|
+
return False
|
170
|
+
|
171
|
+
|
172
|
+
def require_dependency(name: str) -> None:
|
173
|
+
"""Require a specific optional dependency, raise ImportError if missing.
|
174
|
+
|
175
|
+
Args:
|
176
|
+
name: Name of the dependency to require
|
177
|
+
|
178
|
+
Raises:
|
179
|
+
ImportError: If dependency is not available
|
180
|
+
"""
|
181
|
+
if not has_dependency(name):
|
182
|
+
raise ImportError(
|
183
|
+
f"Optional dependency '{name}' is required for this feature. "
|
184
|
+
f"Install with: pip install 'provide-foundation[{name}]'"
|
185
|
+
)
|
186
|
+
|
187
|
+
|
188
|
+
def get_available_features() -> dict[str, bool]:
|
189
|
+
"""Get a dictionary of available optional features.
|
190
|
+
|
191
|
+
Returns:
|
192
|
+
Dictionary mapping feature names to availability
|
193
|
+
"""
|
194
|
+
deps = get_optional_dependencies()
|
195
|
+
return {dep.name: dep.available for dep in deps}
|