mountaineer-cloud 0.1.1__tar.gz → 0.2.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.
- mountaineer_cloud-0.2.0.dev1/.dockerignore +22 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/PKG-INFO +2 -1
- mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/__tests__/providers/test_definition.py +114 -0
- mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/__tests__/test_mountaineer_integration.py +42 -0
- mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/providers/definition.py +81 -0
- mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/py.typed +1 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/pyproject.toml +3 -3
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/uv.lock +68 -59
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/.github/scripts/update_version.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/.github/workflows/test.yml +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/.gitignore +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/Makefile +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/README.md +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/docs/Email.md +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/docs/ses_prod.png +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/conftest.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/dependencies/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/dependencies/test_core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/test_email.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/test_s3.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/cloudflare/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/cloudflare/dependencies/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/cloudflare/dependencies/test_core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/digitalocean/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/digitalocean/dependencies/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/digitalocean/dependencies/test_core.py +0 -0
- {mountaineer_cloud-0.1.1/mountaineer_cloud/__tests__/resend → mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/__tests__/providers}/__init__.py +0 -0
- {mountaineer_cloud-0.1.1/mountaineer_cloud/__tests__/resend/dependencies → mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/__tests__/resend}/__init__.py +0 -0
- /mountaineer_cloud-0.1.1/mountaineer_cloud/py.typed → /mountaineer_cloud-0.2.0.dev1/mountaineer_cloud/__tests__/resend/dependencies/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/resend/dependencies/test_core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/resend/test_email.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/test_utilities/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/test_utilities/test_mock_aws.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/logging.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/mixin.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/base.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/email.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/storage.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/config.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/dependencies.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/base.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/cloudflare/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/cloudflare/config.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/cloudflare/core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/cloudflare/dependencies.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/digitalocean/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/digitalocean/config.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/digitalocean/core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/digitalocean/dependencies.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/resend/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/resend/config.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/resend/core.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/resend/dependencies.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers_common/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers_common/email.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers_common/s3_compat.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers_common/storage.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/test_utilities/__init__.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/test_utilities/fixtures.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/test_utilities/mock_aws.py +0 -0
- {mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/typing.py +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.git
|
|
2
|
+
.gitignore
|
|
3
|
+
.venv
|
|
4
|
+
**/.venv
|
|
5
|
+
__pycache__
|
|
6
|
+
**/__pycache__
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
.mypy_cache
|
|
10
|
+
.pytest_cache
|
|
11
|
+
.ruff_cache
|
|
12
|
+
**/.mypy_cache
|
|
13
|
+
**/.pytest_cache
|
|
14
|
+
**/.ruff_cache
|
|
15
|
+
.DS_Store
|
|
16
|
+
**/.DS_Store
|
|
17
|
+
dist
|
|
18
|
+
build
|
|
19
|
+
*.egg-info
|
|
20
|
+
**/*.egg-info
|
|
21
|
+
node_modules
|
|
22
|
+
**/node_modules
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mountaineer-cloud
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0.dev1
|
|
4
4
|
Author-email: Pierce Freeman <pierce@freeman.vc>
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Requires-Dist: aioboto3>=14.0.0
|
|
7
7
|
Requires-Dist: httpx>=0.28.1
|
|
8
|
+
Requires-Dist: mountaineer>=0.20.0.dev1
|
|
8
9
|
Requires-Dist: pydantic-settings>=2.2.1
|
|
9
10
|
Provides-Extra: mocks
|
|
10
11
|
Requires-Dist: moto[all,server]>=5.0.0; extra == 'mocks'
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import inspect
|
|
3
|
+
import pkgutil
|
|
4
|
+
|
|
5
|
+
import mountaineer_cloud.providers as providers_package
|
|
6
|
+
from mountaineer_cloud.providers.aws import AWSConfig, AWSCore, AWSDependencies
|
|
7
|
+
from mountaineer_cloud.providers.base import ProviderCore
|
|
8
|
+
from mountaineer_cloud.providers.cloudflare import (
|
|
9
|
+
CloudflareConfig,
|
|
10
|
+
CloudflareCore,
|
|
11
|
+
CloudflareDependencies,
|
|
12
|
+
)
|
|
13
|
+
from mountaineer_cloud.providers.definition import (
|
|
14
|
+
SUPPORTED_PROVIDERS,
|
|
15
|
+
ProviderDefinition,
|
|
16
|
+
resolve_cloud_by_config,
|
|
17
|
+
)
|
|
18
|
+
from mountaineer_cloud.providers.digitalocean import (
|
|
19
|
+
DigitalOceanConfig,
|
|
20
|
+
DigitalOceanCore,
|
|
21
|
+
DigitalOceanDependencies,
|
|
22
|
+
)
|
|
23
|
+
from mountaineer_cloud.providers.resend import (
|
|
24
|
+
ResendConfig,
|
|
25
|
+
ResendCore,
|
|
26
|
+
ResendDependencies,
|
|
27
|
+
)
|
|
28
|
+
from mountaineer_cloud.providers_common.email import EmailProviderCore
|
|
29
|
+
from mountaineer_cloud.providers_common.storage import StorageProviderCore
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_supported_providers_registry():
|
|
33
|
+
assert SUPPORTED_PROVIDERS == [
|
|
34
|
+
ProviderDefinition(
|
|
35
|
+
config_class=AWSConfig,
|
|
36
|
+
core_class=AWSCore,
|
|
37
|
+
injection_function=AWSDependencies.get_aws_core,
|
|
38
|
+
),
|
|
39
|
+
ProviderDefinition(
|
|
40
|
+
config_class=CloudflareConfig,
|
|
41
|
+
core_class=CloudflareCore,
|
|
42
|
+
injection_function=CloudflareDependencies.get_cloudflare_core,
|
|
43
|
+
),
|
|
44
|
+
ProviderDefinition(
|
|
45
|
+
config_class=DigitalOceanConfig,
|
|
46
|
+
core_class=DigitalOceanCore,
|
|
47
|
+
injection_function=DigitalOceanDependencies.get_digitalocean_core,
|
|
48
|
+
),
|
|
49
|
+
ProviderDefinition(
|
|
50
|
+
config_class=ResendConfig,
|
|
51
|
+
core_class=ResendCore,
|
|
52
|
+
injection_function=ResendDependencies.get_resend_core,
|
|
53
|
+
),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_supported_providers_include_every_defined_core():
|
|
58
|
+
discovered_core_classes: list[type[ProviderCore]] = []
|
|
59
|
+
|
|
60
|
+
for module_info in pkgutil.iter_modules(providers_package.__path__):
|
|
61
|
+
if not module_info.ispkg:
|
|
62
|
+
continue
|
|
63
|
+
|
|
64
|
+
module_name = f"{providers_package.__name__}.{module_info.name}"
|
|
65
|
+
provider_module = importlib.import_module(module_name)
|
|
66
|
+
|
|
67
|
+
provider_core_classes = [
|
|
68
|
+
core_class
|
|
69
|
+
for _, core_class in inspect.getmembers(provider_module, inspect.isclass)
|
|
70
|
+
if issubclass(core_class, ProviderCore)
|
|
71
|
+
and core_class is not ProviderCore
|
|
72
|
+
and core_class.__module__ == f"{module_name}.core"
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
assert provider_core_classes, f"No provider core exported by {module_name}"
|
|
76
|
+
discovered_core_classes.extend(provider_core_classes)
|
|
77
|
+
|
|
78
|
+
assert {provider.core_class for provider in SUPPORTED_PROVIDERS} == set(
|
|
79
|
+
discovered_core_classes
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_resolve_cloud_by_config_returns_all_email_matches():
|
|
84
|
+
class EmailAppConfig(AWSConfig, ResendConfig):
|
|
85
|
+
pass
|
|
86
|
+
|
|
87
|
+
app_config = EmailAppConfig(
|
|
88
|
+
AWS_ACCESS_KEY="aws_access_key",
|
|
89
|
+
AWS_SECRET_KEY="aws_secret_key",
|
|
90
|
+
AWS_REGION_NAME="us-east-1",
|
|
91
|
+
AWS_ROLE_ARN="arn:aws:iam::123456789012:role/test-role",
|
|
92
|
+
AWS_ROLE_SESSION_NAME="test-session",
|
|
93
|
+
RESEND_API_KEY="re_test_key",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
matches = resolve_cloud_by_config(app_config, EmailProviderCore)
|
|
97
|
+
|
|
98
|
+
assert [provider.config_class for provider in matches] == [
|
|
99
|
+
AWSConfig,
|
|
100
|
+
ResendConfig,
|
|
101
|
+
]
|
|
102
|
+
assert [provider.core_class for provider in matches] == [AWSCore, ResendCore]
|
|
103
|
+
assert [provider.injection_function for provider in matches] == [
|
|
104
|
+
AWSDependencies.get_aws_core,
|
|
105
|
+
ResendDependencies.get_resend_core,
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_resolve_cloud_by_config_returns_empty_for_unsupported_capability():
|
|
110
|
+
app_config = ResendConfig(RESEND_API_KEY="re_test_key")
|
|
111
|
+
|
|
112
|
+
matches = resolve_cloud_by_config(app_config, StorageProviderCore)
|
|
113
|
+
|
|
114
|
+
assert matches == []
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from fastapi.testclient import TestClient
|
|
4
|
+
|
|
5
|
+
from mountaineer import AppController, ConfigBase, Depends
|
|
6
|
+
from mountaineer.config import unregister_config
|
|
7
|
+
|
|
8
|
+
from mountaineer_cloud.providers.resend import (
|
|
9
|
+
ResendConfig,
|
|
10
|
+
ResendCore,
|
|
11
|
+
ResendDependencies,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AppConfig(ConfigBase, ResendConfig):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_resend_component_boots_with_mountaineer(tmp_path: Path) -> None:
|
|
20
|
+
unregister_config()
|
|
21
|
+
component = AppController(
|
|
22
|
+
view_root=tmp_path,
|
|
23
|
+
config=AppConfig(
|
|
24
|
+
RESEND_API_KEY="re_test_key",
|
|
25
|
+
RESEND_BASE_URL="https://api.resend.test",
|
|
26
|
+
),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
@component.app.get("/cloud")
|
|
30
|
+
async def cloud(
|
|
31
|
+
resend: ResendCore = Depends(ResendDependencies.get_resend_core),
|
|
32
|
+
) -> dict[str, str]:
|
|
33
|
+
return {"base_url": str(resend.session.base_url)}
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
with TestClient(component.app) as client:
|
|
37
|
+
response = client.get("/cloud")
|
|
38
|
+
finally:
|
|
39
|
+
unregister_config()
|
|
40
|
+
|
|
41
|
+
assert response.status_code == 200
|
|
42
|
+
assert response.json() == {"base_url": "https://api.resend.test"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from collections.abc import AsyncGenerator, Callable
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Generic, TypeVar, cast
|
|
4
|
+
|
|
5
|
+
from mountaineer_cloud.providers.aws.config import AWSConfig
|
|
6
|
+
from mountaineer_cloud.providers.aws.core import AWSCore
|
|
7
|
+
from mountaineer_cloud.providers.aws.dependencies import get_aws_core
|
|
8
|
+
from mountaineer_cloud.providers.base import ProviderCore
|
|
9
|
+
from mountaineer_cloud.providers.cloudflare.config import CloudflareConfig
|
|
10
|
+
from mountaineer_cloud.providers.cloudflare.core import CloudflareCore
|
|
11
|
+
from mountaineer_cloud.providers.cloudflare.dependencies import get_cloudflare_core
|
|
12
|
+
from mountaineer_cloud.providers.digitalocean.config import DigitalOceanConfig
|
|
13
|
+
from mountaineer_cloud.providers.digitalocean.core import DigitalOceanCore
|
|
14
|
+
from mountaineer_cloud.providers.digitalocean.dependencies import (
|
|
15
|
+
get_digitalocean_core,
|
|
16
|
+
)
|
|
17
|
+
from mountaineer_cloud.providers.resend.config import ResendConfig
|
|
18
|
+
from mountaineer_cloud.providers.resend.core import ResendCore
|
|
19
|
+
from mountaineer_cloud.providers.resend.dependencies import get_resend_core
|
|
20
|
+
|
|
21
|
+
TConfig = TypeVar("TConfig")
|
|
22
|
+
TProviderCore = TypeVar("TProviderCore", bound=ProviderCore[Any])
|
|
23
|
+
TRequiredCloudBase = TypeVar("TRequiredCloudBase", bound=ProviderCore[Any])
|
|
24
|
+
|
|
25
|
+
ProviderInjectionFunction = Callable[..., AsyncGenerator[TProviderCore, None]]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class ProviderDefinition(Generic[TConfig, TProviderCore]):
|
|
30
|
+
config_class: type[TConfig]
|
|
31
|
+
core_class: type[TProviderCore]
|
|
32
|
+
injection_function: ProviderInjectionFunction[TProviderCore]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
SUPPORTED_PROVIDERS: list[ProviderDefinition[Any, Any]] = [
|
|
36
|
+
ProviderDefinition(
|
|
37
|
+
config_class=AWSConfig,
|
|
38
|
+
core_class=AWSCore,
|
|
39
|
+
injection_function=get_aws_core,
|
|
40
|
+
),
|
|
41
|
+
ProviderDefinition(
|
|
42
|
+
config_class=CloudflareConfig,
|
|
43
|
+
core_class=CloudflareCore,
|
|
44
|
+
injection_function=get_cloudflare_core,
|
|
45
|
+
),
|
|
46
|
+
ProviderDefinition(
|
|
47
|
+
config_class=DigitalOceanConfig,
|
|
48
|
+
core_class=DigitalOceanCore,
|
|
49
|
+
injection_function=get_digitalocean_core,
|
|
50
|
+
),
|
|
51
|
+
ProviderDefinition(
|
|
52
|
+
config_class=ResendConfig,
|
|
53
|
+
core_class=ResendCore,
|
|
54
|
+
injection_function=get_resend_core,
|
|
55
|
+
),
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def resolve_cloud_by_config(
|
|
60
|
+
app_config: object,
|
|
61
|
+
required_cloud_base: type[TRequiredCloudBase],
|
|
62
|
+
) -> list[ProviderDefinition[Any, TRequiredCloudBase]]:
|
|
63
|
+
"""
|
|
64
|
+
Used by clients to get a dynamic list of providers that match the current app config.
|
|
65
|
+
This is useful in situations where you know you need an email-provider but you don't
|
|
66
|
+
know which one the user has configured.
|
|
67
|
+
|
|
68
|
+
"""
|
|
69
|
+
matching_providers: list[ProviderDefinition[Any, TRequiredCloudBase]] = []
|
|
70
|
+
|
|
71
|
+
for provider in SUPPORTED_PROVIDERS:
|
|
72
|
+
if not isinstance(app_config, provider.config_class):
|
|
73
|
+
continue
|
|
74
|
+
if not issubclass(provider.core_class, required_cloud_base):
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
matching_providers.append(
|
|
78
|
+
cast(ProviderDefinition[Any, TRequiredCloudBase], provider)
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return matching_providers
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mountaineer-cloud"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0.dev1"
|
|
4
4
|
description = ""
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
|
-
dependencies = [ "pydantic-settings>=2.2.1", "aioboto3>=14.0.0", "httpx>=0.28.1",]
|
|
7
|
+
dependencies = [ "pydantic-settings>=2.2.1", "aioboto3>=14.0.0", "httpx>=0.28.1", "mountaineer>=0.20.0.dev1",]
|
|
8
8
|
[[project.authors]]
|
|
9
9
|
name = "Pierce Freeman"
|
|
10
10
|
email = "pierce@freeman.vc"
|
|
@@ -14,7 +14,7 @@ requires = [ "hatchling",]
|
|
|
14
14
|
build-backend = "hatchling.build"
|
|
15
15
|
|
|
16
16
|
[dependency-groups]
|
|
17
|
-
dev = [ "ruff>=0.3.1", "ty>=0.0.22", "pytest>=8.0.2", "pytest-asyncio>=0.23.5.post1", "types-aioboto3[full]>=12.3.0", "moto[all,server]>=5.0.0", "brotli>=1.1.0", "
|
|
17
|
+
dev = [ "ruff>=0.3.1", "ty>=0.0.22", "pytest>=8.0.2", "pytest-asyncio>=0.23.5.post1", "types-aioboto3[full]>=12.3.0", "moto[all,server]>=5.0.0", "brotli>=1.1.0", "iceaxe>=0.10.0",]
|
|
18
18
|
|
|
19
19
|
[project.optional-dependencies]
|
|
20
20
|
mocks = [ "moto[all,server]>=5.0.0", "types-aiobotocore[full]>=2.20.0",]
|
|
@@ -566,20 +566,6 @@ wheels = [
|
|
|
566
566
|
{ url = "https://files.pythonhosted.org/packages/8f/7d/2d6ce181d7a5f51dedb8c06206cbf0ec026a99bf145edd309f9e17c3282f/fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf", size = 94814, upload-time = "2025-01-30T14:06:38.564Z" },
|
|
567
567
|
]
|
|
568
568
|
|
|
569
|
-
[[package]]
|
|
570
|
-
name = "firehot"
|
|
571
|
-
version = "0.4.0"
|
|
572
|
-
source = { registry = "https://pypi.org/simple" }
|
|
573
|
-
sdist = { url = "https://files.pythonhosted.org/packages/9a/b3/20838615f249478762d48dccd3243f4ea9087e298fb6ca4cdad5bac94dee/firehot-0.4.0.tar.gz", hash = "sha256:bf0d47c5cbcae7bd8c72356cfddf4b7a45bc79dda5147fe139a794a6a5ac8196", size = 16310256, upload-time = "2025-03-15T04:31:21.212Z" }
|
|
574
|
-
wheels = [
|
|
575
|
-
{ url = "https://files.pythonhosted.org/packages/9b/2d/413d5487ab84eadcd78de4fccab55cca2c84b332fb21951493f79731491b/firehot-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0f18ac687f9fa2c2567b7802ac462d10d20319cc267e0293c4d0e2046f3a799", size = 1940053, upload-time = "2025-03-15T04:31:11.213Z" },
|
|
576
|
-
{ url = "https://files.pythonhosted.org/packages/70/8a/963496e493f3bc7a1b0d3c5b25cec1589da0bbaf3038facd6fa613cdd0c1/firehot-0.4.0-cp311-cp311-manylinux_2_39_x86_64.whl", hash = "sha256:24161e10609545e09fd1b741c24eaad75ef9310d0ecc91116cb5e4c0bbea8db7", size = 2191203, upload-time = "2025-03-15T04:31:13.531Z" },
|
|
577
|
-
{ url = "https://files.pythonhosted.org/packages/22/45/4624f2d6bf157eeef0edd378ab1043972584e4743a154ccd9660c6ea81e3/firehot-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:97880744de074a4b6378737fdd8116064f5548f3cd449a533f17a3125a3ec45a", size = 1940863, upload-time = "2025-03-15T04:31:14.79Z" },
|
|
578
|
-
{ url = "https://files.pythonhosted.org/packages/ab/48/d1d05cb4ab0baeedf768b03c3eabee075a24d180a22f3cee30e0a0935b27/firehot-0.4.0-cp312-cp312-manylinux_2_39_x86_64.whl", hash = "sha256:43e9faa68c25898a266c9753154efc2292130ca5f71f025d772cd779f58840c9", size = 2189068, upload-time = "2025-03-15T04:31:16.533Z" },
|
|
579
|
-
{ url = "https://files.pythonhosted.org/packages/4e/d9/d9f38515e5670197eeee7c903d6df625889b4b0429f29a135c1f5ab1c6ac/firehot-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:293b05f142af9a370ed416c9aa6d7082165c57f11ad88c75f607a9328d7203f3", size = 1940859, upload-time = "2025-03-15T04:31:17.895Z" },
|
|
580
|
-
{ url = "https://files.pythonhosted.org/packages/22/60/1beaf8bd296f9b17bfdc008f15979b6c7b8be752ddc9f156c399de6d9f75/firehot-0.4.0-cp313-cp313-manylinux_2_39_x86_64.whl", hash = "sha256:f5b422279c650b92c2e717c5467840c829c11dc78dc33b1015a7724ed85fbbff", size = 2189068, upload-time = "2025-03-15T04:31:19.268Z" },
|
|
581
|
-
]
|
|
582
|
-
|
|
583
569
|
[[package]]
|
|
584
570
|
name = "flask"
|
|
585
571
|
version = "3.1.0"
|
|
@@ -696,31 +682,45 @@ wheels = [
|
|
|
696
682
|
|
|
697
683
|
[[package]]
|
|
698
684
|
name = "httptools"
|
|
699
|
-
version = "0.
|
|
700
|
-
source = { registry = "https://pypi.org/simple" }
|
|
701
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
702
|
-
wheels = [
|
|
703
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
704
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
705
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
706
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
707
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
708
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
709
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
710
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
711
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
712
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
713
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
714
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
715
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
716
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
717
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
718
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
719
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
720
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
721
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
722
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
723
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
685
|
+
version = "0.8.0"
|
|
686
|
+
source = { registry = "https://pypi.org/simple" }
|
|
687
|
+
sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" }
|
|
688
|
+
wheels = [
|
|
689
|
+
{ url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" },
|
|
690
|
+
{ url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" },
|
|
691
|
+
{ url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" },
|
|
692
|
+
{ url = "https://files.pythonhosted.org/packages/bf/95/4c1c26c0b985f8a3331682d802598f14e32dc41bf7509266eb2c04ad4801/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d", size = 464235, upload-time = "2026-05-25T22:17:03.109Z" },
|
|
693
|
+
{ url = "https://files.pythonhosted.org/packages/a2/82/6735be2b0ca527718c431cdb8e5f70c3862c0844a687df0f572c51e11497/httptools-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085", size = 449809, upload-time = "2026-05-25T22:17:04.443Z" },
|
|
694
|
+
{ url = "https://files.pythonhosted.org/packages/b5/f9/5811c74f37a758c8a4aa3dc430375119d335947e883efc4664d8f3559a41/httptools-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124", size = 452174, upload-time = "2026-05-25T22:17:05.476Z" },
|
|
695
|
+
{ url = "https://files.pythonhosted.org/packages/cc/94/97b75870dea07b71e3ec535cebe525b08d723152e4c7d13fa887e51f4de2/httptools-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1b4c8e7a489a0d750d91894e9a8cdc295838f1924c0ca903ae993456fddec07", size = 90991, upload-time = "2026-05-25T22:17:06.75Z" },
|
|
696
|
+
{ url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" },
|
|
697
|
+
{ url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" },
|
|
698
|
+
{ url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" },
|
|
699
|
+
{ url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" },
|
|
700
|
+
{ url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" },
|
|
701
|
+
{ url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" },
|
|
702
|
+
{ url = "https://files.pythonhosted.org/packages/05/0b/4240efeb672751ee5b9b380cb0e3fdc050bc05f68adc7a8aefc4fcd9a69a/httptools-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150", size = 90918, upload-time = "2026-05-25T22:17:15.155Z" },
|
|
703
|
+
{ url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" },
|
|
704
|
+
{ url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" },
|
|
705
|
+
{ url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" },
|
|
706
|
+
{ url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" },
|
|
707
|
+
{ url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" },
|
|
708
|
+
{ url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" },
|
|
709
|
+
{ url = "https://files.pythonhosted.org/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117, upload-time = "2026-05-25T22:17:23.074Z" },
|
|
710
|
+
{ url = "https://files.pythonhosted.org/packages/1a/12/fa3fbf5f9517b273edea2dc982aa82a8c634091e67c590792b729017bc6f/httptools-0.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6", size = 206183, upload-time = "2026-05-25T22:17:24.004Z" },
|
|
711
|
+
{ url = "https://files.pythonhosted.org/packages/30/fc/5e7c4cb443370f2090a3aba0453a07384d29ff66b7435bb90e77e1037599/httptools-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b", size = 112079, upload-time = "2026-05-25T22:17:25.216Z" },
|
|
712
|
+
{ url = "https://files.pythonhosted.org/packages/ba/53/771bd891eb0f236f32145d6a1775777ec85745f3cc983a1f23d1a3b8ddfe/httptools-0.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0", size = 481596, upload-time = "2026-05-25T22:17:26.186Z" },
|
|
713
|
+
{ url = "https://files.pythonhosted.org/packages/62/42/94e15bc68ce3d423243c45d7f1b0c7561f13844f97dc52ae23182fb65628/httptools-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e", size = 480865, upload-time = "2026-05-25T22:17:27.542Z" },
|
|
714
|
+
{ url = "https://files.pythonhosted.org/packages/1c/7c/fe2980fc03723272e30f135b62360b075f513dfe7cc73aef36c7f04012bd/httptools-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b", size = 463189, upload-time = "2026-05-25T22:17:28.546Z" },
|
|
715
|
+
{ url = "https://files.pythonhosted.org/packages/15/1b/47fc5fff68acd1bfa20b4734059c9a06cadb88119dcd5258b5b0d21d91c8/httptools-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0", size = 466610, upload-time = "2026-05-25T22:17:29.816Z" },
|
|
716
|
+
{ url = "https://files.pythonhosted.org/packages/60/bd/07b13c93ffd9bec9546e0d43f8e19378dd696dbd278511406bc07371ef1f/httptools-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527", size = 92705, upload-time = "2026-05-25T22:17:31.133Z" },
|
|
717
|
+
{ url = "https://files.pythonhosted.org/packages/fd/c4/121648f68ce066d7bd762d6b6d97e620847642d38d54f3d90ff11d947629/httptools-0.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568", size = 215023, upload-time = "2026-05-25T22:17:32.401Z" },
|
|
718
|
+
{ url = "https://files.pythonhosted.org/packages/b9/b0/312a062ae741ae3e8baa8c8bf20be81b2e67337b259ab4349bebc7b6142e/httptools-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b", size = 117405, upload-time = "2026-05-25T22:17:33.742Z" },
|
|
719
|
+
{ url = "https://files.pythonhosted.org/packages/fc/37/fccd705f795386bb05bf413012fecff2a33e5aa8c2f069096de3e9fd8702/httptools-0.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca", size = 558497, upload-time = "2026-05-25T22:17:34.732Z" },
|
|
720
|
+
{ url = "https://files.pythonhosted.org/packages/bd/39/f172e8003576de35f5ba77ff417cf0e34429d35dc014deef15afa337a72c/httptools-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f", size = 571585, upload-time = "2026-05-25T22:17:35.813Z" },
|
|
721
|
+
{ url = "https://files.pythonhosted.org/packages/3e/b9/f5564760af99f3dbbf3f9104dc00e5da27e96cf433c6bdcf77617f70bf3f/httptools-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d", size = 543297, upload-time = "2026-05-25T22:17:37.08Z" },
|
|
722
|
+
{ url = "https://files.pythonhosted.org/packages/99/67/8d9f2c313618e161b82f3873188e7196126da1d6e29688df40eb3997c77a/httptools-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081", size = 539535, upload-time = "2026-05-25T22:17:38.032Z" },
|
|
723
|
+
{ url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" },
|
|
724
724
|
]
|
|
725
725
|
|
|
726
726
|
[[package]]
|
|
@@ -1053,38 +1053,37 @@ server = [
|
|
|
1053
1053
|
|
|
1054
1054
|
[[package]]
|
|
1055
1055
|
name = "mountaineer"
|
|
1056
|
-
version = "0.
|
|
1056
|
+
version = "0.20.0.dev1"
|
|
1057
1057
|
source = { registry = "https://pypi.org/simple" }
|
|
1058
1058
|
dependencies = [
|
|
1059
1059
|
{ name = "click" },
|
|
1060
1060
|
{ name = "fastapi" },
|
|
1061
|
-
{ name = "firehot" },
|
|
1062
1061
|
{ name = "inflection" },
|
|
1062
|
+
{ name = "mountaineer-di" },
|
|
1063
1063
|
{ name = "mountaineer-exceptions" },
|
|
1064
1064
|
{ name = "packaging" },
|
|
1065
1065
|
{ name = "pydantic" },
|
|
1066
1066
|
{ name = "pydantic-settings" },
|
|
1067
1067
|
{ name = "rich" },
|
|
1068
1068
|
{ name = "uvicorn", extra = ["standard"] },
|
|
1069
|
-
{ name = "watchfiles" },
|
|
1070
|
-
{ name = "websockets" },
|
|
1071
1069
|
]
|
|
1072
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1070
|
+
sdist = { url = "https://files.pythonhosted.org/packages/71/14/fe5839708905310577da84bea57b103b5b7e67efbcd0fa71c19ec2d03cbc/mountaineer-0.20.0.dev1.tar.gz", hash = "sha256:3f06a639a44f5667b14d2c0e4d5297047a7c21106379c1cc63ddedd39d8259f5", size = 889554, upload-time = "2026-07-31T13:30:35.961Z" }
|
|
1073
1071
|
wheels = [
|
|
1074
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1075
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1076
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1077
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1078
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1072
|
+
{ url = "https://files.pythonhosted.org/packages/6c/0a/a719f91dbb9f3fe91d343711bd7d8d5dd0fe6440837adecbde0df2a4dd9d/mountaineer-0.20.0.dev1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:10005e66b91aacd27c254d03a36a683d9b333891a55c137963335d4ac488fbb4", size = 17017877, upload-time = "2026-07-31T13:30:24.289Z" },
|
|
1073
|
+
{ url = "https://files.pythonhosted.org/packages/f2/69/83b44ad6156a69a46a9cc081f8a71389d5736ec1a27020efc6e356495cf3/mountaineer-0.20.0.dev1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:9340600b29274fd8d0de4e9f8a510e4c5b106e13b74870fffc1157c1de5e19e2", size = 16120411, upload-time = "2026-07-31T13:30:26.728Z" },
|
|
1074
|
+
{ url = "https://files.pythonhosted.org/packages/74/f8/3fc131a4ff1aaf2982105b0283f45a8532377776806a5dee5e0a542db767/mountaineer-0.20.0.dev1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1130ac20b2459ce3c2ac7ebda99dc38380f204276720a7050f2a57e56c625e7a", size = 18342434, upload-time = "2026-07-31T13:30:28.932Z" },
|
|
1075
|
+
{ url = "https://files.pythonhosted.org/packages/b8/f2/439a41b10db13d1b23b2b45a343f7845f7b2821b393b89230a6fbc69f04e/mountaineer-0.20.0.dev1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f23368425fbc87183bc1182ad215b34183dcab20b4fff6b6854b195fff3501e0", size = 17912066, upload-time = "2026-07-31T13:30:31.607Z" },
|
|
1076
|
+
{ url = "https://files.pythonhosted.org/packages/68/96/dfe4241081b5f65877a1e75e3fa2aa2a0a3478b2f29e3f210a716c54edb9/mountaineer-0.20.0.dev1-cp310-abi3-win_amd64.whl", hash = "sha256:686ea7b1cb5b8bb3cf48a69408d7cc2b7ce29a8a92cb90d731d176bbd6a35f19", size = 15787965, upload-time = "2026-07-31T13:30:33.818Z" },
|
|
1079
1077
|
]
|
|
1080
1078
|
|
|
1081
1079
|
[[package]]
|
|
1082
1080
|
name = "mountaineer-cloud"
|
|
1083
|
-
version = "0.1.
|
|
1081
|
+
version = "0.1.2"
|
|
1084
1082
|
source = { editable = "." }
|
|
1085
1083
|
dependencies = [
|
|
1086
1084
|
{ name = "aioboto3" },
|
|
1087
1085
|
{ name = "httpx" },
|
|
1086
|
+
{ name = "mountaineer" },
|
|
1088
1087
|
{ name = "pydantic-settings" },
|
|
1089
1088
|
]
|
|
1090
1089
|
|
|
@@ -1099,7 +1098,6 @@ dev = [
|
|
|
1099
1098
|
{ name = "brotli" },
|
|
1100
1099
|
{ name = "iceaxe" },
|
|
1101
1100
|
{ name = "moto", extra = ["all", "server"] },
|
|
1102
|
-
{ name = "mountaineer" },
|
|
1103
1101
|
{ name = "pytest" },
|
|
1104
1102
|
{ name = "pytest-asyncio" },
|
|
1105
1103
|
{ name = "ruff" },
|
|
@@ -1112,6 +1110,7 @@ requires-dist = [
|
|
|
1112
1110
|
{ name = "aioboto3", specifier = ">=14.0.0" },
|
|
1113
1111
|
{ name = "httpx", specifier = ">=0.28.1" },
|
|
1114
1112
|
{ name = "moto", extras = ["all", "server"], marker = "extra == 'mocks'", specifier = ">=5.0.0" },
|
|
1113
|
+
{ name = "mountaineer", specifier = ">=0.20.0.dev1" },
|
|
1115
1114
|
{ name = "pydantic-settings", specifier = ">=2.2.1" },
|
|
1116
1115
|
{ name = "types-aiobotocore", extras = ["full"], marker = "extra == 'mocks'", specifier = ">=2.20.0" },
|
|
1117
1116
|
]
|
|
@@ -1122,7 +1121,6 @@ dev = [
|
|
|
1122
1121
|
{ name = "brotli", specifier = ">=1.1.0" },
|
|
1123
1122
|
{ name = "iceaxe", specifier = ">=0.10.0" },
|
|
1124
1123
|
{ name = "moto", extras = ["all", "server"], specifier = ">=5.0.0" },
|
|
1125
|
-
{ name = "mountaineer", specifier = ">=0.10.0.dev2" },
|
|
1126
1124
|
{ name = "pytest", specifier = ">=8.0.2" },
|
|
1127
1125
|
{ name = "pytest-asyncio", specifier = ">=0.23.5.post1" },
|
|
1128
1126
|
{ name = "ruff", specifier = ">=0.3.1" },
|
|
@@ -1130,16 +1128,28 @@ dev = [
|
|
|
1130
1128
|
{ name = "types-aioboto3", extras = ["full"], specifier = ">=12.3.0" },
|
|
1131
1129
|
]
|
|
1132
1130
|
|
|
1131
|
+
[[package]]
|
|
1132
|
+
name = "mountaineer-di"
|
|
1133
|
+
version = "0.2.1"
|
|
1134
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1135
|
+
dependencies = [
|
|
1136
|
+
{ name = "pydantic" },
|
|
1137
|
+
]
|
|
1138
|
+
sdist = { url = "https://files.pythonhosted.org/packages/61/f2/9482135ed6efde1eaaa903bdd7c953df65c6c8288f5a90e9501dc0562958/mountaineer_di-0.2.1.tar.gz", hash = "sha256:56406f73b2b16209b8ac2ddf95e60404ecb4c98c281e16fbefb26359464cf6d1", size = 46279, upload-time = "2026-04-22T00:41:18.485Z" }
|
|
1139
|
+
wheels = [
|
|
1140
|
+
{ url = "https://files.pythonhosted.org/packages/ef/7d/6cad2a62913c4ef88948e16b6017656630d19cc874b96f7c9ad4ef28ac37/mountaineer_di-0.2.1-py3-none-any.whl", hash = "sha256:1c9157ef878b4277106753ee9209c0c4bd31bd0761f27e127842c5eb15fdc144", size = 12500, upload-time = "2026-04-22T00:41:16.899Z" },
|
|
1141
|
+
]
|
|
1142
|
+
|
|
1133
1143
|
[[package]]
|
|
1134
1144
|
name = "mountaineer-exceptions"
|
|
1135
|
-
version = "0.
|
|
1145
|
+
version = "0.1.1"
|
|
1136
1146
|
source = { registry = "https://pypi.org/simple" }
|
|
1137
1147
|
dependencies = [
|
|
1138
1148
|
{ name = "pygments" },
|
|
1139
1149
|
]
|
|
1140
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1150
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c7/d8/b059cf20539381ee58bdd2ded15f7f10d8b238497532d4378dab78ff7697/mountaineer_exceptions-0.1.1.tar.gz", hash = "sha256:979c783e35176264354ac42e8037c4da65781df747600790c03848ec63f0c073", size = 1004780, upload-time = "2025-05-28T18:43:41.896Z" }
|
|
1141
1151
|
wheels = [
|
|
1142
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1152
|
+
{ url = "https://files.pythonhosted.org/packages/e9/0a/02ee87ee23b51734eb596aba3d292a2db4d0820fb8c147a4a1f1e2c2e27d/mountaineer_exceptions-0.1.1-py3-none-any.whl", hash = "sha256:0e5b1b5d0b913aa170dfc1ff5d30958e08bbe60194705e042f530847b008be80", size = 264917, upload-time = "2025-05-28T18:43:40.101Z" },
|
|
1143
1153
|
]
|
|
1144
1154
|
|
|
1145
1155
|
[[package]]
|
|
@@ -1941,20 +1951,19 @@ wheels = [
|
|
|
1941
1951
|
|
|
1942
1952
|
[[package]]
|
|
1943
1953
|
name = "uvicorn"
|
|
1944
|
-
version = "0.
|
|
1954
|
+
version = "0.52.0"
|
|
1945
1955
|
source = { registry = "https://pypi.org/simple" }
|
|
1946
1956
|
dependencies = [
|
|
1947
1957
|
{ name = "click" },
|
|
1948
1958
|
{ name = "h11" },
|
|
1949
1959
|
]
|
|
1950
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1960
|
+
sdist = { url = "https://files.pythonhosted.org/packages/05/c8/2d307868453a4bca6e64fa3581d122ae0748a0869c53f159339def179c7c/uvicorn-0.52.0.tar.gz", hash = "sha256:ca8876ad6c1983f394157c168b39d52f6dd56dabf5602fa0982751cffc2293ae", size = 97504, upload-time = "2026-07-29T08:45:34.065Z" }
|
|
1951
1961
|
wheels = [
|
|
1952
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1962
|
+
{ url = "https://files.pythonhosted.org/packages/39/e6/b5c0630ace9757232aec07112be8146b812787db52141ff9d50674aa7634/uvicorn-0.52.0-py3-none-any.whl", hash = "sha256:3d887809810b89ed33501bcf0a9aba469b06ecd608158efce04bd6b48d8c9b08", size = 79058, upload-time = "2026-07-29T08:45:32.492Z" },
|
|
1953
1963
|
]
|
|
1954
1964
|
|
|
1955
1965
|
[package.optional-dependencies]
|
|
1956
1966
|
standard = [
|
|
1957
|
-
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
1958
1967
|
{ name = "httptools" },
|
|
1959
1968
|
{ name = "python-dotenv" },
|
|
1960
1969
|
{ name = "pyyaml" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/__init__.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/conftest.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/__tests__/aws/test_s3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/__init__.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/base.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/email.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/primitives/storage.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/__init__.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/__init__.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/config.py
RENAMED
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/aws/core.py
RENAMED
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers/resend/core.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mountaineer_cloud-0.1.1 → mountaineer_cloud-0.2.0.dev1}/mountaineer_cloud/providers_common/email.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|