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.
Files changed (69) hide show
  1. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/PKG-INFO +1 -1
  2. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/_version.py +2 -2
  3. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/debug.py +2 -2
  4. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/date.py +2 -2
  5. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/web.py +14 -3
  6. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/pyproject.toml +3 -2
  7. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/.gitignore +0 -0
  8. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/LICENSE +0 -0
  9. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/README.md +0 -0
  10. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/hatch_build.py +0 -0
  11. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/__init__.py +0 -0
  12. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/__main__.py +0 -0
  13. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/argument_parser.py +1 -1
  14. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/clients.py +0 -0
  15. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/__init__.py +0 -0
  16. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/csv_request_logger.py +0 -0
  17. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/dns.py +0 -0
  18. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/fasthttp.py +0 -0
  19. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/milvus.py +0 -0
  20. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/mongodb.py +0 -0
  21. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/mqtt.py +0 -0
  22. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/oai.py +0 -0
  23. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/postgres.py +0 -0
  24. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/qdrant.py +0 -0
  25. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/contrib/socketio.py +0 -0
  26. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/dispatch.py +0 -0
  27. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/env.py +0 -0
  28. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/event.py +0 -0
  29. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/exception.py +0 -0
  30. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/html.py +0 -0
  31. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/input_events.py +0 -0
  32. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/log.py +0 -0
  33. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/main.py +0 -0
  34. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/opentelemetry.py +0 -0
  35. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/py.typed +0 -0
  36. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/__init__.py +0 -0
  37. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/protocol.py +0 -0
  38. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/rpc/zmqrpc.py +0 -0
  39. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/runners.py +0 -0
  40. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/shape.py +0 -0
  41. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/stats.py +0 -0
  42. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/__init__.py +0 -0
  43. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/inspectuser.py +0 -0
  44. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/markov_taskset.py +0 -0
  45. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/sequential_taskset.py +0 -0
  46. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/task.py +0 -0
  47. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/users.py +0 -0
  48. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/user/wait_time.py +0 -0
  49. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/__init__.py +0 -0
  50. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/cache.py +0 -0
  51. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/deprecation.py +0 -0
  52. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/directory.py +0 -0
  53. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/exception_handler.py +0 -0
  54. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/load_locustfile.py +0 -0
  55. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/rounding.py +0 -0
  56. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/timespan.py +0 -0
  57. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/util/url.py +0 -0
  58. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/favicon-dark.png +0 -0
  59. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/favicon-light.png +0 -0
  60. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/graphs-dark.png +0 -0
  61. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/graphs-light.png +0 -0
  62. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  63. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/terminal.gif +0 -0
  64. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/testruns-dark.png +0 -0
  65. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/assets/testruns-light.png +0 -0
  66. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/auth.html +0 -0
  67. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/index.html +0 -0
  68. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/locust/webui/dist/report.html +0 -0
  69. {locust-2.46.5.dev2 → locust-2.46.5.dev5}/pytest_locust/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: locust
3
- Version: 2.46.5.dev2
3
+ Version: 2.46.5.dev5
4
4
  Summary: Developer-friendly load testing framework
5
5
  Project-URL: Homepage, https://locust.cloud/
6
6
  Project-URL: Repository, https://github.com/locustio/locust
@@ -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.dev2'
22
- __version_tuple__ = version_tuple = (2, 46, 5, 'dev2')
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 datetime, timezone
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=timezone.utc))
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 datetime, timezone
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), timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
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}: {error.name}",
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
- user_count = int(value)
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
- spawn_rate = float(value)
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 = "py310"
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.py",
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
@@ -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