kafka-python 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. kafka/__init__.py +34 -0
  2. kafka/__main__.py +5 -0
  3. kafka/admin/__init__.py +29 -0
  4. kafka/admin/__main__.py +5 -0
  5. kafka/admin/_acls.py +355 -0
  6. kafka/admin/_cluster.py +359 -0
  7. kafka/admin/_configs.py +479 -0
  8. kafka/admin/_groups.py +754 -0
  9. kafka/admin/_partitions.py +595 -0
  10. kafka/admin/_topics.py +281 -0
  11. kafka/admin/_transactions.py +450 -0
  12. kafka/admin/_users.py +194 -0
  13. kafka/admin/client.py +373 -0
  14. kafka/benchmarks/__init__.py +0 -0
  15. kafka/benchmarks/consumer_performance.py +138 -0
  16. kafka/benchmarks/load_example.py +109 -0
  17. kafka/benchmarks/producer_encode_path.py +201 -0
  18. kafka/benchmarks/producer_performance.py +161 -0
  19. kafka/benchmarks/profile_protocol.py +138 -0
  20. kafka/benchmarks/protocol_old_vs_new.py +447 -0
  21. kafka/benchmarks/record_batch_compose.py +77 -0
  22. kafka/benchmarks/record_batch_read.py +82 -0
  23. kafka/benchmarks/varint_speed.py +426 -0
  24. kafka/cli/__init__.py +36 -0
  25. kafka/cli/admin/__init__.py +117 -0
  26. kafka/cli/admin/acls/__init__.py +9 -0
  27. kafka/cli/admin/acls/common.py +76 -0
  28. kafka/cli/admin/acls/create.py +19 -0
  29. kafka/cli/admin/acls/delete.py +23 -0
  30. kafka/cli/admin/acls/describe.py +16 -0
  31. kafka/cli/admin/cluster/__init__.py +14 -0
  32. kafka/cli/admin/cluster/describe.py +11 -0
  33. kafka/cli/admin/cluster/describe_quorum.py +11 -0
  34. kafka/cli/admin/cluster/features.py +52 -0
  35. kafka/cli/admin/cluster/log_dirs.py +43 -0
  36. kafka/cli/admin/cluster/versions.py +33 -0
  37. kafka/cli/admin/configs/__init__.py +10 -0
  38. kafka/cli/admin/configs/alter.py +43 -0
  39. kafka/cli/admin/configs/common.py +17 -0
  40. kafka/cli/admin/configs/describe.py +30 -0
  41. kafka/cli/admin/configs/list.py +16 -0
  42. kafka/cli/admin/configs/reset.py +20 -0
  43. kafka/cli/admin/groups/__init__.py +16 -0
  44. kafka/cli/admin/groups/alter_offsets.py +30 -0
  45. kafka/cli/admin/groups/delete.py +11 -0
  46. kafka/cli/admin/groups/delete_offsets.py +29 -0
  47. kafka/cli/admin/groups/describe.py +11 -0
  48. kafka/cli/admin/groups/list.py +28 -0
  49. kafka/cli/admin/groups/list_offsets.py +29 -0
  50. kafka/cli/admin/groups/remove_members.py +40 -0
  51. kafka/cli/admin/groups/reset_offsets.py +139 -0
  52. kafka/cli/admin/partitions/__init__.py +21 -0
  53. kafka/cli/admin/partitions/alter_reassignments.py +37 -0
  54. kafka/cli/admin/partitions/create.py +27 -0
  55. kafka/cli/admin/partitions/delete_records.py +31 -0
  56. kafka/cli/admin/partitions/describe.py +36 -0
  57. kafka/cli/admin/partitions/elect_leaders.py +53 -0
  58. kafka/cli/admin/partitions/list_offsets.py +88 -0
  59. kafka/cli/admin/partitions/list_reassignments.py +35 -0
  60. kafka/cli/admin/topics/__init__.py +10 -0
  61. kafka/cli/admin/topics/create.py +13 -0
  62. kafka/cli/admin/topics/delete.py +19 -0
  63. kafka/cli/admin/topics/describe.py +18 -0
  64. kafka/cli/admin/topics/list.py +11 -0
  65. kafka/cli/admin/transactions/__init__.py +17 -0
  66. kafka/cli/admin/transactions/abort.py +38 -0
  67. kafka/cli/admin/transactions/describe.py +24 -0
  68. kafka/cli/admin/transactions/describe_producers.py +29 -0
  69. kafka/cli/admin/transactions/find_hanging.py +26 -0
  70. kafka/cli/admin/transactions/list.py +37 -0
  71. kafka/cli/admin/users/__init__.py +8 -0
  72. kafka/cli/admin/users/alter_user_scram_credentials.py +34 -0
  73. kafka/cli/admin/users/describe_user_scram_credentials.py +15 -0
  74. kafka/cli/common.py +95 -0
  75. kafka/cli/consumer/__init__.py +63 -0
  76. kafka/cli/producer/__init__.py +57 -0
  77. kafka/cluster.py +824 -0
  78. kafka/codec.py +325 -0
  79. kafka/consumer/__init__.py +5 -0
  80. kafka/consumer/__main__.py +5 -0
  81. kafka/consumer/fetcher.py +2012 -0
  82. kafka/consumer/group.py +1347 -0
  83. kafka/consumer/subscription_state.py +897 -0
  84. kafka/coordinator/__init__.py +0 -0
  85. kafka/coordinator/assignors/__init__.py +0 -0
  86. kafka/coordinator/assignors/abstract.py +90 -0
  87. kafka/coordinator/assignors/cooperative_sticky.py +167 -0
  88. kafka/coordinator/assignors/range.py +81 -0
  89. kafka/coordinator/assignors/roundrobin.py +101 -0
  90. kafka/coordinator/assignors/sticky/StickyAssignorUserData.json +37 -0
  91. kafka/coordinator/assignors/sticky/__init__.py +0 -0
  92. kafka/coordinator/assignors/sticky/partition_movements.py +149 -0
  93. kafka/coordinator/assignors/sticky/sorted_set.py +63 -0
  94. kafka/coordinator/assignors/sticky/sticky_assignor.py +665 -0
  95. kafka/coordinator/assignors/sticky/user_data.py +8 -0
  96. kafka/coordinator/base.py +1215 -0
  97. kafka/coordinator/consumer.py +1224 -0
  98. kafka/coordinator/heartbeat.py +82 -0
  99. kafka/coordinator/subscription.py +34 -0
  100. kafka/errors.py +1004 -0
  101. kafka/future.py +166 -0
  102. kafka/metrics/__init__.py +13 -0
  103. kafka/metrics/compound_stat.py +33 -0
  104. kafka/metrics/dict_reporter.py +81 -0
  105. kafka/metrics/kafka_metric.py +36 -0
  106. kafka/metrics/measurable.py +27 -0
  107. kafka/metrics/measurable_stat.py +13 -0
  108. kafka/metrics/metric_config.py +33 -0
  109. kafka/metrics/metric_name.py +105 -0
  110. kafka/metrics/metrics.py +261 -0
  111. kafka/metrics/metrics_reporter.py +53 -0
  112. kafka/metrics/quota.py +41 -0
  113. kafka/metrics/stat.py +19 -0
  114. kafka/metrics/stats/__init__.py +15 -0
  115. kafka/metrics/stats/avg.py +24 -0
  116. kafka/metrics/stats/count.py +17 -0
  117. kafka/metrics/stats/histogram.py +99 -0
  118. kafka/metrics/stats/max_stat.py +17 -0
  119. kafka/metrics/stats/min_stat.py +19 -0
  120. kafka/metrics/stats/percentile.py +14 -0
  121. kafka/metrics/stats/percentiles.py +75 -0
  122. kafka/metrics/stats/rate.py +118 -0
  123. kafka/metrics/stats/sampled_stat.py +99 -0
  124. kafka/metrics/stats/sensor.py +136 -0
  125. kafka/metrics/stats/total.py +15 -0
  126. kafka/net/__init__.py +19 -0
  127. kafka/net/compat.py +165 -0
  128. kafka/net/connection.py +593 -0
  129. kafka/net/http_connect.py +144 -0
  130. kafka/net/inet.py +122 -0
  131. kafka/net/manager.py +451 -0
  132. kafka/net/metrics.py +149 -0
  133. kafka/net/sasl/__init__.py +32 -0
  134. kafka/net/sasl/abc.py +28 -0
  135. kafka/net/sasl/gssapi.py +95 -0
  136. kafka/net/sasl/msk.py +245 -0
  137. kafka/net/sasl/oauth.py +98 -0
  138. kafka/net/sasl/plain.py +42 -0
  139. kafka/net/sasl/scram.py +135 -0
  140. kafka/net/sasl/sspi.py +111 -0
  141. kafka/net/selector.py +644 -0
  142. kafka/net/socks5.py +262 -0
  143. kafka/net/transport.py +415 -0
  144. kafka/net/wakeup_notifier.py +72 -0
  145. kafka/partitioner/__init__.py +8 -0
  146. kafka/partitioner/abc.py +8 -0
  147. kafka/partitioner/default.py +89 -0
  148. kafka/partitioner/sticky.py +109 -0
  149. kafka/producer/__init__.py +5 -0
  150. kafka/producer/__main__.py +5 -0
  151. kafka/producer/future.py +101 -0
  152. kafka/producer/kafka.py +1123 -0
  153. kafka/producer/producer_batch.py +192 -0
  154. kafka/producer/record_accumulator.py +647 -0
  155. kafka/producer/sender.py +884 -0
  156. kafka/producer/transaction_manager.py +1326 -0
  157. kafka/protocol/__init__.py +0 -0
  158. kafka/protocol/admin/__init__.py +29 -0
  159. kafka/protocol/admin/acl.py +83 -0
  160. kafka/protocol/admin/acl.pyi +375 -0
  161. kafka/protocol/admin/client_quotas.py +14 -0
  162. kafka/protocol/admin/client_quotas.pyi +265 -0
  163. kafka/protocol/admin/cluster.py +31 -0
  164. kafka/protocol/admin/cluster.pyi +620 -0
  165. kafka/protocol/admin/configs.py +22 -0
  166. kafka/protocol/admin/configs.pyi +437 -0
  167. kafka/protocol/admin/groups.py +24 -0
  168. kafka/protocol/admin/groups.pyi +261 -0
  169. kafka/protocol/admin/topics.py +53 -0
  170. kafka/protocol/admin/topics.pyi +982 -0
  171. kafka/protocol/admin/transactions.py +18 -0
  172. kafka/protocol/admin/transactions.pyi +311 -0
  173. kafka/protocol/admin/users.py +14 -0
  174. kafka/protocol/admin/users.pyi +223 -0
  175. kafka/protocol/api_data.py +125 -0
  176. kafka/protocol/api_header.py +55 -0
  177. kafka/protocol/api_key.py +97 -0
  178. kafka/protocol/api_message.py +277 -0
  179. kafka/protocol/broker_version_data.py +246 -0
  180. kafka/protocol/consumer/__init__.py +13 -0
  181. kafka/protocol/consumer/fetch.py +16 -0
  182. kafka/protocol/consumer/fetch.pyi +298 -0
  183. kafka/protocol/consumer/group.py +38 -0
  184. kafka/protocol/consumer/group.pyi +824 -0
  185. kafka/protocol/consumer/metadata.py +30 -0
  186. kafka/protocol/consumer/metadata.pyi +89 -0
  187. kafka/protocol/consumer/offsets.py +75 -0
  188. kafka/protocol/consumer/offsets.pyi +288 -0
  189. kafka/protocol/data_container.py +166 -0
  190. kafka/protocol/frame.py +30 -0
  191. kafka/protocol/generate_stubs.py +468 -0
  192. kafka/protocol/metadata/__init__.py +10 -0
  193. kafka/protocol/metadata/api_versions.py +41 -0
  194. kafka/protocol/metadata/api_versions.pyi +128 -0
  195. kafka/protocol/metadata/find_coordinator.py +19 -0
  196. kafka/protocol/metadata/find_coordinator.pyi +105 -0
  197. kafka/protocol/metadata/metadata.py +34 -0
  198. kafka/protocol/metadata/metadata.pyi +160 -0
  199. kafka/protocol/old/__init__.py +0 -0
  200. kafka/protocol/old/abstract.py +17 -0
  201. kafka/protocol/old/add_offsets_to_txn.py +54 -0
  202. kafka/protocol/old/add_partitions_to_txn.py +71 -0
  203. kafka/protocol/old/admin.py +1086 -0
  204. kafka/protocol/old/api.py +205 -0
  205. kafka/protocol/old/api_versions.py +133 -0
  206. kafka/protocol/old/commit.py +355 -0
  207. kafka/protocol/old/consumer_protocol.py +36 -0
  208. kafka/protocol/old/end_txn.py +53 -0
  209. kafka/protocol/old/fetch.py +408 -0
  210. kafka/protocol/old/find_coordinator.py +72 -0
  211. kafka/protocol/old/group.py +451 -0
  212. kafka/protocol/old/init_producer_id.py +42 -0
  213. kafka/protocol/old/list_offsets.py +186 -0
  214. kafka/protocol/old/metadata.py +290 -0
  215. kafka/protocol/old/offset_for_leader_epoch.py +133 -0
  216. kafka/protocol/old/produce.py +247 -0
  217. kafka/protocol/old/sasl_authenticate.py +38 -0
  218. kafka/protocol/old/sasl_handshake.py +39 -0
  219. kafka/protocol/old/struct.py +87 -0
  220. kafka/protocol/old/txn_offset_commit.py +73 -0
  221. kafka/protocol/old/types.py +440 -0
  222. kafka/protocol/parser.py +191 -0
  223. kafka/protocol/producer/__init__.py +7 -0
  224. kafka/protocol/producer/produce.py +17 -0
  225. kafka/protocol/producer/produce.pyi +197 -0
  226. kafka/protocol/producer/transaction.py +30 -0
  227. kafka/protocol/producer/transaction.pyi +663 -0
  228. kafka/protocol/sasl.py +52 -0
  229. kafka/protocol/sasl.pyi +126 -0
  230. kafka/protocol/schemas/__init__.py +7 -0
  231. kafka/protocol/schemas/fields/__init__.py +7 -0
  232. kafka/protocol/schemas/fields/array.py +127 -0
  233. kafka/protocol/schemas/fields/base.py +156 -0
  234. kafka/protocol/schemas/fields/codecs/__init__.py +12 -0
  235. kafka/protocol/schemas/fields/codecs/encode_buffer.py +82 -0
  236. kafka/protocol/schemas/fields/codecs/tagged_fields.py +109 -0
  237. kafka/protocol/schemas/fields/codecs/types.py +505 -0
  238. kafka/protocol/schemas/fields/codegen.py +40 -0
  239. kafka/protocol/schemas/fields/simple.py +127 -0
  240. kafka/protocol/schemas/fields/struct.py +357 -0
  241. kafka/protocol/schemas/fields/struct_array.py +142 -0
  242. kafka/protocol/schemas/load_json.py +42 -0
  243. kafka/protocol/schemas/resources/AddOffsetsToTxnRequest.json +40 -0
  244. kafka/protocol/schemas/resources/AddOffsetsToTxnResponse.json +35 -0
  245. kafka/protocol/schemas/resources/AddPartitionsToTxnRequest.json +65 -0
  246. kafka/protocol/schemas/resources/AddPartitionsToTxnResponse.json +60 -0
  247. kafka/protocol/schemas/resources/AlterClientQuotasRequest.json +47 -0
  248. kafka/protocol/schemas/resources/AlterClientQuotasResponse.json +41 -0
  249. kafka/protocol/schemas/resources/AlterConfigsRequest.json +43 -0
  250. kafka/protocol/schemas/resources/AlterConfigsResponse.json +39 -0
  251. kafka/protocol/schemas/resources/AlterPartitionReassignmentsRequest.json +42 -0
  252. kafka/protocol/schemas/resources/AlterPartitionReassignmentsResponse.json +47 -0
  253. kafka/protocol/schemas/resources/AlterReplicaLogDirsRequest.json +41 -0
  254. kafka/protocol/schemas/resources/AlterReplicaLogDirsResponse.json +41 -0
  255. kafka/protocol/schemas/resources/AlterUserScramCredentialsRequest.json +45 -0
  256. kafka/protocol/schemas/resources/AlterUserScramCredentialsResponse.json +35 -0
  257. kafka/protocol/schemas/resources/ApiVersionsRequest.json +34 -0
  258. kafka/protocol/schemas/resources/ApiVersionsResponse.json +79 -0
  259. kafka/protocol/schemas/resources/ConsumerProtocolAssignment.json +42 -0
  260. kafka/protocol/schemas/resources/ConsumerProtocolSubscription.json +49 -0
  261. kafka/protocol/schemas/resources/CreateAclsRequest.json +46 -0
  262. kafka/protocol/schemas/resources/CreateAclsResponse.json +37 -0
  263. kafka/protocol/schemas/resources/CreatePartitionsRequest.json +47 -0
  264. kafka/protocol/schemas/resources/CreatePartitionsResponse.json +41 -0
  265. kafka/protocol/schemas/resources/CreateTopicsRequest.json +65 -0
  266. kafka/protocol/schemas/resources/CreateTopicsResponse.json +72 -0
  267. kafka/protocol/schemas/resources/DeleteAclsRequest.json +46 -0
  268. kafka/protocol/schemas/resources/DeleteAclsResponse.json +59 -0
  269. kafka/protocol/schemas/resources/DeleteGroupsRequest.json +30 -0
  270. kafka/protocol/schemas/resources/DeleteGroupsResponse.json +36 -0
  271. kafka/protocol/schemas/resources/DeleteRecordsRequest.json +42 -0
  272. kafka/protocol/schemas/resources/DeleteRecordsResponse.json +43 -0
  273. kafka/protocol/schemas/resources/DeleteTopicsRequest.json +43 -0
  274. kafka/protocol/schemas/resources/DeleteTopicsResponse.json +52 -0
  275. kafka/protocol/schemas/resources/DescribeAclsRequest.json +43 -0
  276. kafka/protocol/schemas/resources/DescribeAclsResponse.json +55 -0
  277. kafka/protocol/schemas/resources/DescribeClientQuotasRequest.json +37 -0
  278. kafka/protocol/schemas/resources/DescribeClientQuotasResponse.json +47 -0
  279. kafka/protocol/schemas/resources/DescribeClusterRequest.json +35 -0
  280. kafka/protocol/schemas/resources/DescribeClusterResponse.json +56 -0
  281. kafka/protocol/schemas/resources/DescribeConfigsRequest.json +42 -0
  282. kafka/protocol/schemas/resources/DescribeConfigsResponse.json +69 -0
  283. kafka/protocol/schemas/resources/DescribeGroupsRequest.json +38 -0
  284. kafka/protocol/schemas/resources/DescribeGroupsResponse.json +74 -0
  285. kafka/protocol/schemas/resources/DescribeLogDirsRequest.json +38 -0
  286. kafka/protocol/schemas/resources/DescribeLogDirsResponse.json +65 -0
  287. kafka/protocol/schemas/resources/DescribeProducersRequest.json +32 -0
  288. kafka/protocol/schemas/resources/DescribeProducersResponse.json +55 -0
  289. kafka/protocol/schemas/resources/DescribeQuorumRequest.json +39 -0
  290. kafka/protocol/schemas/resources/DescribeQuorumResponse.json +82 -0
  291. kafka/protocol/schemas/resources/DescribeTopicPartitionsRequest.json +40 -0
  292. kafka/protocol/schemas/resources/DescribeTopicPartitionsResponse.json +66 -0
  293. kafka/protocol/schemas/resources/DescribeTransactionsRequest.json +27 -0
  294. kafka/protocol/schemas/resources/DescribeTransactionsResponse.json +52 -0
  295. kafka/protocol/schemas/resources/DescribeUserScramCredentialsRequest.json +30 -0
  296. kafka/protocol/schemas/resources/DescribeUserScramCredentialsResponse.json +45 -0
  297. kafka/protocol/schemas/resources/ElectLeadersRequest.json +41 -0
  298. kafka/protocol/schemas/resources/ElectLeadersResponse.json +45 -0
  299. kafka/protocol/schemas/resources/EndTxnRequest.json +43 -0
  300. kafka/protocol/schemas/resources/EndTxnResponse.json +41 -0
  301. kafka/protocol/schemas/resources/FetchRequest.json +125 -0
  302. kafka/protocol/schemas/resources/FetchResponse.json +124 -0
  303. kafka/protocol/schemas/resources/FindCoordinatorRequest.json +43 -0
  304. kafka/protocol/schemas/resources/FindCoordinatorResponse.json +58 -0
  305. kafka/protocol/schemas/resources/HeartbeatRequest.json +39 -0
  306. kafka/protocol/schemas/resources/HeartbeatResponse.json +35 -0
  307. kafka/protocol/schemas/resources/IncrementalAlterConfigsRequest.json +44 -0
  308. kafka/protocol/schemas/resources/IncrementalAlterConfigsResponse.json +38 -0
  309. kafka/protocol/schemas/resources/InitProducerIdRequest.json +50 -0
  310. kafka/protocol/schemas/resources/InitProducerIdResponse.json +47 -0
  311. kafka/protocol/schemas/resources/JoinGroupRequest.json +63 -0
  312. kafka/protocol/schemas/resources/JoinGroupResponse.json +69 -0
  313. kafka/protocol/schemas/resources/LeaveGroupRequest.json +47 -0
  314. kafka/protocol/schemas/resources/LeaveGroupResponse.json +47 -0
  315. kafka/protocol/schemas/resources/ListConfigResourcesRequest.json +31 -0
  316. kafka/protocol/schemas/resources/ListConfigResourcesResponse.json +37 -0
  317. kafka/protocol/schemas/resources/ListGroupsRequest.json +36 -0
  318. kafka/protocol/schemas/resources/ListGroupsResponse.json +49 -0
  319. kafka/protocol/schemas/resources/ListOffsetsRequest.json +72 -0
  320. kafka/protocol/schemas/resources/ListOffsetsResponse.json +71 -0
  321. kafka/protocol/schemas/resources/ListPartitionReassignmentsRequest.json +34 -0
  322. kafka/protocol/schemas/resources/ListPartitionReassignmentsResponse.json +46 -0
  323. kafka/protocol/schemas/resources/ListTransactionsRequest.json +40 -0
  324. kafka/protocol/schemas/resources/ListTransactionsResponse.json +42 -0
  325. kafka/protocol/schemas/resources/MetadataRequest.json +56 -0
  326. kafka/protocol/schemas/resources/MetadataResponse.json +101 -0
  327. kafka/protocol/schemas/resources/OffsetCommitRequest.json +76 -0
  328. kafka/protocol/schemas/resources/OffsetCommitResponse.json +71 -0
  329. kafka/protocol/schemas/resources/OffsetDeleteRequest.json +39 -0
  330. kafka/protocol/schemas/resources/OffsetDeleteResponse.json +42 -0
  331. kafka/protocol/schemas/resources/OffsetFetchRequest.json +76 -0
  332. kafka/protocol/schemas/resources/OffsetFetchResponse.json +107 -0
  333. kafka/protocol/schemas/resources/OffsetForLeaderEpochRequest.json +52 -0
  334. kafka/protocol/schemas/resources/OffsetForLeaderEpochResponse.json +51 -0
  335. kafka/protocol/schemas/resources/ProduceRequest.json +73 -0
  336. kafka/protocol/schemas/resources/ProduceResponse.json +96 -0
  337. kafka/protocol/schemas/resources/RequestHeader.json +44 -0
  338. kafka/protocol/schemas/resources/ResponseHeader.json +26 -0
  339. kafka/protocol/schemas/resources/SaslAuthenticateRequest.json +29 -0
  340. kafka/protocol/schemas/resources/SaslAuthenticateResponse.json +34 -0
  341. kafka/protocol/schemas/resources/SaslHandshakeRequest.json +31 -0
  342. kafka/protocol/schemas/resources/SaslHandshakeResponse.json +32 -0
  343. kafka/protocol/schemas/resources/SyncGroupRequest.json +56 -0
  344. kafka/protocol/schemas/resources/SyncGroupResponse.json +46 -0
  345. kafka/protocol/schemas/resources/TxnOffsetCommitRequest.json +68 -0
  346. kafka/protocol/schemas/resources/TxnOffsetCommitResponse.json +47 -0
  347. kafka/protocol/schemas/resources/UpdateFeaturesRequest.json +43 -0
  348. kafka/protocol/schemas/resources/UpdateFeaturesResponse.json +39 -0
  349. kafka/protocol/schemas/resources/WriteTxnMarkersRequest.json +49 -0
  350. kafka/protocol/schemas/resources/WriteTxnMarkersResponse.json +45 -0
  351. kafka/protocol/schemas/resources/__init__.py +0 -0
  352. kafka/record/__init__.py +3 -0
  353. kafka/record/_crc32c.py +161 -0
  354. kafka/record/abc.py +144 -0
  355. kafka/record/default_records.py +782 -0
  356. kafka/record/legacy_records.py +587 -0
  357. kafka/record/memory_records.py +255 -0
  358. kafka/record/util.py +135 -0
  359. kafka/serializer/__init__.py +4 -0
  360. kafka/serializer/abstract.py +20 -0
  361. kafka/serializer/default.py +16 -0
  362. kafka/serializer/json.py +17 -0
  363. kafka/serializer/wrapper.py +21 -0
  364. kafka/structs.py +69 -0
  365. kafka/util.py +159 -0
  366. kafka/vendor/__init__.py +0 -0
  367. kafka/version.py +1 -0
  368. kafka_python-3.0.0.dist-info/METADATA +319 -0
  369. kafka_python-3.0.0.dist-info/RECORD +373 -0
  370. kafka_python-3.0.0.dist-info/WHEEL +5 -0
  371. kafka_python-3.0.0.dist-info/entry_points.txt +2 -0
  372. kafka_python-3.0.0.dist-info/licenses/LICENSE +202 -0
  373. kafka_python-3.0.0.dist-info/top_level.txt +1 -0
kafka/admin/_topics.py ADDED
@@ -0,0 +1,281 @@
1
+ """Topic management mixin for KafkaAdminClient.
2
+
3
+ Also defines NewTopic data class.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import logging
9
+ import time
10
+ from typing import TYPE_CHECKING
11
+ import uuid
12
+
13
+ import kafka.errors as Errors
14
+ from kafka.errors import IncompatibleBrokerVersion
15
+ from kafka.protocol.admin import CreateTopicsRequest, DeleteTopicsRequest, CreatePartitionsRequest
16
+ from ._configs import ConfigResourceType
17
+
18
+ if TYPE_CHECKING:
19
+ from kafka.net.manager import KafkaConnectionManager
20
+
21
+ log = logging.getLogger(__name__)
22
+
23
+
24
+ class TopicAdminMixin:
25
+ """Mixin providing topic management methods for KafkaAdminClient."""
26
+ _manager: KafkaConnectionManager
27
+ config: dict
28
+
29
+ def list_topics(self):
30
+ """Retrieve a list of all topic names in the cluster.
31
+
32
+ Returns:
33
+ A list of topic name strings.
34
+ """
35
+ metadata = self._manager.run(self._get_cluster_metadata, None)
36
+ return [t['name'] for t in metadata['topics']]
37
+
38
+ def describe_topics(self, topics=None):
39
+ """Fetch metadata for the specified topics or all topics if None.
40
+
41
+ Keyword Arguments:
42
+ topics (list, optional): A list of topic names or
43
+ :class:`uuid.UUID` topic ids (KIP-516). Strings and UUIDs may
44
+ be mixed. Describing by id requires broker >= 2.8
45
+ (MetadataRequest v12+); name-based describe works on any
46
+ broker. If None, metadata for all topics is retrieved.
47
+
48
+ Returns:
49
+ A list of dicts describing each topic (including partition info).
50
+ """
51
+ metadata = self._manager.run(self._get_cluster_metadata, topics)
52
+ return metadata['topics']
53
+
54
+ @staticmethod
55
+ def _process_create_topics_input(new_topics):
56
+ _Topic = CreateTopicsRequest.CreatableTopic
57
+ _Assignment = _Topic.CreatableReplicaAssignment
58
+ _Config = _Topic.CreatableTopicConfig
59
+ topics = []
60
+ if isinstance(new_topics, dict):
61
+ # {topic_name: {num_partitions:, replication_factor:, assignments: {partition: [broker_ids]}, configs: {key: value}}
62
+ for topic, data in new_topics.items():
63
+ configs = data.get('configs', {})
64
+ topics.append(_Topic(
65
+ name=topic,
66
+ num_partitions=data.get('num_partitions', -1),
67
+ replication_factor=data.get('replication_factor', -1),
68
+ assignments=[_Assignment(partition_index=partition_id, broker_ids=replicas)
69
+ for partition_id, replicas in data.get('assignments', {}).items()],
70
+ configs=[_Config(name=config_key, value=config_value)
71
+ for config_key, config_value in data.get('configs', {}).items()]
72
+ ))
73
+ elif all(isinstance(v, str) for v in new_topics):
74
+ for new_topic in new_topics:
75
+ topics.append(_Topic(name=new_topic, num_partitions=-1, replication_factor=-1))
76
+ else:
77
+ if all(isinstance(v, NewTopic) for v in new_topics):
78
+ for new_topic in new_topics:
79
+ topics.append(_Topic(
80
+ name=new_topic.name,
81
+ num_partitions=new_topic.num_partitions,
82
+ replication_factor=new_topic.replication_factor,
83
+ assignments=[_Assignment(partition_index=partition_id, broker_ids=replicas)
84
+ for partition_id, replicas in new_topic.replica_assignments.items()],
85
+ configs=[_Config(name=config_key, value=config_value)
86
+ for config_key, config_value in new_topic.topic_configs.items()]
87
+ ))
88
+ if not topics:
89
+ raise ValueError(f"No valid topics found in new_topics: {new_topics}")
90
+ return topics
91
+
92
+ def create_topics(self, new_topics, timeout_ms=None, validate_only=False, raise_errors=True,
93
+ wait_for_metadata=False):
94
+ """Create new topics in the cluster.
95
+
96
+ Arguments:
97
+ new_topics: A list of topic names, or a dict mapping each topic
98
+ name to a dict of options (all keys optional)::
99
+
100
+ {topic_name: {num_partitions: int (default -1),
101
+ replication_factor: int (default -1),
102
+ assignments: {partition_id: [broker_ids]},
103
+ configs: {key: value}}}
104
+
105
+ List of NewTopic objects is deprecated.
106
+ Note: for brokers < 2.4, num_partitions and replication_factor
107
+ are required and must be provided via dict or [NewTopic].
108
+
109
+ Keyword Arguments:
110
+ timeout_ms (numeric, optional): Milliseconds to wait for new topics to be created
111
+ before the broker returns.
112
+ validate_only (bool, optional): If True, don't actually create new topics.
113
+ Not supported by all versions. Default: False
114
+ raise_errors (bool, optional): Whether to raise errors as exceptions. Default True.
115
+ wait_for_metadata (bool, optional): If True, block until each new topic is visible
116
+ in broker metadata with a leader assigned for every partition. Default: False
117
+
118
+ Returns:
119
+ dict of CreateTopicsResponse key/vals.
120
+ """
121
+ if validate_only and wait_for_metadata:
122
+ raise ValueError('validate_only and wait_for_metadata are mutually exclusive')
123
+ timeout_ms = self._validate_timeout(timeout_ms)
124
+ if validate_only and self._manager.broker_version < (0, 10, 2):
125
+ raise IncompatibleBrokerVersion(
126
+ "validate_only requires CreateTopicsRequest >= v1, which is not supported by Kafka {}."
127
+ .format(self._manager.broker_version))
128
+
129
+ topics = self._process_create_topics_input(new_topics)
130
+ if self._manager.broker_version < (2, 4):
131
+ if any(topic.num_partitions == -1 or topic.replication_factor == -1 for topic in topics):
132
+ raise IncompatibleBrokerVersion(
133
+ "Broker version {} requires explicit num_partitions and replication_factor"
134
+ .format(self._manager.broker_version))
135
+
136
+ request = CreateTopicsRequest(
137
+ topics=topics,
138
+ timeout_ms=timeout_ms,
139
+ validate_only=validate_only,
140
+ )
141
+ def response_errors(r):
142
+ for topic in r.topics:
143
+ yield Errors.for_code(topic.error_code)
144
+ response = self._manager.run(self._send_request_to_controller, request, response_errors, raise_errors)
145
+ if wait_for_metadata:
146
+ self.wait_for_topics([new_topic.name for new_topic in request.topics])
147
+ result = response.to_dict()
148
+ result.pop('throttle_time_ms', None)
149
+ for topic in result['topics']:
150
+ configs = topic.pop('configs', None)
151
+ if configs:
152
+ processed_configs = {}
153
+ for config in configs:
154
+ name = self._process_config(config, ConfigResourceType.TOPIC)
155
+ processed_configs[name] = config
156
+ topic['configs'] = processed_configs
157
+ return result
158
+
159
+ def wait_for_topics(self, topic_names, timeout_ms=10000):
160
+ """Block until each of the given topics is ready to use.
161
+
162
+ CreateTopicsResponse only confirms that the broker accepted the create
163
+ request; propagating the new topics into the broker's metadata cache --
164
+ and electing a leader for every partition -- can lag behind, especially
165
+ on KRaft clusters. This method polls :meth:`describe_topics` at a fixed
166
+ interval until every requested topic both:
167
+
168
+ - is returned with ``error_code == 0``, and
169
+ - has ``error_code == 0`` and a leader assigned (``leader_id >= 0``)
170
+ for every partition.
171
+
172
+ Arguments:
173
+ topic_names ([str]): Topic names to wait for.
174
+
175
+ Keyword Arguments:
176
+ timeout_ms (numeric, optional): Maximum milliseconds to wait.
177
+ Default: 10000.
178
+
179
+ Raises:
180
+ KafkaTimeoutError: if any topic is still not ready when the
181
+ deadline expires.
182
+ """
183
+ if not topic_names:
184
+ return
185
+ topic_names = list(topic_names)
186
+ deadline = time.monotonic() + (timeout_ms / 1000.0)
187
+ pending = {name: 'not yet queried' for name in topic_names}
188
+ while True:
189
+ try:
190
+ topics = self.describe_topics(topics=topic_names)
191
+ except Exception as exc:
192
+ log.debug('describe_topics failed while waiting for topic visibility: %s', exc)
193
+ topics = []
194
+ by_name = {t.get('name'): t for t in topics}
195
+ pending = {}
196
+ for name in topic_names:
197
+ reason = self._topic_not_ready_reason(by_name.get(name))
198
+ if reason is not None:
199
+ pending[name] = reason
200
+ if not pending:
201
+ return
202
+ if time.monotonic() >= deadline:
203
+ raise Errors.KafkaTimeoutError(
204
+ 'Topics not ready after %sms: %s' % (timeout_ms, pending))
205
+ time.sleep(0.1)
206
+
207
+ @staticmethod
208
+ def _topic_not_ready_reason(topic_info):
209
+ """Return a string reason if ``topic_info`` isn't ready, else None."""
210
+ if topic_info is None:
211
+ return 'missing from metadata response'
212
+ error_code = topic_info.get('error_code', 0)
213
+ if error_code != 0:
214
+ return Errors.for_code(error_code).__name__
215
+ partitions = topic_info.get('partitions') or []
216
+ if not partitions:
217
+ return 'no partitions reported'
218
+ bad = []
219
+ for p in partitions:
220
+ p_err = p.get('error_code', 0)
221
+ idx = p.get('partition_index')
222
+ if p_err != 0:
223
+ bad.append('p%s=%s' % (idx, Errors.for_code(p_err).__name__))
224
+ continue
225
+ if p.get('leader_id', -1) < 0:
226
+ bad.append('p%s=no leader' % idx)
227
+ if bad:
228
+ return ','.join(bad)
229
+ return None
230
+
231
+ def delete_topics(self, topics, timeout_ms=None, raise_errors=True):
232
+ """Delete topics from the cluster.
233
+
234
+ Arguments:
235
+ topics ([str]): A list of topic name strings or uuid.UUID ids.
236
+
237
+ Keyword Arguments:
238
+ timeout_ms (numeric, optional): Milliseconds to wait for topics to be deleted
239
+ before the broker returns.
240
+ raise_errors (bool, optional): Whether to raise errors as exceptions. Default True.
241
+
242
+ Returns:
243
+ dict of DeleteTopicsResponse key/vals (version-dependent)
244
+ """
245
+ timeout_ms = self._validate_timeout(timeout_ms)
246
+ _Topic = DeleteTopicsRequest.DeleteTopicState
247
+ request = DeleteTopicsRequest(
248
+ topics=[_Topic(topic_id=topic) if isinstance(topic, uuid.UUID) else _Topic(name=topic)
249
+ for topic in topics],
250
+ timeout_ms=timeout_ms)
251
+ def response_errors(r):
252
+ for response in r.responses:
253
+ yield Errors.for_code(response.error_code)
254
+ response = self._manager.run(self._send_request_to_controller, request, response_errors, raise_errors)
255
+ result = response.to_dict()
256
+ result.pop('throttle_time_ms', None)
257
+ result['topics'] = result.pop('responses')
258
+ return result
259
+
260
+
261
+ class NewTopic:
262
+ """DEPRECATED: A class for new topic creation.
263
+
264
+ Arguments:
265
+ name (string): name of the topic
266
+ num_partitions (int): number of partitions, or -1 if
267
+ replica_assignment has been specified
268
+ replication_factor (int): replication factor, or -1 if
269
+ replica assignment is specified
270
+ replica_assignments (dict of int: [int]): A mapping containing
271
+ partition id and replicas to assign to it.
272
+ topic_configs (dict of str: str): A mapping of config key
273
+ and value for the topic.
274
+ """
275
+ def __init__(self, name, num_partitions=-1, replication_factor=-1,
276
+ replica_assignments=None, topic_configs=None):
277
+ self.name = name
278
+ self.num_partitions = num_partitions
279
+ self.replication_factor = replication_factor
280
+ self.replica_assignments = replica_assignments or {}
281
+ self.topic_configs = topic_configs or {}