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.
- {locust-2.31.9.dev36 → locust-2.32.0}/PKG-INFO +4 -2
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/_version.py +2 -2
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/main.py +3 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/zmqrpc.py +16 -5
- {locust-2.31.9.dev36 → locust-2.32.0}/poetry.lock +307 -284
- {locust-2.31.9.dev36 → locust-2.32.0}/pyproject.toml +6 -2
- {locust-2.31.9.dev36 → locust-2.32.0}/LICENSE +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/README.md +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/__init__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/__main__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/argument_parser.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/clients.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/__init__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/fasthttp.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/mongodb.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/contrib/postgres.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/debug.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/dispatch.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/env.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/event.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/exception.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/html.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/input_events.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/log.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/py.typed +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/__init__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/rpc/protocol.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/runners.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/shape.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/stats.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/__init__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/inspectuser.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/sequential_taskset.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/task.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/users.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/user/wait_time.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/__init__.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/cache.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/date.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/deprecation.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/directory.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/exception_handler.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/load_locustfile.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/rounding.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/timespan.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/util/url.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/web.py +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/assets/index-C35vpr6y.js +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/auth.html +0 -0
- {locust-2.31.9.dev36 → locust-2.32.0}/locust/webui/dist/index.html +0 -0
- {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.
|
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.
|
17
|
+
__version__ = "2.32.0"
|
18
18
|
version = __version__
|
19
|
-
__version_tuple__ = (2,
|
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
|
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))
|