locust 2.46.1.dev14__tar.gz → 2.46.2__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.1.dev14 → locust-2.46.2}/PKG-INFO +4 -5
  2. {locust-2.46.1.dev14 → locust-2.46.2}/locust/_version.py +2 -2
  3. {locust-2.46.1.dev14 → locust-2.46.2}/locust/stats.py +14 -9
  4. {locust-2.46.1.dev14 → locust-2.46.2}/pyproject.toml +5 -6
  5. {locust-2.46.1.dev14 → locust-2.46.2}/.gitignore +0 -0
  6. {locust-2.46.1.dev14 → locust-2.46.2}/LICENSE +0 -0
  7. {locust-2.46.1.dev14 → locust-2.46.2}/README.md +0 -0
  8. {locust-2.46.1.dev14 → locust-2.46.2}/hatch_build.py +0 -0
  9. {locust-2.46.1.dev14 → locust-2.46.2}/locust/__init__.py +0 -0
  10. {locust-2.46.1.dev14 → locust-2.46.2}/locust/__main__.py +0 -0
  11. {locust-2.46.1.dev14 → locust-2.46.2}/locust/argument_parser.py +0 -0
  12. {locust-2.46.1.dev14 → locust-2.46.2}/locust/clients.py +0 -0
  13. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/__init__.py +0 -0
  14. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/csv_request_logger.py +0 -0
  15. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/dns.py +0 -0
  16. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/fasthttp.py +0 -0
  17. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/milvus.py +0 -0
  18. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/mongodb.py +0 -0
  19. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/mqtt.py +0 -0
  20. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/oai.py +0 -0
  21. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/postgres.py +0 -0
  22. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/qdrant.py +0 -0
  23. {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/socketio.py +0 -0
  24. {locust-2.46.1.dev14 → locust-2.46.2}/locust/debug.py +0 -0
  25. {locust-2.46.1.dev14 → locust-2.46.2}/locust/dispatch.py +0 -0
  26. {locust-2.46.1.dev14 → locust-2.46.2}/locust/env.py +0 -0
  27. {locust-2.46.1.dev14 → locust-2.46.2}/locust/event.py +0 -0
  28. {locust-2.46.1.dev14 → locust-2.46.2}/locust/exception.py +0 -0
  29. {locust-2.46.1.dev14 → locust-2.46.2}/locust/html.py +0 -0
  30. {locust-2.46.1.dev14 → locust-2.46.2}/locust/input_events.py +0 -0
  31. {locust-2.46.1.dev14 → locust-2.46.2}/locust/log.py +0 -0
  32. {locust-2.46.1.dev14 → locust-2.46.2}/locust/main.py +0 -0
  33. {locust-2.46.1.dev14 → locust-2.46.2}/locust/opentelemetry.py +0 -0
  34. {locust-2.46.1.dev14 → locust-2.46.2}/locust/py.typed +0 -0
  35. {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/__init__.py +0 -0
  36. {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/protocol.py +0 -0
  37. {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/zmqrpc.py +0 -0
  38. {locust-2.46.1.dev14 → locust-2.46.2}/locust/runners.py +0 -0
  39. {locust-2.46.1.dev14 → locust-2.46.2}/locust/shape.py +0 -0
  40. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/__init__.py +0 -0
  41. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/inspectuser.py +0 -0
  42. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/markov_taskset.py +0 -0
  43. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/sequential_taskset.py +0 -0
  44. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/task.py +0 -0
  45. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/users.py +0 -0
  46. {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/wait_time.py +0 -0
  47. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/__init__.py +0 -0
  48. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/cache.py +0 -0
  49. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/date.py +0 -0
  50. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/deprecation.py +0 -0
  51. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/directory.py +0 -0
  52. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/exception_handler.py +0 -0
  53. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/load_locustfile.py +0 -0
  54. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/rounding.py +0 -0
  55. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/timespan.py +0 -0
  56. {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/url.py +0 -0
  57. {locust-2.46.1.dev14 → locust-2.46.2}/locust/web.py +0 -0
  58. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/favicon-dark.png +0 -0
  59. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/favicon-light.png +0 -0
  60. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/graphs-dark.png +0 -0
  61. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/graphs-light.png +0 -0
  62. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  63. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/terminal.gif +0 -0
  64. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/testruns-dark.png +0 -0
  65. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/testruns-light.png +0 -0
  66. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/auth.html +0 -0
  67. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/index.html +0 -0
  68. {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/report.html +0 -0
  69. {locust-2.46.1.dev14 → locust-2.46.2}/pytest_locust/plugin.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: locust
3
- Version: 2.46.1.dev14
3
+ Version: 2.46.2
4
4
  Summary: Developer-friendly load testing framework
5
- Project-URL: homepage, https://locust.io/
6
- Project-URL: repository, https://github.com/locustio/locust
7
- Project-URL: documentation, https://docs.locust.io/
5
+ Project-URL: Homepage, https://locust.cloud/
6
+ Project-URL: Repository, https://github.com/locustio/locust
7
+ Project-URL: Documentation, https://docs.locust.io/
8
8
  Author: Jonatan Heyman, Lars Holmberg
9
9
  Maintainer: Lars Holmberg, Jonatan Heyman, Andrew Baldwin
10
10
  License: MIT
@@ -39,7 +39,6 @@ Requires-Dist: python-socketio[client]>=5.13.0
39
39
  Requires-Dist: pywin32; sys_platform == 'win32'
40
40
  Requires-Dist: pyzmq>=25.0.0
41
41
  Requires-Dist: requests>=2.32.2
42
- Requires-Dist: tomli>=1.1.0; python_version < '3.11'
43
42
  Requires-Dist: typing-extensions>=4.6.0; python_version < '3.12'
44
43
  Requires-Dist: werkzeug>=2.0.0
45
44
  Provides-Extra: dns
@@ -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.1.dev14'
22
- __version_tuple__ = version_tuple = (2, 46, 1, 'dev14')
21
+ __version__ = version = '2.46.2'
22
+ __version_tuple__ = version_tuple = (2, 46, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -113,7 +113,7 @@ response time percentile
113
113
  """
114
114
  CURRENT_RESPONSE_TIME_PERCENTILE_WINDOW = 10
115
115
 
116
- CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_requests"])
116
+ CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_requests", "num_none_requests"])
117
117
 
118
118
  PERCENTILES_TO_REPORT = [0.50, 0.66, 0.75, 0.80, 0.90, 0.95, 0.98, 0.99, 0.999, 0.9999, 1.0]
119
119
 
@@ -298,7 +298,7 @@ class StatsEntry:
298
298
  Represents a single stats entry (name and method)
299
299
  """
300
300
 
301
- def __init__(self, stats: RequestStats | None, name: str, method: str, use_response_times_cache: bool = False):
301
+ def __init__(self, stats: RequestStats, name: str, method: str, use_response_times_cache: bool = False):
302
302
  self.stats = stats
303
303
  self.name = name
304
304
  """ Name (URL) of this stats entry """
@@ -450,7 +450,7 @@ class StatsEntry:
450
450
 
451
451
  @property
452
452
  def current_rps(self) -> float:
453
- if self.stats is None or self.stats.last_request_timestamp is None:
453
+ if self.stats.last_request_timestamp is None:
454
454
  return 0
455
455
  slice_start_time = max(int(self.stats.last_request_timestamp) - 12, int(self.stats.start_time or 0))
456
456
 
@@ -543,9 +543,9 @@ class StatsEntry:
543
543
  return cast(StatsEntryDict, {key: getattr(self, key, None) for key in StatsEntryDict.__annotations__.keys()})
544
544
 
545
545
  @classmethod
546
- def unserialize(cls, data: StatsEntryDict) -> StatsEntry:
546
+ def unserialize(cls, data: StatsEntryDict, stats: RequestStats) -> StatsEntry:
547
547
  """Return the unserialzed version of the specified dict"""
548
- obj = cls(None, data["name"], data["method"])
548
+ obj = cls(stats, data["name"], data["method"])
549
549
  valid_keys = StatsEntryDict.__annotations__.keys()
550
550
 
551
551
  for key, value in data.items():
@@ -604,7 +604,11 @@ class StatsEntry:
604
604
 
605
605
  Percent specified in range: 0.0 - 1.0
606
606
  """
607
- return calculate_response_time_percentile(self.response_times, self.num_requests, percent)
607
+ # response_times only holds non-None samples, so None (async) requests
608
+ # must be excluded from the denominator, just like in avg/median
609
+ return calculate_response_time_percentile(
610
+ self.response_times, self.num_requests - self.num_none_requests, percent
611
+ )
608
612
 
609
613
  def get_current_response_time_percentile(self, percent: float) -> int | None:
610
614
  """
@@ -644,7 +648,7 @@ class StatsEntry:
644
648
  # for that timeframe
645
649
  return calculate_response_time_percentile(
646
650
  diff_response_time_dicts(self.response_times, cached.response_times),
647
- self.num_requests - cached.num_requests,
651
+ (self.num_requests - self.num_none_requests) - (cached.num_requests - cached.num_none_requests),
648
652
  percent,
649
653
  )
650
654
  # if time was not in response times cache window
@@ -669,6 +673,7 @@ class StatsEntry:
669
673
  self.response_times_cache[t] = CachedResponseTimes(
670
674
  response_times=copy(self.response_times),
671
675
  num_requests=self.num_requests,
676
+ num_none_requests=self.num_none_requests,
672
677
  )
673
678
 
674
679
  # We'll use a cache size of CURRENT_RESPONSE_TIME_PERCENTILE_WINDOW + 10 since - in the extreme case -
@@ -830,7 +835,7 @@ def setup_distributed_stats_event_listeners(events: Events, stats: RequestStats)
830
835
 
831
836
  def on_worker_report(client_id: str, data: dict[str, Any]) -> None:
832
837
  for stats_data in data["stats"]:
833
- entry = StatsEntry.unserialize(stats_data)
838
+ entry = StatsEntry.unserialize(stats_data, stats)
834
839
  request_key = (entry.name, entry.method)
835
840
  if request_key not in stats.entries:
836
841
  stats.entries[request_key] = StatsEntry(stats, entry.name, entry.method, use_response_times_cache=True)
@@ -851,7 +856,7 @@ def setup_distributed_stats_event_listeners(events: Events, stats: RequestStats)
851
856
  incoming_last if existing.last_seen is None else max(existing.last_seen, incoming_last)
852
857
  )
853
858
 
854
- stats.total.extend(StatsEntry.unserialize(data["stats_total"]))
859
+ stats.total.extend(StatsEntry.unserialize(data["stats_total"], stats))
855
860
 
856
861
  events.report_to_master.add_listener(on_report_to_master)
857
862
  events.worker_report.add_listener(on_worker_report)
@@ -40,7 +40,6 @@ dependencies = [
40
40
  "pyzmq>=25.0.0",
41
41
  "geventhttpclient>=2.3.1",
42
42
  "configargparse>=1.7.1",
43
- "tomli>=1.1.0; python_version < '3.11'",
44
43
  "typing_extensions>=4.6.0; python_version < '3.12'",
45
44
  "psutil>=5.9.1",
46
45
  "Flask-Login>=0.6.3",
@@ -66,9 +65,9 @@ otel = [
66
65
  qdrant = ["qdrant-client>=1.16.2"]
67
66
 
68
67
  [project.urls]
69
- homepage = "https://locust.io/"
70
- repository = "https://github.com/locustio/locust"
71
- documentation = "https://docs.locust.io/"
68
+ Homepage = "https://locust.cloud/"
69
+ Repository = "https://github.com/locustio/locust"
70
+ Documentation = "https://docs.locust.io/"
72
71
 
73
72
  [tool.uv]
74
73
  default-groups = ["build", "test", "lint"]
@@ -76,7 +75,7 @@ default-groups = ["build", "test", "lint"]
76
75
  [dependency-groups]
77
76
  build = ["hatch==1.16.5", "hatch-vcs>=0.4.0"]
78
77
  test = [
79
- "cryptography>=43.0.1,<47.0.0",
78
+ "cryptography>=43.0.1,<49.0.0",
80
79
  "pyquery>=2.0.0,<3.0.0",
81
80
  "retry>=0.9.2,<1.0.0",
82
81
  ]
@@ -203,7 +202,7 @@ reportOptionalMemberAccess = "none"
203
202
  [tool.hatch.envs.hatch-test]
204
203
  default-args = ["locust/test"]
205
204
  dependencies = [
206
- "cryptography>=43.0.1,<47.0.0",
205
+ "cryptography>=43.0.1,<49.0.0",
207
206
  "pyquery>=2.0.1,<3.0.0",
208
207
  "pytest>=8.3.3,<10",
209
208
  "retry>=0.9.2,<1.0.0",
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