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.
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/PKG-INFO +3 -1
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/_version.py +2 -2
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/argument_parser.py +3 -3
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/fasthttp.py +15 -14
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/input_events.py +1 -1
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/runners.py +1 -1
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/pyproject.toml +16 -10
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/.gitignore +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/LICENSE +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/README.md +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/hatch_build.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/__init__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/__main__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/clients.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/__init__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/dns.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/milvus.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/mongodb.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/mqtt.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/oai.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/postgres.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/qdrant.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/contrib/socketio.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/debug.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/dispatch.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/env.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/event.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/exception.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/html.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/log.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/main.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/opentelemetry.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/py.typed +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/__init__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/protocol.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/shape.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/stats.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/__init__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/inspectuser.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/markov_taskset.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/sequential_taskset.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/task.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/users.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/user/wait_time.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/__init__.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/cache.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/date.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/deprecation.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/directory.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/exception_handler.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/load_locustfile.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/rounding.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/timespan.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/util/url.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/web.py +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/src-Cl6CiemE.js +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/auth.html +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/index.html +0 -0
- {locust-2.47.1.dev2 → locust-2.47.1.dev13}/locust/webui/dist/report.html +0 -0
- {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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 47, 1, '
|
|
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.
|
|
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]), "
|
|
210
|
-
locustfile.write(response.
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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.
|
|
84
|
-
"ruff==0.
|
|
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.
|
|
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.
|
|
121
|
-
"opentelemetry-exporter-otlp-proto-grpc>=1.
|
|
122
|
-
"opentelemetry-exporter-otlp-proto-http>=1.
|
|
123
|
-
"opentelemetry-instrumentation-requests>=0.
|
|
124
|
-
"opentelemetry-instrumentation-urllib3>=0.
|
|
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", "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|