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.
Files changed (69) hide show
  1. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/PKG-INFO +1 -1
  2. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/_version.py +2 -2
  3. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/argument_parser.py +3 -0
  4. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/fasthttp.py +2 -1
  5. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/dispatch.py +3 -0
  6. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/html.py +3 -1
  7. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/main.py +8 -2
  8. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/web.py +8 -1
  9. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/.gitignore +0 -0
  10. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/LICENSE +0 -0
  11. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/README.md +0 -0
  12. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/hatch_build.py +0 -0
  13. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/__init__.py +0 -0
  14. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/__main__.py +0 -0
  15. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/clients.py +0 -0
  16. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/__init__.py +0 -0
  17. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/csv_request_logger.py +0 -0
  18. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/dns.py +0 -0
  19. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/milvus.py +0 -0
  20. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/mongodb.py +0 -0
  21. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/mqtt.py +0 -0
  22. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/oai.py +0 -0
  23. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/postgres.py +0 -0
  24. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/qdrant.py +0 -0
  25. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/contrib/socketio.py +0 -0
  26. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/debug.py +0 -0
  27. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/env.py +0 -0
  28. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/event.py +0 -0
  29. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/exception.py +0 -0
  30. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/input_events.py +0 -0
  31. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/log.py +0 -0
  32. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/opentelemetry.py +0 -0
  33. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/py.typed +0 -0
  34. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/__init__.py +0 -0
  35. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/protocol.py +0 -0
  36. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/rpc/zmqrpc.py +0 -0
  37. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/runners.py +0 -0
  38. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/shape.py +0 -0
  39. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/stats.py +0 -0
  40. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/__init__.py +0 -0
  41. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/inspectuser.py +0 -0
  42. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/markov_taskset.py +0 -0
  43. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/sequential_taskset.py +0 -0
  44. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/task.py +0 -0
  45. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/users.py +0 -0
  46. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/user/wait_time.py +0 -0
  47. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/__init__.py +0 -0
  48. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/cache.py +0 -0
  49. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/date.py +0 -0
  50. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/deprecation.py +0 -0
  51. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/directory.py +0 -0
  52. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/exception_handler.py +0 -0
  53. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/load_locustfile.py +0 -0
  54. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/rounding.py +0 -0
  55. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/timespan.py +0 -0
  56. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/util/url.py +0 -0
  57. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/favicon-dark.png +0 -0
  58. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/favicon-light.png +0 -0
  59. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/graphs-dark.png +0 -0
  60. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/graphs-light.png +0 -0
  61. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  62. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/terminal.gif +0 -0
  63. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/testruns-dark.png +0 -0
  64. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/assets/testruns-light.png +0 -0
  65. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/auth.html +0 -0
  66. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/index.html +0 -0
  67. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/locust/webui/dist/report.html +0 -0
  68. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/pyproject.toml +0 -0
  69. {locust-2.46.8.dev24 → locust-2.46.8.dev32}/pytest_locust/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: locust
3
- Version: 2.46.8.dev24
3
+ Version: 2.46.8.dev32
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.8.dev24'
22
- __version_tuple__ = version_tuple = (2, 46, 8, 'dev24')
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 (HTTPParseError, *FAILURE_EXCEPTIONS) as e:
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
- options.html_file = options.html_file.replace(option_term, str(int(option_value)))
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
- sys.stderr.write(f"Duplicate shape classes: {shape_class_name}\n")
113
- sys.exit(1)
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 user_count is None or user_count < 0 or spawn_rate is None or spawn_rate <= 0:
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