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.
Files changed (149) hide show
  1. provide/__init__.py +15 -0
  2. provide/foundation/__init__.py +155 -0
  3. provide/foundation/_version.py +58 -0
  4. provide/foundation/cli/__init__.py +67 -0
  5. provide/foundation/cli/commands/__init__.py +3 -0
  6. provide/foundation/cli/commands/deps.py +71 -0
  7. provide/foundation/cli/commands/logs/__init__.py +63 -0
  8. provide/foundation/cli/commands/logs/generate.py +357 -0
  9. provide/foundation/cli/commands/logs/generate_old.py +569 -0
  10. provide/foundation/cli/commands/logs/query.py +174 -0
  11. provide/foundation/cli/commands/logs/send.py +166 -0
  12. provide/foundation/cli/commands/logs/tail.py +112 -0
  13. provide/foundation/cli/decorators.py +262 -0
  14. provide/foundation/cli/main.py +65 -0
  15. provide/foundation/cli/testing.py +220 -0
  16. provide/foundation/cli/utils.py +210 -0
  17. provide/foundation/config/__init__.py +106 -0
  18. provide/foundation/config/base.py +295 -0
  19. provide/foundation/config/env.py +369 -0
  20. provide/foundation/config/loader.py +311 -0
  21. provide/foundation/config/manager.py +387 -0
  22. provide/foundation/config/schema.py +284 -0
  23. provide/foundation/config/sync.py +281 -0
  24. provide/foundation/config/types.py +78 -0
  25. provide/foundation/config/validators.py +80 -0
  26. provide/foundation/console/__init__.py +29 -0
  27. provide/foundation/console/input.py +364 -0
  28. provide/foundation/console/output.py +178 -0
  29. provide/foundation/context/__init__.py +12 -0
  30. provide/foundation/context/core.py +356 -0
  31. provide/foundation/core.py +20 -0
  32. provide/foundation/crypto/__init__.py +182 -0
  33. provide/foundation/crypto/algorithms.py +111 -0
  34. provide/foundation/crypto/certificates.py +896 -0
  35. provide/foundation/crypto/checksums.py +301 -0
  36. provide/foundation/crypto/constants.py +57 -0
  37. provide/foundation/crypto/hashing.py +265 -0
  38. provide/foundation/crypto/keys.py +188 -0
  39. provide/foundation/crypto/signatures.py +144 -0
  40. provide/foundation/crypto/utils.py +164 -0
  41. provide/foundation/errors/__init__.py +96 -0
  42. provide/foundation/errors/auth.py +73 -0
  43. provide/foundation/errors/base.py +81 -0
  44. provide/foundation/errors/config.py +103 -0
  45. provide/foundation/errors/context.py +299 -0
  46. provide/foundation/errors/decorators.py +484 -0
  47. provide/foundation/errors/handlers.py +360 -0
  48. provide/foundation/errors/integration.py +105 -0
  49. provide/foundation/errors/platform.py +37 -0
  50. provide/foundation/errors/process.py +140 -0
  51. provide/foundation/errors/resources.py +133 -0
  52. provide/foundation/errors/runtime.py +160 -0
  53. provide/foundation/errors/safe_decorators.py +133 -0
  54. provide/foundation/errors/types.py +276 -0
  55. provide/foundation/file/__init__.py +79 -0
  56. provide/foundation/file/atomic.py +157 -0
  57. provide/foundation/file/directory.py +134 -0
  58. provide/foundation/file/formats.py +236 -0
  59. provide/foundation/file/lock.py +175 -0
  60. provide/foundation/file/safe.py +179 -0
  61. provide/foundation/file/utils.py +170 -0
  62. provide/foundation/hub/__init__.py +88 -0
  63. provide/foundation/hub/click_builder.py +310 -0
  64. provide/foundation/hub/commands.py +42 -0
  65. provide/foundation/hub/components.py +640 -0
  66. provide/foundation/hub/decorators.py +244 -0
  67. provide/foundation/hub/info.py +32 -0
  68. provide/foundation/hub/manager.py +446 -0
  69. provide/foundation/hub/registry.py +279 -0
  70. provide/foundation/hub/type_mapping.py +54 -0
  71. provide/foundation/hub/types.py +28 -0
  72. provide/foundation/logger/__init__.py +41 -0
  73. provide/foundation/logger/base.py +22 -0
  74. provide/foundation/logger/config/__init__.py +16 -0
  75. provide/foundation/logger/config/base.py +40 -0
  76. provide/foundation/logger/config/logging.py +394 -0
  77. provide/foundation/logger/config/telemetry.py +188 -0
  78. provide/foundation/logger/core.py +239 -0
  79. provide/foundation/logger/custom_processors.py +172 -0
  80. provide/foundation/logger/emoji/__init__.py +44 -0
  81. provide/foundation/logger/emoji/matrix.py +209 -0
  82. provide/foundation/logger/emoji/sets.py +458 -0
  83. provide/foundation/logger/emoji/types.py +56 -0
  84. provide/foundation/logger/factories.py +56 -0
  85. provide/foundation/logger/processors/__init__.py +13 -0
  86. provide/foundation/logger/processors/main.py +254 -0
  87. provide/foundation/logger/processors/trace.py +113 -0
  88. provide/foundation/logger/ratelimit/__init__.py +31 -0
  89. provide/foundation/logger/ratelimit/limiters.py +294 -0
  90. provide/foundation/logger/ratelimit/processor.py +203 -0
  91. provide/foundation/logger/ratelimit/queue_limiter.py +305 -0
  92. provide/foundation/logger/setup/__init__.py +29 -0
  93. provide/foundation/logger/setup/coordinator.py +138 -0
  94. provide/foundation/logger/setup/emoji_resolver.py +64 -0
  95. provide/foundation/logger/setup/processors.py +85 -0
  96. provide/foundation/logger/setup/testing.py +39 -0
  97. provide/foundation/logger/trace.py +38 -0
  98. provide/foundation/metrics/__init__.py +119 -0
  99. provide/foundation/metrics/otel.py +122 -0
  100. provide/foundation/metrics/simple.py +165 -0
  101. provide/foundation/observability/__init__.py +53 -0
  102. provide/foundation/observability/openobserve/__init__.py +79 -0
  103. provide/foundation/observability/openobserve/auth.py +72 -0
  104. provide/foundation/observability/openobserve/client.py +307 -0
  105. provide/foundation/observability/openobserve/commands.py +357 -0
  106. provide/foundation/observability/openobserve/exceptions.py +41 -0
  107. provide/foundation/observability/openobserve/formatters.py +298 -0
  108. provide/foundation/observability/openobserve/models.py +134 -0
  109. provide/foundation/observability/openobserve/otlp.py +320 -0
  110. provide/foundation/observability/openobserve/search.py +222 -0
  111. provide/foundation/observability/openobserve/streaming.py +235 -0
  112. provide/foundation/platform/__init__.py +44 -0
  113. provide/foundation/platform/detection.py +193 -0
  114. provide/foundation/platform/info.py +157 -0
  115. provide/foundation/process/__init__.py +39 -0
  116. provide/foundation/process/async_runner.py +373 -0
  117. provide/foundation/process/lifecycle.py +406 -0
  118. provide/foundation/process/runner.py +390 -0
  119. provide/foundation/setup/__init__.py +101 -0
  120. provide/foundation/streams/__init__.py +44 -0
  121. provide/foundation/streams/console.py +57 -0
  122. provide/foundation/streams/core.py +65 -0
  123. provide/foundation/streams/file.py +104 -0
  124. provide/foundation/testing/__init__.py +166 -0
  125. provide/foundation/testing/cli.py +227 -0
  126. provide/foundation/testing/crypto.py +163 -0
  127. provide/foundation/testing/fixtures.py +49 -0
  128. provide/foundation/testing/hub.py +23 -0
  129. provide/foundation/testing/logger.py +106 -0
  130. provide/foundation/testing/streams.py +54 -0
  131. provide/foundation/tracer/__init__.py +49 -0
  132. provide/foundation/tracer/context.py +115 -0
  133. provide/foundation/tracer/otel.py +135 -0
  134. provide/foundation/tracer/spans.py +174 -0
  135. provide/foundation/types.py +32 -0
  136. provide/foundation/utils/__init__.py +97 -0
  137. provide/foundation/utils/deps.py +195 -0
  138. provide/foundation/utils/env.py +491 -0
  139. provide/foundation/utils/formatting.py +483 -0
  140. provide/foundation/utils/parsing.py +235 -0
  141. provide/foundation/utils/rate_limiting.py +112 -0
  142. provide/foundation/utils/streams.py +67 -0
  143. provide/foundation/utils/timing.py +93 -0
  144. provide_foundation-0.0.0.dev0.dist-info/METADATA +469 -0
  145. provide_foundation-0.0.0.dev0.dist-info/RECORD +149 -0
  146. provide_foundation-0.0.0.dev0.dist-info/WHEEL +5 -0
  147. provide_foundation-0.0.0.dev0.dist-info/entry_points.txt +2 -0
  148. provide_foundation-0.0.0.dev0.dist-info/licenses/LICENSE +201 -0
  149. 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}