locust 2.46.8.dev32__tar.gz → 2.46.8.dev43__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.dev32 → locust-2.46.8.dev43}/PKG-INFO +1 -1
  2. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/_version.py +2 -2
  3. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/milvus.py +1 -1
  4. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/qdrant.py +2 -2
  5. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/log.py +3 -0
  6. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/main.py +6 -4
  7. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/runners.py +11 -5
  8. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/.gitignore +0 -0
  9. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/LICENSE +0 -0
  10. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/README.md +0 -0
  11. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/hatch_build.py +0 -0
  12. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/__init__.py +0 -0
  13. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/__main__.py +0 -0
  14. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/argument_parser.py +0 -0
  15. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/clients.py +0 -0
  16. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/__init__.py +0 -0
  17. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/csv_request_logger.py +0 -0
  18. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/dns.py +0 -0
  19. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/fasthttp.py +0 -0
  20. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/mongodb.py +0 -0
  21. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/mqtt.py +0 -0
  22. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/oai.py +0 -0
  23. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/postgres.py +0 -0
  24. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/contrib/socketio.py +0 -0
  25. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/debug.py +0 -0
  26. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/dispatch.py +0 -0
  27. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/env.py +0 -0
  28. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/event.py +0 -0
  29. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/exception.py +0 -0
  30. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/html.py +0 -0
  31. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/input_events.py +0 -0
  32. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/opentelemetry.py +0 -0
  33. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/py.typed +0 -0
  34. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/rpc/__init__.py +0 -0
  35. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/rpc/protocol.py +0 -0
  36. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/rpc/zmqrpc.py +0 -0
  37. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/shape.py +0 -0
  38. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/stats.py +0 -0
  39. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/__init__.py +0 -0
  40. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/inspectuser.py +0 -0
  41. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/markov_taskset.py +0 -0
  42. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/sequential_taskset.py +0 -0
  43. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/task.py +0 -0
  44. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/users.py +0 -0
  45. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/user/wait_time.py +0 -0
  46. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/__init__.py +0 -0
  47. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/cache.py +0 -0
  48. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/date.py +0 -0
  49. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/deprecation.py +0 -0
  50. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/directory.py +0 -0
  51. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/exception_handler.py +0 -0
  52. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/load_locustfile.py +0 -0
  53. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/rounding.py +0 -0
  54. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/timespan.py +0 -0
  55. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/util/url.py +0 -0
  56. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/web.py +0 -0
  57. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/favicon-dark.png +0 -0
  58. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/favicon-light.png +0 -0
  59. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/graphs-dark.png +0 -0
  60. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/graphs-light.png +0 -0
  61. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  62. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/terminal.gif +0 -0
  63. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/testruns-dark.png +0 -0
  64. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/assets/testruns-light.png +0 -0
  65. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/auth.html +0 -0
  66. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/index.html +0 -0
  67. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/locust/webui/dist/report.html +0 -0
  68. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/pyproject.toml +0 -0
  69. {locust-2.46.8.dev32 → locust-2.46.8.dev43}/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.dev32
3
+ Version: 2.46.8.dev43
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.dev32'
22
- __version_tuple__ = version_tuple = (2, 46, 8, 'dev32')
21
+ __version__ = version = '2.46.8.dev43'
22
+ __version_tuple__ = version_tuple = (2, 46, 8, 'dev43')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -284,7 +284,7 @@ class MilvusUser(User):
284
284
  Milvus server URI, e.g. ``"http://localhost:19530"``.
285
285
  collection_name : str
286
286
  The name of the collection to operate on.
287
- **client_kwargs
287
+ ``**client_kwargs``
288
288
  Additional keyword arguments forwarded to the client.
289
289
  """
290
290
 
@@ -148,9 +148,9 @@ class QdrantUser(User):
148
148
  Qdrant server URL, e.g. ``"http://localhost:6333"``.
149
149
  collection_name : str
150
150
  The name of the collection to operate on.
151
- **client_kwargs
151
+ ``**client_kwargs``
152
152
  Additional keyword arguments forwarded to the client.
153
- **collection_kwargs
153
+ ``**collection_kwargs``
154
154
  Additional keyword arguments forwarded to ``create_collection``.
155
155
  """
156
156
 
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import logging.config
3
+ import os
3
4
  import re
4
5
  import socket
5
6
  from collections import deque
@@ -63,6 +64,8 @@ def setup_logging(loglevel, logfile=None):
63
64
  },
64
65
  }
65
66
  if logfile:
67
+ if logfile_dir := os.path.dirname(logfile):
68
+ os.makedirs(logfile_dir, exist_ok=True)
66
69
  # if a file has been specified add a file logging handler and set
67
70
  # the locust and root loggers to use it
68
71
  LOGGING_CONFIG["handlers"]["file"] = {
@@ -434,10 +434,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
434
434
  logger.debug("--run-time specified for a worker node will be ignored.")
435
435
 
436
436
  if options.csv_prefix:
437
- base_csv_file = os.path.basename(options.csv_prefix)
438
- base_csv_dir = options.csv_prefix[: -len(base_csv_file)]
439
- if not os.path.exists(base_csv_dir) and len(base_csv_dir) != 0:
440
- os.makedirs(base_csv_dir)
437
+ if base_csv_dir := os.path.dirname(options.csv_prefix):
438
+ os.makedirs(base_csv_dir, exist_ok=True)
441
439
  stats_csv_writer = stats.StatsCSVFileWriter(
442
440
  environment, stats.PERCENTILES_TO_REPORT, options.csv_prefix, options.stats_history_enabled
443
441
  )
@@ -660,6 +658,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
660
658
  if options.json:
661
659
  stats.print_stats_json(runner.stats)
662
660
  if options.json_file:
661
+ if json_dir := os.path.dirname(options.json_file):
662
+ os.makedirs(json_dir, exist_ok=True)
663
663
  stats.save_stats_json(runner.stats, options.json_file)
664
664
  elif not isinstance(runner, locust.runners.WorkerRunner):
665
665
  stats.print_stats(runner.stats, current=False)
@@ -679,6 +679,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
679
679
  html_report = get_html_report(environment, show_download_link=False)
680
680
  process_html_filename(options)
681
681
  logger.debug("Writing html report to file: %s", options.html_file)
682
+ if html_dir := os.path.dirname(options.html_file):
683
+ os.makedirs(html_dir, exist_ok=True)
682
684
  with open(options.html_file, "w", encoding="utf-8") as file:
683
685
  file.write(html_report)
684
686
 
@@ -32,6 +32,7 @@ from .exception import RPCError, RPCReceiveError, RPCSendError, StopTest
32
32
  from .log import get_logs, greenlet_exception_logger
33
33
  from .rpc import Message, rpc
34
34
  from .stats import RequestStats, StatsError, setup_distributed_stats_event_listeners
35
+ from .user.task import LOCUST_STATE_STOPPING
35
36
  from .util.directory import get_abspaths_in
36
37
  from .util.url import is_url
37
38
 
@@ -276,7 +277,9 @@ class Runner:
276
277
  # User called runner.quit(), so don't block waiting for killing to finish
277
278
  user_to_stop.group.killone(user_to_stop.greenlet, block=False)
278
279
  elif self.environment.stop_timeout:
279
- async_calls_to_stop.add(gevent.spawn_later(0, user_to_stop.stop, force=False))
280
+ # a user that a ramp-down already asked to stop is only waited for, stopping it again raises
281
+ if user_to_stop._state != LOCUST_STATE_STOPPING:
282
+ async_calls_to_stop.add(gevent.spawn_later(0, user_to_stop.stop, force=False))
280
283
  stop_group.add(user_to_stop.greenlet)
281
284
  else:
282
285
  async_calls_to_stop.add(gevent.spawn_later(0, user_to_stop.stop, force=True))
@@ -1446,10 +1449,13 @@ class WorkerRunner(DistributedRunner):
1446
1449
  case _ if lc := self.custom_messages.get(msg.type):
1447
1450
  listener, concurrent = lc
1448
1451
  logger.debug(f"Received {msg.type} message from master")
1449
- if not concurrent:
1450
- listener(environment=self.environment, msg=msg)
1451
- else:
1452
- gevent.spawn(listener, self.environment, msg)
1452
+ try:
1453
+ if not concurrent:
1454
+ listener(environment=self.environment, msg=msg)
1455
+ else:
1456
+ gevent.spawn(listener, environment=self.environment, msg=msg)
1457
+ except Exception:
1458
+ logging.error(f"Uncaught exception in handler for {msg.type}\n{traceback.format_exc()}")
1453
1459
  case _:
1454
1460
  logger.warning(f"Unknown message type received: {msg.type}")
1455
1461
 
File without changes
File without changes
File without changes