Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13"]
poetry-version: ["1.8.3"]
pydantic-version: ["pydantic<2", "pydantic>=2"]

Expand Down
5 changes: 2 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@
##---------- Variables --------------------------------------------------------
PREFIX = /usr/local # Default installation directory
PYTEST_GENERAL_FLAGS := -vvvx --asyncio-mode=auto
PYTEST_COV_FLAGS := --cov=natsapi --cov-append --cov-report=term-missing --cov-fail-under=85
PYTEST_COV_ENV := COV_CORE_SOURCE=natsapi COV_CORE_CONFIG=.coveragerc COV_CORE_DATAFILE=.coverage.eager

##---------- Build targets ----------------------------------------------------

help: ## Show this help message (default)
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

test: ## Run tests
$(PYTEST_COV_ENV) poetry run pytest $(PYTEST_GENERAL_FLAGS) $(PYTEST_COV_FLAGS)
poetry run coverage run --source=natsapi -m pytest $(PYTEST_GENERAL_FLAGS)
poetry run coverage report -m --fail-under=85

testr: ## Run tests with entr
find natsapi tests | entr -r poetry run pytest --disable-warnings -vvvx
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ NatsAPI is highly inspired by [FastAPI](https://github.com/tiangolo/fastapi) and

## Python and pydantic support

This library has support for python > 3.9 and pydantic v1 and v2.
This library has support for python > 3.10 and pydantic v1 and v2.

## Quickstart

Expand Down
6 changes: 3 additions & 3 deletions natsapi/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from dataclasses import dataclass
from enum import Enum
from functools import lru_cache
from typing import Annotated, Any, Literal, Optional, Union
from typing import Annotated, Any, Literal, Union

from pydantic import BaseModel
from pydantic.version import VERSION as PYDANTIC_VERSION
Expand Down Expand Up @@ -36,7 +36,7 @@ class ModelField:
field_info: FieldInfo
name: str
mode: Literal["validation", "serialization"] = "validation"
sub_fields: Optional[str] = None
sub_fields: str | None = None

@property
def alias(self) -> str:
Expand Down Expand Up @@ -122,7 +122,7 @@ def get_definitions(
dict[tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue],
dict[str, dict[str, Any]],
]:
override_mode: Optional[Literal["validation"]] = None if separate_input_output_schemas else "validation"
override_mode: Literal["validation"] | None = None if separate_input_output_schemas else "validation"
inputs = [(field, override_mode or field.mode, field._type_adapter.core_schema) for field in fields]
field_mapping, definitions = schema_generator.generate_definitions(inputs=inputs)
return field_mapping, definitions # type: ignore[return-value]
Expand Down
106 changes: 53 additions & 53 deletions natsapi/applications.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import inspect
import signal
from collections.abc import Callable
from typing import Any, Optional, Union
from typing import Any, Union

from pydantic import BaseModel, ValidationError

Expand All @@ -25,16 +25,16 @@ def __init__(
root_path: str,
*,
app: Any = None,
client_config: Optional[Config] = None,
rpc_methods: Optional[list[str]] = None,
exception_handlers: Optional[dict[type[Exception], Callable[[type[Exception]], JsonRPCException]]] = None,
client_config: Config | None = None,
rpc_methods: list[str] | None = None,
exception_handlers: dict[type[Exception], Callable[[type[Exception]], JsonRPCException]] | None = None,
title: str = "NatsAPI",
version: str = "0.1.0",
description: str = None,
tags: Optional[list[dict[str, Any]]] = None,
servers: Optional[dict[str, Union[str, Any]]] = None,
domain_errors: Optional[dict[str, Any]] = None,
external_docs: Optional[dict[str, Any]] = None,
tags: list[dict[str, Any]] | None = None,
servers: dict[str, Union[str, Any]] | None = None,
domain_errors: dict[str, Any] | None = None,
external_docs: dict[str, Any] | None = None,
):
"""
Parameters
Expand All @@ -54,7 +54,7 @@ def __init__(
self.asyncapi_tags = tags or []
self.asyncapi_version = "2.0.0"
self.domain_errors: Errors = domain_errors
self.asyncapi_schema: Optional[dict[str, Any]] = None
self.asyncapi_schema: dict[str, Any] | None = None
self.nc: NatsClient = None
self.subs: set[Sub] = set()
self.pubs: set[Pub] = set()
Expand Down Expand Up @@ -229,13 +229,13 @@ def add_request(
endpoint: Callable[..., Any],
*,
result=type[Any],
skip_validation: Optional[bool] = False,
description: Optional[str] = None,
deprecated: Optional[bool] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
suggested_timeout: Optional[float] = None,
include_schema: Optional[bool] = True,
skip_validation: bool | None = False,
description: str | None = None,
deprecated: bool | None = None,
tags: list[str] | None = None,
summary: str | None = None,
suggested_timeout: float | None = None,
include_schema: bool | None = True,
) -> None:
request = Request(
subject=subject,
Expand Down Expand Up @@ -265,12 +265,12 @@ def add_publish(
subject: str,
endpoint: Callable[..., Any],
*,
skip_validation: Optional[bool] = False,
description: Optional[str] = None,
deprecated: Optional[bool] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
include_schema: Optional[bool] = True,
skip_validation: bool | None = False,
description: str | None = None,
deprecated: bool | None = None,
tags: list[str] | None = None,
summary: str | None = None,
include_schema: bool | None = True,
) -> None:
publish = Publish(
subject=subject,
Expand Down Expand Up @@ -298,13 +298,13 @@ def request(
subject: str,
*,
result=type[Any],
skip_validation: Optional[bool] = False,
description: Optional[str] = None,
deprecated: Optional[bool] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
suggested_timeout: Optional[float] = None,
include_schema: Optional[bool] = True,
skip_validation: bool | None = False,
description: str | None = None,
deprecated: bool | None = None,
tags: list[str] | None = None,
summary: str | None = None,
suggested_timeout: float | None = None,
include_schema: bool | None = True,
) -> Callable[[DecoratedCallable], DecoratedCallable]:
def decorator(func: DecoratedCallable) -> DecoratedCallable:
self.add_request(
Expand All @@ -327,12 +327,12 @@ def publish(
self,
subject: str,
*,
skip_validation: Optional[bool] = False,
description: Optional[str] = None,
deprecated: Optional[bool] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
include_schema: Optional[bool] = True,
skip_validation: bool | None = False,
description: str | None = None,
deprecated: bool | None = None,
tags: list[str] | None = None,
summary: str | None = None,
include_schema: bool | None = True,
) -> Callable[[DecoratedCallable], DecoratedCallable]:
def decorator(func: DecoratedCallable) -> DecoratedCallable:
self.add_publish(
Expand All @@ -354,10 +354,10 @@ def add_pub(
subject: str,
params: BaseModel,
*,
summary: Optional[str] = None,
description: Optional[str] = None,
tags: Optional[list[str]] = None,
externalDocs: Optional[ExternalDocumentation] = None,
summary: str | None = None,
description: str | None = None,
tags: list[str] | None = None,
externalDocs: ExternalDocumentation | None = None,
) -> None:
"""
Include pub in asyncapi schema
Expand All @@ -377,10 +377,10 @@ def pub(
subject: str,
*,
params=type[Any],
description: Optional[str] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
externalDocs: Optional[ExternalDocumentation] = None,
description: str | None = None,
tags: list[str] | None = None,
summary: str | None = None,
externalDocs: ExternalDocumentation | None = None,
) -> Callable[[DecoratedCallable], DecoratedCallable]:
def decorator(func: DecoratedCallable) -> DecoratedCallable:
self.add_pub(
Expand All @@ -403,11 +403,11 @@ def add_sub(
self,
subject: str,
*,
queue: Optional[str] = None,
summary: Optional[str] = None,
description: Optional[str] = None,
tags: Optional[list[str]] = None,
externalDocs: Optional[ExternalDocumentation] = None,
queue: str | None = None,
summary: str | None = None,
description: str | None = None,
tags: list[str] | None = None,
externalDocs: ExternalDocumentation | None = None,
) -> None:
"""
Include sub in asyncapi schema
Expand All @@ -426,11 +426,11 @@ def sub(
self,
subject: str,
*,
queue: Optional[str] = None,
description: Optional[str] = None,
tags: Optional[list[str]] = None,
summary: Optional[str] = None,
externalDocs: Optional[ExternalDocumentation] = None,
queue: str | None = None,
description: str | None = None,
tags: list[str] | None = None,
summary: str | None = None,
externalDocs: ExternalDocumentation | None = None,
) -> Callable[[DecoratedCallable], DecoratedCallable]:
def decorator(func: DecoratedCallable) -> DecoratedCallable:
self.add_sub(
Expand Down
Loading
Loading