locust 2.46.7.dev2__py3-none-any.whl → 2.46.7.dev9__py3-none-any.whl

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.
locust/__init__.py CHANGED
@@ -36,28 +36,28 @@ from .user.wait_time import between, constant, constant_pacing, constant_through
36
36
  events = Events()
37
37
 
38
38
  __all__ = (
39
- "SequentialTaskSet",
39
+ "FastHttpUser",
40
+ "HttpLocust",
41
+ "HttpUser",
42
+ "LoadTestShape",
43
+ "Locust",
40
44
  "MarkovTaskSet",
41
- "transition",
42
- "transitions",
43
- "wait_time",
44
- "task",
45
- "tag",
45
+ "SequentialTaskSet",
46
46
  "TaskSet",
47
- "HttpUser",
48
- "FastHttpUser",
49
47
  "User",
48
+ "__version__",
50
49
  "between",
51
50
  "constant",
52
51
  "constant_pacing",
53
52
  "constant_throughput",
54
- "poisson",
55
53
  "events",
56
- "LoadTestShape",
54
+ "poisson",
57
55
  "run_single_user",
58
- "HttpLocust",
59
- "Locust",
60
- "__version__",
56
+ "tag",
57
+ "task",
58
+ "transition",
59
+ "transitions",
60
+ "wait_time",
61
61
  )
62
62
 
63
63
  # Used for raising a DeprecationWarning if old Locust/HttpLocust is used
locust/_version.py CHANGED
@@ -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.7.dev2'
22
- __version_tuple__ = version_tuple = (2, 46, 7, 'dev2')
21
+ __version__ = version = '2.46.7.dev9'
22
+ __version_tuple__ = version_tuple = (2, 46, 7, 'dev9')
23
23
 
24
24
  __commit_id__ = commit_id = None
locust/clients.py CHANGED
@@ -8,7 +8,7 @@ import sys
8
8
  import time
9
9
  from contextlib import contextmanager
10
10
  from typing import TYPE_CHECKING, cast
11
- from urllib.parse import urlparse, urlunparse
11
+ from urllib.parse import unquote, urlparse, urlunparse
12
12
 
13
13
  import requests
14
14
  from packaging.version import Version
@@ -104,16 +104,13 @@ class HttpSession(requests.Session):
104
104
  # Check for basic authentication
105
105
  parsed_url = urlparse(self.base_url)
106
106
  if parsed_url.username and parsed_url.password:
107
- netloc = parsed_url.hostname
108
- if parsed_url.port:
109
- netloc += ":%d" % parsed_url.port
110
-
111
- # remove username and password from the base_url
107
+ # remove username and password from the base_url (keeping e.g. the brackets of an IPv6 host)
108
+ netloc = parsed_url.netloc.rpartition("@")[2]
112
109
  self.base_url = urlunparse(
113
110
  (parsed_url.scheme, netloc, parsed_url.path, parsed_url.params, parsed_url.query, parsed_url.fragment)
114
111
  )
115
- # configure requests to use basic auth
116
- self.auth = HTTPBasicAuth(parsed_url.username, parsed_url.password)
112
+ # configure requests to use basic auth (credentials in a URL are percent-encoded)
113
+ self.auth = HTTPBasicAuth(unquote(parsed_url.username), unquote(parsed_url.password))
117
114
 
118
115
  self.mount("https://", LocustHttpAdapter(pool_manager=pool_manager))
119
116
  self.mount("http://", LocustHttpAdapter(pool_manager=pool_manager))
@@ -198,7 +195,7 @@ class HttpSession(requests.Session):
198
195
  response = self._send_request_safe_mode(method, complete_url, data=data, json=json, **kwargs)
199
196
  response_time = (time.perf_counter() - start_perf_counter) * 1000
200
197
 
201
- if request_before_redirect := (response.history and response.history[0] or response).request:
198
+ if request_before_redirect := ((response.history and response.history[0]) or response).request:
202
199
  complete_url = str(request_before_redirect.url)
203
200
  if not name:
204
201
  name = request_before_redirect.path_url
@@ -15,7 +15,7 @@ from base64 import b64encode
15
15
  from http.cookiejar import CookieJar
16
16
  from ssl import SSLError
17
17
  from typing import TYPE_CHECKING
18
- from urllib.parse import urlparse, urlunparse
18
+ from urllib.parse import unquote, urlparse, urlunparse
19
19
 
20
20
  import gevent
21
21
  from charset_normalizer import detect
@@ -128,11 +128,8 @@ class FastHttpSession:
128
128
  if self.base_url:
129
129
  parsed_url = urlparse(self.base_url)
130
130
  if parsed_url.username and parsed_url.password:
131
- netloc = parsed_url.hostname or ""
132
- if parsed_url.port:
133
- netloc += ":%d" % parsed_url.port
134
-
135
- # remove username and password from the base_url
131
+ # remove username and password from the base_url (keeping e.g. the brackets of an IPv6 host)
132
+ netloc = parsed_url.netloc.rpartition("@")[2]
136
133
  self.base_url = str(
137
134
  urlunparse(
138
135
  (
@@ -146,7 +143,8 @@ class FastHttpSession:
146
143
  )
147
144
  )
148
145
  # store authentication header (we construct this by using _basic_auth_str() function from requests.auth)
149
- self.auth_header = _construct_basic_auth_str(parsed_url.username, parsed_url.password)
146
+ # (credentials in a URL are percent-encoded)
147
+ self.auth_header = _construct_basic_auth_str(unquote(parsed_url.username), unquote(parsed_url.password))
150
148
 
151
149
  def _build_url(self, path: str) -> str:
152
150
  """prepend url with hostname unless it's already an absolute URL"""
@@ -248,7 +246,7 @@ class FastHttpSession:
248
246
 
249
247
  if not allow_redirects:
250
248
  old_redirect_resonse_codes = self.client.redirect_resonse_codes
251
- self.client.redirect_resonse_codes = frozenset()
249
+ self.client.redirect_resonse_codes = self.client.redirect_response_codes = frozenset()
252
250
 
253
251
  start_perf_counter = time.perf_counter()
254
252
  # send request, and catch any exceptions
@@ -264,7 +262,7 @@ class FastHttpSession:
264
262
  }
265
263
 
266
264
  if not allow_redirects:
267
- self.client.redirect_resonse_codes = old_redirect_resonse_codes
265
+ self.client.redirect_resonse_codes = self.client.redirect_response_codes = old_redirect_resonse_codes
268
266
 
269
267
  request_meta["response_length"] = 0 # default value, if length cannot be determined
270
268
 
@@ -605,6 +603,7 @@ class LocustUserAgent(UserAgent):
605
603
  request_type = FastRequest
606
604
  valid_response_codes = frozenset([200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 301, 302, 303, 304, 307, 308])
607
605
  redirect_resonse_codes = frozenset([301, 302, 303, 307, 308])
606
+ redirect_response_codes = redirect_resonse_codes # geventhttpclient 2.5+ spelling
608
607
 
609
608
  def __init__(self, client_pool: HTTPClientPool | None = None, **kwargs):
610
609
  super().__init__(**kwargs)
locust/runners.py CHANGED
@@ -917,10 +917,8 @@ class MasterRunner(DistributedRunner):
917
917
  self.greenlet.kill(block=True)
918
918
 
919
919
  def check_stopped(self) -> None:
920
- if (
921
- self.state == STATE_STOPPING
922
- and all(x.state == STATE_INIT for x in self.clients.all)
923
- or all(x.state not in (STATE_RUNNING, STATE_SPAWNING, STATE_INIT) for x in self.clients.all)
920
+ if (self.state == STATE_STOPPING and all(x.state == STATE_INIT for x in self.clients.all)) or all(
921
+ x.state not in (STATE_RUNNING, STATE_SPAWNING, STATE_INIT) for x in self.clients.all
924
922
  ):
925
923
  self.update_state(STATE_STOPPED)
926
924
 
@@ -938,7 +936,7 @@ class MasterRunner(DistributedRunner):
938
936
  missing_clients_to_be_removed.append(client.id)
939
937
 
940
938
  if client.heartbeat < 0 and client.state != STATE_MISSING:
941
- logger.info(f"Worker {str(client.id)} failed to send heartbeat, setting state to missing.")
939
+ logger.info(f"Worker {client.id!s} failed to send heartbeat, setting state to missing.")
942
940
  client.state = STATE_MISSING
943
941
  client.user_classes_count = {}
944
942
  if self._users_dispatcher is not None:
@@ -1023,7 +1021,7 @@ class MasterRunner(DistributedRunner):
1023
1021
  elif msg.data != __version__ and msg.data != -1:
1024
1022
  if msg.data[0:4] == __version__[0:4]:
1025
1023
  logger.debug(
1026
- f"A worker ({client_id}) running a different patch version ({repr(msg.data)}) connected, master version is {repr(__version__)}"
1024
+ f"A worker ({client_id}) running a different patch version ({msg.data!r}) connected, master version is {__version__!r}"
1027
1025
  )
1028
1026
  else:
1029
1027
  logger.warning(
@@ -1113,7 +1111,7 @@ class MasterRunner(DistributedRunner):
1113
1111
  c.heartbeat = HEARTBEAT_LIVENESS
1114
1112
  client_state = msg.data["state"]
1115
1113
  if c.state == STATE_MISSING:
1116
- logger.info(f"Worker {str(c.id)} self-healed with heartbeat, setting state to {client_state}.")
1114
+ logger.info(f"Worker {c.id!s} self-healed with heartbeat, setting state to {client_state}.")
1117
1115
  if self._users_dispatcher is not None:
1118
1116
  self._users_dispatcher.add_worker(worker_node=c)
1119
1117
  if not self._users_dispatcher.dispatch_in_progress and self.state == STATE_RUNNING:
locust/stats.py CHANGED
@@ -539,7 +539,7 @@ class StatsEntry:
539
539
  # (which is what the response times cache is used for) uses an approximation of the
540
540
  # last 10 seconds anyway, it should be fine to ignore this.
541
541
  last_time = int(self.last_request_timestamp) if self.last_request_timestamp else None
542
- if last_time and last_time > (old_last_request_timestamp and int(old_last_request_timestamp) or 0):
542
+ if last_time and last_time > ((old_last_request_timestamp and int(old_last_request_timestamp)) or 0):
543
543
  self._cache_response_times(last_time)
544
544
 
545
545
  def serialize(self) -> StatsEntryDict:
@@ -585,7 +585,7 @@ class StatsEntry:
585
585
  + str((STATS_NAME_WIDTH - STATS_TYPE_WIDTH) + 4)
586
586
  + "s %7d %12s |%7d %7d %7d%7d | %7.2f %11.2f"
587
587
  ) % (
588
- (self.method and self.method + " " or ""),
588
+ ((self.method and self.method + " ") or ""),
589
589
  self.name,
590
590
  self.num_requests,
591
591
  "%d(%.2f%%)" % (self.num_failures, self.fail_ratio * 100),
@@ -661,12 +661,15 @@ class StatsEntry:
661
661
  if not self.num_requests:
662
662
  raise ValueError("Can't calculate percentile on url with no successful requests")
663
663
 
664
- tpl = f"%-{str(STATS_TYPE_WIDTH)}s %-{str(STATS_NAME_WIDTH)}s %8d {' '.join(['%6d'] * len(PERCENTILES_TO_REPORT))}"
664
+ tpl = f"%-{STATS_TYPE_WIDTH!s}s %-{STATS_NAME_WIDTH!s}s %8d {' '.join(['%6d'] * len(PERCENTILES_TO_REPORT))}"
665
665
 
666
666
  return tpl % (
667
- (self.method or "", self.name)
668
- + tuple(self.get_response_time_percentile(p) for p in PERCENTILES_TO_REPORT)
669
- + (self.num_requests,)
667
+ (
668
+ self.method or "",
669
+ self.name,
670
+ *tuple(self.get_response_time_percentile(p) for p in PERCENTILES_TO_REPORT),
671
+ self.num_requests,
672
+ )
670
673
  )
671
674
 
672
675
  def _cache_response_times(self, t: int) -> None:
@@ -897,9 +900,9 @@ def get_percentile_stats_summary(stats: RequestStats) -> list[str]:
897
900
  Percentile stats summary will be returned as list of string
898
901
  """
899
902
  summary = ["Response time percentiles (approximated)"]
900
- headers = ("Type", "Name") + tuple(get_readable_percentiles(PERCENTILES_TO_REPORT)) + ("# reqs",)
903
+ headers = ("Type", "Name", *tuple(get_readable_percentiles(PERCENTILES_TO_REPORT)), "# reqs")
901
904
  summary.append(
902
- (f"%-{str(STATS_TYPE_WIDTH)}s %-{str(STATS_NAME_WIDTH)}s %8s {' '.join(['%6s'] * len(PERCENTILES_TO_REPORT))}")
905
+ f"%-{STATS_TYPE_WIDTH!s}s %-{STATS_NAME_WIDTH!s}s %8s {' '.join(['%6s'] * len(PERCENTILES_TO_REPORT))}"
903
906
  % headers
904
907
  )
905
908
  separator = (
@@ -1008,7 +1011,8 @@ class StatsCSV:
1008
1011
  "Average Content Size",
1009
1012
  "Requests/s",
1010
1013
  "Failures/s",
1011
- ] + get_readable_percentiles(self.percentiles_to_report)
1014
+ *get_readable_percentiles(self.percentiles_to_report),
1015
+ ]
1012
1016
 
1013
1017
  self.failures_columns = [
1014
1018
  "Method",
@@ -1190,8 +1194,8 @@ class StatsCSVFileWriter(StatsCSV):
1190
1194
 
1191
1195
  def _stats_history_data_rows(self, csv_writer: CSVWriter, now: float) -> None:
1192
1196
  """
1193
- Write CSV rows with the *current* stats. By default only includes the
1194
- Aggregated stats entry, but if self.full_history is set to True, a row for each entry will
1197
+ Write CSV rows with the *current* stats. By default, only includes the
1198
+ Aggregated stats entry, but if self.full_history is set to True, a row for each entry
1195
1199
  will be included.
1196
1200
 
1197
1201
  Note that this method differs from the other methods as it appends time-stamped data to the file, whereas the other methods overwrites the data.
locust/user/__init__.py CHANGED
@@ -1,9 +1,9 @@
1
1
  __all__ = (
2
2
  "HttpUser",
3
- "tag",
4
- "task",
5
3
  "TaskSet",
6
4
  "User",
5
+ "tag",
6
+ "task",
7
7
  )
8
8
  from .task import TaskSet, tag, task
9
9
  from .users import HttpUser, User
locust/util/cache.py CHANGED
@@ -24,10 +24,8 @@ def memoize(timeout, dynamic_timeout=False):
24
24
  return cache["result"]
25
25
 
26
26
  def clear_cache():
27
- if "time" in cache:
28
- del cache["time"]
29
- if "result" in cache:
30
- del cache["result"]
27
+ cache.pop("time", None)
28
+ cache.pop("result", None)
31
29
 
32
30
  wrapper.clear_cache = clear_cache
33
31
  return wrapper
locust/util/date.py CHANGED
@@ -20,4 +20,4 @@ def format_duration(start_time, end_time):
20
20
 
21
21
  parts = [f"{value} {label}{'s' if value != 1 else ''}" for value, label in time_parts if value > 0]
22
22
 
23
- return " and ".join(filter(None, [", ".join(parts[:-1])] + parts[-1:])) if parts else "0 seconds"
23
+ return " and ".join(filter(None, [", ".join(parts[:-1]), *parts[-1:]])) if parts else "0 seconds"
@@ -8,7 +8,7 @@ def retry(delays=(1, 3, 5), exception=Exception):
8
8
  def decorator(function):
9
9
  def wrapper(*args, **kwargs):
10
10
  cnt = 0
11
- for delay in delays + (None,):
11
+ for delay in (*delays, None):
12
12
  try:
13
13
  return function(*args, **kwargs)
14
14
  except exception as e:
locust/web.py CHANGED
@@ -274,7 +274,7 @@ class WebUI:
274
274
  err_msg = f"Invalid user_count value: {value!r} (must be an integer)"
275
275
  logger.error(err_msg)
276
276
  return jsonify({"success": False, "message": err_msg, "host": environment.host})
277
- parsed_options_dict["users"] = user_count
277
+ parsed_options_dict["num_users"] = user_count
278
278
  case "spawn_rate":
279
279
  try:
280
280
  spawn_rate = float(value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: locust
3
- Version: 2.46.7.dev2
3
+ Version: 2.46.7.dev9
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
@@ -83,11 +83,12 @@ If you want your users to loop, perform some conditional behaviour or do some ca
83
83
  ```python
84
84
  from locust import HttpUser, task, between
85
85
 
86
+
86
87
  class QuickstartUser(HttpUser):
87
88
  wait_time = between(1, 2)
88
89
 
89
90
  def on_start(self):
90
- self.client.post("/login", json={"username":"foo", "password":"bar"})
91
+ self.client.post("/login", json={"username": "foo", "password": "bar"})
91
92
 
92
93
  @task
93
94
  def hello_world(self):
@@ -1,8 +1,8 @@
1
- locust/__init__.py,sha256=7UPHK7qByPd38tih5_arvidgJgdV9RDbkHCF8dzMPIg,1900
1
+ locust/__init__.py,sha256=30jHCIdubSbGFzns3gfHwSMkK23-d8p8EG0tCqixNgw,1900
2
2
  locust/__main__.py,sha256=vBQ82334kX06ImDbFlPFgiBRiLIinwNk3z8Khs6hd74,31
3
- locust/_version.py,sha256=Uv_QqWuRq45DiDvYoOzFf8lKSADcgM3kQDYKjiaGDWM,535
3
+ locust/_version.py,sha256=QP2OPgSgiXGwS8abWI1ugaFJ4BscI1-X46lwnAgsM_8,535
4
4
  locust/argument_parser.py,sha256=QU6CFpTNs3mLniuwu6kfxazNLZOEWfxpORGebxvXLvM,34607
5
- locust/clients.py,sha256=_6C_yZPNXnrvRnJsz7gEY3ujZBUhv4ho_v67pTLvUc8,23629
5
+ locust/clients.py,sha256=dPXyUhmO2JXGSAuOY-6m8GhP8GIM6dBxWNzNjBW9HAk,23679
6
6
  locust/debug.py,sha256=Rbajbb6ZsP3NuyXE1sQ1zPv81BgWX5-ntF_c-BVqmJE,5095
7
7
  locust/dispatch.py,sha256=rZB1lL45YJWLJw1A97er8XIIWtDKLPYjvHnrko5i5_c,16326
8
8
  locust/env.py,sha256=PypNHmEFBhGBk9dU6pZ2cL5L0TThYejaGWW16RO3ZNQ,13203
@@ -14,14 +14,14 @@ locust/log.py,sha256=5E2ZUOa3V4sfCqa-470Gle1Ik9L5nxYitsjEB9tRwE0,3455
14
14
  locust/main.py,sha256=WxoicVhPHwYfeN1fUAw4FAnSFatxoAhpLXExwnwYmQI,28805
15
15
  locust/opentelemetry.py,sha256=v0TUSGLka3s4bNdzzErRciIRshCpZfYOXc54TH4Labg,11464
16
16
  locust/py.typed,sha256=gkWLl8yD4mIZnNYYAIRM8g9VarLvWmTAFeUfEbxJLBw,65
17
- locust/runners.py,sha256=DpbfTJX6XdxALKQRVk-fRLBm86JeQfinCjFwM2mk3u0,72098
17
+ locust/runners.py,sha256=TUjlgsK9-PxeU_2Owni-9VKcgLtb-_Aaud88LBJmcJo,72060
18
18
  locust/shape.py,sha256=t-lwBS8LOjWcKXNL7j2U3zroIXJ1b0fazUwpRYQOKXw,1973
19
- locust/stats.py,sha256=dWrbDqm2uOgflhkJqDqw4WdxcLFx0lJ2yJMC5hP1QGc,49712
20
- locust/web.py,sha256=-s_o9-EIMnuAnm74tT5jxHeVZBDSxBJ2zVEE4Cf4AoY,33375
19
+ locust/stats.py,sha256=rHqUHPWy8w2KF_ZXTADk57xnqdOybvxKQokYII87jDQ,49757
20
+ locust/web.py,sha256=86DOiMzRnICkIKkIc7Ca9k2MW_imYsyXATUg8SqOFrE,33379
21
21
  locust/contrib/__init__.py,sha256=LtZN7MczpIAbZkN7PT2h8W2wgb9nBl6cDXbFCVsV4fo,290
22
22
  locust/contrib/csv_request_logger.py,sha256=uGtvEakPMYrf_we_P3IGEkhoOlwV-7cmwruZ6r2pDn8,5990
23
23
  locust/contrib/dns.py,sha256=cpw1bTppOBhIyT6SWn0-1Slr8tEKkemfAXHYjxYnB68,2070
24
- locust/contrib/fasthttp.py,sha256=oOElwNtJ92TIz_-Jp8XdJyhiE0QUSCY9SSvq57tcaCk,29264
24
+ locust/contrib/fasthttp.py,sha256=TPox4NNhEM2uvd6zwk6ZloDEyPJBSedxFFMZ4uc3ITM,29479
25
25
  locust/contrib/milvus.py,sha256=ebOIVo6-rO3hnAMPKzMyof5MQd7kxOZFMkBNZYOluYk,13015
26
26
  locust/contrib/mongodb.py,sha256=1seUYgJOaNKwybYOP9PUEVhgl8hGy-G33f8lFj3R8W8,1246
27
27
  locust/contrib/mqtt.py,sha256=YJ-wEykp4MHzq5rSTCIeblFTRHTpR4ckMfBXOlFKSFc,19345
@@ -32,7 +32,7 @@ locust/contrib/socketio.py,sha256=iznaDtXx7ytd60-_oJAb6tc9T26tJ-NcL6vLeTh-AtQ,32
32
32
  locust/rpc/__init__.py,sha256=5YOu-58XSnt-oWWNATgXLTNdYoDkkngwHNXprxkWKSM,99
33
33
  locust/rpc/protocol.py,sha256=n-rb3GZQcAlldYDj4E4GuFGylYj_26GSS5U29meft5Y,1282
34
34
  locust/rpc/zmqrpc.py,sha256=tMeLQiLII8QP29lAHGZsj5Pf5FsTL-X4wM0DrtR3ALw,3214
35
- locust/user/__init__.py,sha256=RgdRCflP2dIDcvwVMdhPQHAMhWVwQarQ9wWjF9HKk0w,151
35
+ locust/user/__init__.py,sha256=EGEaA0VwpG6W9aYjKy1_0a4M2JKQzAsudcxrvOq_wQM,151
36
36
  locust/user/inspectuser.py,sha256=nekMhVtb4qEFh4KHc_TN8ZVtYfVNXJVTgcwFqW18PXc,2601
37
37
  locust/user/markov_taskset.py,sha256=JWnlBG7wffXAea0wQEPGsoV1oQzDdqCABVEuffVh4rQ,11779
38
38
  locust/user/sequential_taskset.py,sha256=SbrrGU9HV2nEWe6zQVtjymn8NgPISP7QSNoVdyoXjYg,2687
@@ -40,11 +40,11 @@ locust/user/task.py,sha256=fZVBEUFKYSSmvxLbvIbRcu8sxl5SzbtL2d2EccmceOI,17388
40
40
  locust/user/users.py,sha256=kAybK8s2Qk3n4ELgknQS-Nvhp4NipWiAds1kzFe2gWI,15165
41
41
  locust/user/wait_time.py,sha256=SYAEkSLOSdh5IUH5_0qzrMgXICRCDPFYvwBykjHKfNw,3946
42
42
  locust/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- locust/util/cache.py,sha256=IxbpGawl0-hoWKvCrtksxjSLf2GbBBTVns06F7mFBkM,1062
44
- locust/util/date.py,sha256=auqVqr9DUd5ROPEznRKepwIhAavEb_k8An8K9ADa04c,819
43
+ locust/util/cache.py,sha256=qOkl56wx5zj4hVs6MTeEtWqfr31wRF8lRNxOc-2u5r8,1000
44
+ locust/util/date.py,sha256=F_2bF9jV6VP8KgX-k2dGFzWR3u7sln1umjVDwRZ_R44,819
45
45
  locust/util/deprecation.py,sha256=4my4IcFpbM6yEKr569GMUKMsS0ywp0N4JPhhwm3J1-w,2026
46
46
  locust/util/directory.py,sha256=2EeuVIIFEErm0OpNXdsEgQLx49jAXq-PvMj2uY0Mr8o,326
47
- locust/util/exception_handler.py,sha256=jTMyBq2a0O07fRjmqGkheyaPj58tUgnbbcjoesKGPws,797
47
+ locust/util/exception_handler.py,sha256=sbmqN8qVUvnskrkXXchX_uXWurFnwQBw48gynXgHp3s,796
48
48
  locust/util/load_locustfile.py,sha256=uz_ZqC-v8n-FzXzFAj81sik3vCgIqC0RPZ-YtoVpwX4,5187
49
49
  locust/util/rounding.py,sha256=a4SXx0OEDMM8ikzwa7qwki_EcH30gMxsQt8NKlqsb74,159
50
50
  locust/util/timespan.py,sha256=t0XptlzFHl_-IegbfbBCWfEF2SLAD0GgJsLO-uoGoxk,1016
@@ -61,8 +61,8 @@ locust/webui/dist/assets/terminal.gif,sha256=iw80LO2u0dnf4wpGfFJZauBeKTcSpw9iUfI
61
61
  locust/webui/dist/assets/testruns-dark.png,sha256=G4p2VZSBuuqF4neqUaPSshIp5OKQJ_Bvb69Luj6XuVs,125231
62
62
  locust/webui/dist/assets/testruns-light.png,sha256=JinGDiiBPOkhpfF-XCbmQqhRInqItrjrBTLKt5MlqVI,130301
63
63
  pytest_locust/plugin.py,sha256=3jr_5H_1SHCJTdQdgnTDJ-09r5jXzNKxJPkocfE9HF4,1669
64
- locust-2.46.7.dev2.dist-info/METADATA,sha256=EDjZ5BHAe1hg6Fyx3OqjyIwzg2FjQu_W8aAgneeol6Y,11434
65
- locust-2.46.7.dev2.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
66
- locust-2.46.7.dev2.dist-info/entry_points.txt,sha256=0uIHcQ71R1qaWhM_sd8uBUCCJgp7gJfGHUVMnJeZfcY,86
67
- locust-2.46.7.dev2.dist-info/licenses/LICENSE,sha256=AAANGesd1_0HEJhl9RQxus8hZUii4zSvcfNI5rxBkvw,1110
68
- locust-2.46.7.dev2.dist-info/RECORD,,
64
+ locust-2.46.7.dev9.dist-info/METADATA,sha256=eMV-pxfwvjdyxn1kbnwdRFGaCXOi-6-CSIXB5l9gQ3s,11437
65
+ locust-2.46.7.dev9.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
66
+ locust-2.46.7.dev9.dist-info/entry_points.txt,sha256=0uIHcQ71R1qaWhM_sd8uBUCCJgp7gJfGHUVMnJeZfcY,86
67
+ locust-2.46.7.dev9.dist-info/licenses/LICENSE,sha256=AAANGesd1_0HEJhl9RQxus8hZUii4zSvcfNI5rxBkvw,1110
68
+ locust-2.46.7.dev9.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.32.0
2
+ Generator: hatchling 1.32.4
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any