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

1from decimal import Decimal 

2from typing import Annotated 

3 

4from pydantic import ( 

5 AfterValidator, 

6 AnyHttpUrl, 

7 PlainSerializer, 

8 PlainValidator, 

9 TypeAdapter, 

10) 

11 

12AnyHttpUrlAdapter = TypeAdapter(AnyHttpUrl) 

13 

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] 

20 

21 

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("/") 

29 

30 

31# Type that can be either a URL or an environment variable reference 

32UrlOrEnvVar = Annotated[str, AfterValidator(validate_url_or_env_var)] 

33 

34 

35NormalizedDecimal = Annotated[ 

36 Decimal, 

37 PlainSerializer(lambda v: str(v.normalize()), return_type=str, when_used="json"), 

38]