diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 223f0b415e45..70d4de091b65 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -56,6 +56,7 @@ "stubs/icalendar/icalendar/timezone/provider.pyi", "stubs/jsonschema", "stubs/jwcrypto", + "stubs/kafka-python", "stubs/ldap3", "stubs/m3u8/m3u8/model.pyi", "stubs/Markdown", diff --git a/stubs/kafka-python/@tests/stubtest_allowlist.txt b/stubs/kafka-python/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..b8dfd146c7cc --- /dev/null +++ b/stubs/kafka-python/@tests/stubtest_allowlist.txt @@ -0,0 +1,24 @@ +# Command-line entry points are not a useful typed API surface. +kafka.__main__ +kafka.admin.__main__ +kafka.consumer.__main__ +kafka.producer.__main__ + +# Benchmark modules are not included in type stubs. +kafka.benchmarks.* + +# Concrete subclasses define these abstract properties as class attributes. +kafka.protocol.api.Request.API_KEY +kafka.protocol.api.Request.API_VERSION +kafka.protocol.api.Request.RESPONSE_TYPE +kafka.protocol.api.Request.SCHEMA +kafka.protocol.api.Response.API_KEY +kafka.protocol.api.Response.API_VERSION +kafka.protocol.api.Response.SCHEMA + +# Vendored compatibility modules are implementation details. +kafka.vendor +kafka.vendor.enum34 +kafka.vendor.selectors34 +kafka.vendor.six +kafka.vendor.socketpair diff --git a/stubs/kafka-python/@tests/stubtest_allowlist_darwin.txt b/stubs/kafka-python/@tests/stubtest_allowlist_darwin.txt new file mode 100644 index 000000000000..0f5c5020fb76 --- /dev/null +++ b/stubs/kafka-python/@tests/stubtest_allowlist_darwin.txt @@ -0,0 +1,2 @@ +# The bytes subclass object layout differs by platform/Python build. +kafka.protocol.message.PartialMessage diff --git a/stubs/kafka-python/METADATA.toml b/stubs/kafka-python/METADATA.toml new file mode 100644 index 000000000000..2f06c1b96010 --- /dev/null +++ b/stubs/kafka-python/METADATA.toml @@ -0,0 +1,2 @@ +version = "2.3.*" +upstream-repository = "https://github.com/dpkp/kafka-python" diff --git a/stubs/kafka-python/kafka/__init__.pyi b/stubs/kafka-python/kafka/__init__.pyi new file mode 100644 index 000000000000..36252752f501 --- /dev/null +++ b/stubs/kafka-python/kafka/__init__.pyi @@ -0,0 +1,13 @@ +import logging + +from kafka.admin import KafkaAdminClient as KafkaAdminClient +from kafka.client_async import KafkaClient as KafkaClient +from kafka.conn import BrokerConnection as BrokerConnection +from kafka.consumer import KafkaConsumer as KafkaConsumer +from kafka.consumer.subscription_state import ConsumerRebalanceListener as ConsumerRebalanceListener +from kafka.producer import KafkaProducer as KafkaProducer + +__all__ = ["BrokerConnection", "ConsumerRebalanceListener", "KafkaAdminClient", "KafkaClient", "KafkaConsumer", "KafkaProducer"] + +class NullHandler(logging.Handler): + def emit(self, record) -> None: ... diff --git a/stubs/kafka-python/kafka/admin/__init__.pyi b/stubs/kafka-python/kafka/admin/__init__.pyi new file mode 100644 index 000000000000..d895bbf521e0 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/__init__.pyi @@ -0,0 +1,30 @@ +from kafka.admin.acl_resource import ( + ACL as ACL, + ACLFilter as ACLFilter, + ACLOperation as ACLOperation, + ACLPermissionType as ACLPermissionType, + ACLResourcePatternType as ACLResourcePatternType, + ResourcePattern as ResourcePattern, + ResourcePatternFilter as ResourcePatternFilter, + ResourceType as ResourceType, +) +from kafka.admin.client import KafkaAdminClient as KafkaAdminClient +from kafka.admin.config_resource import ConfigResource as ConfigResource, ConfigResourceType as ConfigResourceType +from kafka.admin.new_partitions import NewPartitions as NewPartitions +from kafka.admin.new_topic import NewTopic as NewTopic + +__all__ = [ + "ConfigResource", + "ConfigResourceType", + "KafkaAdminClient", + "NewTopic", + "NewPartitions", + "ACL", + "ACLFilter", + "ResourcePattern", + "ResourcePatternFilter", + "ACLOperation", + "ResourceType", + "ACLPermissionType", + "ACLResourcePatternType", +] diff --git a/stubs/kafka-python/kafka/admin/acl_resource.pyi b/stubs/kafka-python/kafka/admin/acl_resource.pyi new file mode 100644 index 000000000000..ea613c07dbe3 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/acl_resource.pyi @@ -0,0 +1,91 @@ +from enum import IntEnum + +class ResourceType(IntEnum): + UNKNOWN = 0 + ANY = 1 + CLUSTER = 4 + DELEGATION_TOKEN = 6 + GROUP = 3 + TOPIC = 2 + TRANSACTIONAL_ID = 5 + +class ACLOperation(IntEnum): + UNKNOWN = 0 + ANY = 1 + ALL = 2 + READ = 3 + WRITE = 4 + CREATE = 5 + DELETE = 6 + ALTER = 7 + DESCRIBE = 8 + CLUSTER_ACTION = 9 + DESCRIBE_CONFIGS = 10 + ALTER_CONFIGS = 11 + IDEMPOTENT_WRITE = 12 + CREATE_TOKENS = 13 + DESCRIBE_TOKENS = 13 + +class ACLPermissionType(IntEnum): + UNKNOWN = 0 + ANY = 1 + DENY = 2 + ALLOW = 3 + +class ACLResourcePatternType(IntEnum): + UNKNOWN = 0 + ANY = 1 + MATCH = 2 + LITERAL = 3 + PREFIXED = 4 + +class ACLFilter: + principal: str | None + host: str | None + operation: ACLOperation + permission_type: ACLPermissionType + resource_pattern: ResourcePatternFilter + def __init__( + self, + principal: str | None, + host: str | None, + operation: ACLOperation, + permission_type: ACLPermissionType, + resource_pattern: ResourcePatternFilter, + ) -> None: ... + def validate(self) -> None: ... + def __eq__(self, other): ... + def __hash__(self): ... + +class ACL(ACLFilter): + resource_pattern: ResourcePattern + def __init__( + self, + principal: str, + host: str, + operation: ACLOperation, + permission_type: ACLPermissionType, + resource_pattern: ResourcePattern, + ) -> None: ... + def validate(self) -> None: ... + +class ResourcePatternFilter: + resource_type: ResourceType + resource_name: str | None + pattern_type: ACLResourcePatternType + def __init__(self, resource_type: ResourceType, resource_name: str | None, pattern_type: ACLResourcePatternType) -> None: ... + def validate(self) -> None: ... + def __eq__(self, other): ... + def __hash__(self): ... + +class ResourcePattern(ResourcePatternFilter): + resource_name: str + def __init__( + self, + resource_type: ResourceType, + resource_name: str, + pattern_type: ACLResourcePatternType = ACLResourcePatternType.LITERAL, + ) -> None: ... + def validate(self) -> None: ... + +def valid_acl_operations(int_vals) -> set[ACLOperation]: ... diff --git a/stubs/kafka-python/kafka/admin/client.pyi b/stubs/kafka-python/kafka/admin/client.pyi new file mode 100644 index 000000000000..bbda95e50889 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/client.pyi @@ -0,0 +1,114 @@ +import selectors +import ssl +from _typeshed import Incomplete +from collections.abc import Callable, Iterable, Mapping, Sequence +from typing import Literal, TypeAlias, TypedDict, type_check_only +from typing_extensions import Unpack + +from kafka.admin.acl_resource import ACL, ACLFilter +from kafka.admin.config_resource import ConfigResource +from kafka.admin.new_partitions import NewPartitions +from kafka.admin.new_topic import NewTopic +from kafka.errors import KafkaError +from kafka.protocol.admin import ElectionType +from kafka.structs import GroupInformation, OffsetAndMetadata, TopicPartition + +_ApiVersion: TypeAlias = tuple[int, ...] +_BootstrapServers: TypeAlias = str | Sequence[str] +_KafkaClientFactory: TypeAlias = Callable[..., object] +_SaslMechanism: TypeAlias = Literal["PLAIN", "GSSAPI", "OAUTHBEARER", "SCRAM-SHA-256", "SCRAM-SHA-512"] +_SecurityProtocol: TypeAlias = Literal["PLAINTEXT", "SSL", "SASL_PLAINTEXT", "SASL_SSL"] +_SocketOption: TypeAlias = tuple[int, int, int] + +@type_check_only +class _KafkaAdminClientConfig(TypedDict, total=False): + bootstrap_servers: _BootstrapServers + client_id: str + request_timeout_ms: int + connections_max_idle_ms: int + reconnect_backoff_ms: int + reconnect_backoff_max_ms: int + max_in_flight_requests_per_connection: int + receive_buffer_bytes: int | None + send_buffer_bytes: int | None + socket_options: Sequence[_SocketOption] + sock_chunk_bytes: int + sock_chunk_buffer_count: int + retry_backoff_ms: int + metadata_max_age_ms: int + security_protocol: _SecurityProtocol + ssl_context: ssl.SSLContext | None + ssl_check_hostname: bool + ssl_cafile: str | None + ssl_certfile: str | None + ssl_keyfile: str | None + ssl_password: str | None + ssl_crlfile: str | None + api_version: _ApiVersion | None + api_version_auto_timeout_ms: int + selector: type[selectors.BaseSelector] + sasl_mechanism: _SaslMechanism | None + sasl_plain_username: str | None + sasl_plain_password: str | None + sasl_kerberos_name: object | None + sasl_kerberos_service_name: str + sasl_kerberos_domain_name: str | None + sasl_oauth_token_provider: object | None + socks5_proxy: str | None + metric_reporters: Sequence[type[object]] + metrics_num_samples: int + metrics_sample_window_ms: int + kafka_client: _KafkaClientFactory + +@type_check_only +class _CreateAclsResult(TypedDict): + succeeded: list[ACL] + failed: list[tuple[ACL, KafkaError]] + +log: Incomplete + +class KafkaAdminClient: + DEFAULT_CONFIG: Incomplete + config: Incomplete + def __init__(self, **configs: Unpack[_KafkaAdminClientConfig]) -> None: ... + def close(self) -> None: ... + def send_request(self, request, node_id=None): ... + def send_requests(self, requests_and_node_ids, response_fn=...): ... + def create_topics(self, new_topics: Sequence[NewTopic], timeout_ms: int | None = None, validate_only: bool = False): ... + def delete_topics(self, topics: Sequence[str], timeout_ms: int | None = None): ... + def list_topics(self) -> list[str]: ... + def describe_topics(self, topics: Sequence[str] | None = None) -> list[dict[str, Incomplete]]: ... + def describe_cluster(self) -> dict[str, Incomplete]: ... + def describe_acls(self, acl_filter: ACLFilter) -> tuple[list[ACL], KafkaError]: ... + def create_acls(self, acls: Sequence[ACL]) -> _CreateAclsResult: ... + def delete_acls( + self, acl_filters: Sequence[ACLFilter] + ) -> list[tuple[ACLFilter, list[tuple[ACL, KafkaError]], KafkaError]]: ... + def describe_configs(self, config_resources: Sequence[ConfigResource], include_synonyms: bool = False): ... + def alter_configs(self, config_resources: Sequence[ConfigResource]): ... + def create_partitions( + self, topic_partitions: Mapping[str, NewPartitions], timeout_ms: int | None = None, validate_only: bool = False + ): ... + def delete_records( + self, + records_to_delete: Mapping[TopicPartition, int], + timeout_ms: float | None = None, + partition_leader_id: int | None = None, + ) -> dict[TopicPartition, Incomplete]: ... + def describe_consumer_groups( + self, group_ids: Sequence[str], group_coordinator_id: int | None = None, include_authorized_operations: bool = False + ) -> list[GroupInformation]: ... + def list_consumer_groups(self, broker_ids: Sequence[int] | None = None) -> list[tuple[str, str]]: ... + def list_consumer_group_offsets( + self, group_id: str, group_coordinator_id: int | None = None, partitions: Iterable[TopicPartition] | None = None + ) -> dict[TopicPartition, OffsetAndMetadata]: ... + def delete_consumer_groups( + self, group_ids: Sequence[str], group_coordinator_id: int | None = None + ) -> list[tuple[str, KafkaError]]: ... + def perform_leader_election( + self, + election_type: int | ElectionType, + topic_partitions: Mapping[str, Sequence[int]] | None = None, + timeout_ms: int | None = None, + ): ... + def describe_log_dirs(self): ... diff --git a/stubs/kafka-python/kafka/admin/config_resource.pyi b/stubs/kafka-python/kafka/admin/config_resource.pyi new file mode 100644 index 000000000000..8a54cca3b482 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/config_resource.pyi @@ -0,0 +1,12 @@ +from collections.abc import Mapping +from enum import IntEnum + +class ConfigResourceType(IntEnum): + BROKER = 4 + TOPIC = 2 + +class ConfigResource: + resource_type: ConfigResourceType + name: str + configs: Mapping[str, str] | None + def __init__(self, resource_type: ConfigResourceType, name: str, configs: Mapping[str, str] | None = None) -> None: ... diff --git a/stubs/kafka-python/kafka/admin/new_partitions.pyi b/stubs/kafka-python/kafka/admin/new_partitions.pyi new file mode 100644 index 000000000000..b828f1f5fef6 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/new_partitions.pyi @@ -0,0 +1,6 @@ +from collections.abc import Sequence + +class NewPartitions: + total_count: int + new_assignments: Sequence[Sequence[int]] | None + def __init__(self, total_count: int, new_assignments: Sequence[Sequence[int]] | None = None) -> None: ... diff --git a/stubs/kafka-python/kafka/admin/new_topic.pyi b/stubs/kafka-python/kafka/admin/new_topic.pyi new file mode 100644 index 000000000000..4a1d64ba08c0 --- /dev/null +++ b/stubs/kafka-python/kafka/admin/new_topic.pyi @@ -0,0 +1,16 @@ +from collections.abc import Mapping, Sequence + +class NewTopic: + name: str + num_partitions: int + replication_factor: int + replica_assignments: Mapping[int, Sequence[int]] | None + topic_configs: Mapping[str, str] | None + def __init__( + self, + name: str, + num_partitions: int = -1, + replication_factor: int = -1, + replica_assignments: Mapping[int, Sequence[int]] | None = None, + topic_configs: Mapping[str, str] | None = None, + ) -> None: ... diff --git a/stubs/kafka-python/kafka/cli/__init__.pyi b/stubs/kafka-python/kafka/cli/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/kafka-python/kafka/cli/admin/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/__init__.pyi new file mode 100644 index 000000000000..50eefc19daa8 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/__init__.pyi @@ -0,0 +1,3 @@ +def main_parser(): ... +def build_kwargs(props): ... +def run_cli(args=None): ... diff --git a/stubs/kafka-python/kafka/cli/admin/cluster/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/cluster/__init__.pyi new file mode 100644 index 000000000000..3a1217ed3605 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/cluster/__init__.pyi @@ -0,0 +1,3 @@ +class ClusterSubCommand: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/cluster/describe.pyi b/stubs/kafka-python/kafka/cli/admin/cluster/describe.pyi new file mode 100644 index 000000000000..d68bcbed33cb --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/cluster/describe.pyi @@ -0,0 +1,3 @@ +class DescribeCluster: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/configs/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/configs/__init__.pyi new file mode 100644 index 000000000000..bf9567add55a --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/configs/__init__.pyi @@ -0,0 +1,3 @@ +class ConfigsSubCommand: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/configs/describe.pyi b/stubs/kafka-python/kafka/cli/admin/configs/describe.pyi new file mode 100644 index 000000000000..175fad7af132 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/configs/describe.pyi @@ -0,0 +1,5 @@ +class DescribeConfigs: + @classmethod + def add_subparser(cls, subparsers) -> None: ... + @classmethod + def command(cls, client, args): ... diff --git a/stubs/kafka-python/kafka/cli/admin/consumer_groups/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/consumer_groups/__init__.pyi new file mode 100644 index 000000000000..782b1765b411 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/consumer_groups/__init__.pyi @@ -0,0 +1,3 @@ +class ConsumerGroupsSubCommand: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/consumer_groups/delete.pyi b/stubs/kafka-python/kafka/cli/admin/consumer_groups/delete.pyi new file mode 100644 index 000000000000..90e373374fc5 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/consumer_groups/delete.pyi @@ -0,0 +1,3 @@ +class DeleteConsumerGroups: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/consumer_groups/describe.pyi b/stubs/kafka-python/kafka/cli/admin/consumer_groups/describe.pyi new file mode 100644 index 000000000000..ce25bc8a0d33 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/consumer_groups/describe.pyi @@ -0,0 +1,3 @@ +class DescribeConsumerGroups: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/consumer_groups/list.pyi b/stubs/kafka-python/kafka/cli/admin/consumer_groups/list.pyi new file mode 100644 index 000000000000..9e16c1de775f --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/consumer_groups/list.pyi @@ -0,0 +1,3 @@ +class ListConsumerGroups: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/consumer_groups/list_offsets.pyi b/stubs/kafka-python/kafka/cli/admin/consumer_groups/list_offsets.pyi new file mode 100644 index 000000000000..e175d4510b08 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/consumer_groups/list_offsets.pyi @@ -0,0 +1,3 @@ +class ListConsumerGroupOffsets: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/log_dirs/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/log_dirs/__init__.pyi new file mode 100644 index 000000000000..a42ac1f93a4e --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/log_dirs/__init__.pyi @@ -0,0 +1,3 @@ +class LogDirsSubCommand: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/log_dirs/describe.pyi b/stubs/kafka-python/kafka/cli/admin/log_dirs/describe.pyi new file mode 100644 index 000000000000..a9ab6d5a7bc9 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/log_dirs/describe.pyi @@ -0,0 +1,3 @@ +class DescribeLogDirs: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/topics/__init__.pyi b/stubs/kafka-python/kafka/cli/admin/topics/__init__.pyi new file mode 100644 index 000000000000..0345a054a456 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/topics/__init__.pyi @@ -0,0 +1,3 @@ +class TopicsSubCommand: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/topics/create.pyi b/stubs/kafka-python/kafka/cli/admin/topics/create.pyi new file mode 100644 index 000000000000..2902efef9999 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/topics/create.pyi @@ -0,0 +1,5 @@ +class CreateTopic: + @classmethod + def add_subparser(cls, subparsers) -> None: ... + @classmethod + def command(cls, client, args): ... diff --git a/stubs/kafka-python/kafka/cli/admin/topics/delete.pyi b/stubs/kafka-python/kafka/cli/admin/topics/delete.pyi new file mode 100644 index 000000000000..128a5c51365e --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/topics/delete.pyi @@ -0,0 +1,3 @@ +class DeleteTopic: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/topics/describe.pyi b/stubs/kafka-python/kafka/cli/admin/topics/describe.pyi new file mode 100644 index 000000000000..ab0ec7438f58 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/topics/describe.pyi @@ -0,0 +1,3 @@ +class DescribeTopics: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/admin/topics/list.pyi b/stubs/kafka-python/kafka/cli/admin/topics/list.pyi new file mode 100644 index 000000000000..b23a865b72e4 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/admin/topics/list.pyi @@ -0,0 +1,3 @@ +class ListTopics: + @classmethod + def add_subparser(cls, subparsers): ... diff --git a/stubs/kafka-python/kafka/cli/consumer/__init__.pyi b/stubs/kafka-python/kafka/cli/consumer/__init__.pyi new file mode 100644 index 000000000000..50eefc19daa8 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/consumer/__init__.pyi @@ -0,0 +1,3 @@ +def main_parser(): ... +def build_kwargs(props): ... +def run_cli(args=None): ... diff --git a/stubs/kafka-python/kafka/cli/producer/__init__.pyi b/stubs/kafka-python/kafka/cli/producer/__init__.pyi new file mode 100644 index 000000000000..50eefc19daa8 --- /dev/null +++ b/stubs/kafka-python/kafka/cli/producer/__init__.pyi @@ -0,0 +1,3 @@ +def main_parser(): ... +def build_kwargs(props): ... +def run_cli(args=None): ... diff --git a/stubs/kafka-python/kafka/client_async.pyi b/stubs/kafka-python/kafka/client_async.pyi new file mode 100644 index 000000000000..3946ec2b79a9 --- /dev/null +++ b/stubs/kafka-python/kafka/client_async.pyi @@ -0,0 +1,56 @@ +from _typeshed import Incomplete +from collections import OrderedDict as OrderedDict + +log: Incomplete +socketpair: Incomplete + +class KafkaClient: + DEFAULT_CONFIG: Incomplete + config: Incomplete + cluster: Incomplete + def __init__(self, **configs) -> None: ... + def maybe_connect(self, node_id, wakeup: bool = True): ... + def connection_failed(self, node_id): ... + def ready(self, node_id, metadata_priority: bool = True): ... + def connected(self, node_id): ... + def close(self, node_id=None) -> None: ... + def __del__(self) -> None: ... + def is_disconnected(self, node_id): ... + def connection_delay(self, node_id): ... + def throttle_delay(self, node_id): ... + def is_ready(self, node_id, metadata_priority: bool = True): ... + def send(self, node_id, request, wakeup: bool = True, request_timeout_ms=None): ... + def poll(self, timeout_ms=None, future=None): ... + def in_flight_request_count(self, node_id=None): ... + def least_loaded_node(self): ... + def least_loaded_node_refresh_ms(self): ... + def set_topics(self, topics): ... + def add_topic(self, topic): ... + def get_api_versions(self): ... + def check_version(self, node_id=None, timeout=None, **kwargs): ... + def api_version(self, operation, max_version=None): ... + def wakeup(self) -> None: ... + def bootstrap_connected(self): ... + def await_ready(self, node_id, timeout_ms: int = 30000): ... + def send_and_receive(self, node_id, request): ... + +class IdleConnectionManager: + connections_max_idle: Incomplete + next_idle_close_check_time: Incomplete + lru_connections: Incomplete + def __init__(self, connections_max_idle_ms) -> None: ... + def update(self, conn_id) -> None: ... + def remove(self, conn_id) -> None: ... + def is_expired(self, conn_id): ... + def next_check_ms(self): ... + def update_next_idle_close_check_time(self, ts) -> None: ... + def poll_expired_connection(self): ... + +class KafkaClientMetrics: + metrics: Incomplete + metric_group_name: Incomplete + connection_closed: Incomplete + connection_created: Incomplete + select_time: Incomplete + io_time: Incomplete + def __init__(self, metrics, metric_group_prefix, conns) -> None: ... diff --git a/stubs/kafka-python/kafka/cluster.pyi b/stubs/kafka-python/kafka/cluster.pyi new file mode 100644 index 000000000000..bcfab555ca99 --- /dev/null +++ b/stubs/kafka-python/kafka/cluster.pyi @@ -0,0 +1,36 @@ +from _typeshed import Incomplete + +log: Incomplete + +class ClusterMetadata: + DEFAULT_CONFIG: Incomplete + need_all_topic_metadata: bool + unauthorized_topics: Incomplete + internal_topics: Incomplete + controller: Incomplete + cluster_id: Incomplete + config: Incomplete + def __init__(self, **configs) -> None: ... + def is_bootstrap(self, node_id): ... + def brokers(self): ... + def broker_metadata(self, broker_id): ... + def partitions_for_topic(self, topic): ... + def available_partitions_for_topic(self, topic): ... + def leader_for_partition(self, partition): ... + def leader_epoch_for_partition(self, partition): ... + def partitions_for_broker(self, broker_id): ... + def coordinator_for_group(self, group): ... + def ttl(self): ... + def refresh_backoff(self): ... + def request_update(self): ... + @property + def need_update(self): ... + def topics(self, exclude_internal_topics: bool = True): ... + def failed_update(self, exception) -> None: ... + def update_metadata(self, metadata): ... + def add_listener(self, listener) -> None: ... + def remove_listener(self, listener) -> None: ... + def add_coordinator(self, response, coord_type, coord_key): ... + def with_partitions(self, partitions_to_add): ... + +def collect_hosts(hosts, randomize: bool = True): ... diff --git a/stubs/kafka-python/kafka/codec.pyi b/stubs/kafka-python/kafka/codec.pyi new file mode 100644 index 000000000000..fcd6af14d29d --- /dev/null +++ b/stubs/kafka-python/kafka/codec.pyi @@ -0,0 +1,25 @@ +from _typeshed import Incomplete + +ZSTD_MAX_OUTPUT_SIZE: Incomplete +PYPY: Incomplete + +def has_gzip(): ... +def has_snappy(): ... +def has_zstd(): ... +def has_lz4(): ... +def gzip_encode(payload, compresslevel=None): ... +def gzip_decode(payload): ... +def snappy_encode(payload, xerial_compatible: bool = True, xerial_blocksize=32768): ... +def snappy_decode(payload): ... + +lz4_encode: Incomplete + +def lz4f_decode(payload): ... + +lz4_decode: Incomplete +lz4_decode = lz4f_decode + +def lz4_encode_old_kafka(payload): ... +def lz4_decode_old_kafka(payload): ... +def zstd_encode(payload): ... +def zstd_decode(payload): ... diff --git a/stubs/kafka-python/kafka/conn.pyi b/stubs/kafka-python/kafka/conn.pyi new file mode 100644 index 000000000000..dd7d99adbc3a --- /dev/null +++ b/stubs/kafka-python/kafka/conn.pyi @@ -0,0 +1,70 @@ +import ssl +from _typeshed import Incomplete + +log: Incomplete +DEFAULT_KAFKA_PORT: int +ssl_available: bool +SSLEOFError = ssl.SSLEOFError +SSLWantReadError = ssl.SSLWantReadError +SSLWantWriteError = ssl.SSLWantWriteError +SSLZeroReturnError = ssl.SSLZeroReturnError + +AFI_NAMES: Incomplete + +class ConnectionStates: + DISCONNECTED: str + CONNECTING: str + HANDSHAKE: str + CONNECTED: str + AUTHENTICATING: str + API_VERSIONS_SEND: str + API_VERSIONS_RECV: str + +class BrokerConnection: + DEFAULT_CONFIG: Incomplete + SECURITY_PROTOCOLS: Incomplete + VERSION_CHECKS: Incomplete + host: Incomplete + port: Incomplete + afi: Incomplete + config: Incomplete + node_id: Incomplete + in_flight_requests: Incomplete + state: Incomplete + last_attempt: int + def __init__(self, host, port, afi, **configs) -> None: ... + def connect_blocking(self, timeout=...): ... + def connect(self): ... + def blacked_out(self): ... + def throttled(self): ... + def throttle_delay(self): ... + def connection_delay(self): ... + def connected(self): ... + def connecting(self): ... + def initializing(self): ... + def disconnected(self): ... + def connect_failed(self): ... + def __del__(self) -> None: ... + def close(self, error=None) -> None: ... + def send(self, request, blocking: bool = True, request_timeout_ms=None): ... + def send_pending_requests(self): ... + def send_pending_requests_v2(self): ... + def can_send_more(self): ... + def recv(self): ... + def requests_timed_out(self): ... + def timed_out_ifrs(self): ... + def next_ifr_request_timeout_ms(self): ... + def get_api_versions(self): ... + def check_version(self, timeout: int = 2, **kwargs): ... + +class BrokerConnectionMetrics: + metrics: Incomplete + bytes_sent: Incomplete + bytes_received: Incomplete + request_time: Incomplete + throttle_time: Incomplete + def __init__(self, metrics, metric_group_prefix, node_id) -> None: ... + +def get_ip_port_afi(host_and_port_str): ... +def is_inet_4_or_6(gai): ... +def dns_lookup(host, port, afi=...): ... diff --git a/stubs/kafka-python/kafka/consumer/__init__.pyi b/stubs/kafka-python/kafka/consumer/__init__.pyi new file mode 100644 index 000000000000..6830e557ab8b --- /dev/null +++ b/stubs/kafka-python/kafka/consumer/__init__.pyi @@ -0,0 +1,3 @@ +from kafka.consumer.group import KafkaConsumer as KafkaConsumer + +__all__ = ["KafkaConsumer"] diff --git a/stubs/kafka-python/kafka/consumer/fetcher.pyi b/stubs/kafka-python/kafka/consumer/fetcher.pyi new file mode 100644 index 000000000000..a34ae667d98b --- /dev/null +++ b/stubs/kafka-python/kafka/consumer/fetcher.pyi @@ -0,0 +1,150 @@ +from _typeshed import Incomplete +from typing import ClassVar, NamedTuple + +import kafka.errors as Errors + +log: Incomplete +READ_UNCOMMITTED: int +READ_COMMITTED: int +ISOLATION_LEVEL_CONFIG: Incomplete + +class ConsumerRecord(NamedTuple): + topic: str + partition: int + leader_epoch: int | None + offset: int + timestamp: int + timestamp_type: int + key: Incomplete + value: Incomplete + headers: list[tuple[str, bytes]] + checksum: int | None + serialized_key_size: int + serialized_value_size: int + serialized_header_size: int + +class CompletedFetch(NamedTuple): + topic_partition: Incomplete + fetched_offset: Incomplete + response_version: Incomplete + partition_data: Incomplete + metric_aggregator: Incomplete + +class ExceptionMetadata(NamedTuple): + partition: Incomplete + fetched_offset: Incomplete + exception: Incomplete + +class NoOffsetForPartitionError(Errors.KafkaError): ... +class RecordTooLargeError(Errors.KafkaError): ... + +class Fetcher: + DEFAULT_CONFIG: Incomplete + config: Incomplete + def __init__(self, client, subscriptions, **configs) -> None: ... + def send_fetches(self): ... + def in_flight_fetches(self): ... + def reset_offsets_if_needed(self): ... + def offsets_by_times(self, timestamps, timeout_ms=None): ... + def beginning_offsets(self, partitions, timeout_ms): ... + def end_offsets(self, partitions, timeout_ms): ... + def beginning_or_end_offset(self, partitions, timestamp, timeout_ms): ... + def fetched_records(self, max_records=None, update_offsets: bool = True): ... + def close(self) -> None: ... + + class PartitionRecords: + fetch_offset: Incomplete + topic_partition: Incomplete + leader_epoch: int + next_fetch_offset: Incomplete + bytes_read: int + records_read: int + isolation_level: Incomplete + aborted_producer_ids: Incomplete + aborted_transactions: Incomplete + metric_aggregator: Incomplete + check_crcs: Incomplete + record_iterator: Incomplete + on_drain: Incomplete + def __init__( + self, + fetch_offset, + tp, + records, + key_deserializer=None, + value_deserializer=None, + check_crcs: bool = True, + isolation_level=0, + aborted_transactions=None, + metric_aggregator=None, + on_drain=..., + ) -> None: ... + def __bool__(self) -> bool: ... + __nonzero__ = __bool__ + def drain(self) -> None: ... + def take(self, n=None): ... + +class FetchSessionHandler: + node_id: Incomplete + next_metadata: Incomplete + session_partitions: Incomplete + def __init__(self, node_id) -> None: ... + def build_next(self, next_partitions): ... + def handle_response(self, response): ... + def handle_error(self, _exception) -> None: ... + +class FetchMetadata: + MAX_EPOCH: int + INVALID_SESSION_ID: int + THROTTLED_SESSION_ID: int + INITIAL_EPOCH: int + FINAL_EPOCH: int + INITIAL: ClassVar[FetchMetadata] + LEGACY: ClassVar[FetchMetadata] + session_id: Incomplete + epoch: Incomplete + def __init__(self, session_id, epoch) -> None: ... + @property + def is_full(self): ... + @classmethod + def next_epoch(cls, prev_epoch): ... + def next_close_existing(self): ... + @classmethod + def new_incremental(cls, session_id): ... + def next_incremental(self): ... + +class FetchRequestData: + def __init__(self, to_send, to_forget, metadata) -> None: ... + @property + def metadata(self): ... + @property + def id(self): ... + @property + def epoch(self): ... + @property + def to_send(self): ... + @property + def to_forget(self): ... + +class FetchMetrics: + total_bytes: int + total_records: int + def __init__(self) -> None: ... + +class FetchResponseMetricAggregator: + sensors: Incomplete + unrecorded_partitions: Incomplete + fetch_metrics: Incomplete + topic_fetch_metrics: Incomplete + def __init__(self, sensors, partitions) -> None: ... + def record(self, partition, num_bytes, num_records) -> None: ... + +class FetchManagerMetrics: + metrics: Incomplete + group_name: Incomplete + bytes_fetched: Incomplete + records_fetched: Incomplete + fetch_latency: Incomplete + records_fetch_lag: Incomplete + def __init__(self, metrics, prefix) -> None: ... + def record_topic_fetch_metrics(self, topic, num_bytes, num_records) -> None: ... diff --git a/stubs/kafka-python/kafka/consumer/group.pyi b/stubs/kafka-python/kafka/consumer/group.pyi new file mode 100644 index 000000000000..e18e3cf3dc33 --- /dev/null +++ b/stubs/kafka-python/kafka/consumer/group.pyi @@ -0,0 +1,143 @@ +import selectors +import ssl +from _typeshed import Incomplete +from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence +from typing import Literal, TypeAlias, TypedDict, overload, type_check_only +from typing_extensions import Self, Unpack + +from kafka.consumer.fetcher import ConsumerRecord +from kafka.consumer.subscription_state import ConsumerRebalanceListener +from kafka.future import Future +from kafka.serializer.abstract import Deserializer +from kafka.structs import OffsetAndMetadata, OffsetAndTimestamp, TopicPartition + +_ApiVersion: TypeAlias = tuple[int, ...] +_BootstrapServers: TypeAlias = str | Sequence[str] +_CommitCallback: TypeAlias = Callable[[Mapping[TopicPartition, OffsetAndMetadata], object], object] +_ConsumerDeserializer: TypeAlias = Deserializer | Callable[[bytes | None], object] +_KafkaClientFactory: TypeAlias = Callable[..., object] +_SaslMechanism: TypeAlias = Literal["PLAIN", "GSSAPI", "OAUTHBEARER", "SCRAM-SHA-256", "SCRAM-SHA-512"] +_SecurityProtocol: TypeAlias = Literal["PLAINTEXT", "SSL", "SASL_PLAINTEXT", "SASL_SSL"] +_SocketOption: TypeAlias = tuple[int, int, int] + +@type_check_only +class _KafkaConsumerConfig(TypedDict, total=False): + bootstrap_servers: _BootstrapServers + client_id: str + group_id: str | None + group_instance_id: str | None + key_deserializer: _ConsumerDeserializer | None + value_deserializer: _ConsumerDeserializer | None + enable_incremental_fetch_sessions: bool + fetch_max_wait_ms: int + fetch_min_bytes: int + fetch_max_bytes: int + max_partition_fetch_bytes: int + request_timeout_ms: int + retry_backoff_ms: int + reconnect_backoff_ms: int + reconnect_backoff_max_ms: int + max_in_flight_requests_per_connection: int + auto_offset_reset: Literal["earliest", "latest", "smallest", "largest"] + enable_auto_commit: bool + auto_commit_interval_ms: int + default_offset_commit_callback: _CommitCallback + check_crcs: bool + isolation_level: Literal["read_uncommitted", "read_committed"] + allow_auto_create_topics: bool + metadata_max_age_ms: int + partition_assignment_strategy: Sequence[type[object]] + max_poll_records: int + max_poll_interval_ms: int + session_timeout_ms: int + heartbeat_interval_ms: int + receive_buffer_bytes: int | None + send_buffer_bytes: int | None + socket_options: Sequence[_SocketOption] + sock_chunk_bytes: int + sock_chunk_buffer_count: int + consumer_timeout_ms: int | float + security_protocol: _SecurityProtocol + ssl_context: ssl.SSLContext | None + ssl_check_hostname: bool + ssl_cafile: str | None + ssl_certfile: str | None + ssl_keyfile: str | None + ssl_crlfile: str | None + ssl_password: str | None + ssl_ciphers: str | None + api_version: _ApiVersion | None + api_version_auto_timeout_ms: int + connections_max_idle_ms: int + metric_reporters: Sequence[type[object]] + metrics_enabled: bool + metrics_num_samples: int + metrics_sample_window_ms: int + metric_group_prefix: str + selector: type[selectors.BaseSelector] + exclude_internal_topics: bool + sasl_mechanism: _SaslMechanism | None + sasl_plain_username: str | None + sasl_plain_password: str | None + sasl_kerberos_name: object | None + sasl_kerberos_service_name: str + sasl_kerberos_domain_name: str | None + sasl_oauth_token_provider: object | None + socks5_proxy: str | None + kafka_client: _KafkaClientFactory + +log: Incomplete + +class KafkaConsumer(Iterator[ConsumerRecord]): + DEFAULT_CONFIG: Incomplete + DEFAULT_SESSION_TIMEOUT_MS_0_9: int + config: Incomplete + def __init__(self, *topics: str, **configs: Unpack[_KafkaConsumerConfig]) -> None: ... + def bootstrap_connected(self): ... + def assign(self, partitions: Iterable[TopicPartition]) -> None: ... + def assignment(self) -> set[TopicPartition]: ... + def close(self, autocommit: bool = True, timeout_ms: int | None = None) -> None: ... + def commit_async( + self, offsets: Mapping[TopicPartition, OffsetAndMetadata] | None = None, callback: _CommitCallback | None = None + ) -> Future: ... + def commit( + self, offsets: Mapping[TopicPartition, OffsetAndMetadata] | None = None, timeout_ms: int | None = None + ) -> None: ... + + @overload + def committed( + self, partition: TopicPartition, metadata: Literal[False] = False, timeout_ms: int | None = None + ) -> int | None: ... + @overload + def committed( + self, partition: TopicPartition, metadata: Literal[True], timeout_ms: int | None = None + ) -> OffsetAndMetadata | None: ... + @overload + def committed( + self, partition: TopicPartition, metadata: bool, timeout_ms: int | None = None + ) -> int | OffsetAndMetadata | None: ... + + def topics(self) -> set[str]: ... + def partitions_for_topic(self, topic: str) -> set[int]: ... + def poll( + self, timeout_ms: int = 0, max_records: int | None = None, update_offsets: bool = True + ) -> dict[TopicPartition, list[ConsumerRecord]]: ... + def position(self, partition: TopicPartition, timeout_ms: int | None = None) -> int | None: ... + def highwater(self, partition: TopicPartition) -> int | None: ... + def pause(self, *partitions: TopicPartition) -> None: ... + def paused(self) -> set[TopicPartition]: ... + def resume(self, *partitions: TopicPartition) -> None: ... + def seek(self, partition: TopicPartition, offset: int) -> None: ... + def seek_to_beginning(self, *partitions: TopicPartition) -> None: ... + def seek_to_end(self, *partitions: TopicPartition) -> None: ... + def subscribe( + self, topics: Iterable[str] = (), pattern: str | None = None, listener: ConsumerRebalanceListener | None = None + ) -> None: ... + def subscription(self) -> set[str]: ... + def unsubscribe(self) -> None: ... + def metrics(self, raw: bool = False) -> dict[str, dict[str, object]] | dict[object, object] | None: ... + def offsets_for_times(self, timestamps: Mapping[TopicPartition, int]) -> dict[TopicPartition, OffsetAndTimestamp | None]: ... + def beginning_offsets(self, partitions: Iterable[TopicPartition]) -> dict[TopicPartition, int]: ... + def end_offsets(self, partitions: Iterable[TopicPartition]) -> dict[TopicPartition, int]: ... + def __iter__(self) -> Self: ... + def __next__(self) -> ConsumerRecord: ... diff --git a/stubs/kafka-python/kafka/consumer/subscription_state.pyi b/stubs/kafka-python/kafka/consumer/subscription_state.pyi new file mode 100644 index 000000000000..e085b78873cf --- /dev/null +++ b/stubs/kafka-python/kafka/consumer/subscription_state.pyi @@ -0,0 +1,112 @@ +import abc +from _typeshed import Incomplete +from enum import IntEnum + +from kafka.util import synchronized + +log: Incomplete + +class SubscriptionType(IntEnum): + NONE = 0 + AUTO_TOPICS = 1 + AUTO_PATTERN = 2 + USER_ASSIGNED = 3 + +class SubscriptionState: + subscription: Incomplete + subscription_type: Incomplete + subscribed_pattern: Incomplete + assignment: Incomplete + rebalance_listener: Incomplete + listeners: Incomplete + def __init__(self, offset_reset_strategy: str = "earliest") -> None: ... + @synchronized + def subscribe(self, topics=(), pattern=None, listener=None) -> None: ... + @synchronized + def change_subscription(self, topics) -> None: ... + @synchronized + def group_subscribe(self, topics) -> None: ... + @synchronized + def reset_group_subscription(self) -> None: ... + @synchronized + def assign_from_user(self, partitions) -> None: ... + @synchronized + def assign_from_subscribed(self, assignments) -> None: ... + @synchronized + def unsubscribe(self) -> None: ... + @synchronized + def group_subscription(self): ... + @synchronized + def seek(self, partition, offset) -> None: ... + @synchronized + def assigned_partitions(self): ... + @synchronized + def paused_partitions(self): ... + @synchronized + def fetchable_partitions(self): ... + @synchronized + def partitions_auto_assigned(self): ... + @synchronized + def all_consumed_offsets(self): ... + @synchronized + def request_offset_reset(self, partition, offset_reset_strategy=None) -> None: ... + @synchronized + def set_reset_pending(self, partitions, next_allowed_reset_time) -> None: ... + @synchronized + def has_default_offset_reset_policy(self): ... + @synchronized + def is_offset_reset_needed(self, partition): ... + @synchronized + def has_all_fetch_positions(self): ... + @synchronized + def missing_fetch_positions(self): ... + @synchronized + def has_valid_position(self, partition): ... + @synchronized + def reset_missing_positions(self) -> None: ... + @synchronized + def partitions_needing_reset(self): ... + @synchronized + def is_assigned(self, partition): ... + @synchronized + def is_paused(self, partition): ... + @synchronized + def is_fetchable(self, partition): ... + @synchronized + def pause(self, partition) -> None: ... + @synchronized + def resume(self, partition) -> None: ... + @synchronized + def reset_failed(self, partitions, next_retry_time) -> None: ... + @synchronized + def move_partition_to_end(self, partition) -> None: ... + @synchronized + def position(self, partition): ... + +class TopicPartitionState: + paused: bool + reset_strategy: Incomplete + highwater: Incomplete + drop_pending_record_batch: bool + next_allowed_retry_time: Incomplete + def __init__(self) -> None: ... + position: Incomplete + def reset(self, strategy) -> None: ... + def is_reset_allowed(self): ... + @property + def awaiting_reset(self): ... + def set_reset_pending(self, next_allowed_retry_time) -> None: ... + def reset_failed(self, next_allowed_retry_time) -> None: ... + @property + def has_valid_position(self): ... + def is_missing_position(self): ... + def seek(self, offset) -> None: ... + def pause(self) -> None: ... + def resume(self) -> None: ... + def is_fetchable(self): ... + +class ConsumerRebalanceListener(metaclass=abc.ABCMeta): + @abc.abstractmethod + def on_partitions_revoked(self, revoked): ... + @abc.abstractmethod + def on_partitions_assigned(self, assigned): ... diff --git a/stubs/kafka-python/kafka/coordinator/__init__.pyi b/stubs/kafka-python/kafka/coordinator/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/kafka-python/kafka/coordinator/assignors/__init__.pyi b/stubs/kafka-python/kafka/coordinator/assignors/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/kafka-python/kafka/coordinator/assignors/abstract.pyi b/stubs/kafka-python/kafka/coordinator/assignors/abstract.pyi new file mode 100644 index 000000000000..898c5dc4d676 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/abstract.pyi @@ -0,0 +1,15 @@ +import abc +from _typeshed import Incomplete + +log: Incomplete + +class AbstractPartitionAssignor(metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def name(self): ... + @abc.abstractmethod + def assign(self, cluster, members): ... + @abc.abstractmethod + def metadata(self, topics): ... + @abc.abstractmethod + def on_assignment(self, assignment): ... diff --git a/stubs/kafka-python/kafka/coordinator/assignors/range.pyi b/stubs/kafka-python/kafka/coordinator/assignors/range.pyi new file mode 100644 index 000000000000..667d52af7efd --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/range.pyi @@ -0,0 +1,15 @@ +from _typeshed import Incomplete + +from kafka.coordinator.assignors.abstract import AbstractPartitionAssignor + +log: Incomplete + +class RangePartitionAssignor(AbstractPartitionAssignor): + name: str + version: int + @classmethod + def assign(cls, cluster, group_subscriptions): ... + @classmethod + def metadata(cls, topics): ... + @classmethod + def on_assignment(cls, assignment) -> None: ... diff --git a/stubs/kafka-python/kafka/coordinator/assignors/roundrobin.pyi b/stubs/kafka-python/kafka/coordinator/assignors/roundrobin.pyi new file mode 100644 index 000000000000..b876b9cec002 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/roundrobin.pyi @@ -0,0 +1,15 @@ +from _typeshed import Incomplete + +from kafka.coordinator.assignors.abstract import AbstractPartitionAssignor + +log: Incomplete + +class RoundRobinPartitionAssignor(AbstractPartitionAssignor): + name: str + version: int + @classmethod + def assign(cls, cluster, group_subscriptions): ... + @classmethod + def metadata(cls, topics): ... + @classmethod + def on_assignment(cls, assignment) -> None: ... diff --git a/stubs/kafka-python/kafka/coordinator/assignors/sticky/__init__.pyi b/stubs/kafka-python/kafka/coordinator/assignors/sticky/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/kafka-python/kafka/coordinator/assignors/sticky/partition_movements.pyi b/stubs/kafka-python/kafka/coordinator/assignors/sticky/partition_movements.pyi new file mode 100644 index 000000000000..1b3620d3623c --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/sticky/partition_movements.pyi @@ -0,0 +1,18 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +log: Incomplete + +class ConsumerPair(NamedTuple): + src_member_id: Incomplete + dst_member_id: Incomplete + +def is_sublist(source, target): ... + +class PartitionMovements: + partition_movements_by_topic: Incomplete + partition_movements: Incomplete + def __init__(self) -> None: ... + def move_partition(self, partition, old_consumer, new_consumer) -> None: ... + def get_partition_to_be_moved(self, partition, old_consumer, new_consumer): ... + def are_sticky(self): ... diff --git a/stubs/kafka-python/kafka/coordinator/assignors/sticky/sorted_set.pyi b/stubs/kafka-python/kafka/coordinator/assignors/sticky/sorted_set.pyi new file mode 100644 index 000000000000..670cfe6b9c0b --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/sticky/sorted_set.pyi @@ -0,0 +1,13 @@ +from _typeshed import Incomplete + +class SortedSet: + def __init__(self, iterable=None, key=None) -> None: ... + def first(self): ... + def last(self): ... + def pop_last(self): ... + def add(self, value): ... + def remove(self, value): ... + def __contains__(self, value) -> bool: ... + def __iter__(self): ... + __nonzero__: Incomplete + __bool__: Incomplete diff --git a/stubs/kafka-python/kafka/coordinator/assignors/sticky/sticky_assignor.pyi b/stubs/kafka-python/kafka/coordinator/assignors/sticky/sticky_assignor.pyi new file mode 100644 index 000000000000..837dd5fabf3e --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/assignors/sticky/sticky_assignor.pyi @@ -0,0 +1,59 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +from kafka.coordinator.assignors.abstract import AbstractPartitionAssignor +from kafka.protocol.struct import Struct + +log: Incomplete + +class ConsumerGenerationPair(NamedTuple): + consumer: Incomplete + generation: Incomplete + +def has_identical_list_elements(list_): ... +def subscriptions_comparator_key(element): ... +def partitions_comparator_key(element): ... +def remove_if_present(collection, element) -> None: ... + +class StickyAssignorMemberMetadataV1(NamedTuple): + subscription: Incomplete + partitions: Incomplete + generation: Incomplete + +class StickyAssignorUserDataV1(Struct): + SCHEMA: Incomplete + +class StickyAssignmentExecutor: + members: Incomplete + current_assignment: Incomplete + previous_assignment: Incomplete + current_partition_consumer: Incomplete + is_fresh_assignment: bool + partition_to_all_potential_consumers: Incomplete + consumer_to_all_potential_partitions: Incomplete + sorted_current_subscriptions: Incomplete + sorted_partitions: Incomplete + unassigned_partitions: Incomplete + revocation_required: bool + partition_movements: Incomplete + def __init__(self, cluster, members) -> None: ... + def perform_initial_assignment(self) -> None: ... + def balance(self) -> None: ... + def get_final_assignment(self, member_id): ... + +class StickyPartitionAssignor(AbstractPartitionAssignor): + DEFAULT_GENERATION_ID: int + name: str + version: int + member_assignment: Incomplete + generation = DEFAULT_GENERATION_ID + @classmethod + def assign(cls, cluster, members): ... + @classmethod + def parse_member_metadata(cls, metadata): ... + @classmethod + def metadata(cls, topics): ... + @classmethod + def on_assignment(cls, assignment) -> None: ... + @classmethod + def on_generation_assignment(cls, generation) -> None: ... diff --git a/stubs/kafka-python/kafka/coordinator/base.pyi b/stubs/kafka-python/kafka/coordinator/base.pyi new file mode 100644 index 000000000000..ae911d976734 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/base.pyi @@ -0,0 +1,86 @@ +import abc +import threading +from _typeshed import Incomplete +from typing import ClassVar + +from kafka import errors as Errors + +log: Incomplete +heartbeat_log: Incomplete + +class MemberState: + UNJOINED: str + REBALANCING: str + STABLE: str + +class Generation: + NO_GENERATION: ClassVar[Generation] + generation_id: Incomplete + member_id: Incomplete + protocol: Incomplete + def __init__(self, generation_id, member_id, protocol) -> None: ... + def has_member_id(self): ... + def __eq__(self, other): ... + +class UnjoinedGroupException(Errors.KafkaError): + retriable: bool + +class BaseCoordinator(metaclass=abc.ABCMeta): + DEFAULT_CONFIG: Incomplete + config: Incomplete + heartbeat: Incomplete + rejoin_needed: bool + rejoining: bool + state: Incomplete + join_future: Incomplete + coordinator_id: Incomplete + def __init__(self, client, **configs) -> None: ... + @property + def group_id(self): ... + @property + def group_instance_id(self): ... + @abc.abstractmethod + def protocol_type(self): ... + @abc.abstractmethod + def group_protocols(self): ... + def coordinator_unknown(self): ... + def coordinator(self): ... + def connected(self): ... + def ensure_coordinator_ready(self, timeout_ms=None): ... + def lookup_coordinator(self): ... + def need_rejoin(self): ... + def poll_heartbeat(self) -> None: ... + def time_to_next_heartbeat(self): ... + def ensure_active_group(self, timeout_ms=None): ... + def join_group(self, timeout_ms=None): ... + def coordinator_dead(self, error) -> None: ... + def generation_if_stable(self): ... + def generation(self): ... + def rebalance_in_progress(self): ... + def reset_generation(self, member_id="") -> None: ... + def request_rejoin(self) -> None: ... + def __del__(self) -> None: ... + def close(self, timeout_ms=None) -> None: ... + def is_dynamic_member(self): ... + def maybe_leave_group(self, timeout_ms=None) -> None: ... + +class GroupCoordinatorMetrics: + heartbeat: Incomplete + metrics: Incomplete + metric_group_name: Incomplete + heartbeat_latency: Incomplete + join_latency: Incomplete + sync_latency: Incomplete + def __init__(self, heartbeat, metrics, prefix, tags=None) -> None: ... + +class HeartbeatThread(threading.Thread): + name: Incomplete + coordinator: Incomplete + enabled: bool + closed: bool + failed: Incomplete + def __init__(self, coordinator) -> None: ... + def enable(self) -> None: ... + def disable(self) -> None: ... + def close(self, timeout_ms=None) -> None: ... + def run(self) -> None: ... diff --git a/stubs/kafka-python/kafka/coordinator/consumer.pyi b/stubs/kafka-python/kafka/coordinator/consumer.pyi new file mode 100644 index 000000000000..159cbc4a2916 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/consumer.pyi @@ -0,0 +1,31 @@ +from _typeshed import Incomplete + +from kafka.coordinator.base import BaseCoordinator + +log: Incomplete + +class ConsumerCoordinator(BaseCoordinator): + DEFAULT_CONFIG: Incomplete + config: Incomplete + auto_commit_interval: Incomplete + next_auto_commit_deadline: Incomplete + completed_offset_commits: Incomplete + def __init__(self, client, subscription, **configs) -> None: ... + def __del__(self) -> None: ... + def protocol_type(self): ... + def group_protocols(self): ... + def poll(self, timeout_ms=None): ... + def time_to_next_poll(self): ... + def need_rejoin(self): ... + def refresh_committed_offsets_if_needed(self, timeout_ms=None): ... + def fetch_committed_offsets(self, partitions, timeout_ms=None): ... + def close(self, autocommit: bool = True, timeout_ms=None) -> None: ... # type: ignore[override] + def commit_offsets_async(self, offsets, callback=None): ... + def commit_offsets_sync(self, offsets, timeout_ms=None): ... + def maybe_auto_commit_offsets_now(self) -> None: ... + +class ConsumerCoordinatorMetrics: + metrics: Incomplete + metric_group_name: Incomplete + commit_latency: Incomplete + def __init__(self, metrics, metric_group_prefix, subscription) -> None: ... diff --git a/stubs/kafka-python/kafka/coordinator/heartbeat.pyi b/stubs/kafka-python/kafka/coordinator/heartbeat.pyi new file mode 100644 index 000000000000..2fb958a5c868 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/heartbeat.pyi @@ -0,0 +1,22 @@ +from _typeshed import Incomplete + +log: Incomplete + +class Heartbeat: + DEFAULT_CONFIG: Incomplete + config: Incomplete + last_send: Incomplete + last_receive: Incomplete + last_poll: Incomplete + last_reset: Incomplete + heartbeat_failed: Incomplete + def __init__(self, **configs) -> None: ... + def poll(self) -> None: ... + def sent_heartbeat(self) -> None: ... + def fail_heartbeat(self) -> None: ... + def received_heartbeat(self) -> None: ... + def time_to_next_heartbeat(self): ... + def should_heartbeat(self): ... + def session_timeout_expired(self): ... + def reset_timeouts(self) -> None: ... + def poll_timeout_expired(self): ... diff --git a/stubs/kafka-python/kafka/coordinator/protocol.pyi b/stubs/kafka-python/kafka/coordinator/protocol.pyi new file mode 100644 index 000000000000..c099575b5c88 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/protocol.pyi @@ -0,0 +1,17 @@ +from _typeshed import Incomplete + +from kafka.protocol.struct import Struct + +class ConsumerProtocolMemberMetadata_v0(Struct): + SCHEMA: Incomplete + +class ConsumerProtocolMemberAssignment_v0(Struct): + SCHEMA: Incomplete + def partitions(self): ... + +class ConsumerProtocol_v0: + PROTOCOL_TYPE: str + METADATA = ConsumerProtocolMemberMetadata_v0 + ASSIGNMENT = ConsumerProtocolMemberAssignment_v0 + +ConsumerProtocol: Incomplete diff --git a/stubs/kafka-python/kafka/coordinator/subscription.pyi b/stubs/kafka-python/kafka/coordinator/subscription.pyi new file mode 100644 index 000000000000..b04a77efda82 --- /dev/null +++ b/stubs/kafka-python/kafka/coordinator/subscription.pyi @@ -0,0 +1,13 @@ +class Subscription: + def __init__(self, metadata, group_instance_id) -> None: ... + @property + def version(self): ... + @property + def user_data(self): ... + @property + def topics(self): ... + subscription = topics + @property + def group_instance_id(self): ... + def encode(self): ... + def __eq__(self, other): ... diff --git a/stubs/kafka-python/kafka/errors.pyi b/stubs/kafka-python/kafka/errors.pyi new file mode 100644 index 000000000000..9c7913a42520 --- /dev/null +++ b/stubs/kafka-python/kafka/errors.pyi @@ -0,0 +1,822 @@ +from _typeshed import Incomplete + +class KafkaError(RuntimeError): + retriable: bool + invalid_metadata: bool + def __eq__(self, other): ... + +class Cancelled(KafkaError): + retriable: bool + +class CommitFailedError(KafkaError): + def __init__(self, *args) -> None: ... + +class IllegalArgumentError(KafkaError): ... +class IllegalStateError(KafkaError): ... +class IncompatibleBrokerVersion(KafkaError): ... +class KafkaConfigurationError(KafkaError): ... + +class KafkaConnectionError(KafkaError): + retriable: bool + invalid_metadata: bool + +class KafkaProtocolError(KafkaError): + retriable: bool + +class CorrelationIdError(KafkaProtocolError): + retriable: bool + +class KafkaTimeoutError(KafkaError): + retriable: bool + +class MetadataEmptyBrokerList(KafkaError): + retriable: bool + +class NoBrokersAvailable(KafkaError): + retriable: bool + invalid_metadata: bool + +class NoOffsetForPartitionError(KafkaError): ... + +class NodeNotReadyError(KafkaError): + retriable: bool + +class QuotaViolationError(KafkaError): ... + +class StaleMetadata(KafkaError): + retriable: bool + invalid_metadata: bool + +class TooManyInFlightRequests(KafkaError): + retriable: bool + +class UnrecognizedBrokerVersion(KafkaError): ... +class UnsupportedCodecError(KafkaError): ... +class TransactionAbortedError(KafkaError): ... + +class BrokerResponseError(KafkaError): + errno: Incomplete + message: Incomplete + description: Incomplete + +class AuthorizationError(BrokerResponseError): ... + +class NoError(BrokerResponseError): + errno: int + message: str + description: str + +class UnknownError(BrokerResponseError): + errno: int + message: str + description: str + +class OffsetOutOfRangeError(BrokerResponseError): + errno: int + message: str + description: str + +class CorruptRecordError(BrokerResponseError): + errno: int + message: str + description: str + +CorruptRecordException = CorruptRecordError + +class UnknownTopicOrPartitionError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class InvalidFetchRequestError(BrokerResponseError): + errno: int + message: str + description: str + +class LeaderNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class NotLeaderForPartitionError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class RequestTimedOutError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class BrokerNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + +class ReplicaNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class MessageSizeTooLargeError(BrokerResponseError): + errno: int + message: str + description: str + +class StaleControllerEpochError(BrokerResponseError): + errno: int + message: str + description: str + +class OffsetMetadataTooLargeError(BrokerResponseError): + errno: int + message: str + description: str + +class NetworkExceptionError(BrokerResponseError): + errno: int + message: str + retriable: bool + invalid_metadata: bool + +class CoordinatorLoadInProgressError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class CoordinatorNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class NotCoordinatorError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidTopicError(BrokerResponseError): + errno: int + message: str + description: str + +class RecordListTooLargeError(BrokerResponseError): + errno: int + message: str + description: str + +class NotEnoughReplicasError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class NotEnoughReplicasAfterAppendError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidRequiredAcksError(BrokerResponseError): + errno: int + message: str + description: str + +class IllegalGenerationError(BrokerResponseError): + errno: int + message: str + description: str + +class InconsistentGroupProtocolError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidGroupIdError(BrokerResponseError): + errno: int + message: str + description: str + +class UnknownMemberIdError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidSessionTimeoutError(BrokerResponseError): + errno: int + message: str + description: str + +class RebalanceInProgressError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidCommitOffsetSizeError(BrokerResponseError): + errno: int + message: str + description: str + +class TopicAuthorizationFailedError(AuthorizationError): + errno: int + message: str + description: str + +class GroupAuthorizationFailedError(AuthorizationError): + errno: int + message: str + description: str + +class ClusterAuthorizationFailedError(AuthorizationError): + errno: int + message: str + description: str + +class InvalidTimestampError(BrokerResponseError): + errno: int + message: str + description: str + +class UnsupportedSaslMechanismError(BrokerResponseError): + errno: int + message: str + description: str + +class IllegalSaslStateError(BrokerResponseError): + errno: int + message: str + description: str + +class UnsupportedVersionError(BrokerResponseError): + errno: int + message: str + description: str + +class TopicAlreadyExistsError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidPartitionsError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidReplicationFactorError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidReplicationAssignmentError(BrokerResponseError): + errno: int + message: str + description: str + +class InvalidConfigurationError(BrokerResponseError): + errno: int + message: str + description: str + +class NotControllerError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidRequestError(BrokerResponseError): + errno: int + message: str + description: str + +class UnsupportedForMessageFormatError(BrokerResponseError): + errno: int + message: str + description: str + +class PolicyViolationError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class OutOfOrderSequenceNumberError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DuplicateSequenceNumberError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidProducerEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidTxnStateError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidProducerIdMappingError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidTransactionTimeoutError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ConcurrentTransactionsError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class TransactionCoordinatorFencedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class TransactionalIdAuthorizationFailedError(AuthorizationError): + errno: int + message: str + description: str + retriable: bool + +class SecurityDisabledError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class OperationNotAttemptedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class KafkaStorageError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class LogDirNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class SaslAuthenticationFailedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnknownProducerIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ReassignmentInProgressError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenAuthDisabledError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenOwnerMismatchError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenRequestNotAllowedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenAuthorizationFailedError(AuthorizationError): + errno: int + message: str + description: str + retriable: bool + +class DelegationTokenExpiredError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidPrincipalTypeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class NonEmptyGroupError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class GroupIdNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FetchSessionIdNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidFetchSessionEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ListenerNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class TopicDeletionDisabledError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FencedLeaderEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class UnknownLeaderEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class UnsupportedCompressionTypeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class StaleBrokerEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class OffsetNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class MemberIdRequiredError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class PreferredLeaderNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class GroupMaxSizeReachedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FencedInstanceIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class EligibleLeadersNotAvailableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class ElectionNotNeededError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class NoReassignmentInProgressError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class GroupSubscribedToTopicError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidRecordError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnstableOffsetCommitError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ThrottlingQuotaExceededError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ProducerFencedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ResourceNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DuplicateResourceError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnacceptableCredentialError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InconsistentVoterSetError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidUpdateVersionError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FeatureUpdateFailedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class PrincipalDeserializationFailureError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class SnapshotNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class PositionOutOfRangeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnknownTopicIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class DuplicateBrokerRegistrationError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class BrokerIdNotRegisteredError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InconsistentTopicIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + invalid_metadata: bool + +class InconsistentClusterIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class TransactionalIdNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FetchSessionTopicIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class IneligibleReplicaError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class NewLeaderElectedError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class OffsetMovedToTieredStorageError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FencedMemberEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnreleasedInstanceIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnsupportedAssignorError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class StaleMemberEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class MismatchedEndpointTypeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnsupportedEndpointTypeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnknownControllerIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class UnknownSubscriptionIdError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class TelemetryTooLargeError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidRegistrationError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class TransactionAbortableError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidRecordStateError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class ShareSessionNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidShareSessionEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class FencedStateEpochError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class InvalidVoterKeyError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class DuplicateVoterError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +class VoterNotFoundError(BrokerResponseError): + errno: int + message: str + description: str + retriable: bool + +kafka_errors: Incomplete + +def for_code(error_code): ... diff --git a/stubs/kafka-python/kafka/future.pyi b/stubs/kafka-python/kafka/future.pyi new file mode 100644 index 000000000000..04b26e768662 --- /dev/null +++ b/stubs/kafka-python/kafka/future.pyi @@ -0,0 +1,19 @@ +from _typeshed import Incomplete + +log: Incomplete + +class Future: + error_on_callbacks: bool + is_done: bool + value: Incomplete + exception: Incomplete + def __init__(self) -> None: ... + def succeeded(self): ... + def failed(self): ... + def retriable(self): ... + def success(self, value): ... + def failure(self, e): ... + def add_callback(self, f, *args, **kwargs): ... + def add_errback(self, f, *args, **kwargs): ... + def add_both(self, f, *args, **kwargs): ... + def chain(self, future): ... diff --git a/stubs/kafka-python/kafka/metrics/__init__.pyi b/stubs/kafka-python/kafka/metrics/__init__.pyi new file mode 100644 index 000000000000..9e6b062abd21 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/__init__.pyi @@ -0,0 +1,10 @@ +from kafka.metrics.compound_stat import NamedMeasurable as NamedMeasurable +from kafka.metrics.dict_reporter import DictReporter as DictReporter +from kafka.metrics.kafka_metric import KafkaMetric as KafkaMetric +from kafka.metrics.measurable import AnonMeasurable as AnonMeasurable +from kafka.metrics.metric_config import MetricConfig as MetricConfig +from kafka.metrics.metric_name import MetricName as MetricName +from kafka.metrics.metrics import Metrics as Metrics +from kafka.metrics.quota import Quota as Quota + +__all__ = ["AnonMeasurable", "DictReporter", "KafkaMetric", "MetricConfig", "MetricName", "Metrics", "NamedMeasurable", "Quota"] diff --git a/stubs/kafka-python/kafka/metrics/compound_stat.pyi b/stubs/kafka-python/kafka/metrics/compound_stat.pyi new file mode 100644 index 000000000000..6f41b10ef0fa --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/compound_stat.pyi @@ -0,0 +1,13 @@ +import abc + +from kafka.metrics.stat import AbstractStat + +class AbstractCompoundStat(AbstractStat, metaclass=abc.ABCMeta): + def stats(self) -> None: ... + +class NamedMeasurable: + def __init__(self, metric_name, measurable_stat) -> None: ... + @property + def name(self): ... + @property + def stat(self): ... diff --git a/stubs/kafka-python/kafka/metrics/dict_reporter.pyi b/stubs/kafka-python/kafka/metrics/dict_reporter.pyi new file mode 100644 index 000000000000..c48a7d9acd80 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/dict_reporter.pyi @@ -0,0 +1,15 @@ +from _typeshed import Incomplete + +from kafka.metrics.metrics_reporter import AbstractMetricsReporter + +logger: Incomplete + +class DictReporter(AbstractMetricsReporter): + def __init__(self, prefix: str = "") -> None: ... + def snapshot(self): ... + def init(self, metrics) -> None: ... + def metric_change(self, metric) -> None: ... + def metric_removal(self, metric): ... + def get_category(self, metric): ... + def configure(self, configs) -> None: ... + def close(self) -> None: ... diff --git a/stubs/kafka-python/kafka/metrics/kafka_metric.pyi b/stubs/kafka-python/kafka/metrics/kafka_metric.pyi new file mode 100644 index 000000000000..856210a6d56b --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/kafka_metric.pyi @@ -0,0 +1,13 @@ +class KafkaMetric: + def __init__(self, metric_name, measurable, config) -> None: ... + @property + def metric_name(self): ... + @property + def measurable(self): ... + + @property + def config(self): ... + @config.setter + def config(self, config) -> None: ... + + def value(self, time_ms=None): ... diff --git a/stubs/kafka-python/kafka/metrics/measurable.pyi b/stubs/kafka-python/kafka/metrics/measurable.pyi new file mode 100644 index 000000000000..2753796bc8cd --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/measurable.pyi @@ -0,0 +1,9 @@ +import abc + +class AbstractMeasurable(metaclass=abc.ABCMeta): + @abc.abstractmethod + def measure(self, config, now): ... + +class AnonMeasurable(AbstractMeasurable): + def __init__(self, measure_fn) -> None: ... + def measure(self, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/measurable_stat.pyi b/stubs/kafka-python/kafka/metrics/measurable_stat.pyi new file mode 100644 index 000000000000..31569f41942a --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/measurable_stat.pyi @@ -0,0 +1,6 @@ +import abc + +from kafka.metrics.measurable import AbstractMeasurable +from kafka.metrics.stat import AbstractStat + +class AbstractMeasurableStat(AbstractStat, AbstractMeasurable, metaclass=abc.ABCMeta): ... diff --git a/stubs/kafka-python/kafka/metrics/metric_config.pyi b/stubs/kafka-python/kafka/metrics/metric_config.pyi new file mode 100644 index 000000000000..fc630189a272 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/metric_config.pyi @@ -0,0 +1,13 @@ +from _typeshed import Incomplete + +class MetricConfig: + quota: Incomplete + event_window: Incomplete + time_window_ms: Incomplete + tags: Incomplete + def __init__(self, quota=None, samples: int = 2, event_window=..., time_window_ms=30000, tags=None) -> None: ... + + @property + def samples(self): ... + @samples.setter + def samples(self, value) -> None: ... diff --git a/stubs/kafka-python/kafka/metrics/metric_name.pyi b/stubs/kafka-python/kafka/metrics/metric_name.pyi new file mode 100644 index 000000000000..44a770132927 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/metric_name.pyi @@ -0,0 +1,13 @@ +class MetricName: + def __init__(self, name, group, description=None, tags=None) -> None: ... + @property + def name(self): ... + @property + def group(self): ... + @property + def description(self): ... + @property + def tags(self): ... + def __hash__(self): ... + def __eq__(self, other): ... + def __ne__(self, other): ... diff --git a/stubs/kafka-python/kafka/metrics/metrics.pyi b/stubs/kafka-python/kafka/metrics/metrics.pyi new file mode 100644 index 000000000000..31db3617f08d --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/metrics.pyi @@ -0,0 +1,24 @@ +from _typeshed import Incomplete + +logger: Incomplete + +class Metrics: + def __init__(self, default_config=None, reporters=None, enable_expiration: bool = False) -> None: ... + @property + def config(self): ... + @property + def metrics(self): ... + def metric_name(self, name, group, description: str = "", tags=None): ... + def get_sensor(self, name): ... + def sensor(self, name, config=None, inactive_sensor_expiration_time_seconds=..., parents=None): ... + def remove_sensor(self, name) -> None: ... + def add_metric(self, metric_name, measurable, config=None) -> None: ... + def remove_metric(self, metric_name): ... + def add_reporter(self, reporter) -> None: ... + def register_metric(self, metric) -> None: ... + + class ExpireSensorTask: + @staticmethod + def run(metrics) -> None: ... + + def close(self) -> None: ... diff --git a/stubs/kafka-python/kafka/metrics/metrics_reporter.pyi b/stubs/kafka-python/kafka/metrics/metrics_reporter.pyi new file mode 100644 index 000000000000..e8022ff431d2 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/metrics_reporter.pyi @@ -0,0 +1,13 @@ +import abc + +class AbstractMetricsReporter(metaclass=abc.ABCMeta): + @abc.abstractmethod + def init(self, metrics): ... + @abc.abstractmethod + def metric_change(self, metric): ... + @abc.abstractmethod + def metric_removal(self, metric): ... + @abc.abstractmethod + def configure(self, configs): ... + @abc.abstractmethod + def close(self): ... diff --git a/stubs/kafka-python/kafka/metrics/quota.pyi b/stubs/kafka-python/kafka/metrics/quota.pyi new file mode 100644 index 000000000000..3290e80589fc --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/quota.pyi @@ -0,0 +1,13 @@ +class Quota: + def __init__(self, bound, is_upper) -> None: ... + @staticmethod + def upper_bound(upper_bound): ... + @staticmethod + def lower_bound(lower_bound): ... + def is_upper_bound(self): ... + @property + def bound(self): ... + def is_acceptable(self, value): ... + def __hash__(self): ... + def __eq__(self, other): ... + def __ne__(self, other): ... diff --git a/stubs/kafka-python/kafka/metrics/stat.pyi b/stubs/kafka-python/kafka/metrics/stat.pyi new file mode 100644 index 000000000000..d9b5f9473988 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stat.pyi @@ -0,0 +1,5 @@ +import abc + +class AbstractStat(metaclass=abc.ABCMeta): + @abc.abstractmethod + def record(self, config, value, time_ms): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/__init__.pyi b/stubs/kafka-python/kafka/metrics/stats/__init__.pyi new file mode 100644 index 000000000000..bc86bfd66544 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/__init__.pyi @@ -0,0 +1,12 @@ +from kafka.metrics.stats.avg import Avg as Avg +from kafka.metrics.stats.count import Count as Count +from kafka.metrics.stats.histogram import Histogram as Histogram +from kafka.metrics.stats.max_stat import Max as Max +from kafka.metrics.stats.min_stat import Min as Min +from kafka.metrics.stats.percentile import Percentile as Percentile +from kafka.metrics.stats.percentiles import Percentiles as Percentiles +from kafka.metrics.stats.rate import Rate as Rate +from kafka.metrics.stats.sensor import Sensor as Sensor +from kafka.metrics.stats.total import Total as Total + +__all__ = ["Avg", "Count", "Histogram", "Max", "Min", "Percentile", "Percentiles", "Rate", "Sensor", "Total"] diff --git a/stubs/kafka-python/kafka/metrics/stats/avg.pyi b/stubs/kafka-python/kafka/metrics/stats/avg.pyi new file mode 100644 index 000000000000..0c00ef442744 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/avg.pyi @@ -0,0 +1,6 @@ +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class Avg(AbstractSampledStat): + def __init__(self) -> None: ... + def update(self, sample, config, value, now) -> None: ... + def combine(self, samples, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/count.pyi b/stubs/kafka-python/kafka/metrics/stats/count.pyi new file mode 100644 index 000000000000..b13c9930b06a --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/count.pyi @@ -0,0 +1,6 @@ +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class Count(AbstractSampledStat): + def __init__(self) -> None: ... + def update(self, sample, config, value, now) -> None: ... + def combine(self, samples, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/histogram.pyi b/stubs/kafka-python/kafka/metrics/stats/histogram.pyi new file mode 100644 index 000000000000..74a77e0ff50c --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/histogram.pyi @@ -0,0 +1,21 @@ +class Histogram: + def __init__(self, bin_scheme) -> None: ... + def record(self, value) -> None: ... + def value(self, quantile): ... + @property + def counts(self): ... + def clear(self) -> None: ... + + class ConstantBinScheme: + def __init__(self, bins, min_val, max_val) -> None: ... + @property + def bins(self): ... + def from_bin(self, b): ... + def to_bin(self, x): ... + + class LinearBinScheme: + def __init__(self, num_bins, max_val) -> None: ... + @property + def bins(self): ... + def from_bin(self, b): ... + def to_bin(self, x): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/max_stat.pyi b/stubs/kafka-python/kafka/metrics/stats/max_stat.pyi new file mode 100644 index 000000000000..705b766b23a6 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/max_stat.pyi @@ -0,0 +1,6 @@ +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class Max(AbstractSampledStat): + def __init__(self) -> None: ... + def update(self, sample, config, value, now) -> None: ... + def combine(self, samples, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/min_stat.pyi b/stubs/kafka-python/kafka/metrics/stats/min_stat.pyi new file mode 100644 index 000000000000..cc5e3fbaf763 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/min_stat.pyi @@ -0,0 +1,6 @@ +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class Min(AbstractSampledStat): + def __init__(self) -> None: ... + def update(self, sample, config, value, now) -> None: ... + def combine(self, samples, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/percentile.pyi b/stubs/kafka-python/kafka/metrics/stats/percentile.pyi new file mode 100644 index 000000000000..a27b11c05a7b --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/percentile.pyi @@ -0,0 +1,6 @@ +class Percentile: + def __init__(self, metric_name, percentile) -> None: ... + @property + def name(self): ... + @property + def percentile(self): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/percentiles.pyi b/stubs/kafka-python/kafka/metrics/stats/percentiles.pyi new file mode 100644 index 000000000000..8f7bbe0effcd --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/percentiles.pyi @@ -0,0 +1,21 @@ +from _typeshed import Incomplete + +from kafka.metrics.compound_stat import AbstractCompoundStat +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class BucketSizing: + CONSTANT: int + LINEAR: int + +class Percentiles(AbstractSampledStat, AbstractCompoundStat): + bin_scheme: Incomplete + def __init__(self, size_in_bytes, bucketing, max_val, min_val: float = 0.0, percentiles=None) -> None: ... + def stats(self): ... + def value(self, config, now, quantile): ... + def combine(self, samples, config, now): ... + def new_sample(self, time_ms): ... + def update(self, sample, config, value, time_ms) -> None: ... + + class HistogramSample(AbstractSampledStat.Sample): + histogram: Incomplete + def __init__(self, scheme, now) -> None: ... diff --git a/stubs/kafka-python/kafka/metrics/stats/rate.pyi b/stubs/kafka-python/kafka/metrics/stats/rate.pyi new file mode 100644 index 000000000000..d5199a72807b --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/rate.pyi @@ -0,0 +1,28 @@ +from _typeshed import Incomplete + +from kafka.metrics.measurable_stat import AbstractMeasurableStat +from kafka.metrics.stats.sampled_stat import AbstractSampledStat + +class TimeUnit: + NANOSECONDS: Incomplete + MICROSECONDS: Incomplete + MILLISECONDS: Incomplete + SECONDS: Incomplete + MINUTES: Incomplete + HOURS: Incomplete + DAYS: Incomplete + @staticmethod + def get_name(time_unit): ... + +class Rate(AbstractMeasurableStat): + def __init__(self, time_unit=3, sampled_stat=None) -> None: ... + def unit_name(self): ... + def record(self, config, value, time_ms) -> None: ... + def measure(self, config, now): ... + def window_size(self, config, now): ... + def convert(self, time_ms): ... + +class SampledTotal(AbstractSampledStat): + def __init__(self, initial_value=None) -> None: ... + def update(self, sample, config, value, time_ms) -> None: ... + def combine(self, samples, config, now): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/sampled_stat.pyi b/stubs/kafka-python/kafka/metrics/stats/sampled_stat.pyi new file mode 100644 index 000000000000..c589cd800c80 --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/sampled_stat.pyi @@ -0,0 +1,26 @@ +import abc +from _typeshed import Incomplete + +from kafka.metrics.measurable_stat import AbstractMeasurableStat + +class AbstractSampledStat(AbstractMeasurableStat, metaclass=abc.ABCMeta): + def __init__(self, initial_value) -> None: ... + @abc.abstractmethod + def update(self, sample, config, value, time_ms): ... + @abc.abstractmethod + def combine(self, samples, config, now): ... + def record(self, config, value, time_ms) -> None: ... + def new_sample(self, time_ms): ... + def measure(self, config, now): ... + def current(self, time_ms): ... + def oldest(self, now): ... + def purge_obsolete_samples(self, config, now) -> None: ... + + class Sample: + initial_value: Incomplete + event_count: int + last_window_ms: Incomplete + value: Incomplete + def __init__(self, initial_value, now) -> None: ... + def reset(self, now) -> None: ... + def is_complete(self, time_ms, config): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/sensor.pyi b/stubs/kafka-python/kafka/metrics/stats/sensor.pyi new file mode 100644 index 000000000000..f302ed0944be --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/sensor.pyi @@ -0,0 +1,10 @@ +class Sensor: + def __init__(self, registry, name, parents, config, inactive_sensor_expiration_time_seconds) -> None: ... + @property + def name(self): ... + @property + def metrics(self): ... + def record(self, value: float = 1.0, time_ms=None) -> None: ... + def add_compound(self, compound_stat, config=None) -> None: ... + def add(self, metric_name, stat, config=None) -> None: ... + def has_expired(self): ... diff --git a/stubs/kafka-python/kafka/metrics/stats/total.pyi b/stubs/kafka-python/kafka/metrics/stats/total.pyi new file mode 100644 index 000000000000..2a33feb1b02b --- /dev/null +++ b/stubs/kafka-python/kafka/metrics/stats/total.pyi @@ -0,0 +1,6 @@ +from kafka.metrics.measurable_stat import AbstractMeasurableStat + +class Total(AbstractMeasurableStat): + def __init__(self, value: float = 0.0) -> None: ... + def record(self, config, value, now) -> None: ... + def measure(self, config, now): ... diff --git a/stubs/kafka-python/kafka/partitioner/__init__.pyi b/stubs/kafka-python/kafka/partitioner/__init__.pyi new file mode 100644 index 000000000000..93b321c722a6 --- /dev/null +++ b/stubs/kafka-python/kafka/partitioner/__init__.pyi @@ -0,0 +1,3 @@ +from kafka.partitioner.default import DefaultPartitioner as DefaultPartitioner, murmur2 as murmur2 + +__all__ = ["DefaultPartitioner", "murmur2"] diff --git a/stubs/kafka-python/kafka/partitioner/default.pyi b/stubs/kafka-python/kafka/partitioner/default.pyi new file mode 100644 index 000000000000..6800f5b03315 --- /dev/null +++ b/stubs/kafka-python/kafka/partitioner/default.pyi @@ -0,0 +1,5 @@ +class DefaultPartitioner: + @classmethod + def __call__(cls, key, all_partitions, available): ... + +def murmur2(data): ... diff --git a/stubs/kafka-python/kafka/producer/__init__.pyi b/stubs/kafka-python/kafka/producer/__init__.pyi new file mode 100644 index 000000000000..35360a27f231 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/__init__.pyi @@ -0,0 +1,3 @@ +from kafka.producer.kafka import KafkaProducer as KafkaProducer + +__all__ = ["KafkaProducer"] diff --git a/stubs/kafka-python/kafka/producer/future.pyi b/stubs/kafka-python/kafka/producer/future.pyi new file mode 100644 index 000000000000..ad0fa3962f16 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/future.pyi @@ -0,0 +1,37 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +from kafka.future import Future +from kafka.structs import TopicPartition + +class FutureProduceResult(Future): + topic_partition: TopicPartition + def __init__(self, topic_partition: TopicPartition) -> None: ... + def success(self, value): ... + def failure(self, error): ... + def wait(self, timeout=None): ... + +class FutureRecordMetadata(Future): + args: Incomplete + def __init__( + self, + produce_future, + batch_index, + timestamp_ms, + checksum, + serialized_key_size, + serialized_value_size, + serialized_header_size, + ) -> None: ... + def get(self, timeout=None): ... + +class RecordMetadata(NamedTuple): + topic: str + partition: int + topic_partition: TopicPartition + offset: int + timestamp: int + checksum: int | None + serialized_key_size: int + serialized_value_size: int + serialized_header_size: int diff --git a/stubs/kafka-python/kafka/producer/kafka.pyi b/stubs/kafka-python/kafka/producer/kafka.pyi new file mode 100644 index 000000000000..c00758c2f684 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/kafka.pyi @@ -0,0 +1,110 @@ +import selectors +import ssl +from _typeshed import Incomplete +from collections.abc import Callable, Mapping, Sequence +from typing import Literal, TypeAlias, TypedDict, type_check_only +from typing_extensions import Unpack + +from kafka.producer.future import FutureRecordMetadata +from kafka.serializer.abstract import Serializer +from kafka.structs import OffsetAndMetadata, TopicPartition + +_ApiVersion: TypeAlias = tuple[int, ...] +_BootstrapServers: TypeAlias = str | Sequence[str] +_KafkaClientFactory: TypeAlias = Callable[..., object] +_Partitioner: TypeAlias = Callable[[bytes | None, Sequence[int], Sequence[int]], int] +_ProducerSerializer: TypeAlias = Serializer | Callable[[object], bytes] +_SaslMechanism: TypeAlias = Literal["PLAIN", "GSSAPI", "OAUTHBEARER", "SCRAM-SHA-256", "SCRAM-SHA-512"] +_SecurityProtocol: TypeAlias = Literal["PLAINTEXT", "SSL", "SASL_PLAINTEXT", "SASL_SSL"] +_SocketOption: TypeAlias = tuple[int, int, int] + +@type_check_only +class _KafkaProducerConfig(TypedDict, total=False): + bootstrap_servers: _BootstrapServers + client_id: str | None + key_serializer: _ProducerSerializer | None + value_serializer: _ProducerSerializer | None + enable_idempotence: bool + transactional_id: str | None + transaction_timeout_ms: int + delivery_timeout_ms: float + acks: int | Literal["all"] + bootstrap_topics_filter: set[str] + compression_type: Literal["gzip", "snappy", "lz4", "zstd"] | None + retries: int | float + batch_size: int + linger_ms: int + partitioner: _Partitioner + connections_max_idle_ms: int + max_block_ms: int + max_request_size: int + allow_auto_create_topics: bool + metadata_max_age_ms: int + retry_backoff_ms: int + request_timeout_ms: int + receive_buffer_bytes: int | None + send_buffer_bytes: int | None + socket_options: Sequence[_SocketOption] + sock_chunk_bytes: int + sock_chunk_buffer_count: int + reconnect_backoff_ms: int + reconnect_backoff_max_ms: int + max_in_flight_requests_per_connection: int + security_protocol: _SecurityProtocol + ssl_context: ssl.SSLContext | None + ssl_check_hostname: bool + ssl_cafile: str | None + ssl_certfile: str | None + ssl_keyfile: str | None + ssl_crlfile: str | None + ssl_password: str | None + ssl_ciphers: str | None + api_version: _ApiVersion | None + api_version_auto_timeout_ms: int + metric_reporters: Sequence[type[object]] + metrics_enabled: bool + metrics_num_samples: int + metrics_sample_window_ms: int + selector: type[selectors.BaseSelector] + sasl_mechanism: _SaslMechanism | None + sasl_plain_username: str | None + sasl_plain_password: str | None + sasl_kerberos_name: object | None + sasl_kerberos_service_name: str + sasl_kerberos_domain_name: str | None + sasl_oauth_token_provider: object | None + socks5_proxy: str | None + kafka_client: _KafkaClientFactory + +log: Incomplete +PRODUCER_CLIENT_ID_SEQUENCE: Incomplete + +class KafkaProducer: + DEFAULT_CONFIG: Incomplete + DEPRECATED_CONFIGS: Incomplete + config: Incomplete + def __init__(self, **configs: Unpack[_KafkaProducerConfig]) -> None: ... + def bootstrap_connected(self): ... + def __del__(self) -> None: ... + def close(self, timeout: float | None = None, null_logger: bool = False) -> None: ... + def partitions_for(self, topic: str) -> set[int]: ... + @classmethod + def max_usable_produce_magic(cls, api_version): ... + def init_transactions(self) -> None: ... + def begin_transaction(self) -> None: ... + def send_offsets_to_transaction( + self, offsets: Mapping[TopicPartition, OffsetAndMetadata], consumer_group_id: str + ) -> None: ... + def commit_transaction(self) -> None: ... + def abort_transaction(self) -> None: ... + def send( + self, + topic: str, + value: object = None, + key: object = None, + headers: Sequence[tuple[str, bytes]] | None = None, + partition: int | None = None, + timestamp_ms: int | None = None, + ) -> FutureRecordMetadata: ... + def flush(self, timeout: float | None = None) -> None: ... + def metrics(self, raw: bool = False) -> dict[str, dict[str, object]] | dict[object, object] | None: ... diff --git a/stubs/kafka-python/kafka/producer/producer_batch.pyi b/stubs/kafka-python/kafka/producer/producer_batch.pyi new file mode 100644 index 000000000000..6b94289a53dd --- /dev/null +++ b/stubs/kafka-python/kafka/producer/producer_batch.pyi @@ -0,0 +1,42 @@ +from _typeshed import Incomplete +from enum import IntEnum + +log: Incomplete + +class FinalState(IntEnum): + ABORTED = 0 + FAILED = 1 + SUCCEEDED = 2 + +class ProducerBatch: + max_record_size: int + created: Incomplete + drained: Incomplete + attempts: int + last_attempt: Incomplete + last_append: Incomplete + records: Incomplete + topic_partition: Incomplete + produce_future: Incomplete + def __init__(self, tp, records, now=None) -> None: ... + @property + def final_state(self): ... + @property + def record_count(self): ... + @property + def producer_id(self): ... + @property + def producer_epoch(self): ... + @property + def has_sequence(self): ... + def try_append(self, timestamp_ms, key, value, headers, now=None): ... + def abort(self, exception): ... + def complete(self, base_offset, log_append_time): ... + def complete_exceptionally(self, top_level_exception, record_exceptions_fn): ... + def done(self, base_offset=None, timestamp_ms=None, top_level_exception=None, record_exceptions_fn=None): ... + def has_reached_delivery_timeout(self, delivery_timeout_ms, now=None): ... + def in_retry(self): ... + def retry(self, now=None) -> None: ... + @property + def is_done(self): ... + def __lt__(self, other): ... diff --git a/stubs/kafka-python/kafka/producer/record_accumulator.pyi b/stubs/kafka-python/kafka/producer/record_accumulator.pyi new file mode 100644 index 000000000000..cb36265f18d5 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/record_accumulator.pyi @@ -0,0 +1,45 @@ +from _typeshed import Incomplete + +log: Incomplete + +class AtomicInteger: + def __init__(self, val: int = 0) -> None: ... + def increment(self): ... + def decrement(self): ... + def get(self): ... + +class RecordAccumulator: + DEFAULT_CONFIG: Incomplete + config: Incomplete + muted: Incomplete + def __init__(self, **configs) -> None: ... + @property + def delivery_timeout_ms(self): ... + @property + def next_expiry_time_ms(self): ... + def append(self, tp, timestamp_ms, key, value, headers, now=None): ... + def reset_next_batch_expiry_time(self) -> None: ... + def maybe_update_next_batch_expiry_time(self, batch) -> None: ... + def expired_batches(self, now=None): ... + def reenqueue(self, batch, now=None) -> None: ... + def ready(self, cluster, now=None): ... + def has_undrained(self): ... + def drain_batches_for_one_node(self, cluster, node_id, max_size, now=None): ... + def drain(self, cluster, nodes, max_size, now=None): ... + def deallocate(self, batch) -> None: ... + def flush_in_progress(self): ... + def begin_flush(self) -> None: ... + def await_flush_completion(self, timeout=None) -> None: ... + @property + def has_incomplete(self): ... + def abort_incomplete_batches(self) -> None: ... + def abort_undrained_batches(self, error) -> None: ... + def close(self) -> None: ... + +class IncompleteProducerBatches: + def __init__(self) -> None: ... + def add(self, batch) -> None: ... + def remove(self, batch) -> None: ... + def all(self): ... + def __bool__(self) -> bool: ... + __nonzero__ = __bool__ diff --git a/stubs/kafka-python/kafka/producer/sender.pyi b/stubs/kafka-python/kafka/producer/sender.pyi new file mode 100644 index 000000000000..abbb22aac1d7 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/sender.pyi @@ -0,0 +1,47 @@ +import threading +from _typeshed import Incomplete +from typing import NamedTuple + +log: Incomplete + +class PartitionResponse(NamedTuple): + error: Incomplete = ... + base_offset: Incomplete = ... + last_offset: Incomplete = ... + log_append_time: Incomplete = ... + log_start_offset: Incomplete = ... + record_errors: Incomplete = ... + error_message: Incomplete = ... + current_leader: Incomplete = ... + +class Sender(threading.Thread): + DEFAULT_CONFIG: Incomplete + config: Incomplete + name: Incomplete + def __init__(self, client, metadata, accumulator, **configs) -> None: ... + def run(self) -> None: ... + def run_once(self) -> None: ... + def initiate_close(self) -> None: ... + def force_close(self) -> None: ... + def add_topic(self, topic) -> None: ... + def wakeup(self) -> None: ... + def bootstrap_connected(self): ... + +class SenderMetrics: + metrics: Incomplete + batch_size_sensor: Incomplete + compression_rate_sensor: Incomplete + queue_time_sensor: Incomplete + records_per_request_sensor: Incomplete + byte_rate_sensor: Incomplete + retry_sensor: Incomplete + error_sensor: Incomplete + max_record_size_sensor: Incomplete + def __init__(self, metrics, client, metadata) -> None: ... + def add_metric( + self, metric_name, measurable, group_name: str = "producer-metrics", description=None, tags=None, sensor_name=None + ) -> None: ... + def maybe_register_topic_metrics(self, topic): ... + def update_produce_request_metrics(self, batches_map) -> None: ... + def record_retries(self, topic, count) -> None: ... + def record_errors(self, topic, count) -> None: ... diff --git a/stubs/kafka-python/kafka/producer/transaction_manager.pyi b/stubs/kafka-python/kafka/producer/transaction_manager.pyi new file mode 100644 index 000000000000..7e6f3e0374f0 --- /dev/null +++ b/stubs/kafka-python/kafka/producer/transaction_manager.pyi @@ -0,0 +1,187 @@ +import abc +from _typeshed import Incomplete +from enum import IntEnum + +log: Incomplete +NO_PRODUCER_ID: int +NO_PRODUCER_EPOCH: int +NO_SEQUENCE: int + +class ProducerIdAndEpoch: + producer_id: Incomplete + epoch: Incomplete + def __init__(self, producer_id, epoch) -> None: ... + @property + def is_valid(self): ... + def match(self, batch): ... + def __eq__(self, other): ... + +class TransactionState(IntEnum): + UNINITIALIZED = 0 + INITIALIZING = 1 + READY = 2 + IN_TRANSACTION = 3 + COMMITTING_TRANSACTION = 4 + ABORTING_TRANSACTION = 5 + ABORTABLE_ERROR = 6 + FATAL_ERROR = 7 + @classmethod + def is_transition_valid(cls, source, target): ... + +class Priority(IntEnum): + FIND_COORDINATOR = 0 + INIT_PRODUCER_ID = 1 + ADD_PARTITIONS_OR_OFFSETS = 2 + END_TXN = 3 + +class TransactionManager: + NO_INFLIGHT_REQUEST_CORRELATION_ID: int + ADD_PARTITIONS_RETRY_BACKOFF_MS: int + transactional_id: Incomplete + transaction_timeout_ms: Incomplete + producer_id_and_epoch: Incomplete + retry_backoff_ms: Incomplete + def __init__( + self, + transactional_id=None, + transaction_timeout_ms: int = 0, + retry_backoff_ms: int = 100, + api_version=(0, 11), + metadata=None, + ) -> None: ... + def initialize_transactions(self): ... + def begin_transaction(self) -> None: ... + def begin_commit(self): ... + def begin_abort(self): ... + def send_offsets_to_transaction(self, offsets, consumer_group_id): ... + def maybe_add_partition_to_transaction(self, topic_partition) -> None: ... + def is_send_to_partition_allowed(self, tp): ... + def has_producer_id(self, producer_id=None): ... + def is_transactional(self): ... + def has_partitions_to_add(self): ... + def is_completing(self): ... + @property + def last_error(self): ... + def has_error(self): ... + def is_aborting(self): ... + def transition_to_abortable_error(self, exc) -> None: ... + def transition_to_fatal_error(self, exc) -> None: ... + def is_partition_added(self, partition): ... + def is_partition_pending_add(self, partition): ... + def has_producer_id_and_epoch(self, producer_id, producer_epoch): ... + def set_producer_id_and_epoch(self, producer_id_and_epoch) -> None: ... + def reset_producer_id(self) -> None: ... + def sequence_number(self, tp): ... + def increment_sequence_number(self, tp, increment) -> None: ... + def reset_sequence_for_partition(self, tp) -> None: ... + def next_request_handler(self, has_incomplete_batches): ... + def retry(self, request) -> None: ... + def authentication_failed(self, exc) -> None: ... + def coordinator(self, coord_type): ... + def lookup_coordinator_for_request(self, request) -> None: ... + def next_in_flight_request_correlation_id(self): ... + def clear_in_flight_transactional_request_correlation_id(self) -> None: ... + def has_in_flight_transactional_request(self): ... + def has_fatal_error(self): ... + def has_abortable_error(self): ... + +class TransactionalRequestResult: + def __init__(self) -> None: ... + def done(self, error=None) -> None: ... + def wait(self, timeout_ms=None): ... + @property + def is_done(self): ... + @property + def succeeded(self): ... + @property + def failed(self): ... + @property + def exception(self): ... + +class TxnRequestHandler(metaclass=abc.ABCMeta): + transaction_manager: Incomplete + retry_backoff_ms: Incomplete + request: Incomplete + def __init__(self, transaction_manager, result=None) -> None: ... + @property + def transactional_id(self): ... + @property + def producer_id(self): ... + @property + def producer_epoch(self): ... + def fatal_error(self, exc) -> None: ... + def abortable_error(self, exc) -> None: ... + def fail(self, exc) -> None: ... + def reenqueue(self) -> None: ... + def on_complete(self, correlation_id, response_or_exc) -> None: ... + def needs_coordinator(self): ... + @property + def result(self): ... + @property + def coordinator_type(self): ... + @property + def coordinator_key(self): ... + def set_retry(self) -> None: ... + @property + def is_retry(self): ... + @abc.abstractmethod + def handle_response(self, response): ... + @property + @abc.abstractmethod + def priority(self): ... + +class InitProducerIdHandler(TxnRequestHandler): + request: Incomplete + def __init__(self, transaction_manager, transaction_timeout_ms) -> None: ... + @property + def priority(self): ... + def handle_response(self, response) -> None: ... + +class AddPartitionsToTxnHandler(TxnRequestHandler): + request: Incomplete + def __init__(self, transaction_manager, topic_partitions) -> None: ... + @property + def priority(self): ... + retry_backoff_ms: Incomplete + def handle_response(self, response) -> None: ... + def maybe_override_retry_backoff_ms(self) -> None: ... + +class FindCoordinatorHandler(TxnRequestHandler): + request: Incomplete + def __init__(self, transaction_manager, coord_type, coord_key) -> None: ... + @property + def priority(self): ... + @property + def coordinator_type(self) -> None: ... + @property + def coordinator_key(self) -> None: ... + def handle_response(self, response) -> None: ... + +class EndTxnHandler(TxnRequestHandler): + request: Incomplete + def __init__(self, transaction_manager, committed) -> None: ... + @property + def priority(self): ... + def handle_response(self, response) -> None: ... + +class AddOffsetsToTxnHandler(TxnRequestHandler): + consumer_group_id: Incomplete + offsets: Incomplete + request: Incomplete + def __init__(self, transaction_manager, consumer_group_id, offsets) -> None: ... + @property + def priority(self): ... + def handle_response(self, response) -> None: ... + +class TxnOffsetCommitHandler(TxnRequestHandler): + consumer_group_id: Incomplete + offsets: Incomplete + request: Incomplete + def __init__(self, transaction_manager, consumer_group_id, offsets, result) -> None: ... + @property + def priority(self): ... + @property + def coordinator_type(self): ... + @property + def coordinator_key(self): ... + def handle_response(self, response) -> None: ... diff --git a/stubs/kafka-python/kafka/protocol/__init__.pyi b/stubs/kafka-python/kafka/protocol/__init__.pyi new file mode 100644 index 000000000000..da1238775e56 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/__init__.pyi @@ -0,0 +1,3 @@ +from _typeshed import Incomplete + +API_KEYS: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/abstract.pyi b/stubs/kafka-python/kafka/protocol/abstract.pyi new file mode 100644 index 000000000000..3229b5ccfa05 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/abstract.pyi @@ -0,0 +1,9 @@ +import abc +from _typeshed import Incomplete + +class AbstractType(metaclass=abc.ABCMeta): + @abc.abstractmethod + def encode(cls, value): ... + @abc.abstractmethod + def decode(cls, data): ... + repr: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/add_offsets_to_txn.pyi b/stubs/kafka-python/kafka/protocol/add_offsets_to_txn.pyi new file mode 100644 index 000000000000..49066ce158a2 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/add_offsets_to_txn.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class AddOffsetsToTxnResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddOffsetsToTxnResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddOffsetsToTxnResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddOffsetsToTxnRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddOffsetsToTxnResponse_v0 + SCHEMA: Incomplete + +class AddOffsetsToTxnRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddOffsetsToTxnResponse_v1 + SCHEMA: Incomplete + +class AddOffsetsToTxnRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddOffsetsToTxnResponse_v2 + SCHEMA: Incomplete + +AddOffsetsToTxnRequest: Incomplete +AddOffsetsToTxnResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/add_partitions_to_txn.pyi b/stubs/kafka-python/kafka/protocol/add_partitions_to_txn.pyi new file mode 100644 index 000000000000..4a1802ab6c28 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/add_partitions_to_txn.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class AddPartitionsToTxnResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddPartitionsToTxnResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddPartitionsToTxnResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AddPartitionsToTxnRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddPartitionsToTxnResponse_v0 + SCHEMA: Incomplete + +class AddPartitionsToTxnRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddPartitionsToTxnResponse_v1 + SCHEMA: Incomplete + +class AddPartitionsToTxnRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AddPartitionsToTxnResponse_v2 + SCHEMA: Incomplete + +AddPartitionsToTxnRequest: Incomplete +AddPartitionsToTxnResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/admin.pyi b/stubs/kafka-python/kafka/protocol/admin.pyi new file mode 100644 index 000000000000..7330c0ae74d1 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/admin.pyi @@ -0,0 +1,506 @@ +from _typeshed import Incomplete +from enum import IntEnum + +from kafka.protocol.api import Request, Response + +class CreateTopicsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateTopicsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateTopicsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateTopicsResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateTopicsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateTopicsResponse_v0 + SCHEMA: Incomplete + +class CreateTopicsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateTopicsResponse_v1 + SCHEMA: Incomplete + +class CreateTopicsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateTopicsResponse_v2 + SCHEMA: Incomplete + +class CreateTopicsRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateTopicsResponse_v3 + SCHEMA: Incomplete + +CreateTopicsRequest: Incomplete +CreateTopicsResponse: Incomplete + +class DeleteTopicsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteTopicsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteTopicsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteTopicsResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteTopicsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteTopicsResponse_v0 + SCHEMA: Incomplete + +class DeleteTopicsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteTopicsResponse_v1 + SCHEMA: Incomplete + +class DeleteTopicsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteTopicsResponse_v2 + SCHEMA: Incomplete + +class DeleteTopicsRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteTopicsResponse_v3 + SCHEMA: Incomplete + +DeleteTopicsRequest: Incomplete +DeleteTopicsResponse: Incomplete + +class DeleteRecordsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteRecordsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteRecordsResponse_v0 + SCHEMA: Incomplete + +DeleteRecordsResponse: Incomplete +DeleteRecordsRequest: Incomplete + +class ListGroupsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListGroupsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListGroupsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListGroupsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListGroupsResponse_v0 + SCHEMA: Incomplete + +class ListGroupsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListGroupsResponse_v1 + SCHEMA: Incomplete + +class ListGroupsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListGroupsResponse_v2 + SCHEMA: Incomplete + +ListGroupsRequest: Incomplete +ListGroupsResponse: Incomplete + +class DescribeGroupsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeGroupsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeGroupsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeGroupsResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeGroupsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeGroupsResponse_v0 + SCHEMA: Incomplete + +class DescribeGroupsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeGroupsResponse_v1 + SCHEMA: Incomplete + +class DescribeGroupsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeGroupsResponse_v2 + SCHEMA: Incomplete + +class DescribeGroupsRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeGroupsResponse_v3 + SCHEMA: Incomplete + +DescribeGroupsRequest: Incomplete +DescribeGroupsResponse: Incomplete + +class DescribeAclsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeAclsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeAclsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeAclsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeAclsResponse_v0 + SCHEMA: Incomplete + +class DescribeAclsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeAclsResponse_v1 + SCHEMA: Incomplete + +class DescribeAclsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeAclsResponse_v2 + SCHEMA: Incomplete + +DescribeAclsRequest: Incomplete +DescribeAclsResponse: Incomplete + +class CreateAclsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateAclsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreateAclsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateAclsResponse_v0 + SCHEMA: Incomplete + +class CreateAclsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreateAclsResponse_v1 + SCHEMA: Incomplete + +CreateAclsRequest: Incomplete +CreateAclsResponse: Incomplete + +class DeleteAclsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteAclsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteAclsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteAclsResponse_v0 + SCHEMA: Incomplete + +class DeleteAclsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteAclsResponse_v1 + SCHEMA: Incomplete + +DeleteAclsRequest: Incomplete +DeleteAclsResponse: Incomplete + +class AlterConfigsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AlterConfigsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class AlterConfigsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AlterConfigsResponse_v0 + SCHEMA: Incomplete + +class AlterConfigsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AlterConfigsResponse_v1 + SCHEMA: Incomplete + +AlterConfigsRequest: Incomplete +AlterConfigsResponse: Incomplete + +class DescribeConfigsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeConfigsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeConfigsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeConfigsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeConfigsResponse_v0 + SCHEMA: Incomplete + +class DescribeConfigsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeConfigsResponse_v1 + SCHEMA: Incomplete + +class DescribeConfigsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeConfigsResponse_v2 + SCHEMA: Incomplete + +DescribeConfigsRequest: Incomplete +DescribeConfigsResponse: Incomplete + +class DescribeLogDirsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeLogDirsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeLogDirsResponse_v0 + SCHEMA: Incomplete + +DescribeLogDirsResponse: Incomplete +DescribeLogDirsRequest: Incomplete + +class SaslAuthenticateResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslAuthenticateResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslAuthenticateRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslAuthenticateResponse_v0 + SCHEMA: Incomplete + +class SaslAuthenticateRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslAuthenticateResponse_v1 + SCHEMA: Incomplete + +SaslAuthenticateRequest: Incomplete +SaslAuthenticateResponse: Incomplete + +class CreatePartitionsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreatePartitionsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class CreatePartitionsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = CreatePartitionsResponse_v0 + SCHEMA: Incomplete + +class CreatePartitionsRequest_v1(Request): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + RESPONSE_TYPE = CreatePartitionsResponse_v1 + +CreatePartitionsRequest: Incomplete +CreatePartitionsResponse: Incomplete + +class DeleteGroupsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteGroupsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DeleteGroupsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteGroupsResponse_v0 + SCHEMA: Incomplete + +class DeleteGroupsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DeleteGroupsResponse_v1 + SCHEMA: Incomplete + +DeleteGroupsRequest: Incomplete +DeleteGroupsResponse: Incomplete + +class DescribeClientQuotasResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class DescribeClientQuotasRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = DescribeClientQuotasResponse_v0 + SCHEMA: Incomplete + +DescribeClientQuotasRequest: Incomplete +DescribeClientQuotasResponse: Incomplete + +class AlterPartitionReassignmentsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + FLEXIBLE_VERSION: bool + +class AlterPartitionReassignmentsRequest_v0(Request): + FLEXIBLE_VERSION: bool + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = AlterPartitionReassignmentsResponse_v0 + SCHEMA: Incomplete + +AlterPartitionReassignmentsRequest: Incomplete +AlterPartitionReassignmentsResponse: Incomplete + +class ListPartitionReassignmentsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + FLEXIBLE_VERSION: bool + +class ListPartitionReassignmentsRequest_v0(Request): + FLEXIBLE_VERSION: bool + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListPartitionReassignmentsResponse_v0 + SCHEMA: Incomplete + +ListPartitionReassignmentsRequest: Incomplete +ListPartitionReassignmentsResponse: Incomplete + +class ElectLeadersResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ElectLeadersRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ElectLeadersResponse_v0 + SCHEMA: Incomplete + +class ElectLeadersResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ElectLeadersRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ElectLeadersResponse_v1 + SCHEMA: Incomplete + +class ElectionType(IntEnum): + PREFERRED = 0 + UNCLEAN = 1 + +ElectLeadersRequest: Incomplete +ElectLeadersResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/api.pyi b/stubs/kafka-python/kafka/protocol/api.pyi new file mode 100644 index 000000000000..72634ee5ee15 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/api.pyi @@ -0,0 +1,37 @@ +import abc +from _typeshed import Incomplete + +from kafka.protocol.struct import Struct + +class RequestHeader(Struct): + SCHEMA: Incomplete + def __init__(self, request, correlation_id: int = 0, client_id: str = "kafka-python") -> None: ... + +class RequestHeaderV2(Struct): + SCHEMA: Incomplete + def __init__(self, request, correlation_id: int = 0, client_id: str = "kafka-python", tags=None) -> None: ... + +class ResponseHeader(Struct): + SCHEMA: Incomplete + +class ResponseHeaderV2(Struct): + SCHEMA: Incomplete + +class Request(Struct, metaclass=abc.ABCMeta): + FLEXIBLE_VERSION: bool + API_KEY: Incomplete + API_VERSION: Incomplete + SCHEMA: Incomplete + RESPONSE_TYPE: Incomplete + def expect_response(self): ... + def to_object(self): ... + def build_header(self, correlation_id, client_id): ... + +class Response(Struct, metaclass=abc.ABCMeta): + FLEXIBLE_VERSION: bool + API_KEY: Incomplete + API_VERSION: Incomplete + SCHEMA: Incomplete + def to_object(self): ... + @classmethod + def parse_header(cls, read_buffer): ... diff --git a/stubs/kafka-python/kafka/protocol/api_versions.pyi b/stubs/kafka-python/kafka/protocol/api_versions.pyi new file mode 100644 index 000000000000..2d1a480aba34 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/api_versions.pyi @@ -0,0 +1,70 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class BaseApiVersionsResponse(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + @classmethod + def decode(cls, data): ... + +class ApiVersionsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ApiVersionsResponse_v1(BaseApiVersionsResponse): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ApiVersionsResponse_v2(BaseApiVersionsResponse): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ApiVersionsResponse_v3(BaseApiVersionsResponse): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ApiVersionsResponse_v4(BaseApiVersionsResponse): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ApiVersionsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ApiVersionsResponse_v0 + SCHEMA: Incomplete + +class ApiVersionsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ApiVersionsResponse_v1 + SCHEMA: Incomplete + +class ApiVersionsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ApiVersionsResponse_v2 + SCHEMA: Incomplete + +class ApiVersionsRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ApiVersionsResponse_v3 + SCHEMA: Incomplete + FLEXIBLE_VERSION: bool + +class ApiVersionsRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ApiVersionsResponse_v4 + SCHEMA: Incomplete + FLEXIBLE_VERSION: bool + +ApiVersionsRequest: Incomplete +ApiVersionsResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/broker_api_versions.pyi b/stubs/kafka-python/kafka/protocol/broker_api_versions.pyi new file mode 100644 index 000000000000..9a9a50c93d65 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/broker_api_versions.pyi @@ -0,0 +1,3 @@ +from _typeshed import Incomplete + +BROKER_API_VERSIONS: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/commit.pyi b/stubs/kafka-python/kafka/protocol/commit.pyi new file mode 100644 index 000000000000..1d3c08d81410 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/commit.pyi @@ -0,0 +1,166 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class OffsetCommitResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v6(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitResponse_v7(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetCommitRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v0 + SCHEMA: Incomplete + +class OffsetCommitRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v1 + SCHEMA: Incomplete + +class OffsetCommitRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v2 + SCHEMA: Incomplete + DEFAULT_RETENTION_TIME: int + +class OffsetCommitRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v3 + SCHEMA: Incomplete + DEFAULT_RETENTION_TIME: int + +class OffsetCommitRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v4 + SCHEMA: Incomplete + DEFAULT_RETENTION_TIME: int + +class OffsetCommitRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v5 + SCHEMA: Incomplete + +class OffsetCommitRequest_v6(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v6 + SCHEMA: Incomplete + +class OffsetCommitRequest_v7(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetCommitResponse_v7 + SCHEMA: Incomplete + +OffsetCommitRequest: Incomplete +OffsetCommitResponse: Incomplete + +class OffsetFetchResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetFetchRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v0 + SCHEMA: Incomplete + +class OffsetFetchRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v1 + SCHEMA: Incomplete + +class OffsetFetchRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v2 + SCHEMA: Incomplete + +class OffsetFetchRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v3 + SCHEMA: Incomplete + +class OffsetFetchRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v4 + SCHEMA: Incomplete + +class OffsetFetchRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetFetchResponse_v5 + SCHEMA: Incomplete + +OffsetFetchRequest: Incomplete +OffsetFetchResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/end_txn.pyi b/stubs/kafka-python/kafka/protocol/end_txn.pyi new file mode 100644 index 000000000000..07ba52aa0f26 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/end_txn.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class EndTxnResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class EndTxnResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class EndTxnResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class EndTxnRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = EndTxnResponse_v0 + SCHEMA: Incomplete + +class EndTxnRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = EndTxnResponse_v1 + SCHEMA: Incomplete + +class EndTxnRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = EndTxnResponse_v2 + SCHEMA: Incomplete + +EndTxnRequest: Incomplete +EndTxnResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/fetch.pyi b/stubs/kafka-python/kafka/protocol/fetch.pyi new file mode 100644 index 000000000000..e110f1557fcc --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/fetch.pyi @@ -0,0 +1,143 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +from kafka.protocol.api import Request, Response + +class AbortedTransaction(NamedTuple): + producer_id: Incomplete + first_offset: Incomplete + +class FetchResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v6(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v7(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v8(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v9(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v10(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchResponse_v11(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FetchRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v0 + SCHEMA: Incomplete + +class FetchRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v1 + SCHEMA: Incomplete + +class FetchRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v2 + SCHEMA: Incomplete + +class FetchRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v3 + SCHEMA: Incomplete + +class FetchRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v4 + SCHEMA: Incomplete + +class FetchRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v5 + SCHEMA: Incomplete + +class FetchRequest_v6(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v6 + SCHEMA: Incomplete + +class FetchRequest_v7(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v7 + SCHEMA: Incomplete + +class FetchRequest_v8(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v8 + SCHEMA: Incomplete + +class FetchRequest_v9(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v9 + SCHEMA: Incomplete + +class FetchRequest_v10(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v10 + SCHEMA: Incomplete + +class FetchRequest_v11(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FetchResponse_v11 + SCHEMA: Incomplete + +FetchRequest: Incomplete +FetchResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/find_coordinator.pyi b/stubs/kafka-python/kafka/protocol/find_coordinator.pyi new file mode 100644 index 000000000000..bd121a8d50ab --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/find_coordinator.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class FindCoordinatorResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FindCoordinatorResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FindCoordinatorResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class FindCoordinatorRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FindCoordinatorResponse_v0 + SCHEMA: Incomplete + +class FindCoordinatorRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FindCoordinatorResponse_v1 + SCHEMA: Incomplete + +class FindCoordinatorRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = FindCoordinatorResponse_v2 + SCHEMA: Incomplete + +FindCoordinatorRequest: Incomplete +FindCoordinatorResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/frame.pyi b/stubs/kafka-python/kafka/protocol/frame.pyi new file mode 100644 index 000000000000..b3c8b9647588 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/frame.pyi @@ -0,0 +1,6 @@ +class KafkaBytes(bytearray): + def __init__(self, size) -> None: ... + def read(self, nbytes=None): ... + def write(self, data) -> None: ... + def seek(self, idx) -> None: ... + def tell(self): ... diff --git a/stubs/kafka-python/kafka/protocol/group.pyi b/stubs/kafka-python/kafka/protocol/group.pyi new file mode 100644 index 000000000000..8cfd38e655a3 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/group.pyi @@ -0,0 +1,229 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +from kafka.protocol.api import Request, Response +from kafka.protocol.struct import Struct + +DEFAULT_GENERATION_ID: int +UNKNOWN_MEMBER_ID: str + +class GroupMember(NamedTuple): + member_id: Incomplete = ... + group_instance_id: Incomplete = ... + metadata_bytes: Incomplete = ... + +class JoinGroupResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class JoinGroupRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v0 + SCHEMA: Incomplete + +class JoinGroupRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v1 + SCHEMA: Incomplete + +class JoinGroupRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v2 + SCHEMA: Incomplete + +class JoinGroupRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v3 + SCHEMA: Incomplete + +class JoinGroupRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v4 + SCHEMA: Incomplete + +class JoinGroupRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = JoinGroupResponse_v5 + SCHEMA: Incomplete + +JoinGroupRequest: Incomplete +JoinGroupResponse: Incomplete + +class ProtocolMetadata(Struct): + SCHEMA: Incomplete + +class SyncGroupResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SyncGroupResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SyncGroupResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SyncGroupResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SyncGroupRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SyncGroupResponse_v0 + SCHEMA: Incomplete + +class SyncGroupRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SyncGroupResponse_v1 + SCHEMA: Incomplete + +class SyncGroupRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SyncGroupResponse_v2 + SCHEMA: Incomplete + +class SyncGroupRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SyncGroupResponse_v3 + SCHEMA: Incomplete + +SyncGroupRequest: Incomplete +SyncGroupResponse: Incomplete + +class MemberAssignment(Struct): + SCHEMA: Incomplete + +class HeartbeatResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class HeartbeatResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class HeartbeatResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class HeartbeatResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class HeartbeatRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = HeartbeatResponse_v0 + SCHEMA: Incomplete + +class HeartbeatRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = HeartbeatResponse_v1 + SCHEMA: Incomplete + +class HeartbeatRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = HeartbeatResponse_v2 + SCHEMA: Incomplete + +class HeartbeatRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = HeartbeatResponse_v3 + SCHEMA: Incomplete + +HeartbeatRequest: Incomplete +HeartbeatResponse: Incomplete + +class LeaveGroupResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class LeaveGroupResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class LeaveGroupResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class LeaveGroupResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class LeaveGroupRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = LeaveGroupResponse_v0 + SCHEMA: Incomplete + +class LeaveGroupRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = LeaveGroupResponse_v1 + SCHEMA: Incomplete + +class LeaveGroupRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = LeaveGroupResponse_v2 + SCHEMA: Incomplete + +class LeaveGroupRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = LeaveGroupResponse_v3 + SCHEMA: Incomplete + +LeaveGroupRequest: Incomplete +LeaveGroupResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/init_producer_id.pyi b/stubs/kafka-python/kafka/protocol/init_producer_id.pyi new file mode 100644 index 000000000000..0025ce3e33c7 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/init_producer_id.pyi @@ -0,0 +1,28 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class InitProducerIdResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class InitProducerIdResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class InitProducerIdRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = InitProducerIdResponse_v0 + SCHEMA: Incomplete + +class InitProducerIdRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = InitProducerIdResponse_v1 + SCHEMA: Incomplete + +InitProducerIdRequest: Incomplete +InitProducerIdResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/list_offsets.pyi b/stubs/kafka-python/kafka/protocol/list_offsets.pyi new file mode 100644 index 000000000000..f8fe7767e0b3 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/list_offsets.pyi @@ -0,0 +1,85 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +UNKNOWN_OFFSET: int + +class OffsetResetStrategy: + LATEST: int + EARLIEST: int + NONE: int + +class ListOffsetsResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ListOffsetsRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v0 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +class ListOffsetsRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v1 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +class ListOffsetsRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v2 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +class ListOffsetsRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v3 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +class ListOffsetsRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v4 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +class ListOffsetsRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = ListOffsetsResponse_v5 + SCHEMA: Incomplete + DEFAULTS: Incomplete + +ListOffsetsRequest: Incomplete +ListOffsetsResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/message.pyi b/stubs/kafka-python/kafka/protocol/message.pyi new file mode 100644 index 000000000000..3e2a48204671 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/message.pyi @@ -0,0 +1,43 @@ +from _typeshed import Incomplete + +from kafka.protocol.struct import Struct +from kafka.protocol.types import AbstractType + +class Message(Struct): + SCHEMAS: Incomplete + SCHEMA: Incomplete + CODEC_MASK: int + CODEC_GZIP: int + CODEC_SNAPPY: int + CODEC_LZ4: int + CODEC_ZSTD: int + TIMESTAMP_TYPE_MASK: int + HEADER_SIZE: int + timestamp: Incomplete + crc: Incomplete + magic: Incomplete + attributes: Incomplete + key: Incomplete + value: Incomplete + encode: Incomplete + def __init__(self, value, key=None, magic: int = 0, attributes: int = 0, crc: int = 0, timestamp=None) -> None: ... + @property + def timestamp_type(self): ... + @classmethod + def decode(cls, data): ... + def validate_crc(self): ... + def is_compressed(self): ... + def decompress(self): ... + def __hash__(self): ... + +class PartialMessage(bytes): ... + +class MessageSet(AbstractType): + ITEM: Incomplete + HEADER_SIZE: int + @classmethod + def encode(cls, items, prepend_size: bool = True): ... + @classmethod + def decode(cls, data, bytes_to_read=None): ... + @classmethod + def repr(cls, messages): ... diff --git a/stubs/kafka-python/kafka/protocol/metadata.pyi b/stubs/kafka-python/kafka/protocol/metadata.pyi new file mode 100644 index 000000000000..429ef2d111d6 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/metadata.pyi @@ -0,0 +1,123 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class MetadataResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v6(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v7(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataResponse_v8(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class MetadataRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v0 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v1 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v2 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v3 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v4 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v5(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v5 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v6(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v6 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v7(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v7 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +class MetadataRequest_v8(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = MetadataResponse_v8 + SCHEMA: Incomplete + ALL_TOPICS: Incomplete + NO_TOPICS: Incomplete + +MetadataRequest: Incomplete +MetadataResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/offset_for_leader_epoch.pyi b/stubs/kafka-python/kafka/protocol/offset_for_leader_epoch.pyi new file mode 100644 index 000000000000..2d0c5e9aee2f --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/offset_for_leader_epoch.pyi @@ -0,0 +1,61 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class OffsetForLeaderEpochResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetForLeaderEpochResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetForLeaderEpochResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetForLeaderEpochResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetForLeaderEpochResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class OffsetForLeaderEpochRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetForLeaderEpochResponse_v0 + SCHEMA: Incomplete + +class OffsetForLeaderEpochRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetForLeaderEpochResponse_v1 + SCHEMA: Incomplete + +class OffsetForLeaderEpochRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetForLeaderEpochResponse_v2 + SCHEMA: Incomplete + +class OffsetForLeaderEpochRequest_v3(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetForLeaderEpochResponse_v3 + SCHEMA: Incomplete + +class OffsetForLeaderEpochRequest_v4(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = OffsetForLeaderEpochResponse_v4 + SCHEMA: Incomplete + +OffsetForLeaderEpochRequest: Incomplete +OffsetForLeaderEpochResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/parser.pyi b/stubs/kafka-python/kafka/protocol/parser.pyi new file mode 100644 index 000000000000..7d0cf2946e66 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/parser.pyi @@ -0,0 +1,11 @@ +from _typeshed import Incomplete + +log: Incomplete + +class KafkaProtocol: + in_flight_requests: Incomplete + bytes_to_send: Incomplete + def __init__(self, client_id=None, api_version=None) -> None: ... + def send_request(self, request, correlation_id=None): ... + def send_bytes(self): ... + def receive_bytes(self, data): ... diff --git a/stubs/kafka-python/kafka/protocol/produce.pyi b/stubs/kafka-python/kafka/protocol/produce.pyi new file mode 100644 index 000000000000..7652fbf6be7c --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/produce.pyi @@ -0,0 +1,103 @@ +import abc +from _typeshed import Incomplete +from typing import type_check_only + +from kafka.protocol.api import Request, Response + +class ProduceResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v3(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v4(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v5(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v6(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v7(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class ProduceResponse_v8(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +@type_check_only +class _ProduceRequest(Request, metaclass=abc.ABCMeta): + API_KEY: int + def expect_response(self): ... + +class ProduceRequest_v0(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v0 + SCHEMA: Incomplete + +class ProduceRequest_v1(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v1 + SCHEMA: Incomplete + +class ProduceRequest_v2(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v2 + SCHEMA: Incomplete + +class ProduceRequest_v3(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v3 + SCHEMA: Incomplete + +class ProduceRequest_v4(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v4 + SCHEMA: Incomplete + +class ProduceRequest_v5(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v5 + SCHEMA: Incomplete + +class ProduceRequest_v6(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v6 + SCHEMA: Incomplete + +class ProduceRequest_v7(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v7 + SCHEMA: Incomplete + +class ProduceRequest_v8(_ProduceRequest): + API_VERSION: int + RESPONSE_TYPE = ProduceResponse_v8 + SCHEMA: Incomplete + +ProduceRequest: list[type[_ProduceRequest]] +ProduceResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/sasl_authenticate.pyi b/stubs/kafka-python/kafka/protocol/sasl_authenticate.pyi new file mode 100644 index 000000000000..da9781407f5b --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/sasl_authenticate.pyi @@ -0,0 +1,28 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class SaslAuthenticateResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslAuthenticateResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslAuthenticateRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslAuthenticateResponse_v0 + SCHEMA: Incomplete + +class SaslAuthenticateRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslAuthenticateResponse_v1 + SCHEMA: Incomplete + +SaslAuthenticateRequest: Incomplete +SaslAuthenticateResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/sasl_handshake.pyi b/stubs/kafka-python/kafka/protocol/sasl_handshake.pyi new file mode 100644 index 000000000000..dad4e65bea5b --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/sasl_handshake.pyi @@ -0,0 +1,28 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class SaslHandshakeResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslHandshakeResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class SaslHandshakeRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslHandshakeResponse_v0 + SCHEMA: Incomplete + +class SaslHandshakeRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = SaslHandshakeResponse_v1 + SCHEMA: Incomplete + +SaslHandshakeRequest: Incomplete +SaslHandshakeResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/struct.pyi b/stubs/kafka-python/kafka/protocol/struct.pyi new file mode 100644 index 000000000000..11de387016c4 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/struct.pyi @@ -0,0 +1,14 @@ +from _typeshed import Incomplete + +from kafka.protocol.abstract import AbstractType + +class Struct(AbstractType): + SCHEMA: Incomplete + def __init__(self, *args, **kwargs) -> None: ... + @classmethod + def encode(cls, item): ... + @classmethod + def decode(cls, data): ... + def get_item(self, name): ... + def __hash__(self): ... + def __eq__(self, other): ... diff --git a/stubs/kafka-python/kafka/protocol/txn_offset_commit.pyi b/stubs/kafka-python/kafka/protocol/txn_offset_commit.pyi new file mode 100644 index 000000000000..d9b035c097da --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/txn_offset_commit.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete + +from kafka.protocol.api import Request, Response + +class TxnOffsetCommitResponse_v0(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class TxnOffsetCommitResponse_v1(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class TxnOffsetCommitResponse_v2(Response): + API_KEY: int + API_VERSION: int + SCHEMA: Incomplete + +class TxnOffsetCommitRequest_v0(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = TxnOffsetCommitResponse_v0 + SCHEMA: Incomplete + +class TxnOffsetCommitRequest_v1(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = TxnOffsetCommitResponse_v1 + SCHEMA: Incomplete + +class TxnOffsetCommitRequest_v2(Request): + API_KEY: int + API_VERSION: int + RESPONSE_TYPE = TxnOffsetCommitResponse_v2 + SCHEMA: Incomplete + +TxnOffsetCommitRequest: Incomplete +TxnOffsetCommitResponse: Incomplete diff --git a/stubs/kafka-python/kafka/protocol/types.pyi b/stubs/kafka-python/kafka/protocol/types.pyi new file mode 100644 index 000000000000..d1cc891ab005 --- /dev/null +++ b/stubs/kafka-python/kafka/protocol/types.pyi @@ -0,0 +1,115 @@ +from _typeshed import Incomplete + +from kafka.protocol.abstract import AbstractType as AbstractType + +class Int8(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class Int16(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class Int32(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class Int64(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class Float64(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class String(AbstractType): + encoding: Incomplete + def __init__(self, encoding: str = "utf-8") -> None: ... + def encode(self, value): ... + def decode(self, data): ... + +class Bytes(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + @classmethod + def repr(cls, value): ... + +class Boolean(AbstractType): + @classmethod + def encode(cls, value): ... + @classmethod + def decode(cls, data): ... + +class Schema(AbstractType): + def __init__(self, *fields) -> None: ... + def encode(self, item): ... + def decode(self, data): ... + def __len__(self) -> int: ... + def repr(self, value): ... + +class Array(AbstractType): + array_of: Incomplete + def __init__(self, *array_of) -> None: ... + def encode(self, items): ... + def decode(self, data): ... + def repr(self, list_of_items): ... + +class UnsignedVarInt32(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, value): ... + +class VarInt32(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, value): ... + +class VarInt64(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, value): ... + +class CompactString(String): + def decode(self, data): ... + def encode(self, value): ... + +class TaggedFields(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, value): ... + +class CompactBytes(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, value): ... + +class CompactArray(Array): + def encode(self, items): ... + def decode(self, data): ... + +class BitField(AbstractType): + @classmethod + def decode(cls, data): ... + @classmethod + def encode(cls, vals): ... + @classmethod + def to_32_bit_field(cls, vals): ... + @classmethod + def from_32_bit_field(cls, value): ... diff --git a/stubs/kafka-python/kafka/record/__init__.pyi b/stubs/kafka-python/kafka/record/__init__.pyi new file mode 100644 index 000000000000..7ac09dc7e0d8 --- /dev/null +++ b/stubs/kafka-python/kafka/record/__init__.pyi @@ -0,0 +1,3 @@ +from kafka.record.memory_records import MemoryRecords as MemoryRecords, MemoryRecordsBuilder as MemoryRecordsBuilder + +__all__ = ["MemoryRecords", "MemoryRecordsBuilder"] diff --git a/stubs/kafka-python/kafka/record/_crc32c.pyi b/stubs/kafka-python/kafka/record/_crc32c.pyi new file mode 100644 index 000000000000..3337132fe642 --- /dev/null +++ b/stubs/kafka-python/kafka/record/_crc32c.pyi @@ -0,0 +1,8 @@ +from _typeshed import Incomplete + +CRC_TABLE: Incomplete +CRC_INIT: int + +def crc_update(crc, data): ... +def crc_finalize(crc): ... +def crc(data): ... diff --git a/stubs/kafka-python/kafka/record/abc.pyi b/stubs/kafka-python/kafka/record/abc.pyi new file mode 100644 index 000000000000..c351d4fb6611 --- /dev/null +++ b/stubs/kafka-python/kafka/record/abc.pyi @@ -0,0 +1,60 @@ +import abc + +class ABCRecord(metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def size_in_bytes(self): ... + @property + @abc.abstractmethod + def offset(self): ... + @property + @abc.abstractmethod + def timestamp(self): ... + @property + @abc.abstractmethod + def timestamp_type(self): ... + @property + @abc.abstractmethod + def key(self): ... + @property + @abc.abstractmethod + def value(self): ... + @property + @abc.abstractmethod + def checksum(self): ... + @abc.abstractmethod + def validate_crc(self): ... + @property + @abc.abstractmethod + def headers(self): ... + +class ABCRecordBatchBuilder(metaclass=abc.ABCMeta): + @abc.abstractmethod + def append(self, offset, timestamp, key, value, headers=None): ... + @abc.abstractmethod + def size_in_bytes(self, offset, timestamp, key, value, headers): ... + @abc.abstractmethod + def build(self): ... + +class ABCRecordBatch(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __iter__(self): ... + @property + @abc.abstractmethod + def base_offset(self): ... + @property + @abc.abstractmethod + def size_in_bytes(self): ... + @property + @abc.abstractmethod + def magic(self): ... + +class ABCRecords(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self, buffer): ... + @abc.abstractmethod + def size_in_bytes(self): ... + @abc.abstractmethod + def next_batch(self): ... + @abc.abstractmethod + def has_next(self): ... diff --git a/stubs/kafka-python/kafka/record/default_records.pyi b/stubs/kafka-python/kafka/record/default_records.pyi new file mode 100644 index 000000000000..bdb79252bc05 --- /dev/null +++ b/stubs/kafka-python/kafka/record/default_records.pyi @@ -0,0 +1,155 @@ +from _typeshed import Incomplete + +from kafka.record.abc import ABCRecord, ABCRecordBatch, ABCRecordBatchBuilder + +class DefaultRecordBase: + HEADER_STRUCT: Incomplete + ATTRIBUTES_OFFSET: Incomplete + CRC_OFFSET: Incomplete + AFTER_LEN_OFFSET: Incomplete + CODEC_MASK: int + CODEC_NONE: int + CODEC_GZIP: int + CODEC_SNAPPY: int + CODEC_LZ4: int + CODEC_ZSTD: int + TIMESTAMP_TYPE_MASK: int + TRANSACTIONAL_MASK: int + CONTROL_MASK: int + LOG_APPEND_TIME: int + CREATE_TIME: int + NO_PRODUCER_ID: int + NO_SEQUENCE: int + MAX_INT: int + +class DefaultRecordBatch(DefaultRecordBase, ABCRecordBatch): + def __init__(self, buffer) -> None: ... + @property + def base_offset(self): ... + @property + def size_in_bytes(self): ... + @property + def leader_epoch(self): ... + @property + def magic(self): ... + @property + def crc(self): ... + @property + def attributes(self): ... + @property + def last_offset_delta(self): ... + @property + def last_offset(self): ... + @property + def next_offset(self): ... + @property + def compression_type(self): ... + @property + def timestamp_type(self): ... + @property + def is_transactional(self): ... + @property + def is_control_batch(self): ... + @property + def first_timestamp(self): ... + @property + def max_timestamp(self): ... + @property + def producer_id(self): ... + def has_producer_id(self): ... + @property + def producer_epoch(self): ... + @property + def base_sequence(self): ... + @property + def has_sequence(self): ... + @property + def last_sequence(self): ... + @property + def records_count(self): ... + def __iter__(self): ... + def __next__(self): ... + next = __next__ + def validate_crc(self): ... + +class DefaultRecord(ABCRecord): + def __init__(self, size_in_bytes, offset, timestamp, timestamp_type, key, value, headers) -> None: ... + @property + def size_in_bytes(self): ... + @property + def offset(self): ... + @property + def timestamp(self): ... + @property + def timestamp_type(self): ... + @property + def key(self): ... + @property + def value(self): ... + @property + def headers(self): ... + @property + def checksum(self) -> None: ... + def validate_crc(self): ... + +class ControlRecord(DefaultRecord): + KEY_STRUCT: Incomplete + def __init__(self, size_in_bytes, offset, timestamp, timestamp_type, key, value, headers) -> None: ... + @property + def version(self): ... + @property + def type(self): ... + @property + def abort(self): ... + @property + def commit(self): ... + +class DefaultRecordBatchBuilder(DefaultRecordBase, ABCRecordBatchBuilder): + MAX_RECORD_OVERHEAD: int + def __init__( + self, magic, compression_type, is_transactional, producer_id, producer_epoch, base_sequence, batch_size + ) -> None: ... + def set_producer_state(self, producer_id, producer_epoch, base_sequence, is_transactional) -> None: ... + @property + def producer_id(self): ... + @property + def producer_epoch(self): ... + def append( # type: ignore[override] + self, + offset, + timestamp, + key, + value, + headers, + encode_varint=..., + size_of_varint=..., + get_type=..., + type_int=..., + time_time=..., + byte_like=..., + bytearray_type=..., + len_func=..., + zero_len_varint: int = 1, + ): ... + def write_header(self, use_compression_type: bool = True) -> None: ... + def build(self): ... + def size(self): ... + @classmethod + def header_size_in_bytes(cls): ... + @classmethod + def size_in_bytes(cls, offset_delta, timestamp_delta, key, value, headers): ... + @classmethod + def size_of(cls, key, value, headers): ... + @classmethod + def estimate_size_in_bytes(cls, key, value, headers): ... + +class DefaultRecordMetadata: + def __init__(self, offset, size, timestamp) -> None: ... + @property + def offset(self): ... + @property + def crc(self) -> None: ... + @property + def size(self): ... + @property + def timestamp(self): ... diff --git a/stubs/kafka-python/kafka/record/legacy_records.pyi b/stubs/kafka-python/kafka/record/legacy_records.pyi new file mode 100644 index 000000000000..d7165b0c0b10 --- /dev/null +++ b/stubs/kafka-python/kafka/record/legacy_records.pyi @@ -0,0 +1,86 @@ +from _typeshed import Incomplete + +from kafka.record.abc import ABCRecord, ABCRecordBatch, ABCRecordBatchBuilder + +class LegacyRecordBase: + HEADER_STRUCT_V0: Incomplete + HEADER_STRUCT_V1: Incomplete + LOG_OVERHEAD: Incomplete + CRC_OFFSET: Incomplete + MAGIC_OFFSET: Incomplete + RECORD_OVERHEAD_V0: Incomplete + RECORD_OVERHEAD_V1: Incomplete + KEY_OFFSET_V0: Incomplete + KEY_OFFSET_V1: Incomplete + KEY_LENGTH: Incomplete + VALUE_LENGTH: Incomplete + CODEC_MASK: int + CODEC_NONE: int + CODEC_GZIP: int + CODEC_SNAPPY: int + CODEC_LZ4: int + TIMESTAMP_TYPE_MASK: int + LOG_APPEND_TIME: int + CREATE_TIME: int + NO_TIMESTAMP: int + +class LegacyRecordBatch(ABCRecordBatch, LegacyRecordBase): + def __init__(self, buffer, magic) -> None: ... + @property + def base_offset(self): ... + @property + def size_in_bytes(self): ... + @property + def timestamp_type(self): ... + @property + def compression_type(self): ... + @property + def magic(self): ... + def validate_crc(self): ... + def __iter__(self): ... + +class LegacyRecord(ABCRecord): + def __init__(self, magic, offset, timestamp, timestamp_type, key, value, crc, crc_bytes) -> None: ... + @property + def magic(self): ... + @property + def offset(self): ... + @property + def timestamp(self): ... + @property + def timestamp_type(self): ... + @property + def key(self): ... + @property + def value(self): ... + @property + def headers(self): ... + @property + def checksum(self): ... + def validate_crc(self): ... + @property + def size_in_bytes(self): ... + +class LegacyRecordBatchBuilder(ABCRecordBatchBuilder, LegacyRecordBase): + def __init__(self, magic, compression_type, batch_size) -> None: ... + def append(self, offset, timestamp, key, value, headers=None): ... + def build(self): ... + def size(self): ... + def size_in_bytes(self, offset, timestamp, key, value, headers=None): ... + @classmethod + def record_size(cls, magic, key, value): ... + @classmethod + def record_overhead(cls, magic): ... + @classmethod + def estimate_size_in_bytes(cls, magic, compression_type, key, value): ... + +class LegacyRecordMetadata: + def __init__(self, offset, crc, size, timestamp) -> None: ... + @property + def offset(self): ... + @property + def crc(self): ... + @property + def size(self): ... + @property + def timestamp(self): ... diff --git a/stubs/kafka-python/kafka/record/memory_records.pyi b/stubs/kafka-python/kafka/record/memory_records.pyi new file mode 100644 index 000000000000..5dec0f3202fa --- /dev/null +++ b/stubs/kafka-python/kafka/record/memory_records.pyi @@ -0,0 +1,44 @@ +from _typeshed import Incomplete + +from kafka.record.abc import ABCRecords + +class MemoryRecords(ABCRecords): + LENGTH_OFFSET: Incomplete + LOG_OVERHEAD: Incomplete + MAGIC_OFFSET: Incomplete + MIN_SLICE: Incomplete + def __init__(self, bytes_data) -> None: ... + def size_in_bytes(self): ... + def valid_bytes(self): ... + def has_next(self): ... + def next_batch(self, _min_slice=26, _magic_offset=16): ... + def __iter__(self): ... + def __next__(self): ... + next = __next__ + +class MemoryRecordsBuilder: + def __init__( + self, + magic, + compression_type, + batch_size, + offset: int = 0, + transactional: bool = False, + producer_id: int = -1, + producer_epoch: int = -1, + base_sequence: int = -1, + ) -> None: ... + def skip(self, offsets_to_skip) -> None: ... + def append(self, timestamp, key, value, headers=[]): ... + def set_producer_state(self, producer_id, producer_epoch, base_sequence, is_transactional) -> None: ... + @property + def producer_id(self): ... + @property + def producer_epoch(self): ... + def records(self): ... + def close(self) -> None: ... + def size_in_bytes(self): ... + def compression_rate(self): ... + def is_full(self): ... + def next_offset(self): ... + def buffer(self): ... diff --git a/stubs/kafka-python/kafka/record/util.pyi b/stubs/kafka-python/kafka/record/util.pyi new file mode 100644 index 000000000000..fa94937bc8f8 --- /dev/null +++ b/stubs/kafka-python/kafka/record/util.pyi @@ -0,0 +1,5 @@ +def encode_varint(value, write): ... +def size_of_varint(value): ... +def decode_varint(buffer, pos: int = 0): ... +def calc_crc32c(memview, _crc32c=...): ... +def calc_crc32(memview): ... diff --git a/stubs/kafka-python/kafka/sasl/__init__.pyi b/stubs/kafka-python/kafka/sasl/__init__.pyi new file mode 100644 index 000000000000..93fcedc0ab97 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/__init__.pyi @@ -0,0 +1,6 @@ +from _typeshed import Incomplete + +SASL_MECHANISMS: Incomplete + +def register_sasl_mechanism(name, klass, overwrite: bool = False) -> None: ... +def get_sasl_mechanism(name): ... diff --git a/stubs/kafka-python/kafka/sasl/abc.pyi b/stubs/kafka-python/kafka/sasl/abc.pyi new file mode 100644 index 000000000000..52d76c08a27c --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/abc.pyi @@ -0,0 +1,14 @@ +import abc + +class SaslMechanism(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __init__(self, **config): ... + @abc.abstractmethod + def auth_bytes(self): ... + @abc.abstractmethod + def receive(self, auth_bytes): ... + @abc.abstractmethod + def is_done(self): ... + @abc.abstractmethod + def is_authenticated(self): ... + def auth_details(self): ... diff --git a/stubs/kafka-python/kafka/sasl/gssapi.pyi b/stubs/kafka-python/kafka/sasl/gssapi.pyi new file mode 100644 index 000000000000..2bbe75ee3526 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/gssapi.pyi @@ -0,0 +1,16 @@ +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +class SaslMechanismGSSAPI(SaslMechanism): + SASL_QOP_AUTH: int + SASL_QOP_AUTH_INT: int + SASL_QOP_AUTH_CONF: int + gssapi_name: Incomplete + auth_id: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes) -> None: ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... diff --git a/stubs/kafka-python/kafka/sasl/msk.pyi b/stubs/kafka-python/kafka/sasl/msk.pyi new file mode 100644 index 000000000000..3c3efed6fcc1 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/msk.pyi @@ -0,0 +1,33 @@ +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +log: Incomplete + +class SaslMechanismAwsMskIam(SaslMechanism): + host: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes) -> None: ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... + +class AwsMskIamClient: + UNRESERVED_CHARS: Incomplete + algorithm: str + expires: str + hashfunc: Incomplete + headers: Incomplete + version: str + service: str + action: Incomplete + datestamp: Incomplete + timestamp: Incomplete + host: Incomplete + access_key: Incomplete + secret_key: Incomplete + region: Incomplete + token: Incomplete + def __init__(self, host, access_key, secret_key, region, token=None) -> None: ... + def first_message(self): ... diff --git a/stubs/kafka-python/kafka/sasl/oauth.pyi b/stubs/kafka-python/kafka/sasl/oauth.pyi new file mode 100644 index 000000000000..089ad778c4f4 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/oauth.pyi @@ -0,0 +1,23 @@ +import abc +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +log: Incomplete + +class SaslMechanismOAuth(SaslMechanism): + token_provider: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes) -> None: ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... + +ABC: Incomplete + +class AbstractTokenProvider(ABC, metaclass=abc.ABCMeta): + def __init__(self, **config) -> None: ... + @abc.abstractmethod + def token(self): ... + def extensions(self): ... diff --git a/stubs/kafka-python/kafka/sasl/plain.pyi b/stubs/kafka-python/kafka/sasl/plain.pyi new file mode 100644 index 000000000000..be3f7961ad39 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/plain.pyi @@ -0,0 +1,15 @@ +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +log: Incomplete + +class SaslMechanismPlain(SaslMechanism): + username: Incomplete + password: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes) -> None: ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... diff --git a/stubs/kafka-python/kafka/sasl/scram.pyi b/stubs/kafka-python/kafka/sasl/scram.pyi new file mode 100644 index 000000000000..928d1efb094f --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/scram.pyi @@ -0,0 +1,40 @@ +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +log: Incomplete + +def xor_bytes(left, right): ... + +class SaslMechanismScram(SaslMechanism): + username: Incomplete + mechanism: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes): ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... + +class ScramClient: + MECHANISMS: Incomplete + nonce: Incomplete + auth_message: bytes + salted_password: Incomplete + user: Incomplete + password: Incomplete + hashfunc: Incomplete + hashname: Incomplete + stored_key: Incomplete + client_key: Incomplete + client_signature: Incomplete + client_proof: Incomplete + server_key: Incomplete + server_signature: Incomplete + def __init__(self, user, password, mechanism) -> None: ... + def first_message(self): ... + def process_server_first_message(self, server_first_message) -> None: ... + def hmac(self, key, msg): ... + def create_salted_password(self, salt, iterations) -> None: ... + def final_message(self): ... + def process_server_final_message(self, server_final_message) -> None: ... diff --git a/stubs/kafka-python/kafka/sasl/sspi.pyi b/stubs/kafka-python/kafka/sasl/sspi.pyi new file mode 100644 index 000000000000..600c382b4094 --- /dev/null +++ b/stubs/kafka-python/kafka/sasl/sspi.pyi @@ -0,0 +1,17 @@ +from _typeshed import Incomplete + +from kafka.sasl.abc import SaslMechanism + +log: Incomplete + +class SaslMechanismSSPI(SaslMechanism): + SASL_QOP_AUTH: int + SASL_QOP_AUTH_INT: int + SASL_QOP_AUTH_CONF: int + auth_id: Incomplete + def __init__(self, **config) -> None: ... + def auth_bytes(self): ... + def receive(self, auth_bytes) -> None: ... + def is_done(self): ... + def is_authenticated(self): ... + def auth_details(self): ... diff --git a/stubs/kafka-python/kafka/serializer/__init__.pyi b/stubs/kafka-python/kafka/serializer/__init__.pyi new file mode 100644 index 000000000000..b9caa9a2bcbb --- /dev/null +++ b/stubs/kafka-python/kafka/serializer/__init__.pyi @@ -0,0 +1 @@ +from kafka.serializer.abstract import Deserializer as Deserializer, Serializer as Serializer diff --git a/stubs/kafka-python/kafka/serializer/abstract.pyi b/stubs/kafka-python/kafka/serializer/abstract.pyi new file mode 100644 index 000000000000..5e57c8b778a0 --- /dev/null +++ b/stubs/kafka-python/kafka/serializer/abstract.pyi @@ -0,0 +1,15 @@ +import abc + +class Serializer(metaclass=abc.ABCMeta): + __meta__ = abc.ABCMeta + def __init__(self, **config) -> None: ... + @abc.abstractmethod + def serialize(self, topic, value): ... + def close(self) -> None: ... + +class Deserializer(metaclass=abc.ABCMeta): + __meta__ = abc.ABCMeta + def __init__(self, **config) -> None: ... + @abc.abstractmethod + def deserialize(self, topic, bytes_): ... + def close(self) -> None: ... diff --git a/stubs/kafka-python/kafka/socks5_wrapper.pyi b/stubs/kafka-python/kafka/socks5_wrapper.pyi new file mode 100644 index 000000000000..871e8b20344f --- /dev/null +++ b/stubs/kafka-python/kafka/socks5_wrapper.pyi @@ -0,0 +1,25 @@ +from _typeshed import Incomplete + +log: Incomplete + +class ProxyConnectionStates: + DISCONNECTED: str + CONNECTING: str + NEGOTIATE_PROPOSE: str + NEGOTIATING: str + AUTHENTICATING: str + REQUEST_SUBMIT: str + REQUESTING: str + READ_ADDRESS: str + COMPLETE: str + +class Socks5Wrapper: + def __init__(self, proxy_url, afi) -> None: ... + @classmethod + def is_inet_4_or_6(cls, gai): ... + @classmethod + def dns_lookup(cls, host, port, afi=...): ... + @classmethod + def use_remote_lookup(cls, proxy_url): ... + def socket(self, family, sock_type): ... + def connect_ex(self, addr): ... diff --git a/stubs/kafka-python/kafka/structs.pyi b/stubs/kafka-python/kafka/structs.pyi new file mode 100644 index 000000000000..997afe9492f3 --- /dev/null +++ b/stubs/kafka-python/kafka/structs.pyi @@ -0,0 +1,53 @@ +from _typeshed import Incomplete +from typing import NamedTuple + +class TopicPartition(NamedTuple): + topic: str + partition: int + +class BrokerMetadata(NamedTuple): + nodeId: int + host: str + port: int + rack: str | None + +class PartitionMetadata(NamedTuple): + topic: str + partition: int + leader: int + leader_epoch: int | None + replicas: list[int] + isr: list[int] + offline_replicas: list[int] + error: Incomplete + +class OffsetAndMetadata(NamedTuple): + offset: int + metadata: str + leader_epoch: int + +class OffsetAndTimestamp(NamedTuple): + offset: int + timestamp: int + leader_epoch: int + +class MemberInformation(NamedTuple): + member_id: str + client_id: str + client_host: str + member_metadata: Incomplete + member_assignment: Incomplete + +class GroupInformation(NamedTuple): + error_code: int + group: str + state: str + protocol_type: str + protocol: str + members: list[MemberInformation] + authorized_operations: list[str] + +class RetryOptions(NamedTuple): + limit: int + backoff_ms: int + retry_on_timeouts: bool diff --git a/stubs/kafka-python/kafka/util.pyi b/stubs/kafka-python/kafka/util.pyi new file mode 100644 index 000000000000..4783d02b462a --- /dev/null +++ b/stubs/kafka-python/kafka/util.pyi @@ -0,0 +1,38 @@ +from _typeshed import Incomplete +from collections.abc import Callable +from typing import ParamSpec, TypeVar + +_P = ParamSpec("_P") +_T = TypeVar("_T") + +MAX_INT: Incomplete +TO_SIGNED: Incomplete + +def crc32(data): ... + +class Timer: + def __init__(self, timeout_ms, error_message=None, start_at=None) -> None: ... + @property + def expired(self): ... + @property + def timeout_ms(self): ... + @property + def elapsed_ms(self): ... + def maybe_raise(self) -> None: ... + +TOPIC_MAX_LENGTH: int +TOPIC_LEGAL_CHARS: Incomplete + +def ensure_valid_topic_name(topic) -> None: ... + +class WeakMethod: + target: Incomplete + method: Incomplete + def __init__(self, object_dot_method) -> None: ... + def __call__(self, *args, **kwargs): ... + def __hash__(self): ... + def __eq__(self, other): ... + +class Dict(dict[Incomplete, Incomplete]): ... + +def synchronized(func: Callable[_P, _T]) -> Callable[_P, _T]: ... diff --git a/stubs/kafka-python/kafka/version.pyi b/stubs/kafka-python/kafka/version.pyi new file mode 100644 index 000000000000..bda5b5a7f4cc --- /dev/null +++ b/stubs/kafka-python/kafka/version.pyi @@ -0,0 +1 @@ +__version__: str