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
11 changes: 10 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
resolution: ["highest", "lowest-direct"]
os:
- macos-15
- ubuntu-24.04
Expand All @@ -36,16 +37,23 @@ jobs:
- os: ubuntu-24.04
python: "3.11"
coverage: "nocov"
resolution: "lowest-direct"
- os: ubuntu-24.04
python: "3.12"
coverage: "nocov"
resolution: "lowest-direct"
# Enable coverage on just one job
- os: ubuntu-24.04
python: "3.13"
coverage: "cov"
resolution: "lowest-direct"
- os: ubuntu-24.04
python: "3.14.0-rc.2"
coverage: "nocov"
resolution: "lowest-direct"
env:
# Shared env variables for all the tests
UV_RESOLUTION: '${{ matrix.resolution }}'

steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
Expand Down Expand Up @@ -89,7 +97,8 @@ jobs:

- name: check running `just generate` does not create a diff
# NOTE: running on macOS as our sed command only works there
if: startsWith(matrix.os, 'macos-')
# We expect uv.lock to change when matrix.resolution == "highest", so we don't check it there.
if: ${{ startsWith(matrix.os, 'macos-') && matrix.resolution == 'lowest-direct' }}
run: uv run just checkgenerate

- uses: codecov/codecov-action@v5
Expand Down
5 changes: 3 additions & 2 deletions conformance/buf.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ version: v2
inputs:
- module: buf.build/connectrpc/conformance:v1.0.4
plugins:
- remote: buf.build/protocolbuffers/python:v32.0
# NOTE: v26.0 is the earliest version supporting protobuf==5.
- remote: buf.build/protocolbuffers/python:v26.0
out: test/gen
- remote: buf.build/protocolbuffers/pyi:v32.0
- remote: buf.build/protocolbuffers/pyi:v26.0
out: test/gen
- local:
- go
Expand Down
17 changes: 0 additions & 17 deletions conformance/pyproject.toml

This file was deleted.

11 changes: 6 additions & 5 deletions conformance/test/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@

import httpx
from _util import create_standard_streams
from connectrpc.client import ResponseMetadata
from connectrpc.code import Code
from connectrpc.errors import ConnectError
from connectrpc.request import Headers
from gen.connectrpc.conformance.v1.client_compat_pb2 import (
ClientCompatRequest,
ClientCompatResponse,
Expand All @@ -33,9 +29,14 @@
UnaryRequest,
UnimplementedRequest,
)
from google.protobuf.any import Any
from google.protobuf.any_pb2 import Any
from google.protobuf.message import Message

from connectrpc.client import ResponseMetadata
from connectrpc.code import Code
from connectrpc.errors import ConnectError
from connectrpc.request import Headers


def _convert_code(error: Code) -> ConformanceCode:
match error:
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ from google.protobuf import struct_pb2 as _struct_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from collections.abc import Iterable as _Iterable, Mapping as _Mapping
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

Expand Down Expand Up @@ -62,7 +61,7 @@ class ClientCompatRequest(_message.Message):
request_delay_ms: int
cancel: ClientCompatRequest.Cancel
raw_request: _service_pb2.RawHTTPRequest
def __init__(self, test_name: _Optional[str] = ..., http_version: _Optional[_Union[_config_pb2.HTTPVersion, str]] = ..., protocol: _Optional[_Union[_config_pb2.Protocol, str]] = ..., codec: _Optional[_Union[_config_pb2.Codec, str]] = ..., compression: _Optional[_Union[_config_pb2.Compression, str]] = ..., host: _Optional[str] = ..., port: _Optional[int] = ..., server_tls_cert: _Optional[bytes] = ..., client_tls_creds: _Optional[_Union[_config_pb2.TLSCreds, _Mapping]] = ..., message_receive_limit: _Optional[int] = ..., service: _Optional[str] = ..., method: _Optional[str] = ..., stream_type: _Optional[_Union[_config_pb2.StreamType, str]] = ..., use_get_http_method: _Optional[bool] = ..., request_headers: _Optional[_Iterable[_Union[_service_pb2.Header, _Mapping]]] = ..., request_messages: _Optional[_Iterable[_Union[_any_pb2.Any, _Mapping]]] = ..., timeout_ms: _Optional[int] = ..., request_delay_ms: _Optional[int] = ..., cancel: _Optional[_Union[ClientCompatRequest.Cancel, _Mapping]] = ..., raw_request: _Optional[_Union[_service_pb2.RawHTTPRequest, _Mapping]] = ...) -> None: ...
def __init__(self, test_name: _Optional[str] = ..., http_version: _Optional[_Union[_config_pb2.HTTPVersion, str]] = ..., protocol: _Optional[_Union[_config_pb2.Protocol, str]] = ..., codec: _Optional[_Union[_config_pb2.Codec, str]] = ..., compression: _Optional[_Union[_config_pb2.Compression, str]] = ..., host: _Optional[str] = ..., port: _Optional[int] = ..., server_tls_cert: _Optional[bytes] = ..., client_tls_creds: _Optional[_Union[_config_pb2.TLSCreds, _Mapping]] = ..., message_receive_limit: _Optional[int] = ..., service: _Optional[str] = ..., method: _Optional[str] = ..., stream_type: _Optional[_Union[_config_pb2.StreamType, str]] = ..., use_get_http_method: bool = ..., request_headers: _Optional[_Iterable[_Union[_service_pb2.Header, _Mapping]]] = ..., request_messages: _Optional[_Iterable[_Union[_any_pb2.Any, _Mapping]]] = ..., timeout_ms: _Optional[int] = ..., request_delay_ms: _Optional[int] = ..., cancel: _Optional[_Union[ClientCompatRequest.Cancel, _Mapping]] = ..., raw_request: _Optional[_Union[_service_pb2.RawHTTPRequest, _Mapping]] = ...) -> None: ...

class ClientCompatResponse(_message.Message):
__slots__ = ("test_name", "response", "error")
Expand Down
12 changes: 1 addition & 11 deletions conformance/test/gen/connectrpc/conformance/v1/config_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions conformance/test/gen/connectrpc/conformance/v1/config_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from collections.abc import Iterable as _Iterable, Mapping as _Mapping
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

Expand Down Expand Up @@ -145,7 +144,7 @@ class Features(_message.Message):
supports_half_duplex_bidi_over_http1: bool
supports_connect_get: bool
supports_message_receive_limit: bool
def __init__(self, versions: _Optional[_Iterable[_Union[HTTPVersion, str]]] = ..., protocols: _Optional[_Iterable[_Union[Protocol, str]]] = ..., codecs: _Optional[_Iterable[_Union[Codec, str]]] = ..., compressions: _Optional[_Iterable[_Union[Compression, str]]] = ..., stream_types: _Optional[_Iterable[_Union[StreamType, str]]] = ..., supports_h2c: _Optional[bool] = ..., supports_tls: _Optional[bool] = ..., supports_tls_client_certs: _Optional[bool] = ..., supports_trailers: _Optional[bool] = ..., supports_half_duplex_bidi_over_http1: _Optional[bool] = ..., supports_connect_get: _Optional[bool] = ..., supports_message_receive_limit: _Optional[bool] = ...) -> None: ...
def __init__(self, versions: _Optional[_Iterable[_Union[HTTPVersion, str]]] = ..., protocols: _Optional[_Iterable[_Union[Protocol, str]]] = ..., codecs: _Optional[_Iterable[_Union[Codec, str]]] = ..., compressions: _Optional[_Iterable[_Union[Compression, str]]] = ..., stream_types: _Optional[_Iterable[_Union[StreamType, str]]] = ..., supports_h2c: bool = ..., supports_tls: bool = ..., supports_tls_client_certs: bool = ..., supports_trailers: bool = ..., supports_half_duplex_bidi_over_http1: bool = ..., supports_connect_get: bool = ..., supports_message_receive_limit: bool = ...) -> None: ...

class ConfigCase(_message.Message):
__slots__ = ("version", "protocol", "codec", "compression", "stream_type", "use_tls", "use_tls_client_certs", "use_message_receive_limit")
Expand All @@ -165,7 +164,7 @@ class ConfigCase(_message.Message):
use_tls: bool
use_tls_client_certs: bool
use_message_receive_limit: bool
def __init__(self, version: _Optional[_Union[HTTPVersion, str]] = ..., protocol: _Optional[_Union[Protocol, str]] = ..., codec: _Optional[_Union[Codec, str]] = ..., compression: _Optional[_Union[Compression, str]] = ..., stream_type: _Optional[_Union[StreamType, str]] = ..., use_tls: _Optional[bool] = ..., use_tls_client_certs: _Optional[bool] = ..., use_message_receive_limit: _Optional[bool] = ...) -> None: ...
def __init__(self, version: _Optional[_Union[HTTPVersion, str]] = ..., protocol: _Optional[_Union[Protocol, str]] = ..., codec: _Optional[_Union[Codec, str]] = ..., compression: _Optional[_Union[Compression, str]] = ..., stream_type: _Optional[_Union[StreamType, str]] = ..., use_tls: bool = ..., use_tls_client_certs: bool = ..., use_message_receive_limit: bool = ...) -> None: ...

class TLSCreds(_message.Message):
__slots__ = ("cert", "key")
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from gen.connectrpc.conformance.v1 import config_pb2 as _config_pb2
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from collections.abc import Mapping as _Mapping
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

Expand All @@ -20,7 +19,7 @@ class ServerCompatRequest(_message.Message):
client_tls_cert: bytes
message_receive_limit: int
server_creds: _config_pb2.TLSCreds
def __init__(self, protocol: _Optional[_Union[_config_pb2.Protocol, str]] = ..., http_version: _Optional[_Union[_config_pb2.HTTPVersion, str]] = ..., use_tls: _Optional[bool] = ..., client_tls_cert: _Optional[bytes] = ..., message_receive_limit: _Optional[int] = ..., server_creds: _Optional[_Union[_config_pb2.TLSCreds, _Mapping]] = ...) -> None: ...
def __init__(self, protocol: _Optional[_Union[_config_pb2.Protocol, str]] = ..., http_version: _Optional[_Union[_config_pb2.HTTPVersion, str]] = ..., use_tls: bool = ..., client_tls_cert: _Optional[bytes] = ..., message_receive_limit: _Optional[int] = ..., server_creds: _Optional[_Union[_config_pb2.TLSCreds, _Mapping]] = ...) -> None: ...

class ServerCompatResponse(_message.Message):
__slots__ = ("host", "port", "pem_cert")
Expand Down
12 changes: 1 addition & 11 deletions conformance/test/gen/connectrpc/conformance/v1/service_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ from google.protobuf import any_pb2 as _any_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from collections.abc import Iterable as _Iterable, Mapping as _Mapping
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

Expand Down Expand Up @@ -104,7 +103,7 @@ class BidiStreamRequest(_message.Message):
response_definition: StreamResponseDefinition
full_duplex: bool
request_data: bytes
def __init__(self, response_definition: _Optional[_Union[StreamResponseDefinition, _Mapping]] = ..., full_duplex: _Optional[bool] = ..., request_data: _Optional[bytes] = ...) -> None: ...
def __init__(self, response_definition: _Optional[_Union[StreamResponseDefinition, _Mapping]] = ..., full_duplex: bool = ..., request_data: _Optional[bytes] = ...) -> None: ...

class BidiStreamResponse(_message.Message):
__slots__ = ("payload",)
Expand Down Expand Up @@ -172,7 +171,7 @@ class RawHTTPRequest(_message.Message):
name: str
value: MessageContents
base64_encode: bool
def __init__(self, name: _Optional[str] = ..., value: _Optional[_Union[MessageContents, _Mapping]] = ..., base64_encode: _Optional[bool] = ...) -> None: ...
def __init__(self, name: _Optional[str] = ..., value: _Optional[_Union[MessageContents, _Mapping]] = ..., base64_encode: bool = ...) -> None: ...
VERB_FIELD_NUMBER: _ClassVar[int]
URI_FIELD_NUMBER: _ClassVar[int]
HEADERS_FIELD_NUMBER: _ClassVar[int]
Expand Down
12 changes: 1 addition & 11 deletions conformance/test/gen/connectrpc/conformance/v1/suite_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions conformance/test/gen/connectrpc/conformance/v1/suite_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ from google.protobuf.internal import containers as _containers
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from collections.abc import Iterable as _Iterable, Mapping as _Mapping
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union

DESCRIPTOR: _descriptor.FileDescriptor

Expand Down Expand Up @@ -51,7 +50,7 @@ class TestSuite(_message.Message):
relies_on_tls_client_certs: bool
relies_on_connect_get: bool
relies_on_message_receive_limit: bool
def __init__(self, name: _Optional[str] = ..., mode: _Optional[_Union[TestSuite.TestMode, str]] = ..., test_cases: _Optional[_Iterable[_Union[TestCase, _Mapping]]] = ..., relevant_protocols: _Optional[_Iterable[_Union[_config_pb2.Protocol, str]]] = ..., relevant_http_versions: _Optional[_Iterable[_Union[_config_pb2.HTTPVersion, str]]] = ..., relevant_codecs: _Optional[_Iterable[_Union[_config_pb2.Codec, str]]] = ..., relevant_compressions: _Optional[_Iterable[_Union[_config_pb2.Compression, str]]] = ..., connect_version_mode: _Optional[_Union[TestSuite.ConnectVersionMode, str]] = ..., relies_on_tls: _Optional[bool] = ..., relies_on_tls_client_certs: _Optional[bool] = ..., relies_on_connect_get: _Optional[bool] = ..., relies_on_message_receive_limit: _Optional[bool] = ...) -> None: ...
def __init__(self, name: _Optional[str] = ..., mode: _Optional[_Union[TestSuite.TestMode, str]] = ..., test_cases: _Optional[_Iterable[_Union[TestCase, _Mapping]]] = ..., relevant_protocols: _Optional[_Iterable[_Union[_config_pb2.Protocol, str]]] = ..., relevant_http_versions: _Optional[_Iterable[_Union[_config_pb2.HTTPVersion, str]]] = ..., relevant_codecs: _Optional[_Iterable[_Union[_config_pb2.Codec, str]]] = ..., relevant_compressions: _Optional[_Iterable[_Union[_config_pb2.Compression, str]]] = ..., connect_version_mode: _Optional[_Union[TestSuite.ConnectVersionMode, str]] = ..., relies_on_tls: bool = ..., relies_on_tls_client_certs: bool = ..., relies_on_connect_get: bool = ..., relies_on_message_receive_limit: bool = ...) -> None: ...

class TestCase(_message.Message):
__slots__ = ("request", "expand_requests", "expected_response", "other_allowed_error_codes")
Expand Down
16 changes: 12 additions & 4 deletions conformance/test/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
from typing import TYPE_CHECKING, Literal, TypeVar

from _util import create_standard_streams
from connectrpc.code import Code
from connectrpc.errors import ConnectError
from connectrpc.request import RequestContext
from gen.connectrpc.conformance.v1.config_pb2 import Code as ConformanceCode
from gen.connectrpc.conformance.v1.server_compat_pb2 import (
ServerCompatRequest,
Expand All @@ -38,15 +35,26 @@
UnaryResponse,
UnaryResponseDefinition,
)
from google.protobuf.any import Any, pack
from google.protobuf.any_pb2 import Any
from hypercorn.asyncio import serve as hypercorn_serve
from hypercorn.config import Config as HypercornConfig
from hypercorn.logging import Logger

from connectrpc.code import Code
from connectrpc.errors import ConnectError
from connectrpc.request import RequestContext

if TYPE_CHECKING:
from google.protobuf.message import Message


# TODO: Use google.protobuf.any.pack on upgrade to protobuf==6.
def pack(msg: "Message") -> Any:
any_msg = Any()
any_msg.Pack(msg)
return any_msg


def _convert_code(conformance_code: ConformanceCode) -> Code:
match conformance_code:
case ConformanceCode.CODE_CANCELED:
Expand Down
Loading