Coverage for packages/core/src/langgate/core/fields.py: 92%
13 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-06-18 14:26 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-06-18 14:26 +0000
1from decimal import Decimal
2from typing import Annotated
4from pydantic import (
5 AfterValidator,
6 AnyHttpUrl,
7 PlainSerializer,
8 PlainValidator,
9 TypeAdapter,
10)
12AnyHttpUrlAdapter = TypeAdapter(AnyHttpUrl)
14# https://github.com/pydantic/pydantic/issues/7186
15HttpUrlStr = Annotated[
16 str,
17 PlainValidator(lambda x: AnyHttpUrlAdapter.validate_strings(x)),
18 AfterValidator(lambda x: str(x).rstrip("/")),
19]
22def validate_url_or_env_var(v: str) -> str:
23 """Validate a string as either a URL or an environment variable reference."""
24 if v is None:
25 return v
26 if isinstance(v, str) and v.startswith("${") and v.endswith("}"):
27 return v
28 return str(AnyHttpUrlAdapter.validate_strings(v)).rstrip("/")
31# Type that can be either a URL or an environment variable reference
32UrlOrEnvVar = Annotated[str, AfterValidator(validate_url_or_env_var)]
35NormalizedDecimal = Annotated[
36 Decimal,
37 PlainSerializer(lambda v: str(v.normalize()), return_type=str, when_used="json"),
38]