locust 2.46.8.dev24__tar.gz → 2.46.8.dev32__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.46.8.dev24 → locust-2.46.8.dev32}/PKG-INFO +1 -1
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/_version.py +2 -2
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/argument_parser.py +3 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/fasthttp.py +2 -1
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/dispatch.py +3 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/html.py +3 -1
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/main.py +8 -2
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/web.py +8 -1
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/.gitignore +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/LICENSE +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/README.md +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/hatch_build.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/__init__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/__main__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/clients.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/__init__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/dns.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/milvus.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/mongodb.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/mqtt.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/oai.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/postgres.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/qdrant.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/socketio.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/debug.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/env.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/event.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/exception.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/input_events.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/log.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/opentelemetry.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/py.typed +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/__init__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/protocol.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/runners.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/shape.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/stats.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/__init__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/inspectuser.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/markov_taskset.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/sequential_taskset.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/task.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/users.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/wait_time.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/__init__.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/cache.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/date.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/deprecation.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/directory.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/exception_handler.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/load_locustfile.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/rounding.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/timespan.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/url.py +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/auth.html +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/index.html +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/report.html +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/pyproject.toml +0 -0
- {locust-2.46.8.dev24 → locust-2.46.8.dev32}/pytest_locust/plugin.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.46.8.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 46, 8, '
|
|
21
|
+
__version__ = version = '2.46.8.dev32'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 46, 8, 'dev32')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -9,6 +9,7 @@ import ast
|
|
|
9
9
|
import atexit
|
|
10
10
|
import difflib
|
|
11
11
|
import json
|
|
12
|
+
import math
|
|
12
13
|
import os
|
|
13
14
|
import platform
|
|
14
15
|
import socket
|
|
@@ -431,6 +432,8 @@ def positive_integer(string) -> int:
|
|
|
431
432
|
def gt_zero(t):
|
|
432
433
|
def checker(value):
|
|
433
434
|
v = t(value)
|
|
435
|
+
if not math.isfinite(v):
|
|
436
|
+
raise argparse.ArgumentTypeError("must be a finite number")
|
|
434
437
|
if v <= 0:
|
|
435
438
|
raise argparse.ArgumentTypeError("must be > 0")
|
|
436
439
|
return v
|
|
@@ -78,6 +78,7 @@ FAILURE_EXCEPTIONS = (
|
|
|
78
78
|
SSLError,
|
|
79
79
|
Timeout,
|
|
80
80
|
HTTPConnectionClosed,
|
|
81
|
+
HTTPParseError,
|
|
81
82
|
zlib.error,
|
|
82
83
|
)
|
|
83
84
|
|
|
@@ -294,7 +295,7 @@ class FastHttpSession:
|
|
|
294
295
|
else:
|
|
295
296
|
try:
|
|
296
297
|
request_meta["response_length"] = len(response.content) if response.content else 0
|
|
297
|
-
except
|
|
298
|
+
except FAILURE_EXCEPTIONS as e:
|
|
298
299
|
request_meta["response_time"] = (time.perf_counter() - start_perf_counter) * 1000
|
|
299
300
|
request_meta["exception"] = e # type: ignore
|
|
300
301
|
if catch_response:
|
|
@@ -198,6 +198,9 @@ class UsersDispatcher(Iterator):
|
|
|
198
198
|
if spawn_rate <= 0:
|
|
199
199
|
raise ValueError(f"spawn_rate must be > 0, got {spawn_rate}")
|
|
200
200
|
|
|
201
|
+
if not math.isfinite(spawn_rate):
|
|
202
|
+
raise ValueError(f"spawn_rate must be a finite number, got {spawn_rate}")
|
|
203
|
+
|
|
201
204
|
if user_classes is not None and self._user_classes != sorted(user_classes, key=attrgetter("__name__")):
|
|
202
205
|
self._user_classes = sorted(user_classes, key=attrgetter("__name__"))
|
|
203
206
|
self._user_generator = self._user_gen()
|
|
@@ -21,7 +21,9 @@ def process_html_filename(options) -> None:
|
|
|
21
21
|
}
|
|
22
22
|
for option_term, option_value in option_mapping.items():
|
|
23
23
|
if option_value is not None:
|
|
24
|
-
|
|
24
|
+
# -r is a float option, so a fractional spawn rate must survive the substitution.
|
|
25
|
+
replacement = str(int(option_value)) if float(option_value).is_integer() else str(option_value)
|
|
26
|
+
options.html_file = options.html_file.replace(option_term, replacement)
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
def render_template_from(file, build_path=DEFAULT_BUILD_PATH, **kwargs):
|
|
@@ -109,8 +109,14 @@ def merge_locustfiles_content(
|
|
|
109
109
|
for _shape_class in shape_classes:
|
|
110
110
|
shape_class_name = type(_shape_class).__name__
|
|
111
111
|
if shape_class_name in available_shape_classes.keys():
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
previous_path = inspect.getfile(type(available_shape_classes[shape_class_name]))
|
|
113
|
+
new_path = inspect.getfile(type(_shape_class))
|
|
114
|
+
if previous_path == new_path:
|
|
115
|
+
# The same shape class was defined in two locustfiles but one probably imported the other, so we just ignore it
|
|
116
|
+
continue
|
|
117
|
+
else:
|
|
118
|
+
sys.stderr.write(f"Duplicate shape classes: {shape_class_name}\n")
|
|
119
|
+
sys.exit(1)
|
|
114
120
|
|
|
115
121
|
available_shape_classes[shape_class_name] = _shape_class
|
|
116
122
|
|
|
@@ -4,6 +4,7 @@ import csv
|
|
|
4
4
|
import itertools
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
|
+
import math
|
|
7
8
|
import mimetypes
|
|
8
9
|
import os.path
|
|
9
10
|
from functools import wraps
|
|
@@ -340,7 +341,13 @@ class WebUI:
|
|
|
340
341
|
self._cancel_run_time_timer()
|
|
341
342
|
|
|
342
343
|
if environment.runner is not None:
|
|
343
|
-
if
|
|
344
|
+
if (
|
|
345
|
+
user_count is None
|
|
346
|
+
or user_count < 0
|
|
347
|
+
or spawn_rate is None
|
|
348
|
+
or spawn_rate <= 0
|
|
349
|
+
or not math.isfinite(spawn_rate)
|
|
350
|
+
):
|
|
344
351
|
err_msg = "Missing or invalid user_count or spawn_rate from /swarm request"
|
|
345
352
|
logger.error(err_msg)
|
|
346
353
|
return jsonify({"success": False, "message": err_msg, "host": environment.host})
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|