locust 2.31.9.dev36__tar.gz → 2.32.0__tar.gz

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 (53) hide show
  1. {locust-2.31.9.dev36 → locust-2.32.0}/PKG-INFO +4 -2
  2. {locust-2.31.9.dev36 → locust-2.32.0}/locust/_version.py +2 -2
  3. {locust-2.31.9.dev36 → locust-2.32.0}/locust/main.py +3 -0
  4. {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/zmqrpc.py +16 -5
  5. {locust-2.31.9.dev36 → locust-2.32.0}/poetry.lock +307 -284
  6. {locust-2.31.9.dev36 → locust-2.32.0}/pyproject.toml +6 -2
  7. {locust-2.31.9.dev36 → locust-2.32.0}/LICENSE +0 -0
  8. {locust-2.31.9.dev36 → locust-2.32.0}/README.md +0 -0
  9. {locust-2.31.9.dev36 → locust-2.32.0}/locust/__init__.py +0 -0
  10. {locust-2.31.9.dev36 → locust-2.32.0}/locust/__main__.py +0 -0
  11. {locust-2.31.9.dev36 → locust-2.32.0}/locust/argument_parser.py +0 -0
  12. {locust-2.31.9.dev36 → locust-2.32.0}/locust/clients.py +0 -0
  13. {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/__init__.py +0 -0
  14. {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/fasthttp.py +0 -0
  15. {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/mongodb.py +0 -0
  16. {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/postgres.py +0 -0
  17. {locust-2.31.9.dev36 → locust-2.32.0}/locust/debug.py +0 -0
  18. {locust-2.31.9.dev36 → locust-2.32.0}/locust/dispatch.py +0 -0
  19. {locust-2.31.9.dev36 → locust-2.32.0}/locust/env.py +0 -0
  20. {locust-2.31.9.dev36 → locust-2.32.0}/locust/event.py +0 -0
  21. {locust-2.31.9.dev36 → locust-2.32.0}/locust/exception.py +0 -0
  22. {locust-2.31.9.dev36 → locust-2.32.0}/locust/html.py +0 -0
  23. {locust-2.31.9.dev36 → locust-2.32.0}/locust/input_events.py +0 -0
  24. {locust-2.31.9.dev36 → locust-2.32.0}/locust/log.py +0 -0
  25. {locust-2.31.9.dev36 → locust-2.32.0}/locust/py.typed +0 -0
  26. {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/__init__.py +0 -0
  27. {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/protocol.py +0 -0
  28. {locust-2.31.9.dev36 → locust-2.32.0}/locust/runners.py +0 -0
  29. {locust-2.31.9.dev36 → locust-2.32.0}/locust/shape.py +0 -0
  30. {locust-2.31.9.dev36 → locust-2.32.0}/locust/stats.py +0 -0
  31. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/__init__.py +0 -0
  32. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/inspectuser.py +0 -0
  33. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/sequential_taskset.py +0 -0
  34. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/task.py +0 -0
  35. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/users.py +0 -0
  36. {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/wait_time.py +0 -0
  37. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/__init__.py +0 -0
  38. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/cache.py +0 -0
  39. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/date.py +0 -0
  40. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/deprecation.py +0 -0
  41. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/directory.py +0 -0
  42. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/exception_handler.py +0 -0
  43. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/load_locustfile.py +0 -0
  44. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/rounding.py +0 -0
  45. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/timespan.py +0 -0
  46. {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/url.py +0 -0
  47. {locust-2.31.9.dev36 → locust-2.32.0}/locust/web.py +0 -0
  48. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/favicon-dark.png +0 -0
  49. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/favicon-light.png +0 -0
  50. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/index-C35vpr6y.js +0 -0
  51. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/auth.html +0 -0
  52. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/index.html +0 -0
  53. {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/report.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.31.9.dev36
3
+ Version: 2.32.0
4
4
  Summary: Developer-friendly load testing framework
5
5
  Home-page: https://locust.io/
6
6
  License: MIT
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.9
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
21
22
  Classifier: Topic :: Software Development :: Testing
22
23
  Classifier: Topic :: Software Development :: Testing :: Traffic Generation
23
24
  Classifier: Topic :: System :: Distributed Computing
@@ -26,7 +27,8 @@ Requires-Dist: Flask-Cors (>=3.0.10)
26
27
  Requires-Dist: Flask-Login (>=0.6.3)
27
28
  Requires-Dist: Werkzeug (>=2.0.0)
28
29
  Requires-Dist: flask (>=2.0.0)
29
- Requires-Dist: gevent (>=22.10.2)
30
+ Requires-Dist: gevent (>=22.10.2) ; python_full_version <= "3.12.0"
31
+ Requires-Dist: gevent (>=24.10.1) ; python_full_version > "3.13.0"
30
32
  Requires-Dist: geventhttpclient (>=2.3.1)
31
33
  Requires-Dist: msgpack (>=1.0.0)
32
34
  Requires-Dist: psutil (>=5.9.1)
@@ -14,7 +14,7 @@ __version_tuple__: VERSION_TUPLE
14
14
  version_tuple: VERSION_TUPLE
15
15
 
16
16
 
17
- __version__ = "2.31.9.dev36"
17
+ __version__ = "2.32.0"
18
18
  version = __version__
19
- __version_tuple__ = (2, 31, 9, "dev36")
19
+ __version_tuple__ = (2, 32, 0)
20
20
  version_tuple = __version_tuple__
@@ -309,6 +309,9 @@ def main():
309
309
 
310
310
  greenlet_exception_handler = greenlet_exception_logger(logger)
311
311
 
312
+ if sys.version_info < (3, 10):
313
+ logger.warning("Python 3.9 support is deprecated and will be removed soon")
314
+
312
315
  if options.stop_timeout:
313
316
  try:
314
317
  options.stop_timeout = parse_timespan(options.stop_timeout)
@@ -1,22 +1,24 @@
1
1
  from locust.exception import RPCError, RPCReceiveError, RPCSendError
2
2
  from locust.util.exception_handler import retry
3
3
 
4
+ import socket as csocket
5
+ from socket import gaierror, has_dualstack_ipv6
6
+
4
7
  import msgpack.exceptions as msgerr
5
8
  import zmq.error as zmqerr
6
9
  import zmq.green as zmq
7
- from urllib3.util.connection import HAS_IPV6
8
10
 
9
11
  from .protocol import Message
10
12
 
11
13
 
12
14
  class BaseSocket:
13
- def __init__(self, sock_type):
15
+ def __init__(self, sock_type, ipv4_only):
14
16
  context = zmq.Context()
15
17
  self.socket = context.socket(sock_type)
16
18
 
17
19
  self.socket.setsockopt(zmq.TCP_KEEPALIVE, 1)
18
20
  self.socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE, 30)
19
- if HAS_IPV6:
21
+ if has_dualstack_ipv6() and not ipv4_only:
20
22
  self.socket.setsockopt(zmq.IPV6, 1)
21
23
 
22
24
  @retry()
@@ -60,10 +62,19 @@ class BaseSocket:
60
62
  def close(self, linger=None):
61
63
  self.socket.close(linger=linger)
62
64
 
65
+ def ipv4_only(self, host, port) -> bool:
66
+ try:
67
+ if str(csocket.getaddrinfo(host, port, proto=csocket.IPPROTO_TCP)).find("Family.AF_INET6") == -1:
68
+ return True
69
+ except gaierror as e:
70
+ print(f"Error resolving address: {e}")
71
+ return False
72
+ return False
73
+
63
74
 
64
75
  class Server(BaseSocket):
65
76
  def __init__(self, host, port):
66
- BaseSocket.__init__(self, zmq.ROUTER)
77
+ BaseSocket.__init__(self, zmq.ROUTER, self.ipv4_only(host, port))
67
78
  if port == 0:
68
79
  self.port = self.socket.bind_to_random_port(f"tcp://{host}")
69
80
  else:
@@ -76,6 +87,6 @@ class Server(BaseSocket):
76
87
 
77
88
  class Client(BaseSocket):
78
89
  def __init__(self, host, port, identity):
79
- BaseSocket.__init__(self, zmq.DEALER)
90
+ BaseSocket.__init__(self, zmq.DEALER, self.ipv4_only(host, port))
80
91
  self.socket.setsockopt(zmq.IDENTITY, identity.encode())
81
92
  self.socket.connect("tcp://%s:%i" % (host, port))