kafka-python 3.0.7__py3-none-any.whl → 3.0.9__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.
@@ -290,6 +290,9 @@ class SubscriptionState:
290
290
  for tp in list(self.assignment.keys()):
291
291
  if tp not in new_set:
292
292
  del self.assignment[tp]
293
+ else:
294
+ # Retained partitions are no longer pending_revocation
295
+ self.assignment[tp].mark_pending_revocation(False)
293
296
  # Add new partitions; kept partitions retain their existing
294
297
  # TopicPartitionState (positions, paused flag, KIP-392 cache,
295
298
  # etc.).
@@ -651,12 +654,12 @@ class TopicPartitionState:
651
654
  def resume(self):
652
655
  self.paused = False
653
656
 
654
- def mark_pending_revocation(self):
657
+ def mark_pending_revocation(self, val=True):
655
658
  """KIP-429: gate fetches while an on_partitions_revoked /
656
659
  on_partitions_lost listener is in progress for this partition.
657
660
  Single-shot: the surrounding ``assign_from_subscribed`` drops
658
661
  the state object once the listener returns."""
659
- self._pending_revocation = True
662
+ self._pending_revocation = val
660
663
 
661
664
  def is_fetchable(self):
662
665
  return (not self.paused
kafka/net/manager.py CHANGED
@@ -3,7 +3,6 @@ import logging
3
3
  import inspect
4
4
  import random
5
5
  import socket
6
- import ssl
7
6
  import time
8
7
 
9
8
  from .inet import create_connection
@@ -205,35 +204,16 @@ class KafkaConnectionManager:
205
204
  def ssl_enabled(self):
206
205
  return self.config['security_protocol'] in ('SSL', 'SASL_SSL')
207
206
 
208
- def _build_ssl_context(self):
209
- if self.config['ssl_context'] is not None:
210
- return self.config['ssl_context']
211
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
212
- ctx.minimum_version = ssl.TLSVersion.TLSv1_2
213
- ctx.check_hostname = self.config['ssl_check_hostname']
214
- if self.config['ssl_cafile']:
215
- ctx.load_verify_locations(self.config['ssl_cafile'])
216
- else:
217
- ctx.load_default_certs()
218
- if self.config['ssl_certfile']:
219
- ctx.load_cert_chain(
220
- certfile=self.config['ssl_certfile'],
221
- keyfile=self.config['ssl_keyfile'],
222
- password=self.config['ssl_password'],
223
- )
224
- if self.config['ssl_crlfile']:
225
- ctx.load_verify_locations(crl=self.config['ssl_crlfile'])
226
- ctx.verify_flags |= ssl.VERIFY_CRL_CHECK_LEAF
227
- return ctx
228
-
229
207
  async def _build_transport(self, node, timeout_at=None):
230
208
  sock = await create_connection(self._net, node.host, node.port,
231
209
  self.config['socket_options'],
232
210
  proxy_url=self.config['proxy_url'],
233
211
  timeout_at=timeout_at)
234
212
  if self.ssl_enabled:
235
- transport = KafkaSSLTransport(self._net, sock, self._build_ssl_context(),
236
- host=node.host, ssl_check_hostname=self.config['ssl_check_hostname'])
213
+ ssl_configs = {key: value
214
+ for key, value in self.config.items()
215
+ if key.startswith('ssl_')}
216
+ transport = KafkaSSLTransport(self._net, sock, host=node.host, **ssl_configs)
237
217
  else:
238
218
  transport = KafkaTCPTransport(self._net, sock, host=node.host)
239
219
 
kafka/net/transport.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from collections import deque
2
+ import copy
2
3
  import logging
3
4
  import selectors
4
5
  import socket
@@ -371,13 +372,49 @@ class KafkaTCPTransport:
371
372
 
372
373
 
373
374
  class KafkaSSLTransport(KafkaTCPTransport):
374
- def __init__(self, net, sock, ssl_context, host=None, ssl_check_hostname=False):
375
- self._ssl_context = ssl_context
376
- server_hostname = host if ssl_check_hostname else None
377
- sock = ssl_context.wrap_socket(
378
- sock, server_hostname=server_hostname, do_handshake_on_connect=False)
375
+ DEFAULT_CONFIG = {
376
+ 'ssl_context': None,
377
+ 'ssl_check_hostname': True,
378
+ 'ssl_cafile': None,
379
+ 'ssl_certfile': None,
380
+ 'ssl_keyfile': None,
381
+ 'ssl_password': None,
382
+ 'ssl_crlfile': None,
383
+ }
384
+ def __init__(self, net, sock, host=None, **configs):
385
+ self.ssl_config = copy.copy(self.DEFAULT_CONFIG)
386
+ for key in self.ssl_config:
387
+ if key in configs:
388
+ self.ssl_config[key] = configs[key]
389
+ self._ssl_context = self._build_ssl_context(self.ssl_config)
390
+ server_hostname = host.rstrip('.') if host is not None else None
391
+ sock = self._ssl_context.wrap_socket(
392
+ sock, server_hostname=server_hostname,
393
+ do_handshake_on_connect=False)
379
394
  super().__init__(net, sock, host=host)
380
395
 
396
+ @staticmethod
397
+ def _build_ssl_context(config):
398
+ if config['ssl_context'] is not None:
399
+ return config['ssl_context']
400
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
401
+ ctx.minimum_version = ssl.TLSVersion.TLSv1_2
402
+ ctx.check_hostname = config['ssl_check_hostname']
403
+ if config['ssl_cafile']:
404
+ ctx.load_verify_locations(config['ssl_cafile'])
405
+ else:
406
+ ctx.load_default_certs()
407
+ if config['ssl_certfile']:
408
+ ctx.load_cert_chain(
409
+ certfile=config['ssl_certfile'],
410
+ keyfile=config['ssl_keyfile'],
411
+ password=config['ssl_password'],
412
+ )
413
+ if config['ssl_crlfile']:
414
+ ctx.load_verify_locations(crl=config['ssl_crlfile'])
415
+ ctx.verify_flags |= ssl.VERIFY_CRL_CHECK_LEAF
416
+ return ctx
417
+
381
418
  async def handshake(self):
382
419
  while True:
383
420
  try:
kafka/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '3.0.7'
1
+ __version__ = '3.0.9'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kafka-python
3
- Version: 3.0.7
3
+ Version: 3.0.9
4
4
  Summary: Pure Python client for Apache Kafka
5
5
  Author-email: Dana Powers <dana.powers@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -6,7 +6,7 @@ kafka/errors.py,sha256=9owgtTIcttdTCD1vAF9wz5jL9G72ljpR7M-vjLKEGvY,33206
6
6
  kafka/future.py,sha256=INmMIy2-BPxJ4zlw-V_i8Tj_OG9DMbyYyUEjOQ5pn_o,5440
7
7
  kafka/structs.py,sha256=ZOFmVJRbhSXykkw9cnuv-DGYE7g2KjaUGsytSOv4xVw,3146
8
8
  kafka/util.py,sha256=hvSdRbh5-IsUbpD_BqjabjEldtNmXufZH68b_xCkNjE,5194
9
- kafka/version.py,sha256=nrBN-YleEph5Asdo18FBZNm74FlORYq6jGrwHBllWIU,22
9
+ kafka/version.py,sha256=GgzlXELdHTkTAUXqLnCAGFr2E0nwjjBPe-3RxfSkl6c,22
10
10
  kafka/admin/__init__.py,sha256=nTXg2CQo8Bydxsj80pVBzF2-jq4IhK7_gLnboeNWG60,1575
11
11
  kafka/admin/__main__.py,sha256=l5ujkHa3lBFEbKPCl7U0_pi6IIgj1IJfmB219vtcj50,69
12
12
  kafka/admin/_acls.py,sha256=QJlHguEM9t46qlABoQqTEDFQErDgG2RKwfV1NOKeKmU,13983
@@ -85,7 +85,7 @@ kafka/consumer/__init__.py,sha256=I7nuPUb103S1CvCqcudbIRG_isJbRgTXkK1mpHIhoVs,82
85
85
  kafka/consumer/__main__.py,sha256=bnxM30LbGVvLb0ZBcgJEt_8bZHADJpboHZCxzd8QEhA,72
86
86
  kafka/consumer/fetcher.py,sha256=Xr-JNlyNZgVNanh6AlYn1ImsyuBbpMqjPGwMZL50Hmc,106075
87
87
  kafka/consumer/group.py,sha256=lJo2U_wHSk_j-qwfa2GeU_gOZq5kWbxh2qAkjyMer6Q,68423
88
- kafka/consumer/subscription_state.py,sha256=0ixLOlO9KIxzFD0eMkLqrUjSJ44CMkkcvCQGWxt7nJg,40883
88
+ kafka/consumer/subscription_state.py,sha256=tvuOTukWJz75Dy9uU0uhNqM5Gh3I4t04rPGsrmoXXpQ,41048
89
89
  kafka/coordinator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
90
  kafka/coordinator/base.py,sha256=UgMXWES0VVgDsvLEEZB8tAvchGFRzJFO6N9bL06vGm4,57794
91
91
  kafka/coordinator/consumer.py,sha256=cQ-zo0p_lL5H3j8DT4Q6ZrBBxCWWh4p1ub1X2IHlx5w,60186
@@ -131,11 +131,11 @@ kafka/net/compat.py,sha256=xBwWj5WgcfFbiPWy-46VCa25jDC9x5DOTl_ds_VXdyg,6415
131
131
  kafka/net/connection.py,sha256=gxUHGAESQneccx0JXY0apoxcsyL-XtMmryCJV4r_DOQ,26349
132
132
  kafka/net/http_connect.py,sha256=j8R1yLNwhTF-nQVMEgRF88mOF5-v1Sdj7uwkBvvg5PU,5133
133
133
  kafka/net/inet.py,sha256=zMo0NTCS7EY81uoNPri5ZHKcCnRVUIcCJiW6BeZWnCs,4730
134
- kafka/net/manager.py,sha256=bsgpwH_9nCC0hXvNrPfclF4rsvcqbzWOplSN_ATn9rY,21134
134
+ kafka/net/manager.py,sha256=lpvu9ZmLh07ze0QlfVriLQ---3DNotW1VmdJw-FiG58,20283
135
135
  kafka/net/metrics.py,sha256=-cdWXQtonCO7-LpovLoEcWM-_3R9sAtyQxWf_QHOAWE,7299
136
136
  kafka/net/selector.py,sha256=kKKhVA6UdyiTNAnRDlRJNA3rC-C0anUcpYHnQy_yRZQ,29333
137
137
  kafka/net/socks5.py,sha256=euTwJl2avRmCJhVKyGmhZWInqgY6MNHPA1Tz2f2J1Z0,10361
138
- kafka/net/transport.py,sha256=Loa43s09X-VVrNiHggdfzNIDrok4dHlR8LptY3b0yAw,15974
138
+ kafka/net/transport.py,sha256=W6ne_UGPldoYMJ-7KOxksAfswSyLRbjqeSMctr5WGhE,17285
139
139
  kafka/net/wakeup_notifier.py,sha256=gLnfg-HEjVS5J9p-7kZfZpIeLT0AjvK5MOc6EMj3R88,2783
140
140
  kafka/net/sasl/__init__.py,sha256=vKE2jkS_BZ2OEVANlXZhW2xIVvH5C1o2kCxugw2PfYY,1006
141
141
  kafka/net/sasl/abc.py,sha256=H3tHUPevoaQdS395_ID88Wxhwvc8XjOTcAP8dKXxO9I,547
@@ -365,9 +365,9 @@ kafka/serializer/default.py,sha256=ZKzTWlG9N4vS3QXovFLygNVrnjAcMZKS0RE4OvQ6DL4,4
365
365
  kafka/serializer/json.py,sha256=lErgU66KZGf33hofwlObYIaxLDk9gcolhy_rlcOuf8Y,469
366
366
  kafka/serializer/wrapper.py,sha256=RGXFj-PXQyL3rdMXI9ACaohRa6Kg5SHOZTRruU9jluM,485
367
367
  kafka/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
368
- kafka_python-3.0.7.dist-info/licenses/LICENSE,sha256=vxnoJsqm6bKl3ZWdI1Q7Ikw_k9cOvO3vcvZNsY_1fP8,11374
369
- kafka_python-3.0.7.dist-info/METADATA,sha256=qIDuv8vtC5xCXcx0W6Lor0EXAGSUmJIeRqKClE175qw,11590
370
- kafka_python-3.0.7.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
371
- kafka_python-3.0.7.dist-info/entry_points.txt,sha256=LQvqZj3uM785ainO5HrXmukbjSrK-oPqrESqpvoR-As,51
372
- kafka_python-3.0.7.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
373
- kafka_python-3.0.7.dist-info/RECORD,,
368
+ kafka_python-3.0.9.dist-info/licenses/LICENSE,sha256=vxnoJsqm6bKl3ZWdI1Q7Ikw_k9cOvO3vcvZNsY_1fP8,11374
369
+ kafka_python-3.0.9.dist-info/METADATA,sha256=U5mlZjtU_Jvj2x6XgUZoC04O17_xE_7s9CMVnEDNzG0,11590
370
+ kafka_python-3.0.9.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
371
+ kafka_python-3.0.9.dist-info/entry_points.txt,sha256=LQvqZj3uM785ainO5HrXmukbjSrK-oPqrESqpvoR-As,51
372
+ kafka_python-3.0.9.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
373
+ kafka_python-3.0.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (82.0.1)
2
+ Generator: setuptools (83.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5