locust 2.46.5.dev2__tar.gz → 2.46.5.dev5__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.5.dev2 → locust-2.46.5.dev5}/PKG-INFO +1 -1
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/_version.py +2 -2
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/debug.py +2 -2
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/date.py +2 -2
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/web.py +14 -3
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/pyproject.toml +3 -2
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/.gitignore +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/LICENSE +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/README.md +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/hatch_build.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/__init__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/__main__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/argument_parser.py +1 -1
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/clients.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/__init__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/dns.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/fasthttp.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/milvus.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/mongodb.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/mqtt.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/oai.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/postgres.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/qdrant.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/socketio.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/dispatch.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/env.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/event.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/exception.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/html.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/input_events.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/log.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/main.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/opentelemetry.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/py.typed +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/__init__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/protocol.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/runners.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/shape.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/stats.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/__init__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/inspectuser.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/markov_taskset.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/sequential_taskset.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/task.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/users.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/wait_time.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/__init__.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/cache.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/deprecation.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/directory.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/exception_handler.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/load_locustfile.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/rounding.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/timespan.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/url.py +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/auth.html +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/index.html +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/report.html +0 -0
- {locust-2.46.5.dev2 → locust-2.46.5.dev5}/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.5.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 46, 5, '
|
|
21
|
+
__version__ = version = '2.46.5.dev5'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 46, 5, 'dev5')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -8,7 +8,7 @@ from locust.exception import CatchResponseError, RescheduleTask
|
|
|
8
8
|
|
|
9
9
|
import inspect
|
|
10
10
|
import os
|
|
11
|
-
from datetime import
|
|
11
|
+
from datetime import UTC, datetime
|
|
12
12
|
from typing import TYPE_CHECKING
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
@@ -78,7 +78,7 @@ class PrintListener:
|
|
|
78
78
|
|
|
79
79
|
if self.include_time:
|
|
80
80
|
if start_time:
|
|
81
|
-
_print_t(datetime.fromtimestamp(start_time, tz=
|
|
81
|
+
_print_t(datetime.fromtimestamp(start_time, tz=UTC))
|
|
82
82
|
else:
|
|
83
83
|
_print_t(datetime.now())
|
|
84
84
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from datetime import
|
|
1
|
+
from datetime import UTC, datetime
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
def format_utc_timestamp(unix_timestamp):
|
|
5
|
-
return datetime.fromtimestamp(int(unix_timestamp),
|
|
5
|
+
return datetime.fromtimestamp(int(unix_timestamp), UTC).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def format_safe_timestamp(unix_timestamp):
|
|
@@ -183,9 +183,10 @@ class WebUI:
|
|
|
183
183
|
def handle_exception(error):
|
|
184
184
|
error_message = str(error)
|
|
185
185
|
error_code = getattr(error, "code", 500)
|
|
186
|
+
error_name = getattr(error, "name", type(error).__name__)
|
|
186
187
|
logger.log(
|
|
187
188
|
logging.DEBUG if error_code <= 404 else logging.ERROR,
|
|
188
|
-
f"UI got request for {request.method} {request.path}, but it resulted in a {error_code}: {
|
|
189
|
+
f"UI got request for {request.method} {request.path}, but it resulted in a {error_code}: {error_name}",
|
|
189
190
|
)
|
|
190
191
|
return make_response(error_message, error_code)
|
|
191
192
|
|
|
@@ -260,10 +261,20 @@ class WebUI:
|
|
|
260
261
|
for key, value in request.form.items():
|
|
261
262
|
match key:
|
|
262
263
|
case "user_count": # if we just renamed this field to "users" we wouldn't need this
|
|
263
|
-
|
|
264
|
+
try:
|
|
265
|
+
user_count = int(value)
|
|
266
|
+
except ValueError:
|
|
267
|
+
err_msg = f"Invalid user_count value: {value!r} (must be an integer)"
|
|
268
|
+
logger.error(err_msg)
|
|
269
|
+
return jsonify({"success": False, "message": err_msg, "host": environment.host})
|
|
264
270
|
parsed_options_dict["users"] = user_count
|
|
265
271
|
case "spawn_rate":
|
|
266
|
-
|
|
272
|
+
try:
|
|
273
|
+
spawn_rate = float(value)
|
|
274
|
+
except ValueError:
|
|
275
|
+
err_msg = f"Invalid spawn_rate value: {value!r} (must be a number)"
|
|
276
|
+
logger.error(err_msg)
|
|
277
|
+
return jsonify({"success": False, "message": err_msg, "host": environment.host})
|
|
267
278
|
parsed_options_dict[key] = spawn_rate
|
|
268
279
|
case "host":
|
|
269
280
|
# Replace < > to guard against XSS
|
|
@@ -149,13 +149,14 @@ local_scheme = "no-local-version"
|
|
|
149
149
|
[tool.hatch.build.targets.BuildFrontend.hooks.custom]
|
|
150
150
|
|
|
151
151
|
[tool.ruff]
|
|
152
|
-
target-version = "
|
|
152
|
+
target-version = "py311"
|
|
153
153
|
line-length = 120
|
|
154
|
+
force-exclude = true
|
|
154
155
|
extend-exclude = [
|
|
155
156
|
"build",
|
|
156
157
|
"examples/issue_*.py",
|
|
157
158
|
"src/readthedocs-sphinx-search/",
|
|
158
|
-
"examples/grpc/hello_pb2
|
|
159
|
+
"examples/grpc/hello_pb2*.py",
|
|
159
160
|
]
|
|
160
161
|
lint.ignore = ["E402", "E501", "E713", "E731", "E741", "UP031", "PERF203"]
|
|
161
162
|
lint.select = ["E", "F", "W", "UP", "FA102", "I001", "FURB", "PERF"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -15,6 +15,7 @@ import socket
|
|
|
15
15
|
import sys
|
|
16
16
|
import tempfile
|
|
17
17
|
import textwrap
|
|
18
|
+
import tomllib
|
|
18
19
|
from collections import OrderedDict
|
|
19
20
|
from typing import Any, NamedTuple
|
|
20
21
|
from urllib.parse import urlparse
|
|
@@ -23,7 +24,6 @@ from uuid import uuid4
|
|
|
23
24
|
import configargparse
|
|
24
25
|
import gevent
|
|
25
26
|
import requests
|
|
26
|
-
import tomllib
|
|
27
27
|
|
|
28
28
|
from .util.directory import get_abspaths_in
|
|
29
29
|
from .util.timespan import parse_timespan
|
|
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
|