locust 2.46.8.dev14__tar.gz → 2.46.8.dev30__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.dev14 → locust-2.46.8.dev30}/PKG-INFO +1 -1
  2. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/_version.py +2 -2
  3. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/csv_request_logger.py +2 -2
  4. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/fasthttp.py +2 -1
  5. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/html.py +3 -1
  6. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/main.py +8 -2
  7. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/opentelemetry.py +6 -2
  8. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/.gitignore +0 -0
  9. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/LICENSE +0 -0
  10. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/README.md +0 -0
  11. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/hatch_build.py +0 -0
  12. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/__init__.py +0 -0
  13. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/__main__.py +0 -0
  14. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/argument_parser.py +0 -0
  15. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/clients.py +0 -0
  16. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/__init__.py +0 -0
  17. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/dns.py +0 -0
  18. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/milvus.py +0 -0
  19. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/mongodb.py +0 -0
  20. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/mqtt.py +0 -0
  21. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/oai.py +0 -0
  22. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/postgres.py +0 -0
  23. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/qdrant.py +0 -0
  24. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/socketio.py +0 -0
  25. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/debug.py +0 -0
  26. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/dispatch.py +0 -0
  27. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/env.py +0 -0
  28. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/event.py +0 -0
  29. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/exception.py +0 -0
  30. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/input_events.py +0 -0
  31. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/log.py +0 -0
  32. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/py.typed +0 -0
  33. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/__init__.py +0 -0
  34. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/protocol.py +0 -0
  35. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/zmqrpc.py +0 -0
  36. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/runners.py +0 -0
  37. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/shape.py +0 -0
  38. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/stats.py +0 -0
  39. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/__init__.py +0 -0
  40. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/inspectuser.py +0 -0
  41. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/markov_taskset.py +0 -0
  42. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/sequential_taskset.py +0 -0
  43. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/task.py +0 -0
  44. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/users.py +0 -0
  45. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/wait_time.py +0 -0
  46. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/__init__.py +0 -0
  47. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/cache.py +0 -0
  48. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/date.py +0 -0
  49. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/deprecation.py +0 -0
  50. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/directory.py +0 -0
  51. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/exception_handler.py +0 -0
  52. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/load_locustfile.py +0 -0
  53. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/rounding.py +0 -0
  54. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/timespan.py +0 -0
  55. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/url.py +0 -0
  56. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/web.py +0 -0
  57. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/favicon-dark.png +0 -0
  58. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/favicon-light.png +0 -0
  59. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/graphs-dark.png +0 -0
  60. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/graphs-light.png +0 -0
  61. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  62. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/terminal.gif +0 -0
  63. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/testruns-dark.png +0 -0
  64. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/testruns-light.png +0 -0
  65. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/auth.html +0 -0
  66. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/index.html +0 -0
  67. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/report.html +0 -0
  68. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/pyproject.toml +0 -0
  69. {locust-2.46.8.dev14 → locust-2.46.8.dev30}/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.dev14
3
+ Version: 2.46.8.dev30
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.dev14'
22
- __version_tuple__ = version_tuple = (2, 46, 8, 'dev14')
21
+ __version__ = version = '2.46.8.dev30'
22
+ __version_tuple__ = version_tuple = (2, 46, 8, 'dev30')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -149,7 +149,7 @@ class CsvRequestLogger:
149
149
  *,
150
150
  request_type: str,
151
151
  name: str,
152
- response_time: float,
152
+ response_time: float | None,
153
153
  response_length: int,
154
154
  exception: Any = None,
155
155
  response: Any = None,
@@ -170,7 +170,7 @@ class CsvRequestLogger:
170
170
  round(ts, 6),
171
171
  request_type,
172
172
  name,
173
- round(response_time, 2),
173
+ round(response_time, 2) if response_time is not None else "",
174
174
  response_length,
175
175
  status_code,
176
176
  exc_str,
@@ -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:
@@ -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
 
@@ -53,7 +53,9 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
53
53
 
54
54
  @events.request.add_listener
55
55
  def on_request(name, response_time, exception, **kwargs):
56
- if len(request_names) < MAX_REQUEST_NAMES:
56
+ if name in request_names:
57
+ attributes = {"name": name}
58
+ elif len(request_names) < MAX_REQUEST_NAMES:
57
59
  request_names.add(name)
58
60
  attributes = {"name": name}
59
61
  else:
@@ -62,7 +64,9 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
62
64
  if exception:
63
65
  attributes["error.type"] = exception.__class__.__name__
64
66
 
65
- ttlb_histogram.record(response_time / 1000.0, attributes=attributes)
67
+ # response_time is None for requests that have no duration (typically async requests)
68
+ if response_time is not None:
69
+ ttlb_histogram.record(response_time / 1000.0, attributes=attributes)
66
70
 
67
71
  @events.init.add_listener
68
72
  def on_locust_init(runner, **kwargs):
File without changes
File without changes
File without changes