locust 2.47.1.dev2__tar.gz → 2.47.1.dev13__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.47.1.dev2 → locust-2.47.1.dev13}/PKG-INFO +3 -1
  2. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/_version.py +2 -2
  3. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/argument_parser.py +3 -3
  4. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/fasthttp.py +15 -14
  5. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/input_events.py +1 -1
  6. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/runners.py +1 -1
  7. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/pyproject.toml +16 -10
  8. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/.gitignore +0 -0
  9. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/LICENSE +0 -0
  10. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/README.md +0 -0
  11. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/hatch_build.py +0 -0
  12. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/__init__.py +0 -0
  13. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/__main__.py +0 -0
  14. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/clients.py +0 -0
  15. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/__init__.py +0 -0
  16. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/csv_request_logger.py +0 -0
  17. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/dns.py +0 -0
  18. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/milvus.py +0 -0
  19. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/mongodb.py +0 -0
  20. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/mqtt.py +0 -0
  21. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/oai.py +0 -0
  22. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/postgres.py +0 -0
  23. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/qdrant.py +0 -0
  24. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/socketio.py +0 -0
  25. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/debug.py +0 -0
  26. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/dispatch.py +0 -0
  27. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/env.py +0 -0
  28. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/event.py +0 -0
  29. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/exception.py +0 -0
  30. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/html.py +0 -0
  31. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/log.py +0 -0
  32. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/main.py +0 -0
  33. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/opentelemetry.py +0 -0
  34. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/py.typed +0 -0
  35. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/__init__.py +0 -0
  36. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/protocol.py +0 -0
  37. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/zmqrpc.py +0 -0
  38. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/shape.py +0 -0
  39. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/stats.py +0 -0
  40. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/__init__.py +0 -0
  41. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/inspectuser.py +0 -0
  42. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/markov_taskset.py +0 -0
  43. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/sequential_taskset.py +0 -0
  44. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/task.py +0 -0
  45. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/users.py +0 -0
  46. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/wait_time.py +0 -0
  47. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/__init__.py +0 -0
  48. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/cache.py +0 -0
  49. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/date.py +0 -0
  50. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/deprecation.py +0 -0
  51. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/directory.py +0 -0
  52. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/exception_handler.py +0 -0
  53. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/load_locustfile.py +0 -0
  54. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/rounding.py +0 -0
  55. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/timespan.py +0 -0
  56. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/url.py +0 -0
  57. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/web.py +0 -0
  58. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/favicon-dark.png +0 -0
  59. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/favicon-light.png +0 -0
  60. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/graphs-dark.png +0 -0
  61. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/graphs-light.png +0 -0
  62. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/src-Cl6CiemE.js +0 -0
  63. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/terminal.gif +0 -0
  64. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/testruns-dark.png +0 -0
  65. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/testruns-light.png +0 -0
  66. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/auth.html +0 -0
  67. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/index.html +0 -0
  68. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/report.html +0 -0
  69. {locust-2.47.1.dev2 → locust-2.47.1.dev13}/pytest_locust/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: locust
3
- Version: 2.47.1.dev2
3
+ Version: 2.47.1.dev13
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
@@ -25,6 +25,7 @@ Classifier: Topic :: Software Development :: Testing
25
25
  Classifier: Topic :: Software Development :: Testing :: Traffic Generation
26
26
  Classifier: Topic :: System :: Distributed Computing
27
27
  Requires-Python: >=3.11
28
+ Requires-Dist: certifi>=2026.10.19
28
29
  Requires-Dist: configargparse>=1.7.1
29
30
  Requires-Dist: flask-cors>=3.0.10
30
31
  Requires-Dist: flask-login>=0.6.3
@@ -40,6 +41,7 @@ Requires-Dist: pywin32; sys_platform == 'win32'
40
41
  Requires-Dist: pyzmq>=25.0.0
41
42
  Requires-Dist: requests>=2.33.1
42
43
  Requires-Dist: typing-extensions>=4.6.0; python_version < '3.12'
44
+ Requires-Dist: urllib3>=2.8.0
43
45
  Requires-Dist: werkzeug>=2.0.0
44
46
  Provides-Extra: dns
45
47
  Requires-Dist: dnspython>=2.8.0; 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.47.1.dev2'
22
- __version_tuple__ = version_tuple = (2, 47, 1, 'dev2')
21
+ __version__ = version = '2.47.1.dev13'
22
+ __version_tuple__ = version_tuple = (2, 47, 1, 'dev13')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -199,15 +199,15 @@ def download_locustfile_from_url(url: str) -> str:
199
199
  else:
200
200
  try:
201
201
  # Check if response is valid python code
202
- ast.parse(response.text)
202
+ ast.parse(response.content)
203
203
  except SyntaxError:
204
204
  sys.stderr.write(
205
205
  f"Failed to get locustfile from: {url}. Response was not valid python code: '{response.text[:100]}'"
206
206
  )
207
207
  sys.exit(1)
208
208
 
209
- with open(os.path.join(tempfile.gettempdir(), urlparse(url).path.split("/")[-1]), "w") as locustfile:
210
- locustfile.write(response.text)
209
+ with open(os.path.join(tempfile.gettempdir(), urlparse(url).path.split("/")[-1]), "wb") as locustfile:
210
+ locustfile.write(response.content)
211
211
 
212
212
  atexit.register(exit_handler, locustfile.name)
213
213
  return locustfile.name
@@ -267,7 +267,7 @@ class FastHttpSession:
267
267
 
268
268
  if not allow_redirects:
269
269
  old_redirect_response_codes = self.client.redirect_response_codes
270
- self.client.redirect_response_codes = frozenset()
270
+ self.client.redirect_response_codes = frozenset() # type: ignore
271
271
 
272
272
  start_perf_counter = time.perf_counter()
273
273
  # send request, and catch any exceptions
@@ -283,7 +283,7 @@ class FastHttpSession:
283
283
  }
284
284
 
285
285
  if not allow_redirects:
286
- self.client.redirect_response_codes = old_redirect_response_codes
286
+ self.client.redirect_response_codes = old_redirect_response_codes # type: ignore
287
287
 
288
288
  request_meta["response_length"] = 0 # default value, if length cannot be determined
289
289
 
@@ -291,7 +291,7 @@ class FastHttpSession:
291
291
  # the size from the content-length header, in order to not trigger fetching of the body
292
292
  if stream:
293
293
  if response.headers and "content-length" in response.headers:
294
- request_meta["response_length"] = int(response.headers["content-length"])
294
+ request_meta["response_length"] = int(response.headers["content-length"]) # type: ignore
295
295
  else:
296
296
  try:
297
297
  request_meta["response_length"] = len(response.content) if response.content else 0
@@ -468,10 +468,10 @@ class FastRequest(CompatRequest):
468
468
 
469
469
 
470
470
  class FastResponse(CompatResponse):
471
- headers: Headers | None = None
471
+ headers: Headers | None = None # type: ignore
472
472
  """Dict like object containing the response headers"""
473
473
 
474
- _response: HTTPSocketPoolResponse | None = None
474
+ _response: HTTPSocketPoolResponse | None = None # type: ignore
475
475
 
476
476
  encoding: str | float | None = None
477
477
  """In some cases setting the encoding explicitly is needed. If so, do it before calling .text"""
@@ -489,7 +489,7 @@ class FastResponse(CompatResponse):
489
489
  self.request = request
490
490
 
491
491
  @property
492
- def text(self) -> str | None:
492
+ def text(self) -> str | None: # type: ignore
493
493
  """
494
494
  Returns the text content of the response as a decoded string
495
495
  """
@@ -500,7 +500,7 @@ class FastResponse(CompatResponse):
500
500
  # No information, try to detect
501
501
  self.encoding = detect(self.content)["encoding"]
502
502
  else:
503
- self.encoding = get_encoding_from_headers(self.headers)
503
+ self.encoding = get_encoding_from_headers(self.headers) # type: ignore
504
504
  # No information, try to detect
505
505
  if not self.encoding:
506
506
  self.encoding = detect(self.content)["encoding"]
@@ -574,7 +574,7 @@ class FastResponse(CompatResponse):
574
574
  """Returns True if :attr:`status_code` is less than 400, False if not."""
575
575
  return self.status_code < 400
576
576
 
577
- def _content(self):
577
+ def _content(self): # type: ignore
578
578
  if self.headers is None:
579
579
  return None
580
580
  return super()._content()
@@ -597,18 +597,19 @@ class ErrorResponse(FastResponse): # we're really just pretending to be a FastR
597
597
  """
598
598
 
599
599
  headers: Headers | None = None
600
- content = None
601
- status_code = 0
600
+ content = None # type: ignore
601
+ status_code = 0 # type: ignore
602
602
  error: Exception | None = None
603
- text: str | None = None
604
- request: CompatRequest
603
+ text: str | None = None # type: ignore
604
+ request: CompatRequest # type: ignore
605
605
 
606
606
  def __init__(self, request: CompatRequest, error: Exception):
607
- self.request = request
607
+ self.request = request # type: ignore
608
608
  self.error = error
609
609
 
610
610
  def raise_for_status(self):
611
- raise self.error
611
+ if self.error:
612
+ raise self.error
612
613
 
613
614
 
614
615
  class LocustBadStatusCode(ConnectionError):
@@ -41,7 +41,7 @@ class UnixKeyPoller:
41
41
  termios.tcsetattr(self.stdin, termios.TCSANOW, self.tattr)
42
42
 
43
43
  def poll(_self):
44
- dr, dw, de = select.select([sys.stdin], [], [], 0)
44
+ dr, _dw, _de = select.select([sys.stdin], [], [], 0)
45
45
  if not dr == []:
46
46
  return sys.stdin.read(1)
47
47
  return None
@@ -577,7 +577,7 @@ class LocalRunner(Runner):
577
577
  """
578
578
  logger.debug(f"Running locally: sending {msg_type} message to self")
579
579
  if msg_type in self.custom_messages:
580
- listener, concurrent = self.custom_messages[msg_type]
580
+ listener, _concurrent = self.custom_messages[msg_type]
581
581
  msg = Message(msg_type, data, "local")
582
582
  listener(environment=self.environment, msg=msg)
583
583
  else:
@@ -49,6 +49,9 @@ dependencies = [
49
49
  "python-socketio[client]>=5.13.0",
50
50
  "python-engineio>=4.12.2",
51
51
  "pytest>=8.3.3,<10",
52
+ # these are already indirect dependencies, but good to have because of eMudhra
53
+ "certifi>=2026.10.19",
54
+ "urllib3>=2.8.0",
52
55
  ]
53
56
 
54
57
  [project.optional-dependencies]
@@ -80,11 +83,11 @@ test = [
80
83
  "retry>=0.9.2,<1.0.0",
81
84
  ]
82
85
  lint = [
83
- "pre-commit>=4.5.0,<5.0.0",
84
- "ruff==0.16.8",
86
+ "pre-commit>=4.7.0,<5.0.0",
87
+ "ruff==0.17.2",
85
88
  "mypy>=1.13.0,<1.15.0",
86
89
  "types-requests==2.33.0.20260906",
87
- "typos>=1.50.3"
90
+ "typos>=1.51.1"
88
91
  ]
89
92
  release = ["twine>=5.1.1,<6.0.0"]
90
93
  docs = [
@@ -117,13 +120,17 @@ milvus = ["pymilvus>=2.5.0"]
117
120
  mqtt = ["paho-mqtt>=2.1.0"]
118
121
  dns = ["dnspython>=2.8.0"]
119
122
  otel = [
120
- "opentelemetry-sdk>=1.38.0",
121
- "opentelemetry-exporter-otlp-proto-grpc>=1.38.0",
122
- "opentelemetry-exporter-otlp-proto-http>=1.38.0",
123
- "opentelemetry-instrumentation-requests>=0.59b0",
124
- "opentelemetry-instrumentation-urllib3>=0.59b0",
123
+ "opentelemetry-sdk>=1.45.1",
124
+ "opentelemetry-exporter-otlp-proto-grpc>=1.45.1",
125
+ "opentelemetry-exporter-otlp-proto-http>=1.45.1",
126
+ "opentelemetry-instrumentation-requests>=0.66b1",
127
+ "opentelemetry-instrumentation-urllib3>=0.66b1",
128
+ "opentelemetry-api>=1.45.1",
125
129
  ]
126
130
  qdrant = ["qdrant-client>=1.16.2"]
131
+ pymongo = [
132
+ "pymongo>=4.18.2",
133
+ ]
127
134
 
128
135
  [project.scripts]
129
136
  locust = "locust.main:main"
@@ -159,7 +166,7 @@ extend-exclude = [
159
166
  "src/readthedocs-sphinx-search/",
160
167
  "examples/grpc/hello_pb2*.py",
161
168
  ]
162
- lint.ignore = ["E402", "E501", "E713", "E731", "E741", "UP031", "PERF203", "RUF012", "RUF059", "RUF015"]
169
+ lint.ignore = ["E402", "E501", "E713", "E731", "E741", "UP031", "PERF203", "RUF012", "RUF015"]
163
170
  lint.select = ["E", "F", "W", "UP", "FA102", "I001", "FURB", "PERF", "RUF"]
164
171
  lint.dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?)|resp)$"
165
172
 
@@ -298,5 +305,4 @@ filterwarnings = [
298
305
  # "This process is multi-threaded, use of fork() may lead to deadlocks in the child." started happening in Python 3.12
299
306
  # It could potentially be a real issue, but I don't think
300
307
  "ignore::DeprecationWarning:gevent",
301
-
302
308
  ]
File without changes
File without changes
File without changes