Full Code of locustio/locust for AI

master 9de4b47e81d4 cached
389 files
4.6 MB
1.2M tokens
8306 symbols
1 requests
Download .txt
Showing preview only (4,937K chars total). Download the full file or copy to clipboard to get everything.
Repository: locustio/locust
Branch: master
Commit: 9de4b47e81d4
Files: 389
Total size: 4.6 MB

Directory structure:
gitextract_78ea2ktw/

├── .dockerignore
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yaml
│   └── workflows/
│       ├── stale.yml
│       └── tests.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── launch_locust.json
│   └── settings.json
├── CHANGELOG.md
├── Dockerfile
├── Dockerfile.ci
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── Vagrantfile
├── benchmarks/
│   └── dispatch.py
├── docs/
│   ├── _static/
│   │   └── theme-overrides.css
│   ├── _templates/
│   │   └── footer.html
│   ├── api.rst
│   ├── changelog.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── custom-load-shape.rst
│   ├── developing-locust.rst
│   ├── extending-locust.rst
│   ├── extensions.rst
│   ├── faq.rst
│   ├── further-reading.rst
│   ├── history.rst
│   ├── increase-performance.rst
│   ├── increasing-request-rate.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── kubernetes-operator.rst
│   ├── logging.rst
│   ├── quickstart.rst
│   ├── retrieving-stats.rst
│   ├── running-distributed.rst
│   ├── running-in-debugger.rst
│   ├── running-in-docker.rst
│   ├── running-without-web-ui.rst
│   ├── tasksets.rst
│   ├── telemetry.rst
│   ├── testing-other-systems.rst
│   ├── use-as-lib.rst
│   ├── vscode-extension.rst
│   ├── what-is-locust.rst
│   └── writing-a-locustfile.rst
├── examples/
│   ├── add_command_line_argument.py
│   ├── basic.py
│   ├── bottlenecked_server.py
│   ├── browse_docs_sequence_test.py
│   ├── browse_docs_test.py
│   ├── csrf_form_authentication.py
│   ├── custom_messages.py
│   ├── custom_shape/
│   │   ├── double_wave.py
│   │   ├── stages.py
│   │   ├── staging_user_classes.py
│   │   ├── step_load.py
│   │   └── wait_user_count.py
│   ├── custom_wait_function.py
│   ├── custom_xmlrpc_client/
│   │   ├── server.py
│   │   └── xmlrpc_locustfile.py
│   ├── debugging.py
│   ├── debugging_advanced.py
│   ├── dispatch_test_scripts/
│   │   ├── locustfile.py
│   │   ├── run-disributed-headless.sh
│   │   ├── run-disributed-web.sh
│   │   ├── run-local-headless.sh
│   │   └── run-local-web.sh
│   ├── dns_ex.py
│   ├── docker-compose/
│   │   └── docker-compose.yml
│   ├── dynamic_user_credentials.py
│   ├── events.py
│   ├── extend_web_ui.py
│   ├── fast_http_locust.py
│   ├── grpc/
│   │   ├── grpc_user.py
│   │   ├── hello.proto
│   │   ├── hello_pb2.py
│   │   ├── hello_pb2_grpc.py
│   │   ├── hello_server.py
│   │   └── locustfile.py
│   ├── locustfile.py
│   ├── manual_stats_reporting.py
│   ├── markov_taskset.py
│   ├── milvus/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── mongodb/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── mqtt/
│   │   ├── README.md
│   │   ├── locustfile.py
│   │   ├── locustfile_custom_mqtt_client.py
│   │   └── mosquitto_config/
│   │       └── mosquitto.conf
│   ├── multiple_hosts.py
│   ├── nested_inline_tasksets.py
│   ├── open_closed_workload.py
│   ├── openai_ex.py
│   ├── postgres/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── qdrant/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── response_validations.py
│   ├── rest.py
│   ├── sdk_session_patching/
│   │   └── session_patch_locustfile.py
│   ├── semaphore_wait.py
│   ├── socketio/
│   │   ├── echo_server.py
│   │   └── socketio_ex.py
│   ├── stop_on_threshold.py
│   ├── terraform/
│   │   └── aws/
│   │       ├── README.md
│   │       ├── data_subnet.tf
│   │       ├── main.tf
│   │       ├── output.tf
│   │       ├── plan/
│   │       │   └── basic.py
│   │       ├── provisioner.tf
│   │       └── variables.tf
│   ├── test_data_management.py
│   ├── test_pytest.py
│   ├── testdata_from_csv.csv
│   ├── testdata_from_csv.py
│   ├── use_as_lib.py
│   ├── vagrant/
│   │   ├── README.md
│   │   └── supervisord.conf
│   ├── web_ui_auth/
│   │   ├── basic.py
│   │   └── custom_form.py
│   ├── web_ui_cache_stats.py
│   ├── worker_index.py
│   └── x-forwarded-for.py
├── generate_changelog.py
├── hatch_build.py
├── locust/
│   ├── __init__.py
│   ├── __main__.py
│   ├── argument_parser.py
│   ├── clients.py
│   ├── contrib/
│   │   ├── __init__.py
│   │   ├── dns.py
│   │   ├── fasthttp.py
│   │   ├── milvus.py
│   │   ├── mongodb.py
│   │   ├── mqtt.py
│   │   ├── oai.py
│   │   ├── postgres.py
│   │   ├── qdrant.py
│   │   └── socketio.py
│   ├── debug.py
│   ├── dispatch.py
│   ├── env.py
│   ├── event.py
│   ├── exception.py
│   ├── html.py
│   ├── input_events.py
│   ├── log.py
│   ├── main.py
│   ├── opentelemetry.py
│   ├── py.typed
│   ├── rpc/
│   │   ├── __init__.py
│   │   ├── protocol.py
│   │   └── zmqrpc.py
│   ├── runners.py
│   ├── shape.py
│   ├── stats.py
│   ├── test/
│   │   ├── __init__.py
│   │   ├── fake_module1_for_env_test.py
│   │   ├── fake_module2_for_env_test.py
│   │   ├── subprocess_utils.py
│   │   ├── test_date.py
│   │   ├── test_debugging.py
│   │   ├── test_dispatch.py
│   │   ├── test_env.py
│   │   ├── test_fasthttp.py
│   │   ├── test_html_filename.py
│   │   ├── test_http.py
│   │   ├── test_interruptable_task.py
│   │   ├── test_load_locustfile.py
│   │   ├── test_locust_class.py
│   │   ├── test_log.py
│   │   ├── test_main.py
│   │   ├── test_markov_taskset.py
│   │   ├── test_old_wait_api.py
│   │   ├── test_parser.py
│   │   ├── test_pytest_locustfile.py
│   │   ├── test_runners.py
│   │   ├── test_sequential_taskset.py
│   │   ├── test_socketio.py
│   │   ├── test_stats.py
│   │   ├── test_tags.py
│   │   ├── test_taskratio.py
│   │   ├── test_users.py
│   │   ├── test_util.py
│   │   ├── test_wait_time.py
│   │   ├── test_web.py
│   │   ├── test_zmqrpc.py
│   │   ├── testcases.py
│   │   └── util.py
│   ├── user/
│   │   ├── __init__.py
│   │   ├── inspectuser.py
│   │   ├── markov_taskset.py
│   │   ├── sequential_taskset.py
│   │   ├── task.py
│   │   ├── users.py
│   │   └── wait_time.py
│   ├── util/
│   │   ├── __init__.py
│   │   ├── cache.py
│   │   ├── date.py
│   │   ├── deprecation.py
│   │   ├── directory.py
│   │   ├── exception_handler.py
│   │   ├── load_locustfile.py
│   │   ├── rounding.py
│   │   ├── timespan.py
│   │   └── url.py
│   ├── web.py
│   └── webui/
│       ├── .gitignore
│       ├── .prettierrc
│       ├── .yarn/
│       │   └── releases/
│       │       └── yarn-4.12.0.cjs
│       ├── .yarnrc.yml
│       ├── LICENSE
│       ├── README.md
│       ├── auth.html
│       ├── dev.html
│       ├── eslint.config.mjs
│       ├── index.html
│       ├── package.json
│       ├── package.tgz
│       ├── report.html
│       ├── src/
│       │   ├── App.test.tsx
│       │   ├── App.tsx
│       │   ├── HtmlReport.tsx
│       │   ├── assets/
│       │   │   └── Logo.tsx
│       │   ├── components/
│       │   │   ├── DataTable/
│       │   │   │   ├── DataTable.test.tsx
│       │   │   │   └── DataTable.tsx
│       │   │   ├── ExceptionsTab/
│       │   │   │   └── ExceptionsTab.tsx
│       │   │   ├── ExceptionsTable/
│       │   │   │   ├── ExceptionsTable.tsx
│       │   │   │   └── ExceptionsTableContainer.tsx
│       │   │   ├── FadeInBox.tsx
│       │   │   ├── FailuresTable/
│       │   │   │   ├── FailuresTable.tsx
│       │   │   │   └── FailuresTableContainer.tsx
│       │   │   ├── FallbackRender/
│       │   │   │   ├── FallbackRender.test.tsx
│       │   │   │   └── FallbackRender.tsx
│       │   │   ├── Form/
│       │   │   │   ├── CustomInput.tsx
│       │   │   │   ├── Form.tsx
│       │   │   │   ├── NumericField.tsx
│       │   │   │   ├── PasswordField.tsx
│       │   │   │   ├── Select.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── CustomInput.test.tsx
│       │   │   │       ├── Form.test.tsx
│       │   │   │       ├── NumericField.test.tsx
│       │   │   │       ├── PasswordField.test.tsx
│       │   │   │       └── Select.test.tsx
│       │   │   ├── Layout/
│       │   │   │   ├── Footer/
│       │   │   │   │   ├── About.tsx
│       │   │   │   │   └── Footer.tsx
│       │   │   │   ├── Layout.tsx
│       │   │   │   └── Navbar/
│       │   │   │       ├── DarkLightToggle.tsx
│       │   │   │       ├── Navbar.tsx
│       │   │   │       ├── SwarmMonitor.test.tsx
│       │   │   │       └── SwarmMonitor.tsx
│       │   │   ├── LineChart/
│       │   │   │   ├── LineChart.constants.ts
│       │   │   │   ├── LineChart.tsx
│       │   │   │   ├── LineChart.types.ts
│       │   │   │   ├── LineChart.utils.ts
│       │   │   │   └── tests/
│       │   │   │       ├── LineChart.mocks.ts
│       │   │   │       ├── LineChart.test.tsx
│       │   │   │       └── LineChartUtils.test.tsx
│       │   │   ├── LogViewer/
│       │   │   │   ├── LogDisplay.tsx
│       │   │   │   ├── LogViewer.tsx
│       │   │   │   ├── LogViewer.utils.tsx
│       │   │   │   ├── WorkerLogs.tsx
│       │   │   │   ├── tests/
│       │   │   │   │   ├── LogViewer.test.tsx
│       │   │   │   │   ├── WorkerLogs.test.tsx
│       │   │   │   │   └── useLogViewer.test.tsx
│       │   │   │   └── useLogViewer.ts
│       │   │   ├── Modal/
│       │   │   │   └── Modal.tsx
│       │   │   ├── Reports/
│       │   │   │   ├── Reports.test.tsx
│       │   │   │   └── Reports.tsx
│       │   │   ├── ResponseTimeTable/
│       │   │   │   ├── ResponseTimeTable.test.tsx
│       │   │   │   └── ResponseTimeTable.tsx
│       │   │   ├── StateButtons/
│       │   │   │   ├── EditButton.tsx
│       │   │   │   ├── NewTestButton.tsx
│       │   │   │   ├── ResetButton.tsx
│       │   │   │   ├── StateButtons.tsx
│       │   │   │   ├── StopButton.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── ResetButton.test.tsx
│       │   │   │       ├── StateButtons.test.tsx
│       │   │   │       └── StopButton.test.tsx
│       │   │   ├── StatsTable/
│       │   │   │   ├── StatsTable.tsx
│       │   │   │   └── StatsTableContainer.tsx
│       │   │   ├── SwarmCharts/
│       │   │   │   ├── SwarmCharts.tsx
│       │   │   │   └── SwarmChartsContainer.tsx
│       │   │   ├── SwarmForm/
│       │   │   │   ├── LoadingButton.tsx
│       │   │   │   ├── SwarmCustomParameters.tsx
│       │   │   │   ├── SwarmForm.tsx
│       │   │   │   ├── SwarmUserClassPicker.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── SwarmCustomParameters.test.tsx
│       │   │   │       ├── SwarmForm.test.tsx
│       │   │   │       └── SwarmUserClassPicker.test.tsx
│       │   │   ├── SwarmRatios/
│       │   │   │   ├── SwarmRatios.test.tsx
│       │   │   │   ├── SwarmRatios.tsx
│       │   │   │   └── SwarmRatiosContainer.tsx
│       │   │   ├── SwarmRatiosTab/
│       │   │   │   └── SwarmRatiosTab.tsx
│       │   │   ├── Table/
│       │   │   │   ├── Table.test.tsx
│       │   │   │   └── Table.tsx
│       │   │   ├── Tabs/
│       │   │   │   ├── Tabs.constants.tsx
│       │   │   │   ├── Tabs.test.tsx
│       │   │   │   └── Tabs.tsx
│       │   │   ├── ViewColumnSelector/
│       │   │   │   ├── ViewColumnSelector.test.tsx
│       │   │   │   └── ViewColumnSelector.tsx
│       │   │   └── WorkersTable/
│       │   │       └── WorkersTable.tsx
│       │   ├── constants/
│       │   │   ├── auth.ts
│       │   │   ├── logs.ts
│       │   │   ├── swarm.ts
│       │   │   └── theme.ts
│       │   ├── global.d.ts
│       │   ├── hooks/
│       │   │   ├── tests/
│       │   │   │   ├── useFetchExceptions.test.tsx
│       │   │   │   ├── useFetchStats.test.tsx
│       │   │   │   ├── useFetchTasks.test.tsx
│       │   │   │   ├── useNotifications.test.tsx
│       │   │   │   ├── useSelecteViewColumns.test.tsx
│       │   │   │   └── useSortByField.test.tsx
│       │   │   ├── useCreateTheme.ts
│       │   │   ├── useFetchExceptions.ts
│       │   │   ├── useFetchStats.ts
│       │   │   ├── useFetchTasks.ts
│       │   │   ├── useFetchWorkerCount.ts
│       │   │   ├── useForm.ts
│       │   │   ├── useInterval.ts
│       │   │   ├── useNotifications.ts
│       │   │   ├── useSelectViewColumns.ts
│       │   │   └── useSortByField.ts
│       │   ├── images.d.ts
│       │   ├── index.tsx
│       │   ├── lib.tsx
│       │   ├── pages/
│       │   │   ├── Auth.tsx
│       │   │   ├── Dashboard.tsx
│       │   │   ├── HtmlReport.tsx
│       │   │   └── tests/
│       │   │       ├── Auth.test.tsx
│       │   │       ├── Dashboard.test.tsx
│       │   │       └── HtmlReport.test.tsx
│       │   ├── redux/
│       │   │   ├── api/
│       │   │   │   └── swarm.ts
│       │   │   ├── hooks.ts
│       │   │   ├── slice/
│       │   │   │   ├── logViewer.slice.ts
│       │   │   │   ├── notification.slice.ts
│       │   │   │   ├── root.slice.ts
│       │   │   │   ├── swarm.slice.ts
│       │   │   │   ├── tests/
│       │   │   │   │   └── ui.slice.test.ts
│       │   │   │   ├── theme.slice.ts
│       │   │   │   ├── ui.slice.ts
│       │   │   │   └── url.slice.ts
│       │   │   ├── store.ts
│       │   │   └── utils.ts
│       │   ├── styles/
│       │   │   └── theme.ts
│       │   ├── test/
│       │   │   ├── constants.ts
│       │   │   ├── mocks/
│       │   │   │   ├── statsRequest.mock.ts
│       │   │   │   └── swarmState.mock.ts
│       │   │   ├── setup.ts
│       │   │   └── testUtils.tsx
│       │   ├── types/
│       │   │   ├── auth.types.ts
│       │   │   ├── form.types.ts
│       │   │   ├── swarm.types.ts
│       │   │   ├── tab.types.ts
│       │   │   ├── table.types.ts
│       │   │   ├── ui.types.ts
│       │   │   └── window.types.ts
│       │   └── utils/
│       │       ├── array.ts
│       │       ├── date.ts
│       │       ├── number.ts
│       │       ├── object.ts
│       │       ├── string.ts
│       │       ├── tests/
│       │       │   ├── number.test.ts
│       │       │   ├── object.test.ts
│       │       │   ├── string.test.ts
│       │       │   └── url.test.ts
│       │       └── url.ts
│       ├── tsconfig.json
│       ├── vite.config.ts
│       ├── vite.lib.config.ts
│       ├── vite.report.config.ts
│       └── vitest.config.ts
├── package.json
├── pyproject.toml
└── pytest_locust/
    └── plugin.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
locust.egg-info/**
locustio.egg-info/**
build/
.coverage
docs/_build
# Dockerfile # We'd like to ignore this, but it messes up scm_version's detection because it thinks the checkout is dirty


================================================
FILE: .git-blame-ignore-revs
================================================
# Migrate code style to Black
7c0fcc213d3988f6e7c6ffef63b24afe00e5fbd9
2e7a8b5697a98d1d314d6fc3ef0589f81f09d7fe
# upgrade code style to 3.6 using pyupgrade
6ec972f4dbb880bf0c7a11809e6c1ba194c9784c
# upgrade code style to use f-strings using flynt
313b80f27f525441c449593a3aeaf38389f63c13
# upgrade typing annotations using fix-future-annotations
b5324820b299b1fe7da0608f0cc8ec47f58b1e40
# upgrade code style to 3.8 using pyupgrade
60f3bceacc4ab9567433d40ae3ed280750f55ff1
# sort imports using ruff
f99e9df700a8020e4c1967eb42dcb37ddd26e296
# apply ruff 0.3.0
64428a0b4dfc75a00b175b4231db33704d8f5d36
# apply ruff 0.10.0
92268e16d5666d429ccea1742ecb90475f284c89
496c5bd40347b97f917ccacfaf57ceed8f6690b5


================================================
FILE: .gitattributes
================================================
# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto

# Explicitly declare text files we want to always be normalized and converted 
# to native line endings on checkout.
*.c text
*.h text
*.py text
*.js text
*.rst text
*.css text
*.html text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary


================================================
FILE: .github/CONTRIBUTING.md
================================================
## Release Process

 * Install github_changelog_generator (https://github.com/github-changelog-generator/github-changelog-generator/) if not installed 
 * Run github_changelog_generator to update `CHANGELOG.md`
  - `make changelog`
 * Update `locust/__init__.py` with new version number: `__version__ = "VERSION"`
 * Make git tag
 * Push git tag
 * Update Automated Builds configuration in Docker Hub so that the newly created 
   git tag is built as the "latest" docker tag


================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: Bug
description: Report an error
labels: ["bug"]
body:
  - type: checkboxes
    attributes:
      label: Prerequisites
      options:
        - label: I am using [the latest version of Locust](https://github.com/locustio/locust/releases/)
          required: true
        - label: I am reporting a bug, not asking a question
          required: true

  - type: markdown
    attributes:
      value: |
        If you just need help with something, then:

         * [Check the documentation](https://docs.locust.io/en/stable/)
         * [Check the FAQ in the wiki](https://github.com/locustio/locust/wiki/FAQ) 
         * [Check the Github Discussions](https://github.com/orgs/locustio/discussions) 
         * Search [Stack Overflow](https://stackoverflow.com/questions/tagged/locust), or [ask there](https://stackoverflow.com/questions/ask) yourself. If you tag your question with `locust` we will see it.
         * Ask on [Locust's slack](https://locustio.slack.com) [(sign up here)](https://communityinviter.com/apps/locustio/locust)

  - type: textarea
    attributes:
      label: Description
      description: What happened, and what did you want/expect to happen?
    validations:
      required: true

  - type: input
    attributes:
      label: Command line
      description: |
        For example: locust -f mylocustfile.py -t 10s --headless
    validations:
      required: true

  - type: textarea
    attributes:
      label: Locustfile contents
      description: Please remove everything that isn't necessary to trigger the issue.
      render: python3
    validations:
      required: true

  - type: input
    attributes:
      label: Python version
    validations:
      required: true

  - type: input
    attributes:
      label: Locust version
    validations:
      required: true

  - type: input
    attributes:
      label: Operating system
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an improvement
labels: ["feature request"]
body:
  - type: checkboxes
    attributes:
      label: Prerequisites
      options:
        - label: I am using [the latest version of Locust](https://github.com/locustio/locust/releases/)
          required: true
        - label: I am suggesting a new feature, not asking a question
          required: true

  - type: markdown
    attributes:
      value: |
        If you just need help with something, then:

         * [Check the documentation](https://docs.locust.io/en/stable/)
         * [Check the FAQ in the wiki](https://github.com/locustio/locust/wiki/FAQ) 
         * [Check the Github Discussions](https://github.com/orgs/locustio/discussions) 
         * Search [Stack Overflow](https://stackoverflow.com/questions/tagged/locust), or [ask there](https://stackoverflow.com/questions/ask) yourself. If you tag your question with `locust` we will see it.
         * Ask on [Locust's slack](https://locustio.slack.com) [(sign up here)](https://communityinviter.com/apps/locustio/locust)

  - type: textarea
    attributes:
      label: Description
      description: Describe what feature you are missing, and what alternatives you have considered.
    validations:
      required: true


================================================
FILE: .github/dependabot.yaml
================================================
version: 2

updates:
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: semiannually
    groups:
      all_dependencies:
        patterns:
          - "*"

  - package-ecosystem: uv
    directory: /
    schedule:
      interval: semiannually

  - package-ecosystem: npm
    directory: /locust/webui
    schedule:
      interval: semiannually
    groups:
      eslint:
        patterns:
          - "*eslint*"
      vite:
        patterns:
          - "*vite*"
      react:
        patterns:
          - "*react*"
      emotion:
        patterns:
          - "*emotion*"
      mui:
        patterns:
          - "*mui*"


================================================
FILE: .github/workflows/stale.yml
================================================
name: Mark stale issues

on:
  schedule:
    - cron: "30 1 * * *"
  workflow_dispatch:

permissions:
  contents: read

jobs:
  stale:
    permissions:
      issues: write  # for actions/stale to close stale issues
      pull-requests: write  # for actions/stale to close stale PRs
    runs-on: ubuntu-latest

    steps:
      - uses: actions/stale@v10
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          stale-issue-message: "This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 20 days."
          close-issue-message: "This issue was closed because it has been marked stale for 20 days with no activity. This does not necessarily mean that the issue is bad, but it most likely means that nobody is willing to take the time to fix it. If you have found Locust useful, then consider contributing a fix yourself!"
          stale-pr-message: "This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 20 days."
          close-pr-message: "This PR was closed because it has been marked stale for 20 days with no activity."
          days-before-close: 20


================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests

on:
  push:
    branches:
      - master
    tags:
      - "*"
    paths-ignore:
      - "**.md"
  pull_request:
    paths-ignore:
      - "**.md"

permissions:
  contents: read

defaults:
  run:
    shell: bash

jobs:
  #-------------------------
  #       Building
  #-------------------------

  build_package:
    name: Build and Cache Packages
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.set_tag.outputs.tag }}
      tag_short: ${{ steps.set_tag_short.outputs.tag_short }}
      branch: ${{ steps.set_branch.outputs.branch }}
      is_merge_commit: ${{ steps.set_is_merge_commit.outputs.is_merge_commit }}
      is_tag_build: ${{ steps.set_is_tag_build.outputs.is_tag_build }}
      python_version: ${{ steps.set_python_version.outputs.python_version }}

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          fetch-tags: true

      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"

      - uses: astral-sh/setup-uv@v7
        with:
          version: "0.9.7"
          enable-cache: true
          cache-dependency-glob: |
            "pyproject.toml"
            "uv.lock"

      - run: uv venv

      #   # ensure uv.lock doesnt contain anything not in pyproject.toml
      #   - run: uv lock --check

      - name: Install the project
        run: uv sync

      # any local changes would make hatch-vcs set a "local version" (+dev0...), so we ignore any uv.lock updates:
      - run: git update-index --assume-unchanged uv.lock

      # Install node and yarn in order to build the front end during packaging
      - name: Set Node.js 22.x
        uses: actions/setup-node@v6
        with:
          node-version: 22.x
          cache: "yarn"
          cache-dependency-path: locust/webui/yarn.lock

      # Build and upload the project artifacts only once
      - name: Build Python project and front end
        run: uv build

      - name: Upload Python dist as Artifact
        uses: actions/upload-artifact@v7
        with:
          name: python-dist
          path: dist/*

      - name: Upload Web UI as Artifact
        uses: actions/upload-artifact@v7
        with:
          name: webui-dist
          path: locust/webui/dist/*

      - name: Build UI library
        run: yarn webui:build:lib

      - name: Upload web UI library as Artifact
        uses: actions/upload-artifact@v7
        with:
          name: webui-lib-dist
          path: locust/webui/lib

      # Set workflow metadata in one place so we can pull it out later
      - id: set_tag
        run: echo "tag=$(uv run hatch version)" | tee -a "$GITHUB_OUTPUT"
      - id: set_tag_short
        run: echo "tag_short=$(uv run hatch version | cut -d '.' -f1-3)" | tee -a "$GITHUB_OUTPUT"
      - id: set_branch
        run: echo "branch=${{ github.head_ref || github.ref_name }}" | tee -a "$GITHUB_OUTPUT"
      - id: set_is_merge_commit
        run: echo "is_merge_commit=$( [ $(git rev-list --count $GITHUB_SHA^@) -eq 2 ] && echo 'true' || echo 'false' )" | tee -a "$GITHUB_OUTPUT"
      - id: set_is_tag_build
        run: echo "is_tag_build=${{ startsWith(github.event.ref, 'refs/tags') }}" | tee -a "$GITHUB_OUTPUT"
      - id: set_python_version
        run: echo "python_version=$(python -VV | sha256sum | cut -d' ' -f1)" | tee -a "$GITHUB_OUTPUT"

  print_metadata:
    name: Display metadata for build
    runs-on: ubuntu-latest
    needs: build_package
    steps:
      - run: |
          echo "tag: ${{ needs.build_package.outputs.tag }}"
          echo "tag_short: ${{ needs.build_package.outputs.tag_short }}"
          echo "branch: ${{ needs.build_package.outputs.branch }}"
          echo "is_merge_commit: ${{ needs.build_package.outputs.is_merge_commit }}"
          echo "is_tag_build: ${{ needs.build_package.outputs.is_tag_build }}"
          echo "python_version: ${{ needs.build_package.outputs.python_version }}"

  #-------------------------
  #       Testing
  #-------------------------

  tests:
    name: ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    needs: build_package

    strategy:
      fail-fast: false
      matrix:
        include:
          # Static analysis and utilities
          - {
              name: "Ruff",
              python: "3.12",
              os: ubuntu-latest,
              group: "lint",
              env: "lint:format",
            }
          - {
              name: "Mypy",
              python: "3.12",
              os: ubuntu-latest,
              group: "lint",
              env: "lint:types",
            }

          # Verification of builds and other aspects
          - {
              name: "Docs Build",
              python: "3.12",
              os: ubuntu-latest,
              group: "docs",
              env: "docs:build",
            }

          # OS Integration tests
          - {
              name: "Linux",
              python: "3.12",
              os: ubuntu-latest,
              group: "test",
              env: "integration_test_ci:fail_fast",
            }
          - {
              name: "Windows",
              python: "3.12",
              os: windows-latest,
              group: "test",
              env: "integration_test_ci:fail_fast",
            }
          - {
              name: "Linux_pytest_locustfile",
              python: "3.12",
              os: ubuntu-latest,
              group: "test",
              env: "integration_test_ci:test_pytest",
            }
          # MacOS behaves super badly on GH actions right now, so let's disable it for the time being
          # - { name: "MacOS", python: '3.12', os: macos-latest, group: "test", env: "integration_test_ci:fail_fast" }

          # Unit tests on Python versions
          - {
              name: "Python 3.14",
              python: "3.14",
              os: ubuntu-latest,
              group: "test",
              env: "test:all",
            }
          - {
              name: "Python 3.13",
              python: "3.13",
              os: ubuntu-latest,
              group: "test",
              env: "test:all",
            }
          - {
              name: "Python 3.12",
              python: "3.12",
              os: ubuntu-latest,
              group: "test",
              env: "test:all",
            }
          - {
              name: "Python 3.11",
              python: "3.11",
              os: ubuntu-latest,
              group: "test",
              env: "test:all",
            }
          - {
              name: "Python 3.10",
              python: "3.10",
              os: ubuntu-latest,
              group: "test",
              env: "test:all",
            }

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python }}

      - uses: astral-sh/setup-uv@v7
        with:
          version: "0.9.7"
          enable-cache: true
          cache-dependency-glob: |
            "pyproject.toml"
            "uv.lock"

      - run: uv venv --python ${{ matrix.python }}

      # Install what we need to run hatch envs but not the project itself
      - name: Install CI dependencies
        run: uv sync --group ${{ matrix.group }} --no-install-package locust

      # Grab the built artifacts to ensure we're testing what we eventually publish
      - name: Download Python dist
        uses: actions/download-artifact@v8
        with:
          name: python-dist
          path: dist

      - name: Download WebUI dist
        uses: actions/download-artifact@v8
        with:
          name: webui-dist
          path: locust/webui/dist

      - name: Run tests
        run: uv run --group ${{ matrix.group }} hatch run +py=${{ matrix.python }} ${{ matrix.env }}

  test_docker_image:
    name: Test Docker Image
    runs-on: ubuntu-latest
    needs: build_package

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # Grab the built artifacts to ensure we're testing what we eventually publish
      - name: Download Python dist
        uses: actions/download-artifact@v8
        with:
          name: python-dist
          path: dist

      # Set up Docker daemon dependencies for building and publishing
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # Build and load Docker image to the local daemon
      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile.ci
          platforms: linux/amd64
          load: true
          tags: locustio/locust:${{ github.sha }}-test

      # Run a basic test on the image
      - name: Test docker image
        run: |
          docker run --rm locustio/locust:${{ github.sha }}-test --version

  test_webui:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version: 22.x
          cache: "yarn"
          cache-dependency-path: locust/webui/yarn.lock
      - name: yarn install
        uses: borales/actions-yarn@v5
        with:
          cmd: install
          dir: locust/webui
      - name: yarn build
        uses: borales/actions-yarn@v5
        with:
          cmd: build
          dir: locust/webui
      - name: yarn test
        uses: borales/actions-yarn@v5
        with:
          cmd: test
          dir: locust/webui
      - name: yarn lint
        uses: borales/actions-yarn@v5
        with:
          cmd: lint
          dir: locust/webui
      - name: yarn type-check
        uses: borales/actions-yarn@v5
        with:
          cmd: type-check
          dir: locust/webui

  # -------------------------
  #       Publishing
  # -------------------------

  publish-docker:
    needs: [tests, test_webui, test_docker_image, build_package]
    if: github.repository_owner == 'locustio' && ( github.ref == 'refs/heads/master' || startsWith(github.event.ref, 'refs/tags') )
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # Download Python dist artifact
      - name: Download Python dist
        uses: actions/download-artifact@v8
        with:
          name: python-dist
          path: dist

      # Download Web UI lib artifact
      - name: Download UI lib
        uses: actions/download-artifact@v8
        with:
          name: webui-lib-dist
          path: locust/webui/lib

      # Staged docker builds using exports/artifacts is currently difficult using multi-arch builds with buildx
      # So let's just build it here

      # Set docker image and tag values
      - name: Docker meta
        id: docker_meta
        uses: docker/metadata-action@v5
        with:
          images: locustio/locust
          tags: |
            type=raw,value=latest,enable=${{ needs.build_package.outputs.is_tag_build }}
            type=raw,value=${{ needs.build_package.outputs.tag }}
            type=raw,value=${{ needs.build_package.outputs.branch }}

      - uses: docker/login-action@v3
        with:
          username: locustbuild
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build and (optionally) push docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile.ci
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.docker_meta.outputs.tags }}

  publish-pypi:
    needs: [tests, test_webui, test_docker_image, build_package]
    if: github.repository_owner == 'locustio' && ( github.ref == 'refs/heads/master' || startsWith(github.event.ref, 'refs/tags') )
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # Download Python dist artifact
      - name: Download Python dist
        uses: actions/download-artifact@v8
        with:
          name: python-dist
          path: dist

      # Download Web UI lib artifact
      - name: Download UI lib
        uses: actions/download-artifact@v8
        with:
          name: webui-lib-dist
          path: locust/webui/lib

      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
          skip-existing: true

      - name: yarn install
        uses: borales/actions-yarn@v5
        with:
          cmd: install
          dir: locust/webui

      # Set pre-release version
      - name: yarn version
        uses: borales/actions-yarn@v5
        if: github.ref == 'refs/heads/master'
        with:
          cmd: version ${{ needs.build_package.outputs.tag_short }}-next-${{ github.run_id }}
          dir: locust/webui

      # Set tag build version
      - name: yarn version
        uses: borales/actions-yarn@v5
        if: startsWith(github.event.ref, 'refs/tags')
        with:
          cmd: version ${{ github.ref_name }}
          dir: locust/webui

      - name: yarn config
        uses: borales/actions-yarn@v5
        with:
          cmd: config set npmAuthToken ${{ secrets.NPM_AUTH_TOKEN }}
          dir: locust/webui

      # Publish UI lib
      - uses: borales/actions-yarn@v5
        name: Publish package on NPM
        if: github.ref == 'refs/heads/master'
        with:
          cmd: npm publish --tag next
          dir: locust/webui

      # On tag builds
      - uses: borales/actions-yarn@v5
        name: Publish package on NPM
        if: startsWith(github.event.ref, 'refs/tags')
        with:
          cmd: npm publish
          dir: locust/webui


================================================
FILE: .gitignore
================================================
*.pyc
locust.wpr
locust.egg-info/**
locustio.egg-info/**
locust/_version.py
locust/test/mock_*.py
docs/_build/**
docs/cli-help-output.txt
docs/config-options.rst
mock.*.egg
web_test_*.csv
err.txt
out.txt
.eggs/
dist/**
.idea/**
*.iml
*.ipr
.vagrant
build/
.coverage
docs/env-options.rst
.editorconfig
__pycache__
.pytest_cache
.sass-cache/
.env
yarn-error.log
.venv
.DS_Store
.python-version
locust/webui/dist/**
.coverage*

================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    # Ruff version.
    rev: v0.10.0  # Pin the same version in the pyproject.toml file
    hooks:
      # Run the linter.
      - id: ruff
        args: [--fix]
      # Run the formatter.
      - id: ruff-format
  - repo: local
    hooks:
      - id: yarn-lint
        name: yarn lint
        files: ^locust/webui/
        entry: bash -c "cd locust/webui && yarn lint"
        language: system
        pass_filenames: false


================================================
FILE: .readthedocs.yaml
================================================
version: 2

# Set the version of Python and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.12"
  jobs:
    post_checkout:
      - git fetch --unshallow || true
    post_install:
      - python -m pip install uv
      - SKIP_PRE_BUILD=true UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv sync --group docs

sphinx:
  configuration: docs/conf.py


================================================
FILE: .vscode/extensions.json
================================================
{
    "recommendations": [
        "charliermarsh.ruff",
        "ms-python.mypy-type-checker"
    ]
}

================================================
FILE: .vscode/launch.json
================================================
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Run current file",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "gevent": true
        },
        {
            "name": "Run current locust scenario headless",
            "type": "debugpy",
            "request": "launch",
            "module": "locust",
            "args": [
                "-f",
                "${file}",
                "--headless",
                "--users=5"
            ],
            "console": "integratedTerminal",
            "gevent": true
        },
        {
            "name": "Run current locust scenario, autostart",
            "type": "debugpy",
            "request": "launch",
            "module": "locust",
            "args": [
                "-f",
                "${file}",
                "--users=5",
                "--autostart",
                "--print-stats",
                "-L=ERROR"
            ],
            "console": "integratedTerminal",
            "gevent": true
        },
        {
            "name": "(test debug only)",
            "type": "debugpy",
            "request": "launch",
            "gevent": true,
            "purpose": ["debug-test"]
        }
    ]
}

================================================
FILE: .vscode/launch_locust.json
================================================
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Locust: 5 users, with specific config file",
            "type": "python",
            "request": "launch",
            "module": "locust",
            "args": [
                "-f",
                "${file}",
                "--headless",
                "--users=5",
                "--config=${fileDirname}/../locust.conf"
            ],
            "console": "integratedTerminal",
            "gevent": true
        }
    ]
}

================================================
FILE: .vscode/settings.json
================================================
{
    "editor.formatOnSave": true,
    "files.exclude": {
        ".pytest_cache/**/*": true,
        "**/*.pyc": true,
        "**/locust.wpr": true,
        "locust.egg-info/**": true,
        "locustio.egg-info/**": true,
        "docs/_build/**": true,
        "docs/cli-help-output.txt": true,
        "docs/config-options.rst": true,
        "**/mock.*.egg": true,
        "dist/**": true,
        ".idea/**": true,
        "**/*.iml": true,
        "**/*.ipr": true,
        "**/.vagrant": true,
        "**/build/": true,
        "**/.coverage": true,
        "**/.tox/": true,
        "docs/env-options.rst": true,
        "**/.editorconfig": true,
        "**/__pycache__": true,
        "locust/_version.py": true,
        "**/web_test_*.csv": true,
        "**/.eggs/": true,
        "**/.pytest_cache": true,
        "**/.sass-cache/": true,
        "locust/contrib/.mypy_cache/**/*": true,
        "locust/user/.mypy_cache/**/*": true,
        "**/.mypy_cache": true,
        "**/.ruff_cache": true,
        "locust/test/mock_*.py": true,
        "**/err.txt": true,
        "**/out.txt": true,
        "**/.venv": true
    },
    "restructuredtext.confPath": "${workspaceFolder}/docs",
    "[python]": {
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.fixAll": "explicit",
            "source.organizeImports": "explicit"
        },
        "editor.defaultFormatter": "charliermarsh.ruff"
    },
    "python.testing.pytestEnabled": true,
    "python.testing.unittestEnabled": false
}

================================================
FILE: CHANGELOG.md
================================================
# Detailed changelog
The most important changes can also be found in [the documentation](https://docs.locust.io/en/latest/changelog.html).

## [2.43.3](https://github.com/locustio/locust/tree/2.43.3) (2026-02-12)

[Full Changelog](https://github.com/locustio/locust/compare/2.43.2...2.43.3)

**Closed issues:**

- Documentation Improvement - Event hooks [\#3338](https://github.com/locustio/locust/issues/3338)

**Merged pull requests:**

- Bump diff from 8.0.2 to 8.0.3 in /locust/webui [\#3349](https://github.com/locustio/locust/pull/3349) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump lodash from 4.17.21 to 4.17.23 in /locust/webui [\#3348](https://github.com/locustio/locust/pull/3348) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump cryptography from 43.0.3 to 46.0.5 [\#3347](https://github.com/locustio/locust/pull/3347) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump tar from 7.4.3 to 7.5.7 in /locust/webui [\#3346](https://github.com/locustio/locust/pull/3346) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump @isaacs/brace-expansion from 5.0.0 to 5.0.1 in /locust/webui [\#3345](https://github.com/locustio/locust/pull/3345) ([dependabot[bot]](https://github.com/apps/dependabot))
- Add missing event hook parameter documentation [\#3344](https://github.com/locustio/locust/pull/3344) ([veeceey](https://github.com/veeceey))

## [2.43.2](https://github.com/locustio/locust/tree/2.43.2) (2026-02-01)

[Full Changelog](https://github.com/locustio/locust/compare/2.43.1...2.43.2)

**Merged pull requests:**

- Bump flask-cors from 6.0.1 to 6.0.2 [\#3343](https://github.com/locustio/locust/pull/3343) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump hatch from 1.16.2 to 1.16.3 [\#3342](https://github.com/locustio/locust/pull/3342) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump werkzeug from 3.1.4 to 3.1.5 [\#3341](https://github.com/locustio/locust/pull/3341) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump opentelemetry-exporter-otlp-proto-grpc from 1.39.0 to 1.39.1 [\#3340](https://github.com/locustio/locust/pull/3340) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump sphinx-rtd-theme from 3.0.2 to 3.1.0 [\#3339](https://github.com/locustio/locust/pull/3339) ([dependabot[bot]](https://github.com/apps/dependabot))
- Update operator docs [\#3333](https://github.com/locustio/locust/pull/3333) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.43.1](https://github.com/locustio/locust/tree/2.43.1) (2026-01-12)

[Full Changelog](https://github.com/locustio/locust/compare/2.43.0...2.43.1)

**Merged pull requests:**

- Bump packages [\#3331](https://github.com/locustio/locust/pull/3331) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Stabilize tests [\#3326](https://github.com/locustio/locust/pull/3326) ([amadeuppereira](https://github.com/amadeuppereira))
- Stabilize tests [\#3325](https://github.com/locustio/locust/pull/3325) ([amadeuppereira](https://github.com/amadeuppereira))
- Bump @emotion/styled from 11.14.0 to 11.14.1 in /locust/webui in the emotion group [\#3322](https://github.com/locustio/locust/pull/3322) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump the eslint group in /locust/webui with 5 updates [\#3319](https://github.com/locustio/locust/pull/3319) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump the all\_dependencies group with 2 updates [\#3318](https://github.com/locustio/locust/pull/3318) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.43.0](https://github.com/locustio/locust/tree/2.43.0) (2025-12-30)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.6...2.43.0)

**Closed issues:**

- Support for requests \>=2.32.5 \(compatibility with LangChain/AI ecosystem\) [\#3307](https://github.com/locustio/locust/issues/3307)
- Multiple select in web UI for custom arguments [\#3260](https://github.com/locustio/locust/issues/3260)
- Suggestion to Add  "iter\_lines"  Support for  "FastHttpUser"  in Locust [\#3018](https://github.com/locustio/locust/issues/3018)

**Merged pull requests:**

- Provide a better error message when spawn rate is set to zero [\#3317](https://github.com/locustio/locust/pull/3317) ([amadeuppereira](https://github.com/amadeuppereira))
- Support requests\>=2.32.5, reimplement the fix previously there for only loading ssl certificates once [\#3316](https://github.com/locustio/locust/pull/3316) ([amadeuppereira](https://github.com/amadeuppereira))
- Remove references to locust.cloud now that it is shutting down [\#3314](https://github.com/locustio/locust/pull/3314) ([amadeuppereira](https://github.com/amadeuppereira))
- Allow users to stop test run by raising StopTest, use it on missing host in locustfile \(and no --host param\) [\#3313](https://github.com/locustio/locust/pull/3313) ([amadeuppereira](https://github.com/amadeuppereira))
- Locust Cloud demo tab: update domain from auth.locust.cloud to app.locust.cloud [\#3312](https://github.com/locustio/locust/pull/3312) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Solving the iter\_lines problem [\#3311](https://github.com/locustio/locust/pull/3311) ([MasterKey-Pro](https://github.com/MasterKey-Pro))
- Refactor parse\_options [\#3310](https://github.com/locustio/locust/pull/3310) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Capture stacktrace on KeyboardInterrupt on greenlets [\#3306](https://github.com/locustio/locust/pull/3306) ([amadeuppereira](https://github.com/amadeuppereira))
- Bump js-yaml from 4.1.0 to 4.1.1 in /locust/webui [\#3305](https://github.com/locustio/locust/pull/3305) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump glob from 10.4.5 to 10.5.0 in /locust/webui [\#3304](https://github.com/locustio/locust/pull/3304) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.42.6](https://github.com/locustio/locust/tree/2.42.6) (2025-11-29)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.5...2.42.6)

**Fixed bugs:**

- After Locust upgrade, parameter 'headless = true' in conf file does not work as expected. [\#3225](https://github.com/locustio/locust/issues/3225)

**Merged pull requests:**

- Don't import pytest unless it is really needed, to speed up startup [\#3302](https://github.com/locustio/locust/pull/3302) ([cyberw](https://github.com/cyberw))
- refactor case statements and update to use 3.10 set syntax [\#3301](https://github.com/locustio/locust/pull/3301) ([cyberw](https://github.com/cyberw))
- Update OTel setup [\#3300](https://github.com/locustio/locust/pull/3300) ([amadeuppereira](https://github.com/amadeuppereira))
- Use match-case instead of gigantic if-elif statement when handling zmq messages in master-worker communication [\#3299](https://github.com/locustio/locust/pull/3299) ([cyberw](https://github.com/cyberw))
- Add OTel documentation [\#3298](https://github.com/locustio/locust/pull/3298) ([amadeuppereira](https://github.com/amadeuppereira))
- Improve tests [\#3297](https://github.com/locustio/locust/pull/3297) ([amadeuppereira](https://github.com/amadeuppereira))
- Log duplicate client\_ready messages as debug instead of info level [\#3296](https://github.com/locustio/locust/pull/3296) ([cyberw](https://github.com/cyberw))
- Add otel unit tests [\#3295](https://github.com/locustio/locust/pull/3295) ([amadeuppereira](https://github.com/amadeuppereira))
- Only log "OpenTelemetry enabled" message when success [\#3294](https://github.com/locustio/locust/pull/3294) ([amadeuppereira](https://github.com/amadeuppereira))
- Fix Toml Parser Being Called on Conf Files [\#3293](https://github.com/locustio/locust/pull/3293) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- GH Actions: Bump actions/checkout from 5 to 6 in the all\_dependencies group [\#3287](https://github.com/locustio/locust/pull/3287) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.42.5](https://github.com/locustio/locust/tree/2.42.5) (2025-11-20)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.4...2.42.5)

**Merged pull requests:**

- Log when otel is enabled [\#3284](https://github.com/locustio/locust/pull/3284) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.42.4](https://github.com/locustio/locust/tree/2.42.4) (2025-11-20)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.3...2.42.4)

**Closed issues:**

- bumb pytest to support 9.x [\#3262](https://github.com/locustio/locust/issues/3262)

**Merged pull requests:**

- Avoid duplicated action run on pull requests [\#3282](https://github.com/locustio/locust/pull/3282) ([jairhenrique](https://github.com/jairhenrique))
- Forward explicitly set request name to OTEL span [\#3281](https://github.com/locustio/locust/pull/3281) ([amadeuppereira](https://github.com/amadeuppereira))
- Verbose request span name [\#3279](https://github.com/locustio/locust/pull/3279) ([amadeuppereira](https://github.com/amadeuppereira))
- Add OpenTelemetry flag [\#3278](https://github.com/locustio/locust/pull/3278) ([amadeuppereira](https://github.com/amadeuppereira))
- Disable uv.lock check in GH action [\#3277](https://github.com/locustio/locust/pull/3277) ([cyberw](https://github.com/cyberw))
- Add otlp http exporter dependency [\#3276](https://github.com/locustio/locust/pull/3276) ([amadeuppereira](https://github.com/amadeuppereira))
- Add OpenTelemetry support [\#3275](https://github.com/locustio/locust/pull/3275) ([amadeuppereira](https://github.com/amadeuppereira))
- Bump the eslint group in /locust/webui with 11 updates [\#3270](https://github.com/locustio/locust/pull/3270) ([dependabot[bot]](https://github.com/apps/dependabot))
- Includes npm and uv on dependabot file [\#3269](https://github.com/locustio/locust/pull/3269) ([jairhenrique](https://github.com/jairhenrique))
- Enables FURB ruff lint [\#3265](https://github.com/locustio/locust/pull/3265) ([jairhenrique](https://github.com/jairhenrique))
- Updates pytest dependency range [\#3263](https://github.com/locustio/locust/pull/3263) ([jairhenrique](https://github.com/jairhenrique))
- Allow multiple dropdown in Web UI [\#3261](https://github.com/locustio/locust/pull/3261) ([jFompe](https://github.com/jFompe))

## [2.42.3](https://github.com/locustio/locust/tree/2.42.3) (2025-11-15)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.2...2.42.3)

**Merged pull requests:**

- Bump the all\_dependencies group with 7 updates [\#3266](https://github.com/locustio/locust/pull/3266) ([dependabot[bot]](https://github.com/apps/dependabot))
- Creates dependabot file to keep gh actions updated [\#3264](https://github.com/locustio/locust/pull/3264) ([jairhenrique](https://github.com/jairhenrique))
- GH Actions: update uv version, ensure uv.lock doesn't contain anything not in pyproject.toml [\#3259](https://github.com/locustio/locust/pull/3259) ([cyberw](https://github.com/cyberw))
- Fix single line .conf files incorrectly being treated as toml [\#3257](https://github.com/locustio/locust/pull/3257) ([cyberw](https://github.com/cyberw))

## [2.42.2](https://github.com/locustio/locust/tree/2.42.2) (2025-11-06)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.1...2.42.2)

**Merged pull requests:**

- Bump locust-cloud version, fixing an issue with .conf-files [\#3256](https://github.com/locustio/locust/pull/3256) ([cyberw](https://github.com/cyberw))
- Revert "modified ui\_extra\_args\_dict function to pick arguments" [\#3255](https://github.com/locustio/locust/pull/3255) ([cyberw](https://github.com/cyberw))
- Update uv.lock [\#3254](https://github.com/locustio/locust/pull/3254) ([cyberw](https://github.com/cyberw))
- remove setuptools from dependencies [\#3253](https://github.com/locustio/locust/pull/3253) ([dotlambda](https://github.com/dotlambda))
- fix: MQTT client\_id and protocol not passed down to Client [\#3252](https://github.com/locustio/locust/pull/3252) ([ionutab](https://github.com/ionutab))

## [2.42.1](https://github.com/locustio/locust/tree/2.42.1) (2025-10-27)

[Full Changelog](https://github.com/locustio/locust/compare/2.42.0...2.42.1)

**Merged pull requests:**

- Add VS Code Extension and k8s operator to documentation [\#3251](https://github.com/locustio/locust/pull/3251) ([cyberw](https://github.com/cyberw))
- Bump vite from 6.3.5 to 6.4.1 in /locust/webui [\#3249](https://github.com/locustio/locust/pull/3249) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bumped the gRPC example server’s worker pool to 100 [\#3248](https://github.com/locustio/locust/pull/3248) ([sonianuj287](https://github.com/sonianuj287))
- modified ui\_extra\_args\_dict function to pick arguments [\#3245](https://github.com/locustio/locust/pull/3245) ([sonianuj287](https://github.com/sonianuj287))

## [2.42.0](https://github.com/locustio/locust/tree/2.42.0) (2025-10-17)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.6...2.42.0)

**Fixed bugs:**

- Extend Locust UI with new tab does not work [\#3240](https://github.com/locustio/locust/issues/3240)
- Reset button not working after stopping the run [\#3197](https://github.com/locustio/locust/issues/3197)

**Merged pull requests:**

- Avoid using most recent python-requests because it may introduce performance issues [\#3244](https://github.com/locustio/locust/pull/3244) ([cyberw](https://github.com/cyberw))
- Introduce DNSUser [\#3243](https://github.com/locustio/locust/pull/3243) ([cyberw](https://github.com/cyberw))
- Fix reset button not working after stopping the run [\#3238](https://github.com/locustio/locust/pull/3238) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Added readme badge for supported python versions [\#3237](https://github.com/locustio/locust/pull/3237) ([Nirzak](https://github.com/Nirzak))
- loosen dependency on gevent [\#3236](https://github.com/locustio/locust/pull/3236) ([bollwyvl](https://github.com/bollwyvl))

## [2.41.6](https://github.com/locustio/locust/tree/2.41.6) (2025-10-10)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.5...2.41.6)

**Merged pull requests:**

- Officially support Python 3.14 and test it [\#3235](https://github.com/locustio/locust/pull/3235) ([cyberw](https://github.com/cyberw))

## [2.41.5](https://github.com/locustio/locust/tree/2.41.5) (2025-10-06)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.4...2.41.5)

**Merged pull requests:**

- Use www host instead of bare locust.cloud in examples and tests [\#3234](https://github.com/locustio/locust/pull/3234) ([cyberw](https://github.com/cyberw))

## [2.41.4](https://github.com/locustio/locust/tree/2.41.4) (2025-10-06)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.3...2.41.4)

**Merged pull requests:**

- Fix Unsafe Template Arg [\#3232](https://github.com/locustio/locust/pull/3232) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.41.3](https://github.com/locustio/locust/tree/2.41.3) (2025-10-01)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.2...2.41.3)

**Merged pull requests:**

- Make workers correctly ignore the --run-time flag [\#3230](https://github.com/locustio/locust/pull/3230) ([cyberw](https://github.com/cyberw))
- Enhance MilvusUser constructor to support additional collection parameters [\#3229](https://github.com/locustio/locust/pull/3229) ([zhuwenxing](https://github.com/zhuwenxing))

## [2.41.2](https://github.com/locustio/locust/tree/2.41.2) (2025-09-29)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.1...2.41.2)

**Fixed bugs:**

- Locust pytest plugin option '--host' conflicts with common user options; suggest renaming to '--locust-host' [\#3227](https://github.com/locustio/locust/issues/3227)

**Merged pull requests:**

- Pytest plugin: Workaround issue with potential duplicate --host argument definition [\#3228](https://github.com/locustio/locust/pull/3228) ([cyberw](https://github.com/cyberw))
- Fix Alignment of View Column Selector [\#3226](https://github.com/locustio/locust/pull/3226) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.41.1](https://github.com/locustio/locust/tree/2.41.1) (2025-09-25)

[Full Changelog](https://github.com/locustio/locust/compare/2.41.0...2.41.1)

## [2.41.0](https://github.com/locustio/locust/tree/2.41.0) (2025-09-25)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.5...2.41.0)

**Fixed bugs:**

- Master doesn't distribute user equally among workers [\#3209](https://github.com/locustio/locust/issues/3209)

**Merged pull requests:**

- Suggest possibly misspelled command line arguments \(Did you mean ...\) [\#3224](https://github.com/locustio/locust/pull/3224) ([cyberw](https://github.com/cyberw))
- Add Locust Feedback Form [\#3223](https://github.com/locustio/locust/pull/3223) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add MqttUser [\#3216](https://github.com/locustio/locust/pull/3216) ([ionutab](https://github.com/ionutab))

## [2.40.5](https://github.com/locustio/locust/tree/2.40.5) (2025-09-17)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.4...2.40.5)

**Merged pull requests:**

- Avoid wrapping fast response in response context manager when not needed [\#3222](https://github.com/locustio/locust/pull/3222) ([cyberw](https://github.com/cyberw))

## [2.40.4](https://github.com/locustio/locust/tree/2.40.4) (2025-09-11)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.3...2.40.4)

**Merged pull requests:**

- Avoid pytest style locustfiles capturing keyboard input [\#3219](https://github.com/locustio/locust/pull/3219) ([cyberw](https://github.com/cyberw))

## [2.40.3](https://github.com/locustio/locust/tree/2.40.3) (2025-09-11)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.2...2.40.3)

**Merged pull requests:**

- Bump requests minimum version [\#3218](https://github.com/locustio/locust/pull/3218) ([cyberw](https://github.com/cyberw))
- Make ResponseContextManager.raise\_for\_status\(\) consider calls to failure\(\) and success\(\) [\#3217](https://github.com/locustio/locust/pull/3217) ([cyberw](https://github.com/cyberw))

## [2.40.2](https://github.com/locustio/locust/tree/2.40.2) (2025-09-08)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.1...2.40.2)

**Fixed bugs:**

- Python 3.13: KeyError: 'name' on request\_meta in ResponseContextManager.\_\_exit\_\_ [\#3207](https://github.com/locustio/locust/issues/3207)

**Merged pull requests:**

- Refactor SocketIOUser to create separate SocketIOClient class [\#3211](https://github.com/locustio/locust/pull/3211) ([cyberw](https://github.com/cyberw))
- Refactor clients.ResponseContextManager and fix gc issue [\#3210](https://github.com/locustio/locust/pull/3210) ([cyberw](https://github.com/cyberw))

## [2.40.1](https://github.com/locustio/locust/tree/2.40.1) (2025-09-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.40.0...2.40.1)

**Fixed bugs:**

- 2.40.0 with pytest and xdist [\#3202](https://github.com/locustio/locust/issues/3202)

**Merged pull requests:**

- Move pytest plugin to its own directory, to prevent accidental import [\#3205](https://github.com/locustio/locust/pull/3205) ([cyberw](https://github.com/cyberw))
- Pytest plugin: Delay imports to avoid monkey patching until someone uses the fixtures [\#3204](https://github.com/locustio/locust/pull/3204) ([cyberw](https://github.com/cyberw))

## [2.40.0](https://github.com/locustio/locust/tree/2.40.0) (2025-09-04)

[Full Changelog](https://github.com/locustio/locust/compare/2.39.1...2.40.0)

**Fixed bugs:**

- HTTP response 0 [\#3199](https://github.com/locustio/locust/issues/3199)

**Merged pull requests:**

- Avoid exception in HttpUser if requests has lost track of the request it made [\#3201](https://github.com/locustio/locust/pull/3201) ([cyberw](https://github.com/cyberw))
- Support pytests as locustfiles [\#3200](https://github.com/locustio/locust/pull/3200) ([cyberw](https://github.com/cyberw))
- Refactor FastHttpSession to be more like HttpSession [\#3198](https://github.com/locustio/locust/pull/3198) ([cyberw](https://github.com/cyberw))
- Update Dockerfile base to Python 3.13 [\#3193](https://github.com/locustio/locust/pull/3193) ([adaamz](https://github.com/adaamz))

## [2.39.1](https://github.com/locustio/locust/tree/2.39.1) (2025-08-29)

[Full Changelog](https://github.com/locustio/locust/compare/2.39.0...2.39.1)

**Merged pull requests:**

- Avoid broken gevent version for now [\#3196](https://github.com/locustio/locust/pull/3196) ([cyberw](https://github.com/cyberw))
- Remove duplicated line in pyproject.toml [\#3195](https://github.com/locustio/locust/pull/3195) ([JumboBear](https://github.com/JumboBear))

## [2.39.0](https://github.com/locustio/locust/tree/2.39.0) (2025-08-19)

[Full Changelog](https://github.com/locustio/locust/compare/2.38.1...2.39.0)

**Merged pull requests:**

- Add SocketIOUser [\#3189](https://github.com/locustio/locust/pull/3189) ([cyberw](https://github.com/cyberw))
- Add MilvusUser and example [\#3168](https://github.com/locustio/locust/pull/3168) ([zhuwenxing](https://github.com/zhuwenxing))

## [2.38.1](https://github.com/locustio/locust/tree/2.38.1) (2025-08-12)

[Full Changelog](https://github.com/locustio/locust/compare/2.38.0...2.38.1)

**Closed issues:**

- Support for markov chains to describe a user's behavior [\#3156](https://github.com/locustio/locust/issues/3156)
- Switch docker base image to one with uv preinstalled [\#3061](https://github.com/locustio/locust/issues/3061)

**Merged pull requests:**

- FastHttpUser: Dont send zstd in Accept-Encoding header  [\#3188](https://github.com/locustio/locust/pull/3188) ([cyberw](https://github.com/cyberw))
- Fix test flakyness and update error message [\#3187](https://github.com/locustio/locust/pull/3187) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.38.0](https://github.com/locustio/locust/tree/2.38.0) (2025-08-07)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.14...2.38.0)

**Fixed bugs:**

- Failures table sorting is reset to ascending after a few seconds [\#3184](https://github.com/locustio/locust/issues/3184)
- argparse.ArgumentError: argument --profile: conflicting option string: --profile \(locust==2.37.14\) [\#3180](https://github.com/locustio/locust/issues/3180)

**Merged pull requests:**

- Webui: Fix useSortByField [\#3185](https://github.com/locustio/locust/pull/3185) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Optimize unit tests [\#3183](https://github.com/locustio/locust/pull/3183) ([amadeuppereira](https://github.com/amadeuppereira))
- Support for list based custom arguments [\#3181](https://github.com/locustio/locust/pull/3181) ([mickdwyer](https://github.com/mickdwyer))
- Bump form-data from 4.0.0 to 4.0.4 in /locust/webui [\#3179](https://github.com/locustio/locust/pull/3179) ([dependabot[bot]](https://github.com/apps/dependabot))
- Webui: Hide no Host Warning when one is Provided [\#3177](https://github.com/locustio/locust/pull/3177) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add MarkovTaskSet [\#3176](https://github.com/locustio/locust/pull/3176) ([Matthieu-Beauchamp](https://github.com/Matthieu-Beauchamp))
- Add yarn lint precommit [\#3175](https://github.com/locustio/locust/pull/3175) ([cyberw](https://github.com/cyberw))

## [2.37.14](https://github.com/locustio/locust/tree/2.37.14) (2025-07-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.13...2.37.14)

**Merged pull requests:**

- Web UI: Fix Chart Zoom Slider [\#3174](https://github.com/locustio/locust/pull/3174) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Improve Locust Cloud Tab [\#3172](https://github.com/locustio/locust/pull/3172) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.13](https://github.com/locustio/locust/tree/2.37.13) (2025-07-15)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.12...2.37.13)

**Fixed bugs:**

- Locust can't install on alpine linux anymore [\#3166](https://github.com/locustio/locust/issues/3166)

**Closed issues:**

- Decouple the JavaScript asset code from the report [\#3064](https://github.com/locustio/locust/issues/3064)

**Merged pull requests:**

- Remove safe\_name from /stats/requests response [\#3171](https://github.com/locustio/locust/pull/3171) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Shrink Bundle Size [\#3169](https://github.com/locustio/locust/pull/3169) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.12](https://github.com/locustio/locust/tree/2.37.12) (2025-07-08)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.11...2.37.12)

**Fixed bugs:**

- Error shutting down when using processes [\#3161](https://github.com/locustio/locust/issues/3161)
- 1279 Locust instances makes master run at 100% continously [\#3142](https://github.com/locustio/locust/issues/3142)

**Merged pull requests:**

- Attempt to increase open file limit \(RLIMIT\_NOFILE\) even on master. [\#3162](https://github.com/locustio/locust/pull/3162) ([cyberw](https://github.com/cyberw))
- Bump brace-expansion from 1.1.11 to 1.1.12 in /locust/webui [\#3160](https://github.com/locustio/locust/pull/3160) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.37.11](https://github.com/locustio/locust/tree/2.37.11) (2025-06-23)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.10...2.37.11)

**Fixed bugs:**

- FastHttpUser uses incorrect regex to hide home directory [\#3159](https://github.com/locustio/locust/issues/3159)

**Closed issues:**

- Define a list of paths to simulate an user journey [\#3150](https://github.com/locustio/locust/issues/3150)
- export the results as a json file [\#3089](https://github.com/locustio/locust/issues/3089)

**Merged pull requests:**

- Forward locustfiles to locust cloud [\#3157](https://github.com/locustio/locust/pull/3157) ([amadeuppereira](https://github.com/amadeuppereira))
- Web UI: Always Warn of Invalid Host [\#3155](https://github.com/locustio/locust/pull/3155) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.10](https://github.com/locustio/locust/tree/2.37.10) (2025-06-07)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.9...2.37.10)

**Merged pull requests:**

- Revert accidental removal of --json-file option [\#3154](https://github.com/locustio/locust/pull/3154) ([brtkwr](https://github.com/brtkwr))

## [2.37.9](https://github.com/locustio/locust/tree/2.37.9) (2025-06-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.8...2.37.9)

**Merged pull requests:**

- Web UI: Fix host field name missing if host is not required [\#3152](https://github.com/locustio/locust/pull/3152) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.8](https://github.com/locustio/locust/tree/2.37.8) (2025-06-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.7...2.37.8)

**Closed issues:**

- Support gevent \>= 25.4.1 [\#3143](https://github.com/locustio/locust/issues/3143)

**Merged pull requests:**

- Bump locust-cloud dependency, allow 25.x versions of gevent [\#3151](https://github.com/locustio/locust/pull/3151) ([cyberw](https://github.com/cyberw))

## [2.37.7](https://github.com/locustio/locust/tree/2.37.7) (2025-06-03)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.6...2.37.7)

**Merged pull requests:**

- Web Ui: Add host field validation [\#3149](https://github.com/locustio/locust/pull/3149) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.6](https://github.com/locustio/locust/tree/2.37.6) (2025-05-28)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.5...2.37.6)

**Fixed bugs:**

- Documentation is Now Missing Table of "All available configuration options" [\#3144](https://github.com/locustio/locust/issues/3144)

**Merged pull requests:**

- Fix Docs Config Options [\#3145](https://github.com/locustio/locust/pull/3145) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.37.5](https://github.com/locustio/locust/tree/2.37.5) (2025-05-22)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.4...2.37.5)

**Fixed bugs:**

- Web UI Does Not Switch to Details Page Immediately on Test Start in Current Version [\#3128](https://github.com/locustio/locust/issues/3128)

**Merged pull requests:**

- Do not require locustfile on specific locust-cloud arguments [\#3141](https://github.com/locustio/locust/pull/3141) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.37.4](https://github.com/locustio/locust/tree/2.37.4) (2025-05-19)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.3...2.37.4)

## [2.37.3](https://github.com/locustio/locust/tree/2.37.3) (2025-05-14)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.2...2.37.3)

**Merged pull requests:**

- Webui: Warn on Missing Host [\#3140](https://github.com/locustio/locust/pull/3140) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.37.2](https://github.com/locustio/locust/tree/2.37.2) (2025-05-13)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.1...2.37.2)

**Fixed bugs:**

- p95 response time increases with the number of unique URLs [\#3134](https://github.com/locustio/locust/issues/3134)
- FastResponse.failure\(\) takes 1 positional argument but 2 were given [\#3084](https://github.com/locustio/locust/issues/3084)

**Merged pull requests:**

- Webui: Block Submitting SwarmForm in Distributed Mode with no Workers [\#3138](https://github.com/locustio/locust/pull/3138) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fixes \#3134 - Improve the performance of the `/stats/requests` endpoint [\#3136](https://github.com/locustio/locust/pull/3136) ([orf](https://github.com/orf))
- Bump vite from 6.3.2 to 6.3.4 in /locust/webui [\#3132](https://github.com/locustio/locust/pull/3132) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.37.1](https://github.com/locustio/locust/tree/2.37.1) (2025-05-07)

[Full Changelog](https://github.com/locustio/locust/compare/2.37.0...2.37.1)

**Fixed bugs:**

- --json-file always creates empty file [\#3130](https://github.com/locustio/locust/issues/3130)

**Closed issues:**

- Forced Dependency Updates \(e.g., python-socketio\) May Cause Version Mismatch with Java Services [\#3129](https://github.com/locustio/locust/issues/3129)

**Merged pull requests:**

- Fix --json-file \(actually save data to file\) [\#3131](https://github.com/locustio/locust/pull/3131) ([zed](https://github.com/zed))

## [2.37.0](https://github.com/locustio/locust/tree/2.37.0) (2025-05-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.36.2...2.37.0)

**Merged pull requests:**

- Webui: Fix Failing Tests [\#3126](https://github.com/locustio/locust/pull/3126) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update uv to 0.7.2 [\#3125](https://github.com/locustio/locust/pull/3125) ([cyberw](https://github.com/cyberw))
- Add command line option to export json results into a file [\#3124](https://github.com/locustio/locust/pull/3124) ([ajt89](https://github.com/ajt89))
- Add locust exporter import \(used in Locust Cloud\) [\#3122](https://github.com/locustio/locust/pull/3122) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- fix error message to be idiomatically correct English [\#3121](https://github.com/locustio/locust/pull/3121) ([davidxia](https://github.com/davidxia))
- Web UI: Use mutations for state buttons [\#3120](https://github.com/locustio/locust/pull/3120) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.36.2](https://github.com/locustio/locust/tree/2.36.2) (2025-04-25)

[Full Changelog](https://github.com/locustio/locust/compare/2.36.1...2.36.2)

**Merged pull requests:**

- Remove circular dependency for locust-cloud [\#3119](https://github.com/locustio/locust/pull/3119) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.36.1](https://github.com/locustio/locust/tree/2.36.1) (2025-04-24)

[Full Changelog](https://github.com/locustio/locust/compare/2.36.0...2.36.1)

**Merged pull requests:**

- Fix setting version for tag and pre-release [\#3118](https://github.com/locustio/locust/pull/3118) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.36.0](https://github.com/locustio/locust/tree/2.36.0) (2025-04-24)

[Full Changelog](https://github.com/locustio/locust/compare/2.35.0...2.36.0)

**Merged pull requests:**

- Bump locust-cloud dependency to 1.20.0 and remove it from docs dependencies [\#3117](https://github.com/locustio/locust/pull/3117) ([cyberw](https://github.com/cyberw))
- Fix yarn publish [\#3116](https://github.com/locustio/locust/pull/3116) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web Ui: Ensure form element has name [\#3115](https://github.com/locustio/locust/pull/3115) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Add profile field [\#3113](https://github.com/locustio/locust/pull/3113) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Restrict gevent versions to ensure compatibility [\#3112](https://github.com/locustio/locust/pull/3112) ([amadeuppereira](https://github.com/amadeuppereira))
- Bump vite [\#3111](https://github.com/locustio/locust/pull/3111) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Optionally Extend Advanced Options [\#3110](https://github.com/locustio/locust/pull/3110) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Yarn Berry: Update publish command [\#3108](https://github.com/locustio/locust/pull/3108) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Fix npm publish failing [\#3107](https://github.com/locustio/locust/pull/3107) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- chore: set yarn to yarn berry [\#3104](https://github.com/locustio/locust/pull/3104) ([schwannden](https://github.com/schwannden))
- Refactoring: Extract locustfile content merger from main function [\#3102](https://github.com/locustio/locust/pull/3102) ([insspb](https://github.com/insspb))
- Refactoring: Extract validate stats configuration from main function [\#3101](https://github.com/locustio/locust/pull/3101) ([insspb](https://github.com/insspb))
- Add locust-cloud as a dependency, update sphinx and some other docs stuff [\#3097](https://github.com/locustio/locust/pull/3097) ([amadeuppereira](https://github.com/amadeuppereira))

## [2.35.0](https://github.com/locustio/locust/tree/2.35.0) (2025-04-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.34.1...2.35.0)

**Merged pull requests:**

- Bump vite from 6.2.5 to 6.2.6 in /locust/webui [\#3098](https://github.com/locustio/locust/pull/3098) ([dependabot[bot]](https://github.com/apps/dependabot))
- Webui: Add credentials to stop and reset requests [\#3096](https://github.com/locustio/locust/pull/3096) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui: Add history fallback [\#3095](https://github.com/locustio/locust/pull/3095) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI: Add optional base url for locust requests to an external API [\#3094](https://github.com/locustio/locust/pull/3094) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui: adding profile argument and display in html report [\#3093](https://github.com/locustio/locust/pull/3093) ([schwannden](https://github.com/schwannden))

## [2.34.1](https://github.com/locustio/locust/tree/2.34.1) (2025-04-09)

[Full Changelog](https://github.com/locustio/locust/compare/2.34.0...2.34.1)

**Merged pull requests:**

- Bump vite from 6.2.4 to 6.2.5 in /locust/webui [\#3091](https://github.com/locustio/locust/pull/3091) ([dependabot[bot]](https://github.com/apps/dependabot))
- Drop support for Python 3.9 [\#3090](https://github.com/locustio/locust/pull/3090) ([cyberw](https://github.com/cyberw))

## [2.34.0](https://github.com/locustio/locust/tree/2.34.0) (2025-04-06)

[Full Changelog](https://github.com/locustio/locust/compare/2.33.2...2.34.0)

**Merged pull requests:**

- Fix missing optional argument definitions in PostKwargs [\#3088](https://github.com/locustio/locust/pull/3088) ([kairi003](https://github.com/kairi003))
- Bump vite from 6.2.1 to 6.2.4 in /locust/webui [\#3087](https://github.com/locustio/locust/pull/3087) ([dependabot[bot]](https://github.com/apps/dependabot))
- Web UI: Offset Graph Legend so There's no Overlap on Mobile / Narrow Screens [\#3086](https://github.com/locustio/locust/pull/3086) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- FastHttpUser: Dont crash if parameters are passed to failure\(\) when someone forgot catch\_response=True [\#3085](https://github.com/locustio/locust/pull/3085) ([cyberw](https://github.com/cyberw))
- Make the Locust UI Responsive [\#3083](https://github.com/locustio/locust/pull/3083) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add OpenAI User and example [\#3081](https://github.com/locustio/locust/pull/3081) ([cyberw](https://github.com/cyberw))

## [2.33.2](https://github.com/locustio/locust/tree/2.33.2) (2025-03-14)

[Full Changelog](https://github.com/locustio/locust/compare/2.33.1...2.33.2)

**Fixed bugs:**

- There was a heartbeat disconnect during the pressure test [\#3065](https://github.com/locustio/locust/issues/3065)

**Closed issues:**

- Error Logging in FastHttpUser [\#2937](https://github.com/locustio/locust/issues/2937)

**Merged pull requests:**

- Bump @babel/runtime from 7.22.15 to 7.26.10 in /locust/webui [\#3080](https://github.com/locustio/locust/pull/3080) ([dependabot[bot]](https://github.com/apps/dependabot))
- Update ruff to 0.10.0 [\#3079](https://github.com/locustio/locust/pull/3079) ([cyberw](https://github.com/cyberw))
- Optimize unit tests [\#3078](https://github.com/locustio/locust/pull/3078) ([cyberw](https://github.com/cyberw))
- Webui: Bump Vite Version for Dependabot [\#3074](https://github.com/locustio/locust/pull/3074) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update uv to 0.6.5 and optimize docker start time [\#3073](https://github.com/locustio/locust/pull/3073) ([cyberw](https://github.com/cyberw))

## [2.33.1](https://github.com/locustio/locust/tree/2.33.1) (2025-03-08)

[Full Changelog](https://github.com/locustio/locust/compare/2.33.0...2.33.1)

**Fixed bugs:**

- --iterations with locust==2.33.0 and locust-plugins==4.5.3 [\#3071](https://github.com/locustio/locust/issues/3071)
- uv.lock ends up in root of site-packages [\#3053](https://github.com/locustio/locust/issues/3053)

**Merged pull requests:**

- Fix html file naming crash, simplify code [\#3072](https://github.com/locustio/locust/pull/3072) ([cyberw](https://github.com/cyberw))

## [2.33.0](https://github.com/locustio/locust/tree/2.33.0) (2025-02-22)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.10...2.33.0)

**Fixed bugs:**

- UnboundLocalError: local variable 'user\_count' referenced before assignment [\#3051](https://github.com/locustio/locust/issues/3051)

**Merged pull requests:**

- docs: update python-requests documentation links [\#3059](https://github.com/locustio/locust/pull/3059) ([n0h0](https://github.com/n0h0))
- dos: correct venv activation path in docs [\#3058](https://github.com/locustio/locust/pull/3058) ([n0h0](https://github.com/n0h0))
- Use enter to automatically open web UI in default browser [\#3057](https://github.com/locustio/locust/pull/3057) ([cyberw](https://github.com/cyberw))
- Update vite to 6.0.11 [\#3056](https://github.com/locustio/locust/pull/3056) ([cyberw](https://github.com/cyberw))
- Remove uv lock file from build artifacts [\#3055](https://github.com/locustio/locust/pull/3055) ([mquinnfd](https://github.com/mquinnfd))
- Improve error message on missing user\_count or spawn\_rate in swarm payload [\#3052](https://github.com/locustio/locust/pull/3052) ([cyberw](https://github.com/cyberw))
- Enable HTML Report Filename Parsing [\#3049](https://github.com/locustio/locust/pull/3049) ([ktchani](https://github.com/ktchani))
- FastHttpUser: Accept brotli and zstd compression encoding [\#3048](https://github.com/locustio/locust/pull/3048) ([kamilbednarz](https://github.com/kamilbednarz))
- Bump vitest from 2.1.6 to 2.1.9 in /locust/webui [\#3044](https://github.com/locustio/locust/pull/3044) ([dependabot[bot]](https://github.com/apps/dependabot))

## [2.32.10](https://github.com/locustio/locust/tree/2.32.10) (2025-02-18)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.9...2.32.10)

**Closed issues:**

- Switch from Poetry to uv [\#3033](https://github.com/locustio/locust/issues/3033)

**Merged pull requests:**

- Add uv lock file to builds [\#3047](https://github.com/locustio/locust/pull/3047) ([mquinnfd](https://github.com/mquinnfd))
- Use uv/hatch instead of Poetry [\#3039](https://github.com/locustio/locust/pull/3039) ([mquinnfd](https://github.com/mquinnfd))

## [2.32.9](https://github.com/locustio/locust/tree/2.32.9) (2025-02-10)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.8...2.32.9)

**Fixed bugs:**

- Cannot Update Custom options in the Web UI when Default Value is None [\#3011](https://github.com/locustio/locust/issues/3011)

**Merged pull requests:**

- Update docs for stats.py file [\#3038](https://github.com/locustio/locust/pull/3038) ([gabriel-check24](https://github.com/gabriel-check24))
- Add iter\_lines Method to FastHttpSession Class [\#3024](https://github.com/locustio/locust/pull/3024) ([MasterKey-Pro](https://github.com/MasterKey-Pro))
- Fix issue where empty WebUI property is not parsed correctly [\#3012](https://github.com/locustio/locust/pull/3012) ([timhovius](https://github.com/timhovius))

## [2.32.8](https://github.com/locustio/locust/tree/2.32.8) (2025-01-30)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.7...2.32.8)

## [2.32.7](https://github.com/locustio/locust/tree/2.32.7) (2025-01-30)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.6...2.32.7)

**Merged pull requests:**

- Web UI: Allow Showing Only an Error Message on the Login Page [\#3037](https://github.com/locustio/locust/pull/3037) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Allow Empty Tables when Filtering [\#3036](https://github.com/locustio/locust/pull/3036) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Allow xAxis and Grid to be Configured in Echarts [\#3035](https://github.com/locustio/locust/pull/3035) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Code quality: Fix unused imports and switch on related ruff check [\#3034](https://github.com/locustio/locust/pull/3034) ([insspb](https://github.com/insspb))
- Add tab with locust cloud features [\#3032](https://github.com/locustio/locust/pull/3032) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- fix readme image ref links [\#3031](https://github.com/locustio/locust/pull/3031) ([changchaishi](https://github.com/changchaishi))

## [2.32.6](https://github.com/locustio/locust/tree/2.32.6) (2025-01-13)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.5...2.32.6)

**Merged pull requests:**

- Update Dockerfile to use Python 3.12 as base [\#3029](https://github.com/locustio/locust/pull/3029) ([vejmoj1](https://github.com/vejmoj1))
- Update tests to check for hostname instead of fqdn [\#3027](https://github.com/locustio/locust/pull/3027) ([ajt89](https://github.com/ajt89))
- Move some argument parsing/validation from main.py to argument\_parser.py and remove deprecated parameter --hatch-rate [\#3026](https://github.com/locustio/locust/pull/3026) ([ftb-skry](https://github.com/ftb-skry))
- pin poetry-core version to \<2.0.0 in pyproject.toml [\#3025](https://github.com/locustio/locust/pull/3025) ([mgor](https://github.com/mgor))
- Optimize run time of some unit tests [\#3020](https://github.com/locustio/locust/pull/3020) ([cyberw](https://github.com/cyberw))

## [2.32.5](https://github.com/locustio/locust/tree/2.32.5) (2024-12-22)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.4...2.32.5)

**Merged pull requests:**

- Make cpu usage check sleep BEFORE the first check, and make it slightly less frequent [\#3014](https://github.com/locustio/locust/pull/3014) ([cyberw](https://github.com/cyberw))
- FastHttpUser: Fix ssl loading performance issue by avoiding to load certs when they wont be used anyway [\#3013](https://github.com/locustio/locust/pull/3013) ([cyberw](https://github.com/cyberw))
- Treat exceptions in init event handler as fatal [\#3009](https://github.com/locustio/locust/pull/3009) ([cyberw](https://github.com/cyberw))
- Add create store export [\#3004](https://github.com/locustio/locust/pull/3004) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.32.4](https://github.com/locustio/locust/tree/2.32.4) (2024-12-01)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.3...2.32.4)

**Fixed bugs:**

- Number of requests lower than expected in web UI [\#3000](https://github.com/locustio/locust/issues/3000)
- Reports download links do not contain web-base-path [\#2998](https://github.com/locustio/locust/issues/2998)
- Setuptools CVE-2024-6345  [\#2995](https://github.com/locustio/locust/issues/2995)
- When using exclude-tags to exclude more than two tags, this setting will not take effect [\#2994](https://github.com/locustio/locust/issues/2994)

**Merged pull requests:**

- Allow showing auth info on blank page [\#3002](https://github.com/locustio/locust/pull/3002) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Number of requests lower than expected in web UI [\#3001](https://github.com/locustio/locust/pull/3001) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui links should be relative [\#2999](https://github.com/locustio/locust/pull/2999) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Dependency and node version bump [\#2997](https://github.com/locustio/locust/pull/2997) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix example in docs [\#2993](https://github.com/locustio/locust/pull/2993) ([daniloakamine](https://github.com/daniloakamine))
- Add Input Type to Login Form [\#2992](https://github.com/locustio/locust/pull/2992) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update configuration.rst to show minimalistic config example [\#2990](https://github.com/locustio/locust/pull/2990) ([vkuehn](https://github.com/vkuehn))
- Fix README Images for PyPi [\#2989](https://github.com/locustio/locust/pull/2989) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.32.3](https://github.com/locustio/locust/tree/2.32.3) (2024-11-17)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.2...2.32.3)

**Fixed bugs:**

- Setuptools CVE-2022-40897 [\#2986](https://github.com/locustio/locust/issues/2986)
- master crash with different version worker [\#2975](https://github.com/locustio/locust/issues/2975)

**Merged pull requests:**

- Ensure we never use old version of setuptools [\#2988](https://github.com/locustio/locust/pull/2988) ([cyberw](https://github.com/cyberw))
- README Themed Screenshots [\#2985](https://github.com/locustio/locust/pull/2985) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- When specifying locustfile fia url, output start of response text when it wasnt valid python [\#2983](https://github.com/locustio/locust/pull/2983) ([cyberw](https://github.com/cyberw))
- Use debug log level for first 5s of waiting for workers to be ready. [\#2982](https://github.com/locustio/locust/pull/2982) ([cyberw](https://github.com/cyberw))
- Add option for Extra Options to be Required [\#2981](https://github.com/locustio/locust/pull/2981) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update ruff mypy [\#2978](https://github.com/locustio/locust/pull/2978) ([tdadela](https://github.com/tdadela))
- Fix crash with older worker version requesting locustfile from master [\#2976](https://github.com/locustio/locust/pull/2976) ([cyberw](https://github.com/cyberw))
- Use f-strings instead of old style string interpolation [\#2974](https://github.com/locustio/locust/pull/2974) ([tdadela](https://github.com/tdadela))

## [2.32.2](https://github.com/locustio/locust/tree/2.32.2) (2024-11-08)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.1...2.32.2)

**Fixed bugs:**

- Requests not ramping up after switching to using pydantic in django project [\#2960](https://github.com/locustio/locust/issues/2960)
- The locust chart shows that data is still being recorded after the timed run time expires [\#2910](https://github.com/locustio/locust/issues/2910)

**Closed issues:**

- Downloading report should provide a meaningful human name [\#2931](https://github.com/locustio/locust/issues/2931)
- Hard coded path make it impossible to host the UI on a path \(instead of the domain root\) [\#2909](https://github.com/locustio/locust/issues/2909)

**Merged pull requests:**

- Fix Incorrectly Updating Stat History [\#2972](https://github.com/locustio/locust/pull/2972) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Add Markdown Support for Auth Page [\#2969](https://github.com/locustio/locust/pull/2969) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix Web Base Path Env Variable [\#2967](https://github.com/locustio/locust/pull/2967) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Locust Configurable Web Base Path [\#2966](https://github.com/locustio/locust/pull/2966) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix Auth Args Type [\#2965](https://github.com/locustio/locust/pull/2965) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Add Auth Info to Auth Page [\#2963](https://github.com/locustio/locust/pull/2963) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix doc link [\#2961](https://github.com/locustio/locust/pull/2961) ([tjandy98](https://github.com/tjandy98))
- Report name [\#2947](https://github.com/locustio/locust/pull/2947) ([obriat](https://github.com/obriat))

## [2.32.1](https://github.com/locustio/locust/tree/2.32.1) (2024-10-29)

[Full Changelog](https://github.com/locustio/locust/compare/2.32.0...2.32.1)

**Closed issues:**

- Add option to enable different statistics in the chart menu [\#2946](https://github.com/locustio/locust/issues/2946)

**Merged pull requests:**

- Webui Echarts Redraw Request Lines if Changed [\#2953](https://github.com/locustio/locust/pull/2953) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Add Custom Form to Auth Page [\#2952](https://github.com/locustio/locust/pull/2952) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Override Markdown HTML Link with MUI Link [\#2951](https://github.com/locustio/locust/pull/2951) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Fix Echarts Axis Formatting [\#2950](https://github.com/locustio/locust/pull/2950) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Echarts Time Axis Should be Localized [\#2949](https://github.com/locustio/locust/pull/2949) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add Google Analytics to docs.locust.io [\#2948](https://github.com/locustio/locust/pull/2948) ([heyman](https://github.com/heyman))
- LocustBadStatusCode without url param in fasthttp [\#2944](https://github.com/locustio/locust/pull/2944) ([swaalt](https://github.com/swaalt))
- Web UI Remove Default Value for Select if Value is Provided [\#2943](https://github.com/locustio/locust/pull/2943) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI Auth Add Password Visibility Toggle [\#2941](https://github.com/locustio/locust/pull/2941) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.32.0](https://github.com/locustio/locust/tree/2.32.0) (2024-10-15)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.8...2.32.0)

**Fixed bugs:**

- logfile is erroniously written when there are many workers.   [\#2927](https://github.com/locustio/locust/issues/2927)
- Form field for users, spawn rate, and run time still visible in UI although CustomShape defined without use\_common\_options. [\#2924](https://github.com/locustio/locust/issues/2924)
- --html with --process 4 then get ValueError: StatsEntry.use\_response\_times\_cache must be set to True  [\#2908](https://github.com/locustio/locust/issues/2908)
- IPV6 check doesn't work as expected on AWS EKS [\#2787](https://github.com/locustio/locust/issues/2787)

**Merged pull requests:**

- Log deprecation warning for Python 3.9 [\#2940](https://github.com/locustio/locust/pull/2940) ([cyberw](https://github.com/cyberw))
- Run tests on python 3.13 too [\#2939](https://github.com/locustio/locust/pull/2939) ([cyberw](https://github.com/cyberw))
- Web UI - Fix Line Chart [\#2935](https://github.com/locustio/locust/pull/2935) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Modern UI - Fix Hide Common Options [\#2934](https://github.com/locustio/locust/pull/2934) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Allow alerts and errors on new and edit form [\#2932](https://github.com/locustio/locust/pull/2932) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add error message to swarm form [\#2930](https://github.com/locustio/locust/pull/2930) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Disable --csv for workers when using --processes. [\#2929](https://github.com/locustio/locust/pull/2929) ([cyberw](https://github.com/cyberw))
- Decide if ipv6 can work [\#2923](https://github.com/locustio/locust/pull/2923) ([nc-marco](https://github.com/nc-marco))
- Webui Add Form Alert [\#2922](https://github.com/locustio/locust/pull/2922) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add faq item: Basic auth \(Authorization header\) does not work after redirection [\#2921](https://github.com/locustio/locust/pull/2921) ([obriat](https://github.com/obriat))
- Add CSRF example [\#2920](https://github.com/locustio/locust/pull/2920) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI Add Exports for Library [\#2919](https://github.com/locustio/locust/pull/2919) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- lower log level for unnecessary --autostart argument [\#2918](https://github.com/locustio/locust/pull/2918) ([cyberw](https://github.com/cyberw))

## [2.31.8](https://github.com/locustio/locust/tree/2.31.8) (2024-09-28)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.7...2.31.8)

**Merged pull requests:**

- Log locust-cloud version if it is installed [\#2916](https://github.com/locustio/locust/pull/2916) ([cyberw](https://github.com/cyberw))
- Web UI Auth submit should submit a POST request [\#2915](https://github.com/locustio/locust/pull/2915) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Url in template arg [\#2914](https://github.com/locustio/locust/pull/2914) ([fletelli42](https://github.com/fletelli42))
- Fix RTD versioning with a deep git clone [\#2913](https://github.com/locustio/locust/pull/2913) ([mquinnfd](https://github.com/mquinnfd))

## [2.31.7](https://github.com/locustio/locust/tree/2.31.7) (2024-09-25)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4.dev9994...2.31.7)

**Merged pull requests:**

- Fix Dependabot Complaints [\#2912](https://github.com/locustio/locust/pull/2912) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Improve Web UI Logging [\#2911](https://github.com/locustio/locust/pull/2911) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Pin python versions to avoid gh caching issue + always Install Dependencies, even when it looks like there was a cache hit [\#2907](https://github.com/locustio/locust/pull/2907) ([cyberw](https://github.com/cyberw))
- Fix Login Manager Error Message [\#2905](https://github.com/locustio/locust/pull/2905) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Log locust version earlier [\#2904](https://github.com/locustio/locust/pull/2904) ([cyberw](https://github.com/cyberw))
- Add Mongodb test example [\#2903](https://github.com/locustio/locust/pull/2903) ([guel-codes](https://github.com/guel-codes))

## [2.31.4.dev9994](https://github.com/locustio/locust/tree/2.31.4.dev9994) (2024-09-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4.dev9993...2.31.4.dev9994)

## [2.31.4.dev9993](https://github.com/locustio/locust/tree/2.31.4.dev9993) (2024-09-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4.dev9992...2.31.4.dev9993)

## [2.31.4.dev9992](https://github.com/locustio/locust/tree/2.31.4.dev9992) (2024-09-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4.dev9991...2.31.4.dev9992)

## [2.31.4.dev9991](https://github.com/locustio/locust/tree/2.31.4.dev9991) (2024-09-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4.dev999...2.31.4.dev9991)

## [2.31.4.dev999](https://github.com/locustio/locust/tree/2.31.4.dev999) (2024-09-16)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.6...2.31.4.dev999)

## [2.31.6](https://github.com/locustio/locust/tree/2.31.6) (2024-09-15)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.5...2.31.6)

**Fixed bugs:**

- RPS vs Total Running Users [\#2895](https://github.com/locustio/locust/issues/2895)
- Overwriting weight by config-users may lead to crash [\#2852](https://github.com/locustio/locust/issues/2852)
- FastHttpSession requests typing for the json argument should support lists [\#2842](https://github.com/locustio/locust/issues/2842)
- Dockerfile warning [\#2811](https://github.com/locustio/locust/issues/2811)

**Closed issues:**

- Cleaning up the build process [\#2857](https://github.com/locustio/locust/issues/2857)
- Simplify GitHub Actions using install-poetry [\#2822](https://github.com/locustio/locust/issues/2822)

**Merged pull requests:**

- Add Error Message for Accessing Login Manager without --web-login [\#2902](https://github.com/locustio/locust/pull/2902) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update Webui README [\#2901](https://github.com/locustio/locust/pull/2901) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add worker\_count = 1 to LocalRunner for parity with MasterRunner [\#2900](https://github.com/locustio/locust/pull/2900) ([tarkatronic](https://github.com/tarkatronic))
- Remove redundant None in Any | None annotations [\#2892](https://github.com/locustio/locust/pull/2892) ([tdadela](https://github.com/tdadela))
- Fix \_kl\_generator by filtering nonpositive User weights [\#2891](https://github.com/locustio/locust/pull/2891) ([tdadela](https://github.com/tdadela))
- Update README.md [\#2889](https://github.com/locustio/locust/pull/2889) ([JonanOribe](https://github.com/JonanOribe))
- Filename from URL Should Strip Query Params [\#2887](https://github.com/locustio/locust/pull/2887) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Simplify Generator annotations - PEP 696 [\#2886](https://github.com/locustio/locust/pull/2886) ([tdadela](https://github.com/tdadela))
- Fix FastHttpSession.request json typing [\#2885](https://github.com/locustio/locust/pull/2885) ([tdadela](https://github.com/tdadela))

## [2.31.5](https://github.com/locustio/locust/tree/2.31.5) (2024-08-30)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.4...2.31.5)

**Fixed bugs:**

- Pressure testing is over, but RPS and Users still have data [\#2870](https://github.com/locustio/locust/issues/2870)

**Merged pull requests:**

- Ensure we don't accidentally hide errors while importing in locust-cloud or locust-plugins [\#2881](https://github.com/locustio/locust/pull/2881) ([cyberw](https://github.com/cyberw))
- Add publishing dependency on build package step [\#2880](https://github.com/locustio/locust/pull/2880) ([mquinnfd](https://github.com/mquinnfd))
- Build pipeline tweaks - docker tagging [\#2879](https://github.com/locustio/locust/pull/2879) ([mquinnfd](https://github.com/mquinnfd))
- Webui Remove chart initial data fetch [\#2878](https://github.com/locustio/locust/pull/2878) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Document use with uvx and remove openssl version from  --version output [\#2877](https://github.com/locustio/locust/pull/2877) ([cyberw](https://github.com/cyberw))
- Web UI Remove Scroll to Zoom [\#2876](https://github.com/locustio/locust/pull/2876) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Cleaning and improvements in the Build Pipeline [\#2873](https://github.com/locustio/locust/pull/2873) ([mquinnfd](https://github.com/mquinnfd))
- WebUI: Correct types for form select [\#2872](https://github.com/locustio/locust/pull/2872) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.31.4](https://github.com/locustio/locust/tree/2.31.4) (2024-08-26)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.3...2.31.4)

**Merged pull requests:**

- Webui Allow changing select input size [\#2871](https://github.com/locustio/locust/pull/2871) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Replace Logo SVG [\#2867](https://github.com/locustio/locust/pull/2867) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add favicon that looks good in light color theme [\#2866](https://github.com/locustio/locust/pull/2866) ([heyman](https://github.com/heyman))
- Webui Add build lib command to package.json [\#2865](https://github.com/locustio/locust/pull/2865) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI Github Action Publish steps must Build lib [\#2864](https://github.com/locustio/locust/pull/2864) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix npm publish issue [\#2863](https://github.com/locustio/locust/pull/2863) ([cyberw](https://github.com/cyberw))
- GH actions: Update names of publish steps. Don't run prerelease steps when no prerelease is actually going to be published [\#2862](https://github.com/locustio/locust/pull/2862) ([cyberw](https://github.com/cyberw))
- Webui Fix Version Tag in NPM Prerelease Step [\#2861](https://github.com/locustio/locust/pull/2861) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Fix NPM Publish Step [\#2860](https://github.com/locustio/locust/pull/2860) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Web UI as a Library NPM Release [\#2858](https://github.com/locustio/locust/pull/2858) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add PostgresUser to examples [\#2836](https://github.com/locustio/locust/pull/2836) ([guel-codes](https://github.com/guel-codes))

## [2.31.3](https://github.com/locustio/locust/tree/2.31.3) (2024-08-15)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.2...2.31.3)

**Fixed bugs:**

- Brew installed locust missing UI assets [\#2831](https://github.com/locustio/locust/issues/2831)
- response avg time is NaN [\#2829](https://github.com/locustio/locust/issues/2829)
- Windows Action Runs Wrong Version of Locust [\#2796](https://github.com/locustio/locust/issues/2796)

**Merged pull requests:**

- Web UI Remove Echarts startValue [\#2855](https://github.com/locustio/locust/pull/2855) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Update GitHub action versions [\#2853](https://github.com/locustio/locust/pull/2853) ([cyberw](https://github.com/cyberw))
- Improve docs for --class-picker/--config-users and give better error messages if json is bad [\#2851](https://github.com/locustio/locust/pull/2851) ([cyberw](https://github.com/cyberw))
- Add missing margin between Logo and Host in Navbar [\#2850](https://github.com/locustio/locust/pull/2850) ([heyman](https://github.com/heyman))
- Web UI Should use Built-In Echarts Time Axis [\#2847](https://github.com/locustio/locust/pull/2847) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Notification Improvements [\#2846](https://github.com/locustio/locust/pull/2846) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Use new logo in web UI + some minor improvements [\#2844](https://github.com/locustio/locust/pull/2844) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Webui Add Scatterplot Support [\#2840](https://github.com/locustio/locust/pull/2840) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.31.2](https://github.com/locustio/locust/tree/2.31.2) (2024-08-06)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.1...2.31.2)

**Merged pull requests:**

- Prebuild UI in PyPi publish steps so that even source distributions contain web UI code [\#2839](https://github.com/locustio/locust/pull/2839) ([mquinnfd](https://github.com/mquinnfd))
- Add Tests for Web UI Line Chart [\#2838](https://github.com/locustio/locust/pull/2838) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Documentation: Configure html\_baseurl and jinja on RTD [\#2837](https://github.com/locustio/locust/pull/2837) ([plaindocs](https://github.com/plaindocs))

## [2.31.1](https://github.com/locustio/locust/tree/2.31.1) (2024-08-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.31.0...2.31.1)

**Merged pull requests:**

- Fix issue with downloading HTML report, update package.json for webui build [\#2834](https://github.com/locustio/locust/pull/2834) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.31.0](https://github.com/locustio/locust/tree/2.31.0) (2024-08-05)

[Full Changelog](https://github.com/locustio/locust/compare/2.30.0...2.31.0)

**Merged pull requests:**

- Fix docker build for release [\#2830](https://github.com/locustio/locust/pull/2830) ([cyberw](https://github.com/cyberw))
- Github Actions: Use node 20.x \(fix PyPI Release and pre-Release Steps\) [\#2828](https://github.com/locustio/locust/pull/2828) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Improve Echarts and Expose Line and Axis Configuration [\#2826](https://github.com/locustio/locust/pull/2826) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Bump Node [\#2825](https://github.com/locustio/locust/pull/2825) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Integrations for Locust Cloud [\#2824](https://github.com/locustio/locust/pull/2824) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Fix HTML Report Stats Table [\#2817](https://github.com/locustio/locust/pull/2817) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Locust UI Charts Should Change Color Based on Theme [\#2815](https://github.com/locustio/locust/pull/2815) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Locust UI as a Module [\#2804](https://github.com/locustio/locust/pull/2804) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Log a message if total fixed\_count is higher than number of users to spawn [\#2793](https://github.com/locustio/locust/pull/2793) ([cyberw](https://github.com/cyberw))
- Simplify fixed\_count Users generation in UsersDispatcher.\_user\_gen [\#2783](https://github.com/locustio/locust/pull/2783) ([tdadela](https://github.com/tdadela))
- URL Directory, and Multi-File Support for Locustfile Distribution [\#2766](https://github.com/locustio/locust/pull/2766) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.30.0](https://github.com/locustio/locust/tree/2.30.0) (2024-07-31)

[Full Changelog](https://github.com/locustio/locust/compare/2.29.1...2.30.0)

**Fixed bugs:**

- Locust / pypy fails with "AttributeError: module 'gc' has no attribute 'freeze'" error. [\#2818](https://github.com/locustio/locust/issues/2818)
- Worker sometimes fails to send heartbeat after upgrade to urllib3\>=1.26.16 [\#2812](https://github.com/locustio/locust/issues/2812)
- Web UI lacking asset [\#2781](https://github.com/locustio/locust/issues/2781)

**Closed issues:**

- Charts Update Is Delayed [\#2771](https://github.com/locustio/locust/issues/2771)
- Use `itertools.cycle` in `SequentialTaskSet` [\#2740](https://github.com/locustio/locust/issues/2740)
- `SequentialTaskSet` handles task weights in an inconsistent way [\#2739](https://github.com/locustio/locust/issues/2739)

**Merged pull requests:**

- Update poetry windows tests [\#2821](https://github.com/locustio/locust/pull/2821) ([mquinnfd](https://github.com/mquinnfd))
- Fix pypy gc.freeze\(\) AttributeError [\#2819](https://github.com/locustio/locust/pull/2819) ([jimoleary](https://github.com/jimoleary))
- Fix Dockerfile style warning [\#2814](https://github.com/locustio/locust/pull/2814) ([mehrdadbn9](https://github.com/mehrdadbn9))
- Avoid deadlock in gevent/urllib3 connection pool \(fixes occasional worker heartbeat timeouts\) [\#2813](https://github.com/locustio/locust/pull/2813) ([tdadela](https://github.com/tdadela))
- Replace total avg response time with 50 percentile \(avg was broken\) [\#2806](https://github.com/locustio/locust/pull/2806) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add example of a bottlenecked server and use that test to make a new graph for the docs [\#2805](https://github.com/locustio/locust/pull/2805) ([cyberw](https://github.com/cyberw))
- Fix tests on windows [\#2803](https://github.com/locustio/locust/pull/2803) ([mquinnfd](https://github.com/mquinnfd))
- Provide warning for local installs where yarn is not present [\#2801](https://github.com/locustio/locust/pull/2801) ([mquinnfd](https://github.com/mquinnfd))
- Fix Extend Webui Example [\#2800](https://github.com/locustio/locust/pull/2800) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Correctly set version from Poetry in published builds [\#2791](https://github.com/locustio/locust/pull/2791) ([mquinnfd](https://github.com/mquinnfd))
- Fix StatsEntry docstring [\#2784](https://github.com/locustio/locust/pull/2784) ([tdadela](https://github.com/tdadela))
- dispatch benchmark test improvements [\#2780](https://github.com/locustio/locust/pull/2780) ([tdadela](https://github.com/tdadela))
- Typing: strict optional in dispatch.py [\#2779](https://github.com/locustio/locust/pull/2779) ([tdadela](https://github.com/tdadela))
- new events for heartbeat and usage monitor [\#2777](https://github.com/locustio/locust/pull/2777) ([mgor](https://github.com/mgor))
- FastHttpSession requests typing  [\#2775](https://github.com/locustio/locust/pull/2775) ([tdadela](https://github.com/tdadela))
- Remove Line Chart Default Zoom [\#2774](https://github.com/locustio/locust/pull/2774) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- FastHttpSession: Enable passing json as a positional argument for post\(\) and stop converting response times to int [\#2772](https://github.com/locustio/locust/pull/2772) ([tdadela](https://github.com/tdadela))
- SequentialTaskSet: Allow weighted tasks and dict in .tasks [\#2742](https://github.com/locustio/locust/pull/2742) ([bakhtos](https://github.com/bakhtos))
- Implement Poetry build system \(mainly so we don't have to commit dynamically generated front end bundles to git\) [\#2725](https://github.com/locustio/locust/pull/2725) ([mquinnfd](https://github.com/mquinnfd))

## [2.29.1](https://github.com/locustio/locust/tree/2.29.1) (2024-06-25)

[Full Changelog](https://github.com/locustio/locust/compare/2.29.0...2.29.1)

**Fixed bugs:**

- locust/webui/dist/index.html script errors. [\#2753](https://github.com/locustio/locust/issues/2753)

**Merged pull requests:**

- Option to Skip Monkey Patching with LOCUST\_SKIP\_MONKEY\_PATCH [\#2765](https://github.com/locustio/locust/pull/2765) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- HttpSession: Improve error message when someone forgot to pass catch\_response=True + small optimization [\#2762](https://github.com/locustio/locust/pull/2762) ([cyberw](https://github.com/cyberw))
- Add JavaScript to MIME types for Windows Operating Systems [\#2759](https://github.com/locustio/locust/pull/2759) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add proxy support for FastHttpUser [\#2758](https://github.com/locustio/locust/pull/2758) ([NicoAdrian](https://github.com/NicoAdrian))
- Httpsession requests typing [\#2699](https://github.com/locustio/locust/pull/2699) ([tdadela](https://github.com/tdadela))

## [2.29.0](https://github.com/locustio/locust/tree/2.29.0) (2024-06-07)

[Full Changelog](https://github.com/locustio/locust/compare/2.28.0...2.29.0)

**Fixed bugs:**

- The time of the downloaded html report is not correct [\#2691](https://github.com/locustio/locust/issues/2691)
- Event spawning\_complete fires every time a user is created [\#2671](https://github.com/locustio/locust/issues/2671)
- Delay at startup and high cpu usage on Windows in Python 3.12 [\#2555](https://github.com/locustio/locust/issues/2555)

**Closed issues:**

- Log a warning if getting locustfile from master takes more than 60s [\#2748](https://github.com/locustio/locust/issues/2748)
- Show the reset button even after stopping a test [\#2723](https://github.com/locustio/locust/issues/2723)
- Add date to charts in web UI [\#2678](https://github.com/locustio/locust/issues/2678)

**Merged pull requests:**

- Send logs from workers to master and improve log viewer tab in the Web UI [\#2750](https://github.com/locustio/locust/pull/2750) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Add Logging to download\_locustfile\_from\_master [\#2749](https://github.com/locustio/locust/pull/2749) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Modify timestamp generation to remove deprecation warning [\#2738](https://github.com/locustio/locust/pull/2738) ([JavierUhagon](https://github.com/JavierUhagon))
- Docs: Fix API TOC [\#2737](https://github.com/locustio/locust/pull/2737) ([plaindocs](https://github.com/plaindocs))
- Docs: Fix sphinx and theme upgrade [\#2736](https://github.com/locustio/locust/pull/2736) ([plaindocs](https://github.com/plaindocs))
- Docs: Fix theme [\#2735](https://github.com/locustio/locust/pull/2735) ([plaindocs](https://github.com/plaindocs))
- Docs: Import wiki to docs [\#2734](https://github.com/locustio/locust/pull/2734) ([plaindocs](https://github.com/plaindocs))
- Mention installing Locust in Building the Docs [\#2733](https://github.com/locustio/locust/pull/2733) ([plaindocs](https://github.com/plaindocs))
- Docs: Upgrade Sphinx to latest version \(7.3.7\) [\#2732](https://github.com/locustio/locust/pull/2732) ([plaindocs](https://github.com/plaindocs))
- Add date and zoom to charts in web UI [\#2731](https://github.com/locustio/locust/pull/2731) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Use requests 2.32.2 or higher for Python 3.12 [\#2730](https://github.com/locustio/locust/pull/2730) ([cyberw](https://github.com/cyberw))
- The time of the downloaded HTML report is not correct [\#2729](https://github.com/locustio/locust/pull/2729) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Ensure spawning\_complete only happens once on workers [\#2728](https://github.com/locustio/locust/pull/2728) ([cyberw](https://github.com/cyberw))
- Improve confusing log messages if someone accidentally accesses the Web UI over HTTPS [\#2727](https://github.com/locustio/locust/pull/2727) ([cyberw](https://github.com/cyberw))
- Show Reset Button when Test is Stopped [\#2726](https://github.com/locustio/locust/pull/2726) ([andrewbaldwin44](https://github.com/andrewbaldwin44))

## [2.28.0](https://github.com/locustio/locust/tree/2.28.0) (2024-05-23)

[Full Changelog](https://github.com/locustio/locust/compare/2.27.0...2.28.0)

**Fixed bugs:**

- The Charts presentation in the report downloaded by locust is problematic [\#2706](https://github.com/locustio/locust/issues/2706)
- Locust insists on using IPv6 despite being in an IPv4 stack. [\#2689](https://github.com/locustio/locust/issues/2689)
- When there is an error in the FAILURES of the front-end page when there is a worker, there is no escape. [\#2674](https://github.com/locustio/locust/issues/2674)

**Closed issues:**

- Pin the headers and aggregated row to the top and bottom of the window [\#2688](https://github.com/locustio/locust/issues/2688)
- Remove legacy UI [\#2673](https://github.com/locustio/locust/issues/2673)
- TaskSet's `_task_queue` should be a `collections.deque`? [\#2653](https://github.com/locustio/locust/issues/2653)

**Merged pull requests:**

- Pin the headers to the top of the window [\#2717](https://github.com/locustio/locust/pull/2717) ([JavierUhagon](https://github.com/JavierUhagon))
- Dont enable ipv6 for zmq if no ipv6 stack exists [\#2715](https://github.com/locustio/locust/pull/2715) ([cyberw](https://github.com/cyberw))
- Give better error message if User subclass doesnt call base constructor [\#2713](https://github.com/locustio/locust/pull/2713) ([cyberw](https://github.com/cyberw))
- Stop quoting error messages an extra time in distributed mode [\#2712](https://github.com/locustio/locust/pull/2712) ([cyberw](https://github.com/cyberw))
- Lower log levels for exceptions in flask [\#2711](https://github.com/locustio/locust/pull/2711) ([cyberw](https://github.com/cyberw))
- Stop HTML escaping errors for /stats/requests endpoint [\#2710](https://github.com/locustio/locust/pull/2710) ([cyberw](https://github.com/cyberw))
- Update Stats History on HTML Report [\#2709](https://github.com/locustio/locust/pull/2709) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- Logging: Only print hostname instead of FQDN [\#2705](https://github.com/locustio/locust/pull/2705) ([cyberw](https://github.com/cyberw))
- Remove legacy UI [\#2703](https://github.com/locustio/locust/pull/2703) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
- WebUI: update users, spawn\_rate, host and run\_time in `parsed_options` \(for LoadShapes that might access it\) [\#2656](https://github.com/locustio/locust/pull/2656) ([raulparada](https://github.com/raulparada))



\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*


================================================
FILE: Dockerfile
================================================
# This is a local-use Docker image which illustrates the end-to-end build process for Locust

# Stage 1: Build web front end
FROM node:22.0.0-alpine AS webui-builder

ADD locust/webui locust/webui
ADD package.json .

# long yarn timeout necessary in certain network environments
RUN yarn webui:install --production --network-timeout 60000
RUN yarn webui:build

# Stage 2: Build Locust package (make sure any changes here are also reflected in Dockerfile.ci)
FROM python:3.13-slim AS base

FROM base AS builder
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates git
# there are no wheels for some packages (geventhttpclient?) for arm64/aarch64, so we need some build dependencies there
RUN if [ -n "$(arch | grep 'arm64\|aarch64')" ]; then apt install -y --no-install-recommends gcc python3-dev; fi
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
ENV SKIP_PRE_BUILD="true"
COPY . /build
WORKDIR /build
# clear locally built assets, dist remains part of the docker context for CI purposes
RUN rm -rf dist
# bring in the prebuilt front-end before package installation
COPY --from=webui-builder locust/webui/dist locust/webui/dist

# Build the Python project
ENV UV_PROJECT_ENVIRONMENT="/opt/venv"
ADD https://astral.sh/uv/0.7.2/install.sh /uv-installer.sh
RUN sh /uv-installer.sh && rm /uv-installer.sh
ENV PATH="/root/.local/bin/:$PATH"
RUN uv build && \
    pip install dist/*.whl

# Stage 3: Runtime image
FROM base
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# turn off python output buffering
ENV PYTHONUNBUFFERED=1
RUN useradd --create-home locust
# ensure correct permissions
RUN chown -R locust /opt/venv
# perform initial bytecode compilation (brings down total startup time from ~0.9s to ~0.6s)
RUN locust --version
USER locust
WORKDIR /home/locust
EXPOSE 8089 5557
ENTRYPOINT ["locust"]


================================================
FILE: Dockerfile.ci
================================================
# This is the image pushed to Dockerhub, containing the built and tested Locust package

# Stage 1: Install Locust package
FROM python:3.13-slim AS base

FROM base AS builder
RUN apt-get update && apt-get install -y git 
# there are no wheels for some packages (geventhttpclient?) for arm64/aarch64, so we need some build dependencies there
RUN if [ -n "$(arch | grep 'arm64\|aarch64')" ]; then apt install -y --no-install-recommends gcc python3-dev; fi
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# Install the built Python dist
COPY ./dist dist
RUN pip install dist/*.whl

# Stage 2: Runtime image
FROM base
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# turn off python output buffering
ENV PYTHONUNBUFFERED=1
RUN useradd --create-home locust
# ensure correct permissions
RUN chown -R locust /opt/venv
# perform initial bytecode compilation (brings down total startup time from ~0.9s to ~0.6s)
RUN locust --version
USER locust
WORKDIR /home/locust
EXPOSE 8089 5557
ENTRYPOINT ["locust"]


================================================
FILE: LICENSE
================================================
The MIT License

Copyright (c) 2009-2025, Carl Byström, Jonatan Heyman, Lars Holmberg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

================================================
FILE: Makefile
================================================
test:
	pytest -vv locust/test

.PHONY: build
build: check-uv check-yarn
	uv build

install: check-uv
	uv sync

.SILENT:
.PHONY: check-uv
check-uv:
	command -v uv >/dev/null 2>&1 || { echo >&2 "Locust requires the uv binary to be available in this shell to build the Python package.\nSee: https://docs.locust.io/en/stable/developing-locust.html#install-locust-for-development"; exit 1; }

.SILENT:
.PHONY: check-yarn
check-yarn:
	command -v yarn >/dev/null 2>&1 || { echo >&2 "Locust requires the yarn binary to be available in this shell to build the web front-end.\nSee: https://docs.locust.io/en/stable/developing-locust.html#making-changes-to-locust-s-web-ui"; exit 1; }

frontend_build:
	yarn webui:install && yarn webui:build

release: build
	twine upload dist/*

setup_docs_dependencies:
	uv sync --all-groups

build_docs: setup_docs_dependencies
	sphinx-build -b html docs/ docs/_build/

# This command can be used to serve the built documentation at http://localhost for
# easier offline viewing
.SILENT:
.PHONY: serve_docs
serve_docs:
	echo "Serving docs at http://localhost:80"
	python -m http.server 80 -d docs/_build

changelog:
	@echo "Not supported any more. Run ./generate_changelog.py <version_number> instead!"


================================================
FILE: README.md
================================================
# Locust

[![PyPI](https://img.shields.io/pypi/v/locust.svg)](https://pypi.org/project/locust/)
[![Supported Python Versions](https://img.shields.io/pypi/pyversions/locust?color=brightgreen)](https://pypi.org/project/locust/)
[![Downloads](https://static.pepy.tech/personalized-badge/locust?period=total&units=INTERNATIONAL_SYSTEM&left_color=GREY&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/locust)
[![GitHub contributors](https://img.shields.io/github/contributors/locustio/locust.svg)](https://github.com/locustio/locust/graphs/contributors)
[![Support Ukraine Badge](https://bit.ly/support-ukraine-now)](https://github.com/support-ukraine/support-ukraine)

Locust is an open source performance/load testing tool for HTTP and other protocols. Its developer-friendly approach lets you define your tests in regular Python code.

Locust tests can be run from command line or using its web-based UI. Throughput, response times and errors can be viewed in real time and/or exported for later analysis.

You can import regular Python libraries into your tests, and with Locust's pluggable architecture it is infinitely expandable. Unlike when using most other tools, your test design will never be limited by a GUI or domain-specific language.

To get started right away, head over to the [documentation](http://docs.locust.io/en/stable/installation.html).

## Features

#### Write user test scenarios in plain old Python

If you want your users to loop, perform some conditional behaviour or do some calculations, you just use the regular programming constructs provided by Python. Locust runs every user inside its own greenlet (a lightweight process/coroutine). This enables you to write your tests like normal (blocking) Python code instead of having to use callbacks or some other mechanism. Because your scenarios are “just python” you can use your regular IDE, and version control your tests as regular code (as opposed to some other tools that use XML or binary formats)

```python
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3)
    def view_item(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")
```

#### Distributed & Scalable - supports hundreds of thousands of users

Locust makes it easy to run load tests distributed over multiple machines. It is event-based (using [gevent](http://www.gevent.org/)), which makes it possible for a single process to handle many thousands concurrent users. While there may be other tools that are capable of doing more requests per second on a given hardware, the low overhead of each Locust user makes it very suitable for testing highly concurrent workloads.

#### Web-based UI

Locust has a user friendly web interface that shows the progress of your test in real-time. You can even change the load while the test is running. It can also be run without the UI, making it easy to use for CI/CD testing.

<picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/bottlenecked-server-light.png" alt="Locust UI charts" height="100" width="200"/>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/bottlenecked-server-dark.png" alt="Locust UI charts" height="100" width="200"/>
<img src="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/bottlenecked-server-light.png" alt="Locust UI charts" height="100" width="200"/>
</picture>
<picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-running-statistics-light.png" alt="Locust UI stats" height="100" width="200"/>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-running-statistics-dark.png" alt="Locust UI stats" height="100" width="200"/>
<img src="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-running-statistics-light.png" alt="Locust UI stats" height="100" width="200"/>
</picture>
<picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/locust-workers-light.png" alt="Locust UI workers" height="100" width="200"/>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/locust-workers-dark.png" alt="Locust UI workers" height="100" width="200"/>
<img src="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/locust-workers-light.png" alt="Locust UI workers" height="100" width="200"/>
</picture>
<picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-splash-light.png" alt="Locust UI start test" height="100" width="200"/>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-splash-dark.png" alt="Locust UI start test" height="100" width="200"/>
<img src="https://raw.githubusercontent.com/locustio/locust/refs/heads/master/docs/images/webui-splash-light.png" alt="Locust UI start test" height="100" width="200"/>
</picture>

#### Can test any system

Even though Locust primarily works with web sites/services, it can be used to test almost any system or protocol. Just [write a client](https://docs.locust.io/en/latest/testing-other-systems.html#testing-other-systems) for what you want to test, or [explore some created by the community](https://github.com/SvenskaSpel/locust-plugins#users).

## Hackable

Locust's code base is intentionally kept small and doesn't solve everything out of the box. Instead, we try to make it easy to adapt to any situation you may come across, using regular Python code. There is nothing stopping you from: 

* [Send real time reporting data to TimescaleDB and visualize it in Grafana](https://github.com/SvenskaSpel/locust-plugins/blob/master/locust_plugins/dashboards/README.md)
* [Wrap calls to handle the peculiarities of your REST API](https://github.com/SvenskaSpel/locust-plugins/blob/8af21862d8129a5c3b17559677fe92192e312d8f/examples/rest_ex.py#L87) 
* [Use a totally custom load shape/profile](https://docs.locust.io/en/latest/custom-load-shape.html#custom-load-shape)
* [...](https://github.com/locustio/locust/wiki/Extensions)

## Links

* Documentation: [docs.locust.io](https://docs.locust.io)
* Support/Questions: [StackOverflow](https://stackoverflow.com/questions/tagged/locust)
* Github Discussions: [Github Discussions](https://github.com/orgs/locustio/discussions)
* Chat/discussion: [Slack](https://locustio.slack.com) [(signup)](https://communityinviter.com/apps/locustio/locust)

## Authors

* Maintainer: [Lars Holmberg](https://github.com/cyberw)
* UI: [Andrew Baldwin](https://github.com/andrewbaldwin44)
* Original creator: [Jonatan Heyman](https://github.com/heyman)
* Massive thanks to [all of our contributors](https://github.com/locustio/locust/graphs/contributors)

## License

Open source licensed under the MIT license (see _LICENSE_ file for details).


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

Only latest version is actively supported, but issues reported for earlier minor will be considered if they are serious.

## Reporting a Vulnerability

Reported using regular GitHub issues. If there is some reason an issue cannot be made public before a fix has been made, contact @cyberw directly.

## Use Locust safely

Locust is not intended to be deployed on a public-facing server. By default the web UI is only exposed on localhost, so normally this is not a problem.

Do not give someone access to the web UI unless you trust them with everything else that is on that machine.

## Use Locust nicely

Do not load test public web sites/services that you do not own.


================================================
FILE: Vagrantfile
================================================
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial32"
  config.vm.network :forwarded_port, guest: 8089, host: 8089
  config.vm.provision :shell, :path => "examples/vagrant/vagrant.sh"
end


================================================
FILE: benchmarks/dispatch.py
================================================
"""
This file contains a benchmark to validate the performance of Locust itself.
More precisely, the performance of the `UsersDispatcher` class which is responsible
for calculating the distribution of users on each worker. This benchmark is to be used
by people working on Locust's development.
"""

from locust import User
from locust.dispatch import UsersDispatcher
from locust.runners import WorkerNode

import argparse
import gc
import itertools
import statistics
import time

from prettytable import PrettyTable

NUMBER_OF_USER_CLASSES: int = 1000
USER_CLASSES: list[type[User]] = []
WEIGHTS = list(range(1, NUMBER_OF_USER_CLASSES + 1))

for i, x in enumerate(WEIGHTS):
    exec(f"class User{i}(User): weight = {x}")

# Equivalent to:
#
# class User0(User):
#     weight = 5
#
# class User1(User):
#     weight = 55
# .
# .
# .

exec("USER_CLASSES = [" + ",".join(f"User{i}" for i in range(len(WEIGHTS))) + "]")
# Equivalent to:
#
# USER_CLASSES = [
#     User0,
#     User1,
#     .
#     .
#     .
# ]


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-f", "--full-benchmark", action="store_true", help="run benchmark on full test matrix")
    parser.add_argument(
        "-i",
        "--include-fixed-users",
        action="store_true",
        help="add test cases when 50 percent of users use User.fixed_count instead of User.weight",
    )
    parser.add_argument("-r", "--repeat", default=1, type=int, help="number of test cases with the same parameters")
    parser.add_argument("-s", "--save-output", action="store_true", help="save test results to files")
    args = parser.parse_args()

    now = time.time()

    worker_count_cases = [10, 100, 1000]
    user_count_cases = [10_000, 100_000, 1_000_000]
    number_of_user_classes_cases = [1, 30, 1000]
    spawn_rate_cases = [100, 10_000]
    fixed_count_cases = [False, True] if args.include_fixed_users else [False]
    # [0% fixed_count users, 50% fixed_count users] if args.mixed_user_types else [0% fixed_count users]
    repeat_cases = list(range(1, args.repeat + 1))

    if not args.full_benchmark:
        worker_count_cases = [max(worker_count_cases)]
        user_count_cases = [max(user_count_cases)]
        number_of_user_classes_cases = [max(number_of_user_classes_cases)]
        spawn_rate_cases = [max(spawn_rate_cases)]

    case_count = (
        len(worker_count_cases)
        * len(user_count_cases)
        * len(number_of_user_classes_cases)
        * len(spawn_rate_cases)
        * len(fixed_count_cases)
        * len(repeat_cases)
    )

    results = {}

    try:
        for case_index, (
            worker_count,
            user_count,
            number_of_user_classes,
            spawn_rate,
            fixed_users,
            iteration,
        ) in enumerate(
            itertools.product(
                worker_count_cases,
                user_count_cases,
                number_of_user_classes_cases,
                spawn_rate_cases,
                fixed_count_cases,
                repeat_cases,
            )
        ):
            workers = [WorkerNode(str(i)) for i in range(worker_count)]
            if fixed_users:
                sum_fixed_weight = 0
                for j in range(0, number_of_user_classes, 2):
                    sum_fixed_weight += USER_CLASSES[j].weight

                for j in range(0, number_of_user_classes, 2):  # set fixed_weights for 50% of users
                    USER_CLASSES[j].fixed_count = max(1, USER_CLASSES[j].weight // sum_fixed_weight)  # type: ignore # assigned .weight is int

            ts = time.process_time()
            users_dispatcher = UsersDispatcher(
                worker_nodes=workers,
                user_classes=USER_CLASSES[:number_of_user_classes],
            )
            instantiate_duration = time.process_time() - ts

            # Ramp-up
            gc.disable()
            ts = time.process_time()
            users_dispatcher.new_dispatch(target_user_count=user_count, spawn_rate=spawn_rate)
            new_dispatch_ramp_up_duration = time.process_time() - ts
            gc.enable()

            assert len(users_dispatcher.dispatch_iteration_durations) == 0
            users_dispatcher._wait_between_dispatch = 0
            all_dispatched_users_ramp_up = list(users_dispatcher)
            dispatch_iteration_durations_ramp_up = users_dispatcher.dispatch_iteration_durations[:]

            # Ramp-down
            gc.disable()
            ts = time.process_time()
            users_dispatcher.new_dispatch(target_user_count=0, spawn_rate=spawn_rate)
            new_dispatch_ramp_down_duration = time.process_time() - ts
            gc.enable()

            assert len(users_dispatcher.dispatch_iteration_durations) == 0
            users_dispatcher._wait_between_dispatch = 0
            all_dispatched_users_ramp_down = list(users_dispatcher)
            dispatch_iteration_durations_ramp_down = users_dispatcher.dispatch_iteration_durations[:]

            if fixed_users:
                for j in range(0, number_of_user_classes, 2):
                    USER_CLASSES[j].fixed_count = None

            cpu_ramp_up = "{:3.3f}/{:3.3f}/{:3.3f}".format(  # noqa: UP032
                1000 * statistics.mean(dispatch_iteration_durations_ramp_up),
                1000 * min(dispatch_iteration_durations_ramp_up),
                1000 * max(dispatch_iteration_durations_ramp_up),
            )  # noqa: UP032
            cpu_ramp_down = "{:3.3f}/{:3.3f}/{:3.3f}".format(  # noqa: UP032
                1000 * statistics.mean(dispatch_iteration_durations_ramp_down),
                1000 * min(dispatch_iteration_durations_ramp_down),
                1000 * max(dispatch_iteration_durations_ramp_down),
            )

            print(
                "{:04.0f}/{:04.0f} - {:,} workers - {:,} users - {} user classes - {:,} users/s - instantiate: {:.3f}ms - new_dispatch (ramp-up/ramp-down): {:.3f}ms/{:.3f}ms - cpu_ramp_up: {}ms - cpu_ramp_down: {}ms".format(  # noqa: UP032
                    case_index + 1,
                    case_count,
                    worker_count,
                    user_count,
                    number_of_user_classes,
                    spawn_rate,
                    instantiate_duration * 1000,
                    new_dispatch_ramp_up_duration * 1000,
                    new_dispatch_ramp_down_duration * 1000,
                    cpu_ramp_up,
                    cpu_ramp_down,
                )
            )

            results[(worker_count, user_count, number_of_user_classes, spawn_rate, fixed_users, iteration)] = (
                cpu_ramp_up,
                cpu_ramp_down,
            )

    finally:
        table = PrettyTable()
        table.field_names = [
            "Workers",
            "Users",
            "User Classes",
            "Spawn Rate",
            "Fixed Users",
            "Iteration",
            "Ramp-Up (avg/min/max) (ms)",
            "Ramp-Down (avg/min/max) (ms)",
        ]
        table.align["Workers"] = "l"
        table.align["Users"] = "l"
        table.align["User Classes"] = "l"
        table.align["Spawn Rate"] = "l"
        table.align["Fixed Users"] = "l"
        table.align["Iteration"] = "c"
        table.align["Ramp-Up (avg/min/max) (ms)"] = "c"
        table.align["Ramp-Down (avg/min/max) (ms)"] = "c"
        table.add_rows(
            [
                [
                    f"{worker_count:,}",
                    f"{user_count:,}",
                    number_of_user_classes,
                    f"{spawn_rate:,}",
                    "50%" if fixed_users else "0%",
                    iteration,
                    cpu_ramp_up,
                    cpu_ramp_down,
                ]
                for (worker_count, user_count, number_of_user_classes, spawn_rate, fixed_users, iteration), (
                    cpu_ramp_up,
                    cpu_ramp_down,
                ) in results.items()
            ]
        )
        print()
        print(table)

        if args.save_output:
            with open(f"results-dispatch-benchmarks-{int(now)}.txt", "w") as file:
                file.write(table.get_string())

            with open(f"results-dispatch-benchmarks-{int(now)}.json", "w") as file:
                file.write(table.get_json_string())


================================================
FILE: docs/_static/theme-overrides.css
================================================
/* Make it possible to have multiline table cells by removing white-space:nowrap */
.wy-table-responsive table td, .wy-table-responsive table th {
    white-space: normal;
}
.wy-table-responsive {
    margin-bottom: 24px;
    max-width: 100%;
    overflow: visible;
}


================================================
FILE: docs/_templates/footer.html
================================================
{% extends "!footer.html" %}
{% block extrafooter %}
  {{ super }}
  <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=3430e74a-9cd7-459e-837e-520baae8f9e9" />
{% endblock %}


================================================
FILE: docs/api.rst
================================================
###
API
###


User class
============

.. autoclass:: locust.User
    :members: wait_time, tasks, weight, fixed_count, abstract, on_start, on_stop, wait, context, environment

HttpUser class
================

.. autoclass:: locust.HttpUser
    :members: wait_time, tasks, client, abstract

HttpSession class
=================

.. autoclass:: locust.clients.HttpSession
    :members: __init__, request, get, post, delete, put, head, options, patch

FastHttpUser class
==================

.. autoclass:: locust.contrib.fasthttp.FastHttpUser
    :members: wait_time, tasks, client, abstract, rest
    :noindex:

MqttUser class
==================
.. autoclass:: locust.contrib.mqtt.MqttUser
    :members: __init__, host, port, transport, ws_path, tls_context, client_cls, client_id, username, password, protocol 

.. _socketio:

SocketIOUser class
==================

.. autoclass:: locust.contrib.socketio.SocketIOUser
    :members: connect, call, emit, send, on_message, client, options
    :noindex:

FastHttpSession class
=====================

.. autoclass:: locust.contrib.fasthttp.FastHttpSession
    :members: __init__, request, get, post, delete, put, head, options, patch, iter_lines

PostgresUser class
==================

.. autoclass:: locust.contrib.postgres.PostgresUser
    :members: wait_time, tasks, client, abstract
    :noindex:

MongoDBUser class
=================

.. autoclass:: locust.contrib.mongodb.MongoDBUser
    :members: wait_time, tasks, client, abstract
    :noindex:

MilvusUser class
================

.. autoclass:: locust.contrib.milvus.MilvusUser
    :members: wait_time, tasks, client, abstract
    :noindex:

QdrantUser class
================

.. autoclass:: locust.contrib.qdrant.QdrantUser
    :members: wait_time, tasks, client, abstract
    :noindex:

DNSUser class
==========

.. autoclass:: locust.contrib.dns.DNSUser
    :members: client
    :noindex:

TaskSet class
=============

.. autoclass:: locust.TaskSet
    :members: user, parent, wait_time, client, tasks, interrupt, schedule_task, on_start, on_stop, wait

task decorator
==============

.. autofunction:: locust.task

tag decorator
==============

.. autofunction:: locust.tag

SequentialTaskSet class
=======================

.. autoclass:: locust.SequentialTaskSet
    :members: user, parent, wait_time, client, tasks, interrupt, schedule_task, on_start, on_stop


.. _wait_time_functions:

Built in wait_time functions
============================

.. automodule:: locust.wait_time
    :members: between, constant, constant_pacing, constant_throughput

Response class
==============

This class actually resides in the `requests <https://requests.readthedocs.io/>`_ library, 
since that's what Locust is using to make HTTP requests, but it's included in the API docs 
for locust since it's so central when writing locust load tests. You can also look at the 
:py:class:`Response <requests.Response>` class at the 
`requests documentation <https://requests.readthedocs.io/>`_.

.. autoclass:: requests.Response
    :inherited-members:
    :noindex:

ResponseContextManager class
============================

.. autoclass:: locust.clients.ResponseContextManager
    :members: success, failure


.. _exceptions:

Exceptions
==========

.. autoexception:: locust.exception.InterruptTaskSet


.. autoexception:: locust.exception.RescheduleTask


.. autoexception:: locust.exception.RescheduleTaskImmediately


Environment class
=================
.. autoclass:: locust.env.Environment
    :members:


.. _events:

Event hooks
===========

Locust provides event hooks that can be used to extend Locust in various ways.

The following event hooks are available under :py:attr:`Environment.events <locust.env.Environment.events>`, 
and there's also a reference to these events under ``locust.events`` that can be used at the module level 
of locust scripts (since the Environment instance hasn't been created when the locustfile is imported).

.. autoclass:: locust.event.Events
    :members:


.. note::

    It's highly recommended that you add a wildcard keyword argument in your event listeners
    to prevent your code from breaking if new arguments are added in a future version.

EventHook class
---------------

The event hooks are instances of the **locust.events.EventHook** class:

.. autoclass:: locust.event.EventHook
    :members:

Runner classes
=====================

.. autoclass:: locust.runners.Runner
    :members: start, stop, quit, user_count

.. autoclass:: locust.runners.LocalRunner

.. autoclass:: locust.runners.MasterRunner
    :members: register_message, send_message

.. autoclass:: locust.runners.WorkerRunner
    :members: register_message, send_message, client_id, worker_index

Web UI class
============

.. autoclass:: locust.web.WebUI
    :members:

Other
=====

.. autoclass:: locust.shape.LoadTestShape
    :members:

.. autoclass:: locust.stats.RequestStats
    :members: get

.. autoclass:: locust.stats.StatsEntry

.. autofunction:: locust.debug.run_single_user


================================================
FILE: docs/changelog.rst
================================================
####################
Changelog Highlights
####################

For full details of changes, please see https://github.com/locustio/locust/releases or https://github.com/locustio/locust/blob/master/CHANGELOG.md

2.43.3
======
* Update dependencies and some documentation, no functional changes

2.43.2
======
* Upgrade various dependencies, no functional changes https://github.com/locustio/locust/pull/3339, https://github.com/locustio/locust/pull/3343,  https://github.com/locustio/locust/pull/3342, https://github.com/locustio/locust/pull/3341, https://github.com/locustio/locust/pull/3340

2.43.1
======
* Upgrade various Web UI dependencies, no other changes

2.43.0
======
* Capture stacktrace on KeyboardInterrupt on greenlets https://github.com/locustio/locust/pull/3306
* Solving iter_lines problem https://github.com/locustio/locust/pull/3311
* Allow users to stop test run by raising StopTest, use it on missing host https://github.com/locustio/locust/pull/3313
* Remove references to locust.cloud now that it is shutting down https://github.com/locustio/locust/pull/3314
* Support requests>=2.32.5, reimplement the fix previously there for only loading ssl certificates once https://github.com/locustio/locust/pull/3316

2.42.6
======
* GH Actions: Bump actions/checkout from 5 to 6 https://github.com/locustio/locust/pull/3287
* Fix Toml Parser Being Called on .conf Files https://github.com/locustio/locust/pull/3293
* Log duplicate client_ready messages as debug instead of info level https://github.com/locustio/locust/pull/3296
* Various minor code modernization https://github.com/locustio/locust/pull/3299, https://github.com/locustio/locust/pull/3301
* Don't import pytest unless it is really needed, to speed up startup https://github.com/locustio/locust/pull/3296

2.42.5
======
* Log when otel is enabled https://github.com/locustio/locust/pull/3284

2.42.4
======
* Update pytest dependency range https://github.com/locustio/locust/pull/3263
* Allow multiple dropdown in Web UI https://github.com/locustio/locust/pull/3261
* Add OpenTelemetry support https://github.com/locustio/locust/pull/3275, https://github.com/locustio/locust/pull/3276, https://github.com/locustio/locust/pull/3278, https://github.com/locustio/locust/pull/3279

2.42.3
======
* Fix single line .conf files incorrectly being treated as toml https://github.com/locustio/locust/pull/3257
* Update various GitHub actions used in the build https://github.com/locustio/locust/pull/3266, https://github.com/locustio/locust/pull/3259

2.42.2
======
* Remove setuptools from dependencies https://github.com/locustio/locust/pull/3253
* Fix an issue with .conf-files https://github.com/locustio/locust/pull/3256

2.42.1
======

* Add VS Code Extension and k8s Operator to documentation https://github.com/locustio/locust/pull/3251

2.42.0
======
* Introduce DNSUser https://github.com/locustio/locust/pull/3243
* Dependencies: allow gevent >25.8.1, avoid python-requests >2.32.5

2.41.6
======
* Officially support Python 3.14 https://github.com/locustio/locust/pull/3235

2.41.5
======
* Fix FastHttpUser handling of 308 response code
* Fix Unsafe Template Arg https://github.com/locustio/locust/pull/3232

2.41.4
======
(skipped because of failed publishing)

2.41.3
======
* Make workers correctly ignore the --run-time flag https://github.com/locustio/locust/pull/3230

2.41.2
======
* Fix Alignment of View Column Selector https://github.com/locustio/locust/pull/3226
* Pytest plugin: Workaround issue with potential duplicate --host argument definition https://github.com/locustio/locust/pull/3228

2.41.1
======
* Fix incorrect url for feedback form

2.41.0
======
* Suggest possibly misspelled command line arguments (Did you mean ...) https://github.com/locustio/locust/pull/3224
* Add Feedback Form https://github.com/locustio/locust/pull/3223
* Add MqttUser https://github.com/locustio/locust/pull/3216

2.40.5
======
* Avoid wrapping FastResponse in response context manager when not needed https://github.com/locustio/locust/pull/3222

2.40.4
======
* Avoid pytest style locustfiles capturing keyboard input https://github.com/locustio/locust/pull/3219

2.40.3
======
* Make ResponseContextManager.raise_for_status() consider calls to failure() and success() https://github.com/locustio/locust/pull/3217

2.40.2
======
* Refactor clients.ResponseContextManager and fix GC issue https://github.com/locustio/locust/pull/3210
* Refactor SocketIOUser to create separate SocketIOClient class https://github.com/locustio/locust/pull/3211

2.40.1
======
* Pytest plugin: Delay imports to avoid monkey patching until someone actually uses the fixtures https://github.com/locustio/locust/pull/3204 https://github.com/locustio/locust/pull/3205

2.40.0
======
* Add support for pytests as locustfiles https://github.com/locustio/locust/pull/3200
* Refactor FastHttpSession slightly https://github.com/locustio/locust/pull/3198
* Update Dockerfile base to Python 3.13 https://github.com/locustio/locust/pull/3193

2.39.1
======
* Avoid broken gevent version for now by @cyberw in https://github.com/locustio/locust/pull/3196

2.39.0
======
* Add MilvusUser https://github.com/locustio/locust/pull/3168
* Add SocketIOUser https://github.com/locustio/locust/pull/3189

2.38.1
======
* FastHttpUser: Dont send zstd in Accept-Encoding header https://github.com/locustio/locust/pull/3188

2.38.0
======
* Add MarkovTaskSet https://github.com/locustio/locust/pull/3176
* Support for list based custom arguments https://github.com/locustio/locust/pull/3181
* Webui fixes https://github.com/locustio/locust/pull/3177 & https://github.com/locustio/locust/pull/3185

2.37.14
=======
* Web UI: Fix Chart Zoom Slider https://github.com/locustio/locust/pull/3174

2.37.13
=======
* Web UI: Shrink Bundle Size by https://github.com/locustio/locust/pull/3169
* Remove safe_name from /stats/requests response https://github.com/locustio/locust/pull/3171

2.37.12
=======
* Attempt to increase open file limit (RLIMIT_NOFILE) even on master https://github.com/locustio/locust/pull/3162

2.37.11
=======
* Web UI: Always Warn of Invalid Host https://github.com/locustio/locust/pull/3155
* locust-cloud: bump minimum version and support multiple locustfiles https://github.com/locustio/locust/pull/3157 / https://github.com/locustcloud/locust-cloud/pull/38

2.37.10
=======
* Revert accidental removal of --json-file option https://github.com/locustio/locust/pull/3154

2.37.9
======
* Web UI: Fix host field name missing if host is not required https://github.com/locustio/locust/pull/3152

2.37.8
======
* Allow 25.x versions of gevent https://github.com/locustio/locust/pull/3151

2.37.7
======
* Web Ui: Add host field validation https://github.com/locustio/locust/pull/3149

2.37.6
======
* Doc updates, including a fix for config options https://github.com/locustio/locust/pull/3145
* Bumped minimum ConfigArgParse dependency to 1.7.1

2.37.5
======
* Locust Cloud: Stop requiring a locustfile when doing --login or --delete https://github.com/locustio/locust/pull/3141

2.37.4
======
* Bump minimum version of locust-cloud

2.37.3
======
* Webui: Warn on Missing Host https://github.com/locustio/locust/pull/3140

2.37.2
======
* Improve the performance of the `/stats/requests` endpoint when there are >500 unique request names https://github.com/locustio/locust/pull/3136
* Webui: Block starting test in distributed mode until workers have connected https://github.com/locustio/locust/pull/3138

2.37.1
======
* Fix --json-file https://github.com/locustio/locust/pull/3131

2.37.0
======
* Update uv to 0.7.2
* Add --json-file by https://github.com/locustio/locust/pull/3124
* Minor fixes

2.36.3
======
* Bump minimum locust-cloud version + some minor fixes

2.36.2
======
* Remove circular dependency between locust and locust-cloud https://github.com/locustio/locust/pull/3119

2.36.1
======
* Ensure correct version of gevent on Python 3.12

2.36.0
======
* Add locust-cloud as a dependency, so you can now run it using ``locust --cloud`` https://github.com/locustio/locust/pull/3097
* Various minor UI fixes & changes to build process https://github.com/locustio/locust/pull/3104, https://github.com/locustio/locust/pull/3107, https://github.com/locustio/locust/pull/3116
* Refactorings in main() https://github.com/locustio/locust/pull/3101, https://github.com/locustio/locust/pull/3102
* Narrow gevent version requirements to avoid incompatible new version for now https://github.com/locustio/locust/pull/3112

2.35.0
======
* Add profile argument and display in html report https://github.com/locustio/locust/pull/3093
* Various UI fixes and dependency updates

2.34.1
======
* Drop support for Python 3.9 https://github.com/locustio/locust/pull/3090

2.34.0
======
* Add experimental OpenAIUser and example https://github.com/locustio/locust/pull/3081
* Make the Locust UI Responsive and work for smaller screens https://github.com/locustio/locust/pull/3083, https://github.com/locustio/locust/pull/3086
* Tiny fixes & version bumps

2.33.2
======
* Optimize docker startup time https://github.com/locustio/locust/pull/3073
* Various dependency updates

2.33.1
======
* Fix html report file naming crash https://github.com/locustio/locust/pull/3072

2.33.0
======
* Press enter to automatically open web UI in browser https://github.com/locustio/locust/pull/3057
* Enable HTML Report Filename Parsing https://github.com/locustio/locust/pull/3049
* Various minor fixes and dependency updates

2.32.10
=======
* Use uv/hatch instead of Poetry https://github.com/locustio/locust/pull/3039

2.32.9
======
* Fix issue where empty WebUI property is not parsed correctly https://github.com/locustio/locust/pull/3012
* Add iter_lines method to FastHttpSession https://github.com/locustio/locust/pull/3024

2.32.8
======
* Fix a single broken link in the UI

2.32.7
======
* Fix readme image ref links by @changchaishi in https://github.com/locustio/locust/pull/3031
* Add tab showing `Locust Cloud <https://www.locust.cloud>`_ features https://github.com/locustio/locust/pull/3032
* Minor UI enhancements https://github.com/locustio/locust/pull/3035, https://github.com/locustio/locust/pull/3036, https://github.com/locustio/locust/pull/3037
* Code quality: Fix unused imports and switch on related ruff check https://github.com/locustio/locust/pull/3034

2.32.6
======
* Update Dockerfile to use Python 3.12 https://github.com/locustio/locust/pull/3029
* Remove deprecated --hatch-rate parameter https://github.com/locustio/locust/pull/3026

2.32.5
======
* Treat exceptions in init event handler as fatal https://github.com/locustio/locust/pull/3009
* FastHttpUser: Fix SSL certificate loading performance issue https://github.com/locustio/locust/pull/3013
* Delay CPU usage checks to make it less likely to generate false positives during process startup https://github.com/locustio/locust/pull/3014

2.32.4
======
* Minor doc updates https://github.com/locustio/locust/pull/2990, https://github.com/locustio/locust/pull/2989, https://github.com/locustio/locust/pull/2993
* UI fixes and dependency updates https://github.com/locustio/locust/pull/2992 https://github.com/locustio/locust/pull/2997, https://github.com/locustio/locust/pull/3002, https://github.com/locustio/locust/pull/2999
* Fix missing last requests in web UI https://github.com/locustio/locust/pull/3001

2.32.3
======
* Add option for Extra Options to be Required https://github.com/locustio/locust/pull/2981
* Use debug log level for first 5s of waiting for workers to be ready https://github.com/locustio/locust/pull/2982
* Ensure we never use old version of setuptools https://github.com/locustio/locust/pull/2988

2.32.2
======
* Better html report file names https://github.com/locustio/locust/pull/2947
* Fix Incorrectly Updating Stat History https://github.com/locustio/locust/pull/2972
* Various WebUI fixes (most only relevant for https://locust.cloud)

2.32.1
======
* Various WebUI fixes (most only relevant for https://locust.cloud)
* LocustBadStatusCode without url param in fasthttp https://github.com/locustio/locust/pull/2944

2.32.0
======
* Explicitly support Python 3.13 https://github.com/locustio/locust/pull/2939
* Log deprecation warning for Python 3.9 https://github.com/locustio/locust/pull/2940
* Decide if ipv6 can work (especially relevant for EKS) https://github.com/locustio/locust/pull/2923
* Various minor fixes

2.31.8
======
* Minor fixes, nothing worth mentioning.

2.31.7
======
* Log locust version earlier https://github.com/locustio/locust/pull/2904
* Improve Web UI Logging https://github.com/locustio/locust/pull/2911

2.31.6
======
* Various documentation and type hint fixes.
* Fix issue when using --config-users to set weight to 0 https://github.com/locustio/locust/pull/2891
* Add worker_count = 1 to LocalRunner for parity with MasterRunner https://github.com/locustio/locust/pull/2900/files
* Tiny WebUI fixes https://github.com/locustio/locust/pull/2901, https://github.com/locustio/locust/pull/2902

2.31.5
======
* WebUI: Correct types for form select https://github.com/locustio/locust/pull/2872
* Web UI Remove Scroll to Zoom https://github.com/locustio/locust/pull/2876
* Webui Remove chart initial data fetch https://github.com/locustio/locust/pull/2878
* Improved Build Pipeline https://github.com/locustio/locust/pull/2873, https://github.com/locustio/locust/pull/2879, https://github.com/locustio/locust/pull/2880

2.31.4
======
* Publish UI NPM package to simplify use from custom UIs (https://locust.cloud)
* Some tiny UI fixes

2.31.3
======
* Use new logo in web UI + some minor improvements https://github.com/locustio/locust/pull/2844, https://github.com/locustio/locust/pull/2840, https://github.com/locustio/locust/pull/2846, https://github.com/locustio/locust/pull/2850, https://github.com/locustio/locust/pull/2847, https://github.com/locustio/locust/pull/2855
* Update GitHub action versions https://github.com/locustio/locust/pull/2853

2.31.2
======
* Prebuild UI in PyPi publish steps so that even source distributions contain web UI code https://github.com/locustio/locust/pull/2839

2.31.1
======
* Fix issue with downloading HTML report https://github.com/locustio/locust/pull/2834

2.31.0
======
* Fix HTML Report Stats Table https://github.com/locustio/locust/pull/2817
* URL Directory, and Multi-File Support for Locustfile Distribution https://github.com/locustio/locust/pull/2766
* Various UI improvements https://github.com/locustio/locust/pull/2815, https://github.com/locustio/locust/pull/2804, https://github.com/locustio/locust/pull/2824, https://github.com/locustio/locust/pull/2825, https://github.com/locustio/locust/pull/2826, https://github.com/locustio/locust/pull/2828
* Fix docker image build https://github.com/locustio/locust/pull/2830

2.30.0
======
* FastHttpSession: Enable passing json as a positional argument for post() and stop converting response times to int https://github.com/locustio/locust/pull/2772
* New events for heartbeat and usage monitor https://github.com/locustio/locust/pull/2777
* SequentialTaskSet: Allow weighted tasks and dict in .tasks (experimental) https://github.com/locustio/locust/pull/2742
* Implement Poetry build system (mainly so we don't have to commit the built frontend resources to git) https://github.com/locustio/locust/pull/2725
* UI: Replace total avg response time with 50 percentile (avg was broken) https://github.com/locustio/locust/pull/2806
* Avoid deadlock in gevent/urllib3 connection pool (fixes occasional worker heartbeat timeouts) https://github.com/locustio/locust/pull/2813
* This release got no docker image due to a build error

2.29.1
======
* Add option to Skip Monkey Patching with LOCUST_SKIP_MONKEY_PATCH https://github.com/locustio/locust/pull/2765
* HttpSession requests typing https://github.com/locustio/locust/pull/2699
* Add proxy support for FastHttpUser https://github.com/locustio/locust/pull/2758

2.29.0
======
* Ensure spawning_complete only happens once on workers https://github.com/locustio/locust/pull/2728
* Correct time in the downloaded HTML report https://github.com/locustio/locust/pull/2729
* Add date and zoom to charts in web UI https://github.com/locustio/locust/pull/2731
* Send logs from workers to master and improve log viewer tab in the Web UI https://github.com/locustio/locust/pull/2750
* Docs: Upgrade Sphinx and theme, Fix API TOC, import wiki to docs, and mention installing Locust in Building the Docs

2.28.0
======
* Remove legacy UI https://github.com/locustio/locust/pull/2703
* Stop HTML escaping errors for /stats/requests endpoint https://github.com/locustio/locust/pull/2710
* Various minor UI & logging improvements

2.27.0
======
* Simplify how locustfiles are found (using -f). Don’t automatically append .py https://github.com/locustio/locust/pull/2655
* Use more efficient algorithm to calculate user distribution, and allow float weights https://github.com/locustio/locust/pull/2686
* Various minor fixes

2.26.0
======
* Drop support for Python 3.8
* Update geventhttpclient and adjust FastHttpUser max_retries / max_redirects (https://github.com/locustio/locust/pull/2676)
* Pin gevenhttpclient version (https://github.com/locustio/locust/pull/2682)

2.25.0
======
* Add functionality to run listener functions for `custom_messages` concurrently (https://github.com/locustio/locust/pull/2650)
* Update User Classes in Distributed Mode (https://github.com/locustio/locust/pull/2666)
* Log deprecation warning for --legacy-ui (https://github.com/locustio/locust/pull/2670)
* Fix UserClasses weight distribution with gcd (https://github.com/locustio/locust/pull/2663)

2.24.1
======
* Some documentation updates & minor fixes to UI
* Fixes to FastHttpUser content streaming (https://github.com/locustio/locust/pull/2642, https://github.com/locustio/locust/pull/2643)

2.24.0
======
* Pluggable dispatcher logic https://github.com/locustio/locust/pull/2606
* pyproject.toml support for Locust configuration file https://github.com/locustio/locust/pull/2612
* Minor fixes

2.23.1
======
* Fixes for locustfile download https://github.com/locustio/locust/pull/2599
* UI fixes https://github.com/locustio/locust/pull/2600 https://github.com/locustio/locust/pull/2601

2.23.0
======
* UI updates (https://github.com/locustio/locust/pull/2589, https://github.com/locustio/locust/pull/2590, https://github.com/locustio/locust/pull/2596)
* Locustfile distribution from master to worker https://github.com/locustio/locust/pull/2583
* Allow getting locust files from http urls https://github.com/locustio/locust/pull/2595
* Use exec_module() when loading locustfile instead of the deprecated load_module() https://github.com/locustio/locust/pull/2576

2.22.0
======
* Use Modern UI by default, remove --modern-ui and add --legacy-ui parameters https://github.com/locustio/locust/pull/2569

2.21.0
======
* Switch from flake8 + black to ruff for linting and formatting of code
* Update shape class' runner when Web UI picker is used by https://github.com/locustio/locust/pull/2534
* Web UI Modern Auth https://github.com/locustio/locust/pull/2538
* Customization Feature for Percentile Display on Statistics Page https://github.com/locustio/locust/pull/2550
* Allow User weight adjustment (and task selection) in UI when running with --class-picker, or on command line with --config-users argument https://github.com/locustio/locust/pull/2559
* Optimize memory usage when using --processes https://github.com/locustio/locust/pull/2564

2.20.1
======
* run_single_user improvements https://github.com/locustio/locust/pull/2519
* Support IPv6 for zmq connection between master and worker https://github.com/locustio/locust/pull/2521
* Modern UI: Update Vite to 4.5.1 https://github.com/locustio/locust/pull/2530
* Other tiny fixes

2.20.0
======
* Add event.measure context manager for simpler firing of request event (experimental) https://github.com/locustio/locust/pull/2511
* Various improvements to modern UI https://github.com/locustio/locust/pull/2491
* Various tiny fixes

2.19.1
======
* Create any directories as part of the CSV Prefix https://github.com/locustio/locust/pull/2481
* Dont suppress StopUser or GreenletExit in on_stop https://github.com/locustio/locust/pull/2486
* FastHttpUser: Detect response text encoding when no information is present in headers https://github.com/locustio/locust/pull/2485

2.19.0
======
* Add --processes parameter to automatically fork subprocesses for workers https://github.com/locustio/locust/pull/2472
* Automatically shut down workers if master goes missing for too long https://github.com/locustio/locust/pull/2474
* Update minimum version of various dependencies https://github.com/locustio/locust/pull/2476

2.18.4
======
* Various fixes to Modern UI
* Ensure to wait a second before next call to LoadTestShape's tick() https://github.com/locustio/locust/pull/2465

2.18.3
======
* Modern UI: Add sorting to columns on statistics page and downloaded report https://github.com/locustio/locust/pull/2453

2.18.2
======
* FastHttpUser: encoding return str when response is empty https://github.com/locustio/locust/pull/2451

2.18.1
======
* Add Log Viewer to Modern UI https://github.com/locustio/locust/pull/2440

2.18.0
======
* Add a modern web UI based on React, MaterialUI and Vite (activated using --modern-ui) https://github.com/locustio/locust/pull/2405
* Stop supporting Python 3.7 https://github.com/locustio/locust/pull/2421
* Fix too long first wait time for constant_pacing (and constant_throughput) https://github.com/locustio/locust/pull/2428

2.17.0
======
* Support user abstract load shape base classes https://github.com/locustio/locust/pull/2393
* Allow LoadShapes to reuse run-time, spawn-rate and users parameters https://github.com/locustio/locust/pull/2395
* Improve performance for statistics handling https://github.com/locustio/locust/pull/2410
* Test and explicitly support Python 3.12 https://github.com/locustio/locust/pull/2411

2.16.1
======
* Deprecate LOCUST_PLAYWRIGHT env var https://github.com/locustio/locust/pull/2378
* Import locust_plugins if available to give access to its custom command line arguments https://github.com/locustio/locust/pull/2379

2.16.0
======
* Add worker_connect event https://github.com/locustio/locust/pull/2344
* Allow selecting user classes using LOCUST_USER_CLASSES env var https://github.com/locustio/locust/pull/2355
* Web UI dropdown for custom args with choices https://github.com/locustio/locust/pull/2372
* Various minor fixes

2.15.1
======
* Add PERCENTILES_TO_CHART param in stats.py to make the Response Time Chart configurable https://github.com/locustio/locust/pull/2313

2.15.0
======
* Add is_secret option for custom args to be shown in the web UI masked https://github.com/locustio/locust/pull/2284
* Breaking change: Remove deprecated request_success and request_failure event handlers (unified request handler was introduced in 1.5) https://github.com/locustio/locust/pull/2306

2.14.2
======
* Re-add py.typed marker file to package (it was missing in 2.14.1) https://github.com/locustio/locust/pull/2282

2.14.1
======
* Add --json to send stats to stdout as json by @AndersSpringborg in https://github.com/locustio/locust/pull/2269

2.14.0
======
* Add rest method to FastHttpUser to facilitate easy REST/JSON API testing https://github.com/locustio/locust/pull/2274

2.13.2
======
* Fix: Ask worker to reconnect if master gets a broken RPC message by @marcinh in https://github.com/locustio/locust/pull/2271

2.13.1
======
* Document har2locust (auto generation of locustfiles from browser recordings) https://github.com/locustio/locust/pull/2259
* Dont reset connection to worker if master receives a corrupted zmq message by @marcinh in https://github.com/locustio/locust/pull/2266
* Other minor fixes

2.13.0
======
* Add the ability to set default_headers on FastHttpUser https://github.com/locustio/locust/pull/2231
* Web UI: URL link on the host name for easy navigation by @JonanOribe in https://github.com/locustio/locust/pull/2228
* Add support for time strings for --stop timeout (e.g. "5m30s") @cyberw in https://github.com/locustio/locust/pull/2239

2.12.1
======
* Allow setting run time from the web UI & http api by @ajt89 in https://github.com/locustio/locust/pull/2202
* Various fixes

2.12.0
======
* LoadTestShapes with custom user classes https://github.com/locustio/locust/pull/2181
* Minor fixes and bumped some dependencies

2.11.1
======
* Fix issue when editing user count while running a test using --class-picker https://github.com/locustio/locust/pull/2171
* Various minor logging fixes

2.11.0
======
* Allow passing multiple Locustfiles, allow selecting User and Shape class from the WebUI https://github.com/locustio/locust/pull/2137
* Add 'worker_index' to WorkerRunner https://github.com/locustio/locust/pull/2155
* Fix: Ensure new test starts with specified number of users after previous test has been stopped https://github.com/locustio/locust/pull/2152

2.10.2
======
* Fix for Flask 2.2.0 breaking changes https://github.com/locustio/locust/pull/2148

2.10.1
======
* Increase CONNECT_RETRY_COUNT to avoid workers giving up too soon if master is not up yet by https://github.com/locustio/locust/pull/2125

2.10.0
======
* Add ack for worker connection https://github.com/locustio/locust/pull/2077 (note that 2.10 workers will not work with a 2.9 master)
* add support for custom SSLContext when using FastHttpUser https://github.com/locustio/locust/pull/2113
* More robust handling of ZMQ/RPC errors https://github.com/locustio/locust/pull/2120 / https://github.com/locustio/locust/pull/2096
* Full Changelog https://github.com/locustio/locust/compare/2.9.0...2.10.0

2.9.0
=====

* FastHttpUser improvements (including a rename of parameter "url" to "path") https://github.com/locustio/locust/pull/2083
* Modernized build https://github.com/locustio/locust/pull/2070
* Drop support for Python 3.6 https://github.com/locustio/locust/pull/2080
* Add table linkage in UI https://github.com/locustio/locust/pull/2082
* Uniform style of stats/report ascii tables https://github.com/locustio/locust/pull/2084
* Remove explicit version requirement for jinja2 https://github.com/locustio/locust/pull/2090
* Rebalance users even when using fixed_count https://github.com/locustio/locust/pull/2093
* Avoid using incompatible pyzmq 23 https://github.com/locustio/locust/pull/2100

2.8.6
=====

* Support sharing connection pools between users https://github.com/locustio/locust/pull/2059
* Add cpu_warning event, so listeners can do some action when CPU usage is too high https://github.com/locustio/locust/pull/2067

2.8.5
=====

* Fix dependency: Dont use latest Jinja2 because it has breaking changes

2.8.4
=====

* New event: `test_stopping`, triggered just before stopping the test https://github.com/locustio/locust/pull/2033
* New event: `quit`, to enable getting the locust process exit code https://github.com/locustio/locust/pull/2049
* Fix users sometimes not being stopped correctly https://github.com/locustio/locust/pull/2041

2.8.3
=====

* Ensure users are distributed evently across hosts during ramp up https://github.com/locustio/locust/pull/2025 

2.8.2
=====

* Fix issue with permissions in docker image

2.8.1
=====

* Further optimize docker image (60MB compressed)

2.8.0
=====

* Shrink docker image significantly (95MB compressed size for x64 instead of 358MB) by basing the image on python3-slim instead of python3 
* Fix empty tasks section in UI and static report bug (really) https://github.com/locustio/locust/pull/2001

2.7.3
=====

* Fix 'Tasks' section remains empty in web ui https://github.com/locustio/locust/pull/1997

2.7.2
=====

* Fix an issue introduced in 2.7.1 that caused Locust to shut down when the UI stop was clicked https://github.com/locustio/locust/pull/1996

2.7.1
=====
* fix --html report in web mode https://github.com/locustio/locust/pull/1992

2.7.0
=====

* Add run_single_user and documentation on how to debug Users/locustfiles https://github.com/locustio/locust/pull/1985
* Fix "socket operation on non-socket" at shutdown, by reverting #1935 https://github.com/locustio/locust/pull/1991
* Fixing issue with incorrect "All users spawned" log messages https://github.com/locustio/locust/pull/1977

2.6.1
=====

* Documentation fixes only.

2.6.0
=====
* Pass --tags and --exclude-tags to workers. (https://github.com/locustio/locust/pull/1976)
* Clean up some logging messages (https://github.com/locustio/locust/pull/1973)
* Ensure heartbeat\_worker doesn't try to re-establish connection to workers when quit has been called (https://github.com/locustio/locust/pull/1972)
* fixed\_count: ability to spawn a specific number of users \(as opposed to just using weights\) (https://github.com/locustio/locust/pull/1964)

2.5.1
=====

* Ignore empty host field in web ui (Fix running the web UI with class defined hosts) (https://github.com/locustio/locust/pull/1956)
* Throw exception when calling response.success()/.failure() if with-block has not been entered (https://github.com/locustio/locust/pull/1955)
* Stop declaring "fake" class level variables in Environment, User and StatsEntry (https://github.com/locustio/locust/pull/1948)

2.5.0
=====

* Change request event 'url' parameter to contain full URL (technically a breaking change, but very few users will have had time to start using this) (https://github.com/locustio/locust/issues/1927)
* Suppress warnings for patch version mismatch between master and worker (https://github.com/locustio/locust/issues/1926)

2.4.3
=====

* Fix crash on windows (https://github.com/locustio/locust/issues/1924)

2.4.2
=====

* Add --expect-workers-max-wait parameter (https://github.com/locustio/locust/pull/1922)
* Track worker memory usage (https://github.com/locustio/locust/pull/1917)
* Other small fixes

2.4.1
=====

* Fix stat printing when using shapes (https://github.com/locustio/locust/pull/1907)

2.4.0
=====

* Add start_time and url parameters to request event. (https://github.com/locustio/locust/pull/1900)
* Support (and test) Python 3.10 (https://github.com/locustio/locust/pull/1901)
* Make User.run/TaskSet.run final and raise an exception if someone marks it as a task (https://github.com/locustio/locust/pull/1895)
* Release docker image for arm64. (https://github.com/locustio/locust/pull/1889)
* Automated change log generation is broken. Will fix this later, but until then you can look here: https://github.com/locustio/locust/compare/2.2.3...2.4.0

2.3.0
=====

* Accidentally increased version to 2.4 directly so there is no 2.3...

2.2.3
=====

* Fix issue with custom arguments in config file (when not running headless) (https://github.com/locustio/locust/pull/1888)
* Automated change log generation is broken. Will fix this later, but until then you can look here: https://github.com/locustio/locust/compare/2.2.2...2.2.3

2.2.2
=====

* Fix version in Docker builds
* Automated change log generation is broken. Will fix this later, but until then you can look here: https://github.com/locustio/locust/compare/2.2.1...2.2.2

2.2.1
=====

* Automated change log generation is broken. Will fix this later, but until then you can look here: https://github.com/locustio/locust/compare/2.2.0...2.2.1

2.2.0
=====

* Display locustfile and tasks ratio information on index.html
* Add --autostart and --autoquit parameters (https://github.com/locustio/locust/pull/1864)
* Add constant\_throughput wait time \(the inverse of constant\_pacing\)
* Alternative way to rename requests (particularly useful when using an SDK that wraps `requests`) (https://github.com/locustio/locust/pull/1858)
* Add --equal-weights flag (https://github.com/locustio/locust/pull/1842)
* HttpUser: Unpack known exceptions
* Various charting fixes
* Add FastHttpUser directly under locust package
* Auto-generate Locust's version number using setuptools\_scm and git tags 
* Show custom arguments in web ui and forward them to worker (https://github.com/locustio/locust/pull/1841)

2.1.0
=====

* Fix docker builds (2.0 never got pushed to Docker Hub)
* Bump dependency on pyzmq to fix out of memory issue on Windows
* Use 1 as default for user count and spawn rate in web UI start form
* Various documentation updates

2.0.0
=====

User ramp up/down and User type selection is now controlled by the master instead of autonomously by the workers 
----------------------------------------------------------------------------------------------------------------
This has allowed us to fix some issues with incorrect/skewed User type selection and undesired stepping of ramp up. The issues were especially visible when running many workers and/or using LoadShape:s. This change also allows redistribution of Users if a worker disconnects during a test. This is a major change internally in Locust so please let us know if you encounter any problems (particularly regarding ramp up pace, User distribution, CPU usage on master, etc)

Other potentially breaking API changes
--------------------------------------
* Change the default User weight to 1 instead of 10 (the old default made no sense)
* Fire test_start and test_stop events on workers too (previously they were only fired on master/standalone instances)
* Workers now send their version number to master. Master will warn about version differences, and pre 2.0-versions will not be allowed to connect at all (because they would not work anyway)
* Update Flask dependency to 2.0

Significant merged PR:s (and prerelease version they were introduced in)
------------------------------------------------------------------------
* Allow workers to bypass version check by sending -1 as version (2.0.0) https://github.com/locustio/locust/pull/1830
* Improve logging messages and clean up code after dispatch refactoring (2.0.0b4) https://github.com/locustio/locust/pull/1826
* Remove `user_classes_count` from heartbeat payload (2.0.0b4) https://github.com/locustio/locust/pull/1825
* Add option to set concurrency of FastHttpUser/Session (2.0.0b3) https://github.com/locustio/locust/pull/1812/
* Fire test_start and test_stop events on worker nodes (2.0.0b3) https://github.com/locustio/locust/pull/1777/
* Auto shrink request stats table to fit terminal (2.0.0b2) https://github.com/locustio/locust/pull/1811
* Refactoring of the dispatch logic to improve performance (2.0.0b2) https://github.com/locustio/locust/pull/1809 
* Check version of workers when they connect. Warn if there is a mismatch, refuse 1.x workers to connect (2.0.0b1) https://github.com/locustio/locust/pull/1805 
* Change the default User weight to 1 instead of 10 (2.0.0b1) https://github.com/locustio/locust/pull/1803
* Upgrade to Flask 2 (2.0.0b1) https://github.com/locustio/locust/pull/1764
* Move User selection responsibility from worker to master in order to fix unbalanced distribution of users and uneven ramp-up (2.0.0b0) https://github.com/locustio/locust/pull/1621

Some of these are not really that significant and may be removed from this list at a later time, once 2.0 has stabilised.

1.6.0
=====

* Allow cross process communication using custom messages https://github.com/locustio/locust/pull/1782
* Fix: status "stopped" instead of "spawning", tick\(\) method of LoadShape called only once https://github.com/locustio/locust/pull/1769

1.5.3
=====

* Fix an issue with custom Users calling request_success/_failure.fire() not being added to statistics https://github.com/locustio/locust/pull/1761

1.5.2
=====

* Pin version of flask to 1.1.2, fixing https://github.com/locustio/locust/issues/1759
* Fix issue with GRPC compatibility and add GRPC example to documentation https://github.com/locustio/locust/pull/1755
* Use time.perf_counter() to calculate elapsed times everywhere, should only matter for Windows https://github.com/locustio/locust/pull/1758

1.5.1
=====

* Fixed an issue with 1.5.0 where an extra parameter (start_time) was passed to request event https://github.com/locustio/locust/pull/1754

1.5.0
=====

* Unify request_success/request_failure into a single event called request (the old ones are deprecated but still work) https://github.com/locustio/locust/issues/1724
* Add the response object and context as parameters to the request event. context is used to forward information to the request event handler (can be used for things like username, tags etc)

1.4.4
=====

* Ensure runner.quit finishes even when users are broken https://github.com/locustio/locust/pull/1728
* Make runner / user count available to LoadTestShape https://github.com/locustio/locust/pull/1719
* Other small fixes

1.4.3
=====

* Fix bug that broke the tooltips for charts in the Web UI 

1.4.2
=====

* Multiple improvements for charting including tooltips etc
* Added --html option to save HTML report https://github.com/locustio/locust/pull/1637
* Lots of other small fixes

1.4.1
=====

* Fix 100% cpu usage when running in docker/non-tty terminal https://github.com/locustio/locust/issues/1629

1.4.0
=====

* You can now control user count from terminal while the test is running https://github.com/locustio/locust/pull/1612
* Infinite run time is now the default for command line runs https://github.com/locustio/locust/pull/1625
* wait_time now defaults to zero https://github.com/locustio/locust/pull/1626

1.3.2
=====

* List Python 3.9 as supported in the package/on PyPi
* Fix XSS vulnerability in the web UI (sounds important but really isn't, as Locust UI is not meant to be exposed to outside users)

1.3.1
=====

* Bump minimum required gevent version to 20.9.0 (latest), as the previous ones had sneaky binary incompatibilities with the latest version of greenlet ("RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject")

1.3.0
=====

* Breaking change: Remove step-load feature (now that we have LoadTestShape it is no longer needed)
* More type hints to enable better code completion and linting of locustfiles

Bug fixes: 

* LoadTestShape.get\_run\_time is not relative to start of test https://github.com/locustio/locust/issues/1557
* Refactor and fix delayed user stopping in combination with on\_stop https://github.com/locustio/locust/pull/1560
* runner.quit gets blocked by slow on stop https://github.com/locustio/locust/issues/1552
* Remove legacy code that was only needed for py2
* Lots more

1.2.3
=====

* Bug fix (TypeError: code() takes at least 14 arguments (13 given) (Werkzeug version issue) https://github.com/locustio/locust/issues/1545)
* Bug fix (Locust stuck in "Shape worker starting" when restarting a test from the webUI https://github.com/locustio/locust/issues/1540)
* Various linting fixes that *should* have no functional impact

1.2.2
=====

* Bug fix (LoadTestShape in headless mode https://github.com/locustio/locust/pull/1539)

1.2.1
=====

* Bug fix (StatsEntry.use_response_times_cache must be set to True, https://github.com/locustio/locust/issues/1531)

1.2
===

* Rename hatch rate to spawn rate (the --hatch-rate parameter is only deprecated, but the hatch_complete event has been renamed spawning_complete)
* Ability to generate any custom load shape with LoadTestShape class
* Allow ramping down of users
* Ability to use save custom percentiles
* Improve command line stats output
* Bug fixes (excessive precision of metrics in losust csv stats, negative response time when system clock has changed, issue with non-string failure messages, some typos etc)
* Documentation improvements

1.1.1
=====

* --run-time flag is not respected if there is an exception in a test_stop listener
* FastHttpUser: Handle stream ended at an unexpected time and UnicodeDecodeError. Show bad/error status codes on failures page.
* Improve logging when locust master port is busy

1.1
===

* The official Docker image is now based on the ``python:3.8`` image instead of ``python:3.8-alpine``. This should 
  make it easier to install other python packages when extending the locust docker image.
* Allow Users to stop the runner by calling self.environment.runner.quit() (without deadlocking sometimes)
* Cut to only 5% free space on the top of the graphs
* Use csv module to generate csv data (solves issues with sample names that need escaping in csv)
* Various documentation improvements

1.0.3
=====

* Ability to control the exit code of the Locust process by setting :py:attr:`Environment.process_exit_code <locust.env.Environment.process_exit_code>`
* FastHttpLocust: Change dependency to use original geventhttpclient (now that releases can be made there) instead of geventhttpclient-wheels
* Fix search on readthedocs

1.0.2
=====

* Check for low open files limit (ulimit) and try to automatically increase it from within the locust process.
* Other various bug fixes as improvements


.. _changelog-1-0:

1.0, 1.0.1
==========

This version contains some breaking changes.

Locust class renamed to User
----------------------------

We've renamed the ``Locust`` and ``HttpLocust`` classes to ``User`` and ``HttpUser``. The ``locust`` attribute on 
:py:class:`TaskSet <locust.TaskSet>` instances has been renamed to :py:attr:`user <locust.TaskSet.user>`.

The parameter for setting number of users has also been changed, from ``-c`` / ``--clients`` to ``-u`` / ``--users``.

Ability to declare @task directly under the ``User`` class
----------------------------------------------------------

It's now possible to declare tasks directly under a User class like this:

.. code-block:: python

    class WebUser(User):
        @task
        def some_task(self):
            pass

In tasks declared under a User class (e.g. ``some_task`` in the example above), ``self`` refers to the User 
instance, as one would expect. For tasks defined under a :py:class:`TaskSet <locust.TaskSet>` class, ``self`` 
would refer to the ``TaskSet`` instance.

The ``task_set`` attribute on the ``User`` class (previously ``Locust`` class) has been removed. To declare a 
``User`` class with a single ``TaskSet`` one would now use the :py:attr:`tasks <locust.User.tasks>`
attribute instead:

.. code-block:: python

    class MyTaskSet(TaskSet):
        ...
    
    class WebUser(User):
        tasks = [MyTaskSet]


Task tagging
------------

A new :ref:`tag feature <tagging-tasks>` has been added that makes it possible to include/exclude tasks during 
a test run.

Tasks can be tagged using the :py:func:`@tag <locust.tag>` decorator:

.. code-block:: python

    class WebUser(User):
        @task
        @tag("tag1", "tag2")
        def my_task(self):
            ...

And tasks can then be specified/excluded using the ``--tags``/``-T`` and ``--exclude-tags``/``-E`` command line arguments. 


Environment variables changed
-----------------------------

The following changes has been made to the configuration environment variables

* ``LOCUST_MASTER`` has been renamed to ``LOCUST_MODE_MASTER`` (in order to make it less likely to get variable name collisions 
  when running Locust in Kubernetes/K8s which automatically adds environment variables depending on service/pod names).
* ``LOCUST_SLAVE`` has been renamed to ``LOCUST_MODE_WORKER``.
* ``LOCUST_MASTER_PORT`` has been renamed to ``LOCUST_MASTER_NODE_PORT``.
* ``LOCUST_MASTER_HOST`` has been renamed to ``LOCUST_MASTER_NODE_HOST``.
* ``CSVFILEBASE`` has been renamed to ``LOCUST_CSV``.

See the :ref:`configuration` documentation for a full list of available :ref:`environment variables <environment-variables>`.


Other breaking changes
----------------------

* The master/slave terminology has been changed to master/worker. Therefore the command line arguments ``--slave`` and
  ``--expect-slaves`` has been renamed to ``--worker`` and ``--expect-workers``.
* The option for running Locust without the Web UI has been renamed from ``--no-web`` to ``--headless``.
* Removed ``Locust.setup``, ``Locust.teardown``, ``TaskSet.setup`` and ``TaskSet.teardown`` hooks. If you want to 
  run code at the start or end of a test, you should instead use the :py:attr:`test_start <locust.event.Events.test_start>`
  and :py:attr:`test_stop <locust.event.Events.test_stop>` events:
  
  .. code-block:: python
  
      from locust import events
      
      @events.test_start.add_listener
      def on_test_start(**kw):
          print("test is starting")
        
      @events.test_stop.add_listener
      def on_test_start(**kw):
          print("test is stopping")
* ``TaskSequence`` and ``@seq_task`` has been replaced with :ref:`SequentialTaskSet <sequential-taskset>`.
* A ``User count`` column has been added to the history stats CSV file. The column order and column names has been changed.
* The official docker image no longer uses a shell script with a bunch of special environment variables to configure how 
  how locust is started. Instead, the ``locust`` command is now set as ``ENTRYPOINT`` of the docker image. See
  :ref:`running-in-docker` for more info.
* Command line option ``--csv-base-name`` has been removed, since it was just an alias for ``--csv``.
* The way Locust handles logging has been changed. We no longer wrap stdout (and stderr) to automatically make print 
  statements go into the log. ``print()`` statements now only goes to stdout. To add custom entries to the log, one 
  should now use the Python logging module:
  
  .. code-block:: python
  
      import logging
      logging.info("custom logging message)
  
  For more info see :ref:`logging`


Web UI improvements
-------------------

* It's now possible to protect the Web UI with Basic Auth using the ``--web-auth`` command line argument.
* The Web UI can now be served over HTTPS by specifying a TLS certificate and key with the ``--tls-cert`` 
  and ``--tls-key`` command line arguments.
* If the number of users and hatch rate are specified on command line, it's now used to pre-populate the input fields in 
  the Web UI.



Other fixes and improvements
----------------------------

* Added ``--config`` command line option for specifying a :ref:`configuration file <configuration-file>` path
* The code base has been refactored to make it possible to run :ref:`Locust as a python lib <use-as-lib>`. 
* It's now possible to call ``response.failure()`` or ``response.success()`` multiple times when using 
  the ``catch_response=True`` in the HTTP clients. Only the last call to ``success``/``failure`` will count.
* The ``--help`` output has been improved by grouping related options together.



0.14.6
======

* Fix bug when running with latest Gevent version, and pinned the latest version


0.14.0
======

* Drop Python 2 and Python 3.5 support!
* Continuously measure CPU usage and emit a warning if we get a five second average above 90%
* Show CPU usage of slave nodes in the Web UI
* Fixed issue when running Locust distributed and new slave nodes connected during the hatching/ramp-up 
  phase (https://github.com/locustio/locust/issues/1168)


0.13.5
======

Various minor fixes, mainly regarding FastHttpLocust.

0.13.4
======

Identical to previous version, but now built & deployed to Pypi using Travis.

0.13.3
======

* Unable to properly connect multiple slaves - https://github.com/locustio/locust/issues/1176
* Zero exit code on exception - https://github.com/locustio/locust/issues/1172
* `--stop-timeout` is not respected when changing number of running Users in distributed mode - https://github.com/locustio/locust/issues/1162

0.13.2
======

* Fixed bug that broke the Web UI's response time graph

0.13.1
======

* Fixed crash bug on Python 3.8.0
* Various other bug fixes and improvements.


0.13.0
======

* New API for specifying wait time - https://github.com/locustio/locust/pull/1118

  Example of the new API::

      from locust import HttpLocust, between
      class User(HttpLocust):
          # wait between 5 and 30 seconds
          wait_time = between(5, 30)

  There are three built in :ref:`wait time functions <wait_time_functions>`: :py:func:`between <locust.wait_time.between>`,
  :py:func:`constant <locust.wait_time.constant>` and :py:func:`constant_pacing <locust.wait_time.constant_pacing>`.

* FastHttpLocust: Accept self signed SSL certificates, ignore host checks. Improved response code handling
* Add current working dir to sys.path - https://github.com/locustio/locust/pull/484
* Web UI improvements: Added 90th percentile to table, failure per seconds as a series in the chart
* Ability to specify host in web ui
* Added response_length to request_failure event - https://github.com/locustio/locust/pull/1144
* Added p99.9 and p99.99 to request stats distribution csv - https://github.com/locustio/locust/pull/1125
* Various other bug fixes and improvements.

0.12.2
======

* Added `--skip-log-setup` to disable Locust's default logging setup.
* Added `--stop-timeout` to allow tasks to finish running their iteration before stopping
* Added 99.9 and 99.99 percentile response times to csv output
* Allow custom clients to set request response time to None. Those requests will be excluded
  when calculating median, average, min, max and percentile response times.
* Renamed the last row in statistics table from "Total" to "Aggregated" (since the values aren't
  a sum of the individual table rows).
* Some visual improvements to the web UI.
* Fixed issue with simulating fewer number of locust users than the number of slave/worker nodes.
* Fixed bugs in the web UI related to the fact that the stats table is truncated at 500 entries.
* Various other bug fixes and improvements.


0.12.1
======

* Added new :code:`FastHttpLocust` class that uses a faster HTTP client, which should be 5-6 times faster
  than the normal :code:`HttpLocust` class. For more info see the documentation on :ref:`increasing performance <increase-performance>`.
* Added ability to set the exit code of the locust process when exceptions has occurred within the user code,
  using the :code:`--exit-code-on-error` parameter.
* Added TCP keep alive to master/slave communication sockets to avoid broken connections in some environments.
* Dropped support for Python 3.4
* Numerous other bug fixes and improvements.


0.10.0
======

* Python 3.7 support
* Added a status page to the web UI when running Locust distributed showing the status of slave nodes
  and detect down slaves using heartbeats
* Numerous bugfixes/documentation updates (see detailed changelog)


0.9.0
=====

* Added detailed changelog (https://github.com/locustio/locust/blob/master/CHANGELOG.md)
* Numerous bugfixes (see detailed changelog)
* Added sequential task support - https://github.com/locustio/locust/pull/827
* Added support for user-defined wait_function - https://github.com/locustio/locust/pull/785
* By default, Locust no longer resets the statistics when the hatching is complete.
  Therefore :code:`--no-reset-stats` has been deprecated (since it's now the default behavior),
  and instead a new :code:`--reset-stats` option has been added.
* Dropped support for Python 3.3
* Updated documentation

0.8.1
=====

* Updated pyzmq version, and changed so that we don't pin a specific version.
  This makes it easier to install Locust on Windows.


0.8
===

* Python 3 support
* Dropped support for Python 2.6
* Added :code:`--no-reset-stats` option for controlling if the statistics should be reset once
  the hatching is complete
* Added charts to the web UI for requests per second, average response time, and number of
  simulated users.
* Updated the design of the web UI.
* Added ability to write a CSV file for results via command line flag
* Added the URL of the host that is currently being tested to the web UI.
* We now also apply gevent's monkey patching of threads. This fixes an issue when
  using Locust to test Cassandra (https://github.com/locustio/locust/issues/569).
* Various bug fixes and improvements


0.7.5
=====

* Use version 1.1.1 of gevent. Fixes an install issue on certain versions of python.


0.7.4
=====

* Use a newer version of requests, which fixed an issue for users with older versions of
  requests getting ConnectionErrors (https://github.com/locustio/locust/issues/273).
* Various fixes to documentation.


0.7.3
=====

* Fixed bug where POST requests (and other methods as well) got incorrectly reported as
  GET requests, if the request resulted in a redirect.
* Added ability to download exceptions in CSV format. Download links has also been moved
  to its own tab in the web UI.


0.7.2
=====

* Locust now returns an exit code of 1 when any failed requests were reported.
* When making an HTTP request to an endpoint that responds with a redirect, the original
  URL that was requested is now used as the name for that entry in the statistics (unless
  an explicit override is specified through the *name* argument). Previously, the last
  URL in the redirect chain was used to label the request(s) in the statistics.
* Fixed bug which caused only the time of the last request in a redirect chain to be
  included in the reported time.
* Fixed bug which caused the download time of the request body not to be included in the
  reported response time.
* Fixed bug that occurred on some linux dists that were tampering with the python-requests
  system package (removing dependencies which requests is bundling). This bug only occurred
  when installing Locust in the python system packages, and not when using virtualenv.
* Various minor fixes and improvements.


0.7.1
=====

* Exceptions that occurs within TaskSets are now caught by default.
* Fixed bug which caused Min response time to always be 0 after all locusts had been hatched
  and the statistics had been reset.
* Minor UI improvements in the web interface.
* Handle messages from "zombie" slaves by ignoring the message and making a log entry
  in the master process.



0.7
===

HTTP client functionality moved to HttpLocust
---------------------------------------------

Previously, the Locust class instantiated a :py:class:`HttpSession <locust.clients.HttpSession>`
under the client attribute that was used to make HTTP requests. This functionality has
now been moved into the :py:class:`HttpLocust <locust.core.HttpLocust>` class, in an
effort to make it more obvious how one can use Locust to
:doc:`load test non-HTTP systems <testing-other-systems>`.

To make existing locust scripts compatible with the new version you should make your
locust classes inherit from HttpLocust instead of the base Locust class.


msgpack for serializing master/slave data
-----------------------------------------

Locust now uses `msgpack <http://msgpack.org/>`_ for serializing data that is sent between
a master node and its slaves. This addresses a possible attack that can be used to execute
code remote, if one has access to the internal locust ports that are used for master-slave
communication. The reason for this exploit was due to the fact that pickle was used.

.. warning::

    Anyone who uses an older version should make sure that their Locust machines are not publicly
    accessible on port 5557 and 5558. Also, one should never run Locust as root.

Anyone who uses the :py:class:`report_to_master <locust.events.report_to_master>` and
:py:class:`slave_report <locust.events.slave_report>` events, needs to make sure that
any data that is attached to the slave reports is serializable by msgpack.

requests updated to version 2.2
-------------------------------

Locust updated `requests <http://python-requests.org/>`_ to the latest major release.

.. note::

   Requests 1.0 introduced some major API changes (and 2.0 just a few). Please check if you
   are using any internal features and check the documentation:
   `Migrating to 1.x <http://docs.python-requests.org/en/latest/api/#migrating-to-1-x>`_ and
   `Migrationg to 2.x <http://docs.python-requests.org/en/latest/api/#migrating-to-2-x>`_

gevent updated to version 1.0
-------------------------------

gevent 1.0 has now been released and Locust has been updated accordingly.

Big refactoring of request statistics code
------------------------------------------

Refactored :py:class:`RequestStats`.

* Created :py:class:`StatsEntry` which represents a single stats entry (URL).

Previously the :py:class:`RequestStats` was actually doing two different things:

* It was holding track of the aggregated stats from all requests
* It was holding the stats for single stats entries.

Now RequestStats should be instantiated and holds the global stats, as well as a dict of StatsEntry instances which holds the stats for single stats entries (URLs)

Removed support for avg_wait
----------------------------

Previously one could specify avg_wait to :py:class:`TaskSet` and :py:class:`Locust` that Locust would try to strive to. However this can be sufficiently accomplished by using min_wait and max_wait for most use-cases. Therefore we've decided to remove the avg_wait as its use-case is not clear or just too narrow to be in the Locust core.

Removed support for ramping
----------------------------

Previously one could tell Locust, using the --ramp option, to try to find a stable client count that the target host could handle, but it's been broken and undocumented for quite a while so we've decided to remove it from the locust core and perhaps have it reappear as a plugin in the future.


Locust Event hooks now takes keyword argument
---------------------------------------------

When :doc:`extending-locust` by listening to :ref:`events`, the listener functions should now expect
the arguments to be passed in as keyword arguments. It's also highly recommended to add an extra
wildcard keyword arguments to listener functions, since they're then less likely to break if extra
arguments are added to that event in some future version. For example::

    from locust import events

    def on_request(request_type, name, response_time, response_length, **kw):
        print "Got request!"

    locust.events.request_success += on_request

The *method* and *path* arguments to :py:obj:`request_success <locust.events.request_success>` and
:py:obj:`request_failure <locust.events.request_failure>` are now called *request_type* and *name*,
since it's less HTTP specific.


Other changes
-------------

* You can now specify the port on which to run the web host
* Various code cleanups
* Updated gevent/zmq libraries
* Switched to unittest2 discovery
* Added option --only-summary to only output the summary to the console, thus disabling the periodic stats output.
* Locust will now make sure to spawn all the specified locusts in distributed mode, not just a multiple of the number of slaves.
* Fixed the broken Vagrant example.
* Fixed the broken events example (events.py).
* Fixed issue where the request column was not sortable in the web-ui.
* Minor styling of the statistics table in the web-ui.
* Added options to specify host and ports in distributed mode using --master-host, --master-port for the slaves, --master-bind-host, --master-bind-port for the master.
* Removed previously deprecated and obsolete classes WebLocust and SubLocust.
* Fixed so that also failed requests count, when specifying a maximum number of requests on the command line


0.6.2
=====

* Made Locust compatible with gevent 1.0rc2. This allows user to step around a problem
  with running Locust under some versions of CentOS, that can be fixed by upgrading
  gevent to 1.0.
* Added :py:attr:`parent <locust.core.TaskSet.parent>` attribute to TaskSet class that
  refers to the parent TaskSet, or Locust, instance. Contributed by Aaron Daubman.


0.6.1
=====

* Fixed bug that was causing problems when setting a maximum number of requests using the
  **-n** or **--num-request** command line parameter.


0.6
===

.. warning::

    This version comes with non backward compatible changes to the API.
    Anyone who is currently using existing locust scripts and want to upgrade to 0.6
    should read through these changes.

:py:class:`SubLocust <locust.core.SubLocust>` replaced by :py:class:`TaskSet <locust.core.TaskSet>` and :py:class:`Locust <locust.core.Locust>` class behavior changed
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

:py:class:`Locust <locust.core.Locust>` classes does no longer control task scheduling and execution.
Therefore, you no longer define tasks within Locust classes, instead the Locust class has a
:py:attr:`task_set <locust.core.Locust.task_set>` attribute which should point to a
:py:class:`TaskSet <locust.core.TaskSet>` class. Tasks should now be defined in TaskSet
classes, in the same way that was previously done in Locust and SubLocust classes. TaskSets can be
nested just like SubLocust classes could.

So the following code for 0.5.1::

    class User(Locust):
        min_wait = 10000
        max_wait = 120000

        @task(10)
        def index(self):
            self.client.get("/")

        @task(2)
        class AboutPage(SubLocust):
            min_wait = 10000
            max_wait = 120000

            def on_init(self):
                self.client.get("/about/")

            @task
            def team_page(self):
                self.client.get("/about/team/")

            @task
            def press_page(self):
                self.client.get("/about/press/")

            @task
            def stop(self):
                self.interrupt()

Should now be written like::

    class BrowsePage(TaskSet):
        @task(10)
        def index(self):
            self.client.get("/")

        @task(2)
        class AboutPage(TaskSet):
            def on_init(self):
                self.client.get("/about/")

            @task
            def team_page(self):
                self.client.get("/about/team/")

            @task
            def press_page(self):
                self.client.get("/about/press/")

            @task
            def stop(self):
                self.interrupt()

    class User(Locust):
        min_wait = 10000
        max_wait = 120000
        task_set = BrowsePage

Each TaskSet instance gets a :py:attr:`locust <locust.core.TaskSet.locust>` attribute, which refers to the
Locust class.

Locust now uses Requests
------------------------

Locust's own HttpBrowser class (which was typically accessed through *self.client* from within a locust class)
has been replaced by a thin wrapper around the requests library (http://python-requests.org). This comes with
a number of advantages. Users can  now take advantage of a well documented, well written, fully fledged
library for making HTTP requests. However, it also comes with some small API changes which will require users
to update their existing load testing scripts.

Gzip encoding turned on by default
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The HTTP client now sends headers for accepting gzip encoding by default. The **--gzip** command line argument
has been removed and if someone want to disable the *Accept-Encoding* that the HTTP client uses, or any
other HTTP headers you can do::

    class MyWebUser(Locust):
        def on_start(self):
            self.client.headers = {"Accept-Encoding":""}


Improved HTTP client
^^^^^^^^^^^^^^^^^^^^

Because of the switch to using python-requests in the HTTP client, the API for the client has also
gotten a few changes.

* Additionally to the :py:meth:`get <locust.clients.HttpSession.get>`, :py:meth:`post <locust.clients.HttpSession.post>`,
  :py:meth:`put <locust.clients.HttpSession.put>`, :py:meth:`delete <locust.clients.HttpSession.delete>` and
  :py:meth:`head <locust.clients.HttpSession.head>` methods, the :py:class:`HttpSession <locust.clients.HttpSession>` class
  now also has :py:meth:`patch <locust.clients.HttpSession.patch>` and :py:meth:`options <locust.clients.HttpSession.options>` methods.

* All arguments to the HTTP request methods, except for **url** and **data** should now be specified as keyword arguments.
  For example, previously one could specify headers using::

      client.get("/path", {"User-Agent":"locust"}) # this will no longer work

  And should now be specified like::

      client.get("/path", headers={"User-Agent":"locust"})

* In general the whole HTTP client is now more powerful since it leverages on python-requests. Features that we're
  now able to use in Locust includes file upload, SSL, connection keep-alive, and more.
  See the `python-requests documentation <http://python-requests.org>`_ for more details.

* The new :py:class:`HttpSession <locust.clients.HttpSession>` class' methods now return python-request
  :py:class:`Response <requests.Response>` objects. This means that accessing the content of the response
  is no longer made using the **data** attribute, but instead the **content** attribute. The HTTP response
  code is now accessed through the **status_code** attribute, instead of the **code** attribute.


HttpSession methods' catch_response argument improved and allow_http_error argument removed
^^^^^^^^^^^^^^
Download .txt
gitextract_78ea2ktw/

├── .dockerignore
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yaml
│   └── workflows/
│       ├── stale.yml
│       └── tests.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── launch_locust.json
│   └── settings.json
├── CHANGELOG.md
├── Dockerfile
├── Dockerfile.ci
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── Vagrantfile
├── benchmarks/
│   └── dispatch.py
├── docs/
│   ├── _static/
│   │   └── theme-overrides.css
│   ├── _templates/
│   │   └── footer.html
│   ├── api.rst
│   ├── changelog.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── custom-load-shape.rst
│   ├── developing-locust.rst
│   ├── extending-locust.rst
│   ├── extensions.rst
│   ├── faq.rst
│   ├── further-reading.rst
│   ├── history.rst
│   ├── increase-performance.rst
│   ├── increasing-request-rate.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── kubernetes-operator.rst
│   ├── logging.rst
│   ├── quickstart.rst
│   ├── retrieving-stats.rst
│   ├── running-distributed.rst
│   ├── running-in-debugger.rst
│   ├── running-in-docker.rst
│   ├── running-without-web-ui.rst
│   ├── tasksets.rst
│   ├── telemetry.rst
│   ├── testing-other-systems.rst
│   ├── use-as-lib.rst
│   ├── vscode-extension.rst
│   ├── what-is-locust.rst
│   └── writing-a-locustfile.rst
├── examples/
│   ├── add_command_line_argument.py
│   ├── basic.py
│   ├── bottlenecked_server.py
│   ├── browse_docs_sequence_test.py
│   ├── browse_docs_test.py
│   ├── csrf_form_authentication.py
│   ├── custom_messages.py
│   ├── custom_shape/
│   │   ├── double_wave.py
│   │   ├── stages.py
│   │   ├── staging_user_classes.py
│   │   ├── step_load.py
│   │   └── wait_user_count.py
│   ├── custom_wait_function.py
│   ├── custom_xmlrpc_client/
│   │   ├── server.py
│   │   └── xmlrpc_locustfile.py
│   ├── debugging.py
│   ├── debugging_advanced.py
│   ├── dispatch_test_scripts/
│   │   ├── locustfile.py
│   │   ├── run-disributed-headless.sh
│   │   ├── run-disributed-web.sh
│   │   ├── run-local-headless.sh
│   │   └── run-local-web.sh
│   ├── dns_ex.py
│   ├── docker-compose/
│   │   └── docker-compose.yml
│   ├── dynamic_user_credentials.py
│   ├── events.py
│   ├── extend_web_ui.py
│   ├── fast_http_locust.py
│   ├── grpc/
│   │   ├── grpc_user.py
│   │   ├── hello.proto
│   │   ├── hello_pb2.py
│   │   ├── hello_pb2_grpc.py
│   │   ├── hello_server.py
│   │   └── locustfile.py
│   ├── locustfile.py
│   ├── manual_stats_reporting.py
│   ├── markov_taskset.py
│   ├── milvus/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── mongodb/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── mqtt/
│   │   ├── README.md
│   │   ├── locustfile.py
│   │   ├── locustfile_custom_mqtt_client.py
│   │   └── mosquitto_config/
│   │       └── mosquitto.conf
│   ├── multiple_hosts.py
│   ├── nested_inline_tasksets.py
│   ├── open_closed_workload.py
│   ├── openai_ex.py
│   ├── postgres/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── qdrant/
│   │   ├── README.md
│   │   └── locustfile.py
│   ├── response_validations.py
│   ├── rest.py
│   ├── sdk_session_patching/
│   │   └── session_patch_locustfile.py
│   ├── semaphore_wait.py
│   ├── socketio/
│   │   ├── echo_server.py
│   │   └── socketio_ex.py
│   ├── stop_on_threshold.py
│   ├── terraform/
│   │   └── aws/
│   │       ├── README.md
│   │       ├── data_subnet.tf
│   │       ├── main.tf
│   │       ├── output.tf
│   │       ├── plan/
│   │       │   └── basic.py
│   │       ├── provisioner.tf
│   │       └── variables.tf
│   ├── test_data_management.py
│   ├── test_pytest.py
│   ├── testdata_from_csv.csv
│   ├── testdata_from_csv.py
│   ├── use_as_lib.py
│   ├── vagrant/
│   │   ├── README.md
│   │   └── supervisord.conf
│   ├── web_ui_auth/
│   │   ├── basic.py
│   │   └── custom_form.py
│   ├── web_ui_cache_stats.py
│   ├── worker_index.py
│   └── x-forwarded-for.py
├── generate_changelog.py
├── hatch_build.py
├── locust/
│   ├── __init__.py
│   ├── __main__.py
│   ├── argument_parser.py
│   ├── clients.py
│   ├── contrib/
│   │   ├── __init__.py
│   │   ├── dns.py
│   │   ├── fasthttp.py
│   │   ├── milvus.py
│   │   ├── mongodb.py
│   │   ├── mqtt.py
│   │   ├── oai.py
│   │   ├── postgres.py
│   │   ├── qdrant.py
│   │   └── socketio.py
│   ├── debug.py
│   ├── dispatch.py
│   ├── env.py
│   ├── event.py
│   ├── exception.py
│   ├── html.py
│   ├── input_events.py
│   ├── log.py
│   ├── main.py
│   ├── opentelemetry.py
│   ├── py.typed
│   ├── rpc/
│   │   ├── __init__.py
│   │   ├── protocol.py
│   │   └── zmqrpc.py
│   ├── runners.py
│   ├── shape.py
│   ├── stats.py
│   ├── test/
│   │   ├── __init__.py
│   │   ├── fake_module1_for_env_test.py
│   │   ├── fake_module2_for_env_test.py
│   │   ├── subprocess_utils.py
│   │   ├── test_date.py
│   │   ├── test_debugging.py
│   │   ├── test_dispatch.py
│   │   ├── test_env.py
│   │   ├── test_fasthttp.py
│   │   ├── test_html_filename.py
│   │   ├── test_http.py
│   │   ├── test_interruptable_task.py
│   │   ├── test_load_locustfile.py
│   │   ├── test_locust_class.py
│   │   ├── test_log.py
│   │   ├── test_main.py
│   │   ├── test_markov_taskset.py
│   │   ├── test_old_wait_api.py
│   │   ├── test_parser.py
│   │   ├── test_pytest_locustfile.py
│   │   ├── test_runners.py
│   │   ├── test_sequential_taskset.py
│   │   ├── test_socketio.py
│   │   ├── test_stats.py
│   │   ├── test_tags.py
│   │   ├── test_taskratio.py
│   │   ├── test_users.py
│   │   ├── test_util.py
│   │   ├── test_wait_time.py
│   │   ├── test_web.py
│   │   ├── test_zmqrpc.py
│   │   ├── testcases.py
│   │   └── util.py
│   ├── user/
│   │   ├── __init__.py
│   │   ├── inspectuser.py
│   │   ├── markov_taskset.py
│   │   ├── sequential_taskset.py
│   │   ├── task.py
│   │   ├── users.py
│   │   └── wait_time.py
│   ├── util/
│   │   ├── __init__.py
│   │   ├── cache.py
│   │   ├── date.py
│   │   ├── deprecation.py
│   │   ├── directory.py
│   │   ├── exception_handler.py
│   │   ├── load_locustfile.py
│   │   ├── rounding.py
│   │   ├── timespan.py
│   │   └── url.py
│   ├── web.py
│   └── webui/
│       ├── .gitignore
│       ├── .prettierrc
│       ├── .yarn/
│       │   └── releases/
│       │       └── yarn-4.12.0.cjs
│       ├── .yarnrc.yml
│       ├── LICENSE
│       ├── README.md
│       ├── auth.html
│       ├── dev.html
│       ├── eslint.config.mjs
│       ├── index.html
│       ├── package.json
│       ├── package.tgz
│       ├── report.html
│       ├── src/
│       │   ├── App.test.tsx
│       │   ├── App.tsx
│       │   ├── HtmlReport.tsx
│       │   ├── assets/
│       │   │   └── Logo.tsx
│       │   ├── components/
│       │   │   ├── DataTable/
│       │   │   │   ├── DataTable.test.tsx
│       │   │   │   └── DataTable.tsx
│       │   │   ├── ExceptionsTab/
│       │   │   │   └── ExceptionsTab.tsx
│       │   │   ├── ExceptionsTable/
│       │   │   │   ├── ExceptionsTable.tsx
│       │   │   │   └── ExceptionsTableContainer.tsx
│       │   │   ├── FadeInBox.tsx
│       │   │   ├── FailuresTable/
│       │   │   │   ├── FailuresTable.tsx
│       │   │   │   └── FailuresTableContainer.tsx
│       │   │   ├── FallbackRender/
│       │   │   │   ├── FallbackRender.test.tsx
│       │   │   │   └── FallbackRender.tsx
│       │   │   ├── Form/
│       │   │   │   ├── CustomInput.tsx
│       │   │   │   ├── Form.tsx
│       │   │   │   ├── NumericField.tsx
│       │   │   │   ├── PasswordField.tsx
│       │   │   │   ├── Select.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── CustomInput.test.tsx
│       │   │   │       ├── Form.test.tsx
│       │   │   │       ├── NumericField.test.tsx
│       │   │   │       ├── PasswordField.test.tsx
│       │   │   │       └── Select.test.tsx
│       │   │   ├── Layout/
│       │   │   │   ├── Footer/
│       │   │   │   │   ├── About.tsx
│       │   │   │   │   └── Footer.tsx
│       │   │   │   ├── Layout.tsx
│       │   │   │   └── Navbar/
│       │   │   │       ├── DarkLightToggle.tsx
│       │   │   │       ├── Navbar.tsx
│       │   │   │       ├── SwarmMonitor.test.tsx
│       │   │   │       └── SwarmMonitor.tsx
│       │   │   ├── LineChart/
│       │   │   │   ├── LineChart.constants.ts
│       │   │   │   ├── LineChart.tsx
│       │   │   │   ├── LineChart.types.ts
│       │   │   │   ├── LineChart.utils.ts
│       │   │   │   └── tests/
│       │   │   │       ├── LineChart.mocks.ts
│       │   │   │       ├── LineChart.test.tsx
│       │   │   │       └── LineChartUtils.test.tsx
│       │   │   ├── LogViewer/
│       │   │   │   ├── LogDisplay.tsx
│       │   │   │   ├── LogViewer.tsx
│       │   │   │   ├── LogViewer.utils.tsx
│       │   │   │   ├── WorkerLogs.tsx
│       │   │   │   ├── tests/
│       │   │   │   │   ├── LogViewer.test.tsx
│       │   │   │   │   ├── WorkerLogs.test.tsx
│       │   │   │   │   └── useLogViewer.test.tsx
│       │   │   │   └── useLogViewer.ts
│       │   │   ├── Modal/
│       │   │   │   └── Modal.tsx
│       │   │   ├── Reports/
│       │   │   │   ├── Reports.test.tsx
│       │   │   │   └── Reports.tsx
│       │   │   ├── ResponseTimeTable/
│       │   │   │   ├── ResponseTimeTable.test.tsx
│       │   │   │   └── ResponseTimeTable.tsx
│       │   │   ├── StateButtons/
│       │   │   │   ├── EditButton.tsx
│       │   │   │   ├── NewTestButton.tsx
│       │   │   │   ├── ResetButton.tsx
│       │   │   │   ├── StateButtons.tsx
│       │   │   │   ├── StopButton.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── ResetButton.test.tsx
│       │   │   │       ├── StateButtons.test.tsx
│       │   │   │       └── StopButton.test.tsx
│       │   │   ├── StatsTable/
│       │   │   │   ├── StatsTable.tsx
│       │   │   │   └── StatsTableContainer.tsx
│       │   │   ├── SwarmCharts/
│       │   │   │   ├── SwarmCharts.tsx
│       │   │   │   └── SwarmChartsContainer.tsx
│       │   │   ├── SwarmForm/
│       │   │   │   ├── LoadingButton.tsx
│       │   │   │   ├── SwarmCustomParameters.tsx
│       │   │   │   ├── SwarmForm.tsx
│       │   │   │   ├── SwarmUserClassPicker.tsx
│       │   │   │   └── tests/
│       │   │   │       ├── SwarmCustomParameters.test.tsx
│       │   │   │       ├── SwarmForm.test.tsx
│       │   │   │       └── SwarmUserClassPicker.test.tsx
│       │   │   ├── SwarmRatios/
│       │   │   │   ├── SwarmRatios.test.tsx
│       │   │   │   ├── SwarmRatios.tsx
│       │   │   │   └── SwarmRatiosContainer.tsx
│       │   │   ├── SwarmRatiosTab/
│       │   │   │   └── SwarmRatiosTab.tsx
│       │   │   ├── Table/
│       │   │   │   ├── Table.test.tsx
│       │   │   │   └── Table.tsx
│       │   │   ├── Tabs/
│       │   │   │   ├── Tabs.constants.tsx
│       │   │   │   ├── Tabs.test.tsx
│       │   │   │   └── Tabs.tsx
│       │   │   ├── ViewColumnSelector/
│       │   │   │   ├── ViewColumnSelector.test.tsx
│       │   │   │   └── ViewColumnSelector.tsx
│       │   │   └── WorkersTable/
│       │   │       └── WorkersTable.tsx
│       │   ├── constants/
│       │   │   ├── auth.ts
│       │   │   ├── logs.ts
│       │   │   ├── swarm.ts
│       │   │   └── theme.ts
│       │   ├── global.d.ts
│       │   ├── hooks/
│       │   │   ├── tests/
│       │   │   │   ├── useFetchExceptions.test.tsx
│       │   │   │   ├── useFetchStats.test.tsx
│       │   │   │   ├── useFetchTasks.test.tsx
│       │   │   │   ├── useNotifications.test.tsx
│       │   │   │   ├── useSelecteViewColumns.test.tsx
│       │   │   │   └── useSortByField.test.tsx
│       │   │   ├── useCreateTheme.ts
│       │   │   ├── useFetchExceptions.ts
│       │   │   ├── useFetchStats.ts
│       │   │   ├── useFetchTasks.ts
│       │   │   ├── useFetchWorkerCount.ts
│       │   │   ├── useForm.ts
│       │   │   ├── useInterval.ts
│       │   │   ├── useNotifications.ts
│       │   │   ├── useSelectViewColumns.ts
│       │   │   └── useSortByField.ts
│       │   ├── images.d.ts
│       │   ├── index.tsx
│       │   ├── lib.tsx
│       │   ├── pages/
│       │   │   ├── Auth.tsx
│       │   │   ├── Dashboard.tsx
│       │   │   ├── HtmlReport.tsx
│       │   │   └── tests/
│       │   │       ├── Auth.test.tsx
│       │   │       ├── Dashboard.test.tsx
│       │   │       └── HtmlReport.test.tsx
│       │   ├── redux/
│       │   │   ├── api/
│       │   │   │   └── swarm.ts
│       │   │   ├── hooks.ts
│       │   │   ├── slice/
│       │   │   │   ├── logViewer.slice.ts
│       │   │   │   ├── notification.slice.ts
│       │   │   │   ├── root.slice.ts
│       │   │   │   ├── swarm.slice.ts
│       │   │   │   ├── tests/
│       │   │   │   │   └── ui.slice.test.ts
│       │   │   │   ├── theme.slice.ts
│       │   │   │   ├── ui.slice.ts
│       │   │   │   └── url.slice.ts
│       │   │   ├── store.ts
│       │   │   └── utils.ts
│       │   ├── styles/
│       │   │   └── theme.ts
│       │   ├── test/
│       │   │   ├── constants.ts
│       │   │   ├── mocks/
│       │   │   │   ├── statsRequest.mock.ts
│       │   │   │   └── swarmState.mock.ts
│       │   │   ├── setup.ts
│       │   │   └── testUtils.tsx
│       │   ├── types/
│       │   │   ├── auth.types.ts
│       │   │   ├── form.types.ts
│       │   │   ├── swarm.types.ts
│       │   │   ├── tab.types.ts
│       │   │   ├── table.types.ts
│       │   │   ├── ui.types.ts
│       │   │   └── window.types.ts
│       │   └── utils/
│       │       ├── array.ts
│       │       ├── date.ts
│       │       ├── number.ts
│       │       ├── object.ts
│       │       ├── string.ts
│       │       ├── tests/
│       │       │   ├── number.test.ts
│       │       │   ├── object.test.ts
│       │       │   ├── string.test.ts
│       │       │   └── url.test.ts
│       │       └── url.ts
│       ├── tsconfig.json
│       ├── vite.config.ts
│       ├── vite.lib.config.ts
│       ├── vite.report.config.ts
│       └── vitest.config.ts
├── package.json
├── pyproject.toml
└── pytest_locust/
    └── plugin.py
Download .txt
Showing preview only (780K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8306 symbols across 225 files)

FILE: docs/conf.py
  function save_locust_help_output (line 29) | def save_locust_help_output():
  function save_locust_env_variables (line 43) | def save_locust_env_variables():

FILE: examples/add_command_line_argument.py
  function _ (line 5) | def _(parser):
  function _ (line 22) | def _(environment, **kw):
  class WebsiteUser (line 26) | class WebsiteUser(HttpUser):
    method my_task (line 28) | def my_task(self):

FILE: examples/basic.py
  function index (line 4) | def index(l):
  function stats (line 8) | def stats(l):
  class UserTasks (line 12) | class UserTasks(TaskSet):
    method page404 (line 18) | def page404(self):
  class WebsiteUser (line 22) | class WebsiteUser(HttpUser):

FILE: examples/bottlenecked_server.py
  class WebsiteUser (line 18) | class WebsiteUser(HttpUser):
    method index (line 22) | def index(l):
  function locust_init (line 27) | def locust_init(environment, **kwargs):

FILE: examples/browse_docs_sequence_test.py
  class BrowseDocumentationSequence (line 11) | class BrowseDocumentationSequence(SequentialTaskSet):
    method on_start (line 12) | def on_start(self):
    method index_page (line 17) | def index_page(self):
    method load_page (line 26) | def load_page(self, url=None):
    method load_sub_page (line 34) | def load_sub_page(self):
  class AwesomeUser (line 39) | class AwesomeUser(HttpUser):

FILE: examples/browse_docs_test.py
  class BrowseDocumentation (line 11) | class BrowseDocumentation(TaskSet):
    method on_start (line 12) | def on_start(self):
    method index_page (line 18) | def index_page(self):
    method load_page (line 25) | def load_page(self, url=None):
    method load_sub_page (line 33) | def load_sub_page(self):
  class AwesomeUser (line 38) | class AwesomeUser(HttpUser):

FILE: examples/csrf_form_authentication.py
  class WebsiteUser (line 6) | class WebsiteUser(HttpUser):
    method authenticate (line 11) | def authenticate(self):

FILE: examples/custom_messages.py
  function setup_test_users (line 9) | def setup_test_users(environment, msg, **kwargs):
  function on_acknowledge (line 16) | def on_acknowledge(msg, **kwargs):
  function on_concurrent_message (line 21) | def on_concurrent_message(msg, **kwargs):
  function on_locust_init (line 28) | def on_locust_init(environment, **_kwargs):
  function on_test_start (line 37) | def on_test_start(environment, **_kwargs):
  class WebsiteUser (line 64) | class WebsiteUser(HttpUser):
    method __init__ (line 68) | def __init__(self, parent):
    method task (line 73) | def task(self):

FILE: examples/custom_shape/double_wave.py
  class UserTasks (line 6) | class UserTasks(TaskSet):
    method get_root (line 8) | def get_root(self):
  class WebsiteUser (line 12) | class WebsiteUser(HttpUser):
  class DoubleWave (line 17) | class DoubleWave(LoadTestShape):
    method tick (line 35) | def tick(self):

FILE: examples/custom_shape/stages.py
  class UserTasks (line 4) | class UserTasks(TaskSet):
    method get_root (line 6) | def get_root(self):
  class WebsiteUser (line 10) | class WebsiteUser(HttpUser):
  class StagesShape (line 15) | class StagesShape(LoadTestShape):
    method tick (line 40) | def tick(self):

FILE: examples/custom_shape/staging_user_classes.py
  class UserTasks (line 4) | class UserTasks(TaskSet):
    method get_root (line 6) | def get_root(self):
  class WebsiteUserA (line 10) | class WebsiteUserA(HttpUser):
  class WebsiteUserB (line 15) | class WebsiteUserB(HttpUser):
  class StagesShapeWithCustomUsers (line 20) | class StagesShapeWithCustomUsers(LoadTestShape):
    method tick (line 45) | def tick(self):

FILE: examples/custom_shape/step_load.py
  class UserTasks (line 6) | class UserTasks(TaskSet):
    method get_root (line 8) | def get_root(self):
  class WebsiteUser (line 12) | class WebsiteUser(HttpUser):
  class StepLoadShape (line 17) | class StepLoadShape(LoadTestShape):
    method tick (line 36) | def tick(self):

FILE: examples/custom_shape/wait_user_count.py
  class UserTasks (line 8) | class UserTasks(TaskSet):
    method get_root (line 10) | def get_root(self):
  class WebsiteUser (line 14) | class WebsiteUser(HttpUser):
    method __init__ (line 18) | def __init__(self, *args, **kwargs):
  class StepLoadShape (line 30) | class StepLoadShape(LoadTestShape):
    method __init__ (line 48) | def __init__(self, *args, **kwargs):
    method tick (line 53) | def tick(self):

FILE: examples/custom_wait_function.py
  function index (line 6) | def index(l):
  function stats (line 10) | def stats(l):
  class UserTasks (line 14) | class UserTasks(TaskSet):
    method page404 (line 20) | def page404(self):
  class WebsiteUser (line 24) | class WebsiteUser(HttpUser):
  function strictExp (line 36) | def strictExp(min_wait, max_wait, mu=1):
  class StrictWebsiteUser (line 49) | class StrictWebsiteUser(HttpUser):

FILE: examples/custom_xmlrpc_client/server.py
  function get_time (line 6) | def get_time():
  function get_random_number (line 11) | def get_random_number(low, high):

FILE: examples/custom_xmlrpc_client/xmlrpc_locustfile.py
  class XmlRpcClient (line 7) | class XmlRpcClient(ServerProxy):
    method __init__ (line 14) | def __init__(self, host, request_event):
    method __getattr__ (line 18) | def __getattr__(self, name):
  class XmlRpcUser (line 43) | class XmlRpcUser(User):
    method __init__ (line 50) | def __init__(self, environment):
  class MyUser (line 57) | class MyUser(XmlRpcUser):
    method get_time (line 61) | def get_time(self):
    method get_random_number (line 65) | def get_random_number(self):

FILE: examples/debugging.py
  class QuickstartUser (line 4) | class QuickstartUser(HttpUser):
    method hello_world (line 8) | def hello_world(self):

FILE: examples/debugging_advanced.py
  class User1 (line 5) | class User1(HttpUser):
    method hello_world (line 9) | def hello_world(self):
  class User2 (line 15) | class User2(HttpUser):
    method hello_world (line 19) | def hello_world(self):

FILE: examples/dispatch_test_scripts/locustfile.py
  class UserA (line 4) | class UserA(HttpUser):
    method get_root (line 10) | def get_root(self):
  class UserB (line 14) | class UserB(HttpUser):
    method get_root (line 20) | def get_root(self):
  class UserC (line 24) | class UserC(HttpUser):
    method get_root (line 30) | def get_root(self):
  class RampUpThenDownLoadShape (line 50) | class RampUpThenDownLoadShape(LoadTestShape):
    method tick (line 70) | def tick(self):

FILE: examples/dns_ex.py
  class MyDNSUser (line 10) | class MyDNSUser(DNSUser):
    method t (line 12) | def t(self):

FILE: examples/dynamic_user_credentials.py
  class UserBehaviour (line 12) | class UserBehaviour(TaskSet):
    method on_start (line 13) | def on_start(self):
    method some_task (line 19) | def some_task(self):
  class User (line 24) | class User(HttpUser):

FILE: examples/events.py
  class MyTaskSet (line 9) | class MyTaskSet(TaskSet):
    method index (line 11) | def index(l):
    method stats (line 15) | def stats(l):
  class WebsiteUser (line 19) | class WebsiteUser(HttpUser):
  function locust_init (line 29) | def locust_init(environment, **kwargs):
  function on_request (line 48) | def on_request(request_type, name, response_time, response_length, excep...
  function on_report_to_master (line 56) | def on_report_to_master(client_id, data):
  function on_worker_report (line 67) | def on_worker_report(client_id, data):

FILE: examples/extend_web_ui.py
  class MyTaskSet (line 16) | class MyTaskSet(TaskSet):
    method index (line 18) | def index(l):
    method stats (line 22) | def stats(l):
  class WebsiteUser (line 26) | class WebsiteUser(HttpUser):
  function locust_init (line 44) | def locust_init(environment, **kwargs):
  function on_request (line 146) | def on_request(request_type, name, response_time, response_length, excep...
  function on_reset_stats (line 155) | def on_reset_stats():

FILE: examples/fast_http_locust.py
  class WebsiteUser (line 4) | class WebsiteUser(FastHttpUser):
    method index (line 21) | def index(self):
    method stats (line 25) | def stats(self):

FILE: examples/grpc/grpc_user.py
  class LocustInterceptor (line 16) | class LocustInterceptor(ClientInterceptor):
    method __init__ (line 17) | def __init__(self, environment, *args, **kwargs):
    method intercept (line 22) | def intercept(
  class GrpcUser (line 50) | class GrpcUser(User):
    method __init__ (line 54) | def __init__(self, environment):

FILE: examples/grpc/hello_pb2_grpc.py
  class HelloServiceStub (line 8) | class HelloServiceStub:
    method __init__ (line 11) | def __init__(self, channel):
  class HelloServiceServicer (line 24) | class HelloServiceServicer:
    method SayHello (line 27) | def SayHello(self, request, context):
  function add_HelloServiceServicer_to_server (line 34) | def add_HelloServiceServicer_to_server(servicer, server):
  class HelloService (line 47) | class HelloService:
    method SayHello (line 51) | def SayHello(

FILE: examples/grpc/hello_server.py
  class HelloServiceServicer (line 12) | class HelloServiceServicer(hello_pb2_grpc.HelloServiceServicer):
    method SayHello (line 13) | def SayHello(self, request, context):
  function start_server (line 19) | def start_server():

FILE: examples/grpc/locustfile.py
  function run_grpc_server (line 12) | def run_grpc_server(environment, **_kwargs):
  class HelloGrpcUser (line 16) | class HelloGrpcUser(grpc_user.GrpcUser):
    method sayHello (line 21) | def sayHello(self):

FILE: examples/locustfile.py
  class QuickstartUser (line 6) | class QuickstartUser(HttpUser):
    method hello_world (line 10) | def hello_world(self):
    method view_item (line 15) | def view_item(self):
    method on_start (line 20) | def on_start(self):

FILE: examples/manual_stats_reporting.py
  function _manual_report (line 28) | def _manual_report(name):
  function manual_report (line 51) | def manual_report(name_or_func):
  class MyUser (line 59) | class MyUser(User):
    method successful_task (line 63) | def successful_task(self):
    method decorator_test (line 69) | def decorator_test(self):
    method failing_task (line 75) | def failing_task(self):

FILE: examples/markov_taskset.py
  class TransitionsExample (line 16) | class TransitionsExample(MarkovTaskSet):
    method method1 (line 22) | def method1(self):
    method method2 (line 28) | def method2(self):
    method method3 (line 33) | def method3(self):
    method method4 (line 38) | def method4(self):
    method method5 (line 43) | def method5(self):
    method method6 (line 48) | def method6(self):
  class TransitionsUser (line 53) | class TransitionsUser(User):

FILE: examples/milvus/locustfile.py
  class SimpleMilvusUser (line 14) | class SimpleMilvusUser(MilvusUser):
    method on_start (line 19) | def on_start(self):
    method __init__ (line 24) | def __init__(self, environment):
    method insert_data (line 55) | def insert_data(self):
    method search_vectors (line 67) | def search_vectors(self):
    method query_data (line 73) | def query_data(self):
    method delete_data (line 79) | def delete_data(self):

FILE: examples/mongodb/locustfile.py
  class MongoUser (line 7) | class MongoUser(MongoDBUser):
    method db_query (line 12) | def db_query(self):

FILE: examples/mqtt/locustfile.py
  class MyUser (line 8) | class MyUser(MqttUser):
    method on_start (line 29) | def on_start(self):
    method say_hello (line 33) | def say_hello(self):

FILE: examples/mqtt/locustfile_custom_mqtt_client.py
  class MyMqttClient (line 9) | class MyMqttClient(MqttClient):
    method _generate_event_name (line 11) | def _generate_event_name(self, event_type: str, qos: int, topic: str):
  class MyUser (line 15) | class MyUser(MqttUser):
    method on_start (line 36) | def on_start(self):
    method say_hello (line 40) | def say_hello(self):

FILE: examples/multiple_hosts.py
  class MultipleHostsUser (line 7) | class MultipleHostsUser(HttpUser):
    method __init__ (line 10) | def __init__(self, *args, **kwargs):
  class UserTasks (line 17) | class UserTasks(TaskSet):
    method index (line 20) | def index(self):
    method index_other_host (line 24) | def index_other_host(self):
  class WebsiteUser (line 28) | class WebsiteUser(MultipleHostsUser):

FILE: examples/nested_inline_tasksets.py
  class WebsiteUser (line 4) | class WebsiteUser(HttpUser):
    class TopLevelTaskSet (line 13) | class TopLevelTaskSet(TaskSet):
      class IndexTaskSet (line 15) | class IndexTaskSet(TaskSet):
        method index (line 17) | def index(self):
        method stop (line 21) | def stop(self):
      method stats (line 25) | def stats(self):

FILE: examples/open_closed_workload.py
  class ClosedWorkload (line 4) | class ClosedWorkload(HttpUser):
    method t (line 8) | def t(self):
  class OpenWorkload (line 12) | class OpenWorkload(HttpUser):
    method t (line 16) | def t(self):

FILE: examples/openai_ex.py
  class MyUser (line 10) | class MyUser(OpenAIUser):
    method t (line 12) | def t(self):

FILE: examples/postgres/locustfile.py
  class MyUser (line 8) | class MyUser(PostgresUser):
    method run_select_query (line 10) | def run_select_query(self):
    method run_update_query (line 16) | def run_update_query(self):

FILE: examples/qdrant/locustfile.py
  class SimpleQdrantUser (line 13) | class SimpleQdrantUser(QdrantUser):
    method on_start (line 18) | def on_start(self):
    method __init__ (line 28) | def __init__(self, environment):
    method upsert_data (line 33) | def upsert_data(self):
    method search_vectors (line 44) | def search_vectors(self):
    method scroll_data (line 49) | def scroll_data(self):
    method delete_data (line 53) | def delete_data(self):

FILE: examples/response_validations.py
  class BadUser (line 9) | class BadUser(FastHttpUser):
    method t (line 11) | def t(self):
  class GoodUser (line 19) | class GoodUser(FastHttpUser):
    method t (line 21) | def t(self):
  function register_request_listener (line 40) | def register_request_listener(environment, **kwargs):
  function locust_init (line 58) | def locust_init(environment, **kwargs):

FILE: examples/rest.py
  class MyUser (line 9) | class MyUser(FastHttpUser):
    method t (line 14) | def t(self):
  class RestUserThatLooksAtErrors (line 76) | class RestUserThatLooksAtErrors(FastHttpUser):
    method rest (line 80) | def rest(self, method, url, **kwargs) -> Generator[RestResponseContext...
  class MyOtherRestUser (line 88) | class MyOtherRestUser(RestUserThatLooksAtErrors):
    method t (line 93) | def t(self):

FILE: examples/sdk_session_patching/session_patch_locustfile.py
  class ArchivistUser (line 7) | class ArchivistUser(locust.HttpUser):
    method on_start (line 8) | def on_start(self):
    method Create_assets (line 20) | def Create_assets(self):

FILE: examples/semaphore_wait.py
  function on_spawning_complete (line 10) | def on_spawning_complete(**kw):
  class WebsiteUser (line 14) | class WebsiteUser(HttpUser):
    method on_start (line 17) | def on_start(self):
    method index (line 21) | def index(self):

FILE: examples/socketio/echo_server.py
  function connect (line 22) | def connect(sid, environ):
  function join_room (line 29) | def join_room(sid, data):
  function leave_room (line 41) | def leave_room(sid, data):
  function send_message (line 50) | def send_message(sid, data):
  function disconnect (line 60) | def disconnect(sid):

FILE: examples/socketio/socketio_ex.py
  class MySIOHttpUser (line 10) | class MySIOHttpUser(SocketIOUser, HttpUser):
    method on_start (line 17) | def on_start(self) -> None:
    method my_task (line 32) | def my_task(self):
    method on_chat_message (line 47) | def on_chat_message(self, event: str, data: str) -> None:
    method on_stop (line 52) | def on_stop(self) -> None:

FILE: examples/stop_on_threshold.py
  class MyUser (line 10) | class MyUser(HttpUser):
    method my_task (line 14) | def my_task(self):
  function checker (line 23) | def checker(environment):
  function on_locust_init (line 33) | def on_locust_init(environment, **_kwargs):

FILE: examples/terraform/aws/plan/basic.py
  class Quickstart (line 4) | class Quickstart(HttpUser):
    method google (line 8) | def google(self):
    method microsoft (line 13) | def microsoft(self):
    method facebook (line 18) | def facebook(self):

FILE: examples/test_data_management.py
  function timestring (line 36) | def timestring() -> str:
  function init (line 53) | def init(environment: Environment, **_kwargs: Any) -> None:
  function quitting (line 58) | def quitting(environment: Environment, **_kwargs: Any) -> None:
  function test_start (line 63) | def test_start(environment: Environment, **_kwargs) -> None:
  function heartbeat_sent (line 76) | def heartbeat_sent(client_id: str, timestamp: float) -> None:
  function heartbeat_received (line 81) | def heartbeat_received(client_id: str, timestamp: float) -> None:
  function usage_monitor (line 86) | def usage_monitor(environment: Environment, cpu_usage: float, memory_usa...
  function quit (line 93) | def quit(exit_code: int, **kwargs: Any) -> None:
  function test_stopping (line 98) | def test_stopping(environment: Environment, **_kwargs: Any) -> None:
  function test_stop (line 103) | def test_stop(environment: Environment, **_kwargs: Any) -> None:
  class MyUser (line 107) | class MyUser(HttpUser):
    method on_start (line 112) | def on_start(self) -> None:
    method t (line 129) | def t(self) -> None:
    method on_stop (line 142) | def on_stop(self) -> None:

FILE: examples/test_pytest.py
  function test_stuff (line 8) | def test_stuff(session):
  function helper_function (line 39) | def helper_function(session: HttpSession):

FILE: examples/testdata_from_csv.py
  class DemoUser (line 14) | class DemoUser(FastHttpUser):
    method t (line 16) | def t(self):
  function locust_init (line 40) | def locust_init(environment, **kwargs):

FILE: examples/use_as_lib.py
  class MyUser (line 12) | class MyUser(HttpUser):
    method t (line 16) | def t(self):

FILE: examples/web_ui_auth/basic.py
  class LocustHttpUser (line 18) | class LocustHttpUser(HttpUser):
    method example (line 20) | def example(self):
  class AuthUser (line 24) | class AuthUser(UserMixin):
    method __init__ (line 25) | def __init__(self, username):
    method get_id (line 28) | def get_id(self):
  function load_user (line 32) | def load_user(username):
  function locust_init (line 37) | def locust_init(environment, **_kwargs):

FILE: examples/web_ui_auth/custom_form.py
  class LocustHttpUser (line 21) | class LocustHttpUser(HttpUser):
    method example (line 23) | def example(self):
  class AuthUser (line 27) | class AuthUser(UserMixin):
    method __init__ (line 28) | def __init__(self, username):
    method get_id (line 33) | def get_id(self):
  function load_user (line 37) | def load_user(user_id):
  function locust_init (line 42) | def locust_init(environment, **_kwargs):

FILE: examples/web_ui_cache_stats.py
  class MyTaskSet (line 16) | class MyTaskSet(TaskSet):
    method miss (line 18) | def miss(l):
    method hit (line 23) | def hit(l):
    method noinfo (line 28) | def noinfo(l):
  class WebsiteUser (line 33) | class WebsiteUser(HttpUser):
  function locust_init (line 58) | def locust_init(environment, **kwargs):
  function on_request (line 161) | def on_request(name, response, exception, **kwargs):
  function on_report_to_master (line 177) | def on_report_to_master(client_id, data):
  function on_worker_report (line 189) | def on_worker_report(client_id, data):
  function on_reset_stats (line 201) | def on_reset_stats():

FILE: examples/worker_index.py
  class DemoUser (line 8) | class DemoUser(User):
    method t (line 12) | def t(self):
  function on_locust_init (line 18) | def on_locust_init(environment, **_kwargs):

FILE: examples/x-forwarded-for.py
  class ForwardedForUser (line 6) | class ForwardedForUser(HttpUser):
    method __init__ (line 9) | def __init__(self, environment):
  class WebsiteUser (line 15) | class WebsiteUser(ForwardedForUser):
    method index (line 17) | def index(self):

FILE: hatch_build.py
  class BuildFrontend (line 8) | class BuildFrontend(BuildHookInterface):
    method initialize (line 9) | def initialize(self, version: str, build_data: dict[str, Any]) -> None:

FILE: locust/argument_parser.py
  function exit_handler (line 43) | def exit_handler(filename) -> None:
  class LocustArgumentParser (line 52) | class LocustArgumentParser(configargparse.ArgumentParser):
    method error (line 57) | def error(self, message):
    method add_argument (line 66) | def add_argument(self, *args, **kwargs) -> configargparse.Action:
    method args_included_in_web_ui (line 92) | def args_included_in_web_ui(self) -> dict[str, configargparse.Action]:
    method secret_args_included_in_web_ui (line 96) | def secret_args_included_in_web_ui(self) -> dict[str, configargparse.A...
    method required_args_included_in_web_ui (line 104) | def required_args_included_in_web_ui(self) -> dict[str, configargparse...
    method multiple_args_included_in_web_ui (line 112) | def multiple_args_included_in_web_ui(self) -> dict[str, configargparse...
  class LocustTomlConfigParser (line 120) | class LocustTomlConfigParser(configargparse.TomlConfigParser):
    method parse (line 121) | def parse(self, stream):
  class LocustConfigParser (line 147) | class LocustConfigParser(configargparse.ConfigFileParser):
    method parse (line 148) | def parse(self, stream):
  function parse_locustfile_paths (line 155) | def parse_locustfile_paths(paths: list[str]) -> list[str]:
  function _parse_locustfile_path (line 169) | def _parse_locustfile_path(path: str) -> list[str]:
  function download_locustfile_from_url (line 192) | def download_locustfile_from_url(url: str) -> str:
  function get_empty_argument_parser (line 219) | def get_empty_argument_parser(add_help=True, default_config_files=DEFAUL...
  function download_locustfile_from_master (line 263) | def download_locustfile_from_master(master_host: str, master_port: int) ...
  function parse_locustfile_option (line 307) | def parse_locustfile_option(args=None) -> tuple[argparse.Namespace, list...
  function get_locustfiles_locally (line 361) | def get_locustfiles_locally(options):
  function parse_locustfiles_from_master (line 370) | def parse_locustfiles_from_master(locustfile_sources) -> list[str]:
  function retrieve_locustfiles_from_master (line 388) | def retrieve_locustfiles_from_master(options) -> list[str]:
  function raise_argument_type_error (line 403) | def raise_argument_type_error(err_msg):
  function timespan (line 414) | def timespan(time_str) -> int:
  function positive_integer (line 421) | def positive_integer(string) -> int:
  function gt_zero (line 435) | def gt_zero(t):
  function json_user_config (line 445) | def json_user_config(string):
  function setup_parser_arguments (line 469) | def setup_parser_arguments(parser):
  function get_parser (line 902) | def get_parser(default_config_files=DEFAULT_CONFIG_FILES) -> LocustArgum...
  function parse_options (line 912) | def parse_options(args=None) -> configargparse.Namespace:
  function default_args_dict (line 921) | def default_args_dict() -> dict:
  class UIExtraArgOptions (line 930) | class UIExtraArgOptions(NamedTuple):
  function ui_extra_args_dict (line 939) | def ui_extra_args_dict(args=None) -> dict[str, dict[str, Any]]:

FILE: locust/clients.py
  class RequestKwargs (line 47) | class RequestKwargs(TypedDict, total=False):
  class RESTKwargs (line 61) | class RESTKwargs(RequestKwargs, total=False):
  class HttpSession (line 74) | class HttpSession(requests.Session):
    method __init__ (line 98) | def __init__(self, base_url, request_event, user, *args, pool_manager:...
    method _build_url (line 126) | def _build_url(self, path) -> str:
    method rename_request (line 134) | def rename_request(self, name: str) -> Generator[None]:
    method request (line 143) | def request(  # type: ignore[override]
    method _send_request_safe_mode (line 243) | def _send_request_safe_mode(self, method, url, **kwargs) -> Response:
    method prepare_request (line 257) | def prepare_request(self, request) -> requests.PreparedRequest:
    method get (line 263) | def get(
    method options (line 270) | def options(
    method head (line 282) | def head(
    method post (line 294) | def post(
    method put (line 304) | def put(
    method patch (line 315) | def patch(
    method delete (line 326) | def delete(
  class ResponseContextManager (line 338) | class ResponseContextManager(Response):
    method raise_for_status (line 355) | def raise_for_status(self) -> None:
    method __init__ (line 367) | def __init__(self, error: RequestException):
    method wrap_response (line 380) | def wrap_response(
    method __enter__ (line 393) | def __enter__(self):
    method __exit__ (line 399) | def __exit__(self, exc, value, traceback):  # type: ignore[override]
    method _report_request (line 445) | def _report_request(self, exc=None):
    method success (line 448) | def success(self):
    method failure (line 464) | def failure(self, exc):
  class LocustHttpAdapter (line 486) | class LocustHttpAdapter(HTTPAdapter):
    method __init__ (line 487) | def __init__(self, pool_manager: PoolManager | None, *args, **kwargs):
    method init_poolmanager (line 491) | def init_poolmanager(self, *args, **kwargs):
    method cert_verify (line 499) | def cert_verify(self, conn, url, verify, cert):
    method build_connection_pool_key_attributes (line 533) | def build_connection_pool_key_attributes(self, request, verify, cert=N...
  function _missing_catch_response_True (line 543) | def _missing_catch_response_True(self, *_args, **_kwargs):

FILE: locust/contrib/dns.py
  class DNSClient (line 12) | class DNSClient:
    method __init__ (line 13) | def __init__(self, request_event):
    method __getattr__ (line 16) | def __getattr__(self, function_name) -> Callable[..., Message]:
  class DNSUser (line 45) | class DNSUser(User):
    method __init__ (line 53) | def __init__(self, environment):

FILE: locust/contrib/fasthttp.py
  class PostKwargs (line 43) | class PostKwargs(TypedDict, total=False):
  class PutKwargs (line 54) | class PutKwargs(PostKwargs, total=False):
  class PatchKwargs (line 57) | class PatchKwargs(PostKwargs, total=False):
  class RESTKwargs (line 60) | class RESTKwargs(PostKwargs, total=False):
  function _construct_basic_auth_str (line 90) | def _construct_basic_auth_str(username, password):
  function insecure_ssl_context_factory (line 99) | def insecure_ssl_context_factory():
  class FastHttpSession (line 103) | class FastHttpSession:
    method __init__ (line 106) | def __init__(
    method _build_url (line 157) | def _build_url(self, path: str) -> str:
    method _send_request_safe_mode (line 164) | def _send_request_safe_mode(self, method: str, url: str, **kwargs) -> ...
    method request (line 188) | def request(
    method delete (line 311) | def delete(self, url: str, **kwargs: Unpack[RESTKwargs]) -> ResponseCo...
    method get (line 315) | def get(self, url: str, **kwargs: Unpack[RESTKwargs]) -> ResponseConte...
    method iter_lines (line 319) | def iter_lines(self, url: str, method: str = "GET", **kwargs) -> Gener...
    method head (line 339) | def head(self, url: str, **kwargs: Unpack[RESTKwargs]) -> ResponseCont...
    method options (line 343) | def options(self, url: str, **kwargs: Unpack[RESTKwargs]) -> ResponseC...
    method patch (line 347) | def patch(self, url: str, data: str | dict | None = None, **kwargs: Un...
    method post (line 351) | def post(
    method put (line 357) | def put(self, url: str, data: str | dict | None = None, **kwargs: Unpa...
  class FastHttpUser (line 362) | class FastHttpUser(User):
    method __init__ (line 422) | def __init__(self, environment) -> None:
    method rest (line 451) | def rest(self, method, url, headers: dict | None = None, **kwargs) -> ...
    method rest_ (line 499) | def rest_(self, method, url, name=None, **kwargs) -> Generator[RestRes...
  class FastRequest (line 511) | class FastRequest(CompatRequest):
    method body (line 515) | def body(self) -> str | None:
  class FastResponse (line 519) | class FastResponse(CompatResponse):
    method __init__ (line 530) | def __init__(
    method text (line 541) | def text(self) -> str | None:
    method url (line 561) | def url(self) -> str | None:
    method json (line 570) | def json(self) -> dict:
    method raise_for_status (line 576) | def raise_for_status(self):
    method iter_content (line 581) | def iter_content(self, chunk_size=1024, decode_content=True):
    method status_code (line 614) | def status_code(self) -> int:
    method ok (line 622) | def ok(self):
    method _content (line 626) | def _content(self):
    method success (line 631) | def success(self):
    method failure (line 636) | def failure(self, *_args, **_kwargs):
  class ErrorResponse (line 642) | class ErrorResponse(FastResponse):  # we're really just pretending to be...
    method __init__ (line 655) | def __init__(self, request: CompatRequest, error: Exception):
    method raise_for_status (line 659) | def raise_for_status(self):
  class LocustBadStatusCode (line 663) | class LocustBadStatusCode(ConnectionError):
    method __repr__ (line 664) | def __repr__(self):
  class LocustUserAgent (line 671) | class LocustUserAgent(UserAgent):
    method __init__ (line 676) | def __init__(self, client_pool: HTTPClientPool | None = None, **kwargs):
    method _urlopen (line 682) | def _urlopen(self, request):
    method _verify_status (line 690) | def _verify_status(self, status_code, url=None):
  class ResponseContextManager (line 696) | class ResponseContextManager(FastResponse):
    method __init__ (line 709) | def __init__(self, response, request_event, request_meta, catch_respon...
    method __enter__ (line 722) | def __enter__(self):
    method __exit__ (line 728) | def __exit__(self, exc, value, traceback):
    method _report_request (line 756) | def _report_request(self):
    method success (line 759) | def success(self):
    method failure (line 775) | def failure(self, exc):
    method raise_for_status (line 796) | def raise_for_status(self):
  class RestResponseContextManager (line 804) | class RestResponseContextManager(ResponseContextManager):

FILE: locust/contrib/milvus.py
  class BaseClient (line 18) | class BaseClient(ABC):
    method close (line 20) | def close(self) -> None:
    method create_collection (line 24) | def create_collection(self, schema, index_params, **kwargs) -> None:
    method insert (line 28) | def insert(self, data) -> dict[str, Any]:
    method upsert (line 32) | def upsert(self, data) -> dict[str, Any]:
    method search (line 36) | def search(
    method hybrid_search (line 50) | def hybrid_search(self, reqs, ranker, limit, output_fields=None) -> di...
    method query (line 54) | def query(self, filter, output_fields=None) -> dict[str, Any]:
    method delete (line 58) | def delete(self, filter) -> dict[str, Any]:
  class MilvusV2Client (line 62) | class MilvusV2Client(BaseClient):
    method __init__ (line 65) | def __init__(self, uri, collection_name, token="root:Milvus", db_name=...
    method close (line 80) | def close(self):
    method create_collection (line 83) | def create_collection(self, schema, index_params, **kwargs):
    method insert (line 91) | def insert(self, data):
    method upsert (line 104) | def upsert(self, data):
    method search (line 117) | def search(
    method hybrid_search (line 166) | def hybrid_search(self, reqs, ranker, limit, output_fields=None):
    method get_recall (line 200) | def get_recall(search_results, ground_truth, limit=None):
    method query (line 229) | def query(self, filter, output_fields=None):
    method delete (line 255) | def delete(self, filter):
  class MilvusUser (line 274) | class MilvusUser(User):
    method __init__ (line 293) | def __init__(
    method _fire_event (line 324) | def _fire_event(request_type: str, name: str, result: dict[str, Any]):
    method _fire_recall_event (line 336) | def _fire_recall_event(request_type: str, name: str, result: dict[str,...
    method insert (line 349) | def insert(self, data):
    method upsert (line 354) | def upsert(self, data):
    method search (line 359) | def search(
    method hybrid_search (line 389) | def hybrid_search(self, reqs, ranker, limit, output_fields=None):
    method query (line 394) | def query(self, filter, output_fields=None):
    method delete (line 402) | def delete(self, filter):
    method on_stop (line 407) | def on_stop(self):

FILE: locust/contrib/mongodb.py
  class MongoDBClient (line 9) | class MongoDBClient(MongoClient):
    method __init__ (line 10) | def __init__(self, conn_string, db_name):
    method execute_query (line 14) | def execute_query(self, collection_name, query):
  class MongoDBUser (line 33) | class MongoDBUser(User):
    method __init__ (line 36) | def __init__(self, *args, **kwargs):
    method on_stop (line 40) | def on_stop(self):

FILE: locust/contrib/mqtt.py
  function _generate_random_id (line 31) | def _generate_random_id(
  function _generate_mqtt_event_name (line 44) | def _generate_mqtt_event_name(event_type: str, qos: int, topic: str):
  class PublishedMessageContext (line 63) | class PublishedMessageContext(typing.NamedTuple):
  class MqttClient (line 72) | class MqttClient(mqtt.Client):
    method __init__ (line 73) | def __init__(
    method _generate_event_name (line 129) | def _generate_event_name(self, event_type: str, qos: int, topic: str):
    method _on_publish_cb (line 132) | def _on_publish_cb(
    method _on_subscribe_cb_v3x (line 168) | def _on_subscribe_cb_v3x(
    method _on_subscribe_cb_v5 (line 223) | def _on_subscribe_cb_v5(
    method _on_disconnect_cb (line 234) | def _on_disconnect_cb(
    method _on_disconnect_cb_v3x (line 263) | def _on_disconnect_cb_v3x(
    method _on_disconnect_cb_v5 (line 272) | def _on_disconnect_cb_v5(
    method _on_connect_cb (line 282) | def _on_connect_cb(
    method _on_connect_cb_v3x (line 312) | def _on_connect_cb_v3x(
    method _on_connect_cb_v5 (line 322) | def _on_connect_cb_v5(
    method _loop (line 332) | def _loop(self, timeout: float = 1.0) -> MQTTErrorCode:
    method _loop_selectors (line 343) | def _loop_selectors(self, timeout: float = 1.0) -> MQTTErrorCode:
    method publish (line 419) | def publish(
    method subscribe (line 459) | def subscribe(
  class MqttUser (line 516) | class MqttUser(User):
    method __init__ (line 531) | def __init__(self, environment: Environment):

FILE: locust/contrib/oai.py
  class OpenAIClient (line 17) | class OpenAIClient(OpenAI):
    method __init__ (line 18) | def __init__(self, request_event, user, *args, **kwargs):
    method rename_request (line 54) | def rename_request(self, name: str) -> Generator[None]:
  class OpenAIUser (line 64) | class OpenAIUser(User):
    method __init__ (line 67) | def __init__(self, *args, **kwargs):

FILE: locust/contrib/postgres.py
  class PostgresClient (line 8) | class PostgresClient:
    method __init__ (line 9) | def __init__(self, conn_string):
    method execute_query (line 12) | def execute_query(self, query):
    method close (line 33) | def close(self):
  class PostgresUser (line 37) | class PostgresUser(User):
    method __init__ (line 40) | def __init__(self, *args, **kwargs):
    method on_stop (line 44) | def on_stop(self):

FILE: locust/contrib/qdrant.py
  class QdrantLocustClient (line 10) | class QdrantLocustClient:
    method __init__ (line 13) | def __init__(self, url, collection_name, api_key=None, timeout=60, **k...
    method close (line 26) | def close(self):
    method create_collection (line 29) | def create_collection(self, vectors_config, **kwargs):
    method upsert (line 37) | def upsert(self, points):
    method search (line 53) | def search(
    method scroll (line 86) | def scroll(
    method delete (line 116) | def delete(self, points_selector):
  class QdrantUser (line 138) | class QdrantUser(User):
    method __init__ (line 167) | def __init__(self, environment):
    method _fire_event (line 185) | def _fire_event(request_type: str, name: str, result: dict[str, Any]):
    method upsert (line 196) | def upsert(self, points):
    method search (line 201) | def search(
    method scroll (line 219) | def scroll(
    method delete (line 233) | def delete(self, points_selector):
    method on_stop (line 238) | def on_stop(self):

FILE: locust/contrib/socketio.py
  class SocketIOClient (line 10) | class SocketIOClient(socketio.Client):
    method __init__ (line 11) | def __init__(self, request_event: EventHook, *args, **kwargs):
    method connect (line 15) | def connect(self, *args, **kwargs):
    method send (line 22) | def send(self, data, namespace=None, callback=None, name="Unnamed") ->...
    method emit (line 40) | def emit(self, event, data=None, namespace=None, callback=None) -> None:
    method call (line 58) | def call(self, event, data=None, *args, **kwargs):
    method on_message (line 65) | def on_message(self, event: str, data: str) -> None:
  class SocketIOUser (line 84) | class SocketIOUser(User):
    method __init__ (line 95) | def __init__(self, *args, **kwargs):

FILE: locust/debug.py
  function _print_t (line 18) | def _print_t(s):
  class PrintListener (line 25) | class PrintListener:
    method __init__ (line 30) | def __init__(
    method on_request (line 49) | def on_request(
  function run_single_user (line 106) | def run_single_user(

FILE: locust/dispatch.py
  function _kl_generator (line 26) | def _kl_generator(users: Iterable[tuple[T, float]]) -> Generator[T | None]:
  class UsersDispatcher (line 47) | class UsersDispatcher(Iterator):
    method __init__ (line 70) | def __init__(self, worker_nodes: list[WorkerNode], user_classes: list[...
    method get_current_user_count (line 121) | def get_current_user_count(self) -> int:
    method dispatch_in_progress (line 125) | def dispatch_in_progress(self) -> bool:
    method dispatch_iteration_durations (line 129) | def dispatch_iteration_durations(self) -> list[float]:
    method __next__ (line 132) | def __next__(self) -> dict[str, dict[str, int]]:
    method _sort_workers (line 138) | def _sort_workers(self):
    method _dispatcher (line 152) | def _dispatcher(self) -> Generator[dict[str, dict[str, int]]]:
    method new_dispatch (line 185) | def new_dispatch(
    method add_worker (line 217) | def add_worker(self, worker_node: WorkerNode) -> None:
    method remove_worker (line 230) | def remove_worker(self, worker_node: WorkerNode) -> None:
    method _prepare_rebalance (line 244) | def _prepare_rebalance(self) -> None:
    method _wait_between_dispatch_iteration_context (line 271) | def _wait_between_dispatch_iteration_context(self) -> Generator[None]:
    method _add_users_on_workers (line 291) | def _add_users_on_workers(self) -> dict[str, dict[str, int]]:
    method _remove_users_from_workers (line 313) | def _remove_users_from_workers(self) -> dict[str, dict[str, int]]:
    method _get_user_current_count (line 332) | def _get_user_current_count(self, user: str) -> int:
    method _distribute_users (line 339) | def _distribute_users(
    method _user_gen (line 370) | def _user_gen(self) -> Iterator[str | None]:
    method _fast_users_on_workers_copy (line 391) | def _fast_users_on_workers_copy(users_on_workers: dict[str, dict[str, ...

FILE: locust/env.py
  class Environment (line 22) | class Environment:
    method __init__ (line 23) | def __init__(
    method _create_runner (line 116) | def _create_runner(
    method create_local_runner (line 132) | def create_local_runner(self) -> LocalRunner:
    method create_master_runner (line 138) | def create_master_runner(self, master_bind_host="*", master_bind_port=...
    method create_worker_runner (line 152) | def create_worker_runner(self, master_host: str, master_port: int) -> ...
    method create_web_ui (line 168) | def create_web_ui(
    method update_user_class (line 211) | def update_user_class(self, user_settings):
    method update_worker_logs (line 225) | def update_worker_logs(self, worker_log_report):
    method _filter_tasks_by_tags (line 229) | def _filter_tasks_by_tags(self) -> None:
    method _remove_user_classes_with_weight_zero (line 255) | def _remove_user_classes_with_weight_zero(self) -> None:
    method assign_equal_weights (line 270) | def assign_equal_weights(self) -> None:
    method _validate_user_class_name_uniqueness (line 290) | def _validate_user_class_name_uniqueness(self):
    method _validate_shape_class_instance (line 299) | def _validate_shape_class_instance(self):
    method user_classes_by_name (line 306) | def user_classes_by_name(self) -> dict[str, type[User]]:

FILE: locust/event.py
  class EventHook (line 14) | class EventHook:
    method __init__ (line 30) | def __init__(self):
    method add_listener (line 33) | def add_listener(self, handler):
    method remove_listener (line 37) | def remove_listener(self, handler):
    method fire (line 40) | def fire(self, *, reverse=False, **kwargs):
    method measure (line 57) | def measure(
  class DeprecatedEventHook (line 92) | class DeprecatedEventHook(EventHook):
    method __init__ (line 93) | def __init__(self, message):
    method add_listener (line 97) | def add_listener(self, handler):
  class Events (line 102) | class Events:
    method __init__ (line 289) | def __init__(self):

FILE: locust/exception.py
  class LocustError (line 1) | class LocustError(Exception):
  class ResponseError (line 5) | class ResponseError(Exception):
  class CatchResponseError (line 9) | class CatchResponseError(Exception):
  class MissingWaitTimeError (line 13) | class MissingWaitTimeError(LocustError):
  class InterruptTaskSet (line 17) | class InterruptTaskSet(Exception):
    method __init__ (line 22) | def __init__(self, reschedule=True):
  class StopTest (line 30) | class StopTest(Exception):
  class StopUser (line 36) | class StopUser(Exception):
  class RescheduleTask (line 45) | class RescheduleTask(Exception):
  class RescheduleTaskImmediately (line 54) | class RescheduleTaskImmediately(Exception):
  class RPCError (line 60) | class RPCError(Exception):
  class RPCSendError (line 68) | class RPCSendError(Exception):
  class RPCReceiveError (line 76) | class RPCReceiveError(Exception):
    method __init__ (line 83) | def __init__(self, *args: object, addr=None) -> None:
  class RunnerAlreadyExistsError (line 88) | class RunnerAlreadyExistsError(Exception):

FILE: locust/html.py
  function process_html_filename (line 16) | def process_html_filename(options) -> None:
  function render_template_from (line 27) | def render_template_from(file, build_path=DEFAULT_BUILD_PATH, **kwargs):
  function get_html_report (line 33) | def get_html_report(

FILE: locust/input_events.py
  class InitError (line 27) | class InitError(Exception):
  class UnixKeyPoller (line 31) | class UnixKeyPoller:
    method __init__ (line 32) | def __init__(self):
    method cleanup (line 40) | def cleanup(self):
    method poll (line 43) | def poll(_self):
  class WindowsKeyPoller (line 50) | class WindowsKeyPoller:
    method __init__ (line 51) | def __init__(self):
    method cleanup (line 64) | def cleanup(self):
    method poll (line 67) | def poll(self):
  function get_poller (line 91) | def get_poller():
  function input_listener (line 98) | def input_listener(key_to_func_map: dict[str, Callable]):

FILE: locust/log.py
  class LogReader (line 14) | class LogReader(logging.Handler):
    method __init__ (line 15) | def __init__(self):
    method emit (line 19) | def emit(self, record):
  function setup_logging (line 23) | def setup_logging(loglevel, logfile=None):
  function get_logs (line 79) | def get_logs():
  function greenlet_exception_logger (line 88) | def greenlet_exception_logger(logger, level=logging.CRITICAL):

FILE: locust/main.py
  function create_environment (line 56) | def create_environment(
  function merge_locustfiles_content (line 86) | def merge_locustfiles_content(
  function main (line 148) | def main():

FILE: locust/opentelemetry.py
  function setup_opentelemetry (line 10) | def setup_opentelemetry() -> bool:
  function _setup_tracer_provider (line 46) | def _setup_tracer_provider(resource, traces_exporters):
  function _setup_meter_provider (line 91) | def _setup_meter_provider(resource, metrics_exporters):
  function _setup_auto_instrumentation (line 142) | def _setup_auto_instrumentation():

FILE: locust/rpc/protocol.py
  class ObjectId (line 11) | class ObjectId:  # type: ignore
    method __init__ (line 12) | def __init__(self, s):
  function decode (line 16) | def decode(obj):
  function encode (line 24) | def encode(obj):
  class Message (line 32) | class Message:
    method __init__ (line 33) | def __init__(self, message_type, data, node_id):
    method __repr__ (line 38) | def __repr__(self):
    method serialize (line 41) | def serialize(self):
    method unserialize (line 45) | def unserialize(cls, data):

FILE: locust/rpc/zmqrpc.py
  class BaseSocket (line 14) | class BaseSocket:
    method __init__ (line 15) | def __init__(self, sock_type, ipv4_only):
    method send (line 25) | def send(self, msg):
    method send_to_client (line 32) | def send_to_client(self, msg):
    method recv (line 38) | def recv(self):
    method recv_from_client (line 48) | def recv_from_client(self):
    method close (line 62) | def close(self, linger=None):
    method ipv4_only (line 65) | def ipv4_only(self, host, port) -> bool:
  class Server (line 77) | class Server(BaseSocket):
    method __init__ (line 78) | def __init__(self, host, port):
  class Client (line 90) | class Client(BaseSocket):
    method __init__ (line 91) | def __init__(self, host, port, identity):

FILE: locust/runners.py
  function locust_exception_handler (line 66) | def locust_exception_handler(environment: Environment):
  class ExceptionDict (line 83) | class ExceptionDict(TypedDict):
  class Runner (line 90) | class Runner:
    method __init__ (line 101) | def __init__(self, environment: Environment) -> None:
    method __del__ (line 145) | def __del__(self) -> None:
    method user_classes (line 151) | def user_classes(self) -> list[type[User]]:
    method user_classes_by_name (line 155) | def user_classes_by_name(self) -> dict[str, type[User]]:
    method stats (line 159) | def stats(self) -> RequestStats:
    method errors (line 163) | def errors(self) -> dict[str, StatsError]:
    method user_count (line 167) | def user_count(self) -> int:
    method user_classes_count (line 174) | def user_classes_count(self) -> dict[str, int]:
    method update_state (line 197) | def update_state(self, new_state: str) -> None:
    method cpu_log_warning (line 206) | def cpu_log_warning(self) -> bool:
    method spawn_users (line 214) | def spawn_users(self, user_classes_spawn_count: dict[str, int], wait: ...
    method stop_users (line 247) | def stop_users(self, user_classes_stop_count: dict[str, int]) -> None:
    method monitor_cpu_and_memory (line 298) | def monitor_cpu_and_memory(self) -> NoReturn:
    method start (line 317) | def start(
    method send_message (line 322) | def send_message(self, msg_type: str, data: Any = None, client_id: str...
    method start_shape (line 324) | def start_shape(self) -> None:
    method shape_worker (line 339) | def shape_worker(self) -> None:
    method stop (line 378) | def stop(self) -> None:
    method quit (line 414) | def quit(self) -> None:
    method log_exception (line 421) | def log_exception(self, node_id: str, msg: str, formatted_tb: str) -> ...
    method register_message (line 428) | def register_message(self, msg_type: str, listener: Callable, concurre...
  class LocalRunner (line 440) | class LocalRunner(Runner):
    method __init__ (line 445) | def __init__(self, environment) -> None:
    method _start (line 466) | def _start(self, user_count: int, spawn_rate: float, wait: bool = Fals...
    method start (line 547) | def start(
    method stop (line 563) | def stop(self) -> None:
    method send_message (line 568) | def send_message(self, msg_type: str, data: Any = None, client_id: str...
  class DistributedRunner (line 584) | class DistributedRunner(Runner):
    method __init__ (line 585) | def __init__(self, environment) -> None:
  class WorkerNode (line 590) | class WorkerNode:
    method __init__ (line 591) | def __init__(self, id: str, state=STATE_INIT, heartbeat_liveness=HEART...
    method user_count (line 602) | def user_count(self) -> int:
  class WorkerNodes (line 606) | class WorkerNodes(MutableMapping):
    method __init__ (line 607) | def __init__(self) -> None:
    method get_by_state (line 610) | def get_by_state(self, state) -> list[WorkerNode]:
    method all (line 614) | def all(self) -> ValuesView[WorkerNode]:
    method ready (line 618) | def ready(self) -> list[WorkerNode]:
    method spawning (line 622) | def spawning(self) -> list[WorkerNode]:
    method running (line 626) | def running(self) -> list[WorkerNode]:
    method missing (line 630) | def missing(self) -> list[WorkerNode]:
    method __setitem__ (line 633) | def __setitem__(self, k: str, v: WorkerNode) -> None:
    method __delitem__ (line 636) | def __delitem__(self, k: str) -> None:
    method __getitem__ (line 639) | def __getitem__(self, k: str) -> WorkerNode:
    method __len__ (line 642) | def __len__(self) -> int:
    method __iter__ (line 645) | def __iter__(self) -> Iterator[str]:
  class MasterRunner (line 649) | class MasterRunner(DistributedRunner):
    method __init__ (line 659) | def __init__(self, environment, master_bind_host, master_bind_port) ->...
    method rebalancing_enabled (line 709) | def rebalancing_enabled(self) -> bool:
    method get_worker_index (line 714) | def get_worker_index(self, client_id):
    method user_count (line 728) | def user_count(self) -> int:
    method cpu_log_warning (line 731) | def cpu_log_warning(self) -> bool:
    method start (line 738) | def start(
    method _wait_for_workers_report_after_ramp_up (line 851) | def _wait_for_workers_report_after_ramp_up(self) -> float:
    method stop (line 874) | def stop(self, send_stop_to_client: bool = True) -> None:
    method quit (line 909) | def quit(self) -> None:
    method check_stopped (line 918) | def check_stopped(self) -> None:
    method heartbeat_worker (line 926) | def heartbeat_worker(self) -> NoReturn:
    method reset_connection (line 965) | def reset_connection(self) -> None:
    method client_listener (line 974) | def client_listener(self) -> NoReturn:
    method handle_message (line 1015) | def handle_message(self, client_id: str, msg: Message) -> None:
    method worker_count (line 1187) | def worker_count(self) -> int:
    method reported_user_classes_count (line 1191) | def reported_user_classes_count(self) -> dict[str, int]:
    method send_message (line 1198) | def send_message(self, msg_type: str, data: dict[str, Any] | None = No...
  class WorkerRunner (line 1216) | class WorkerRunner(DistributedRunner):
    method __init__ (line 1228) | def __init__(self, environment: Environment, master_host: str, master_...
    method spawning_complete (line 1275) | def spawning_complete(self, user_count):
    method start (line 1286) | def start(
    method start_worker (line 1291) | def start_worker(self, user_classes_count: dict[str, int], **kwargs) -...
    method heartbeat (line 1321) | def heartbeat(self) -> NoReturn:
    method heartbeat_timeout_checker (line 1340) | def heartbeat_timeout_checker(self) -> NoReturn:
    method reset_connection (line 1347) | def reset_connection(self) -> None:
    method worker (line 1355) | def worker(self) -> NoReturn:
    method handle_message (line 1365) | def handle_message(self, msg: Message) -> None:
    method stats_reporter (line 1450) | def stats_reporter(self) -> NoReturn:
    method logs_reporter (line 1458) | def logs_reporter(self) -> None:
    method send_message (line 1477) | def send_message(self, msg_type: str, data: dict[str, Any] | None = No...
    method _send_stats (line 1488) | def _send_stats(self) -> None:
    method _send_logs (line 1493) | def _send_logs(self, current_logs) -> None:
    method connect_to_master (line 1496) | def connect_to_master(self):
  function _format_user_classes_count_for_log (line 1519) | def _format_user_classes_count_for_log(user_classes_count: dict[str, int...
  function _aggregate_dispatched_users (line 1526) | def _aggregate_dispatched_users(d: dict[str, dict[str, int]]) -> dict[st...

FILE: locust/shape.py
  class LoadTestShapeMeta (line 13) | class LoadTestShapeMeta(ABCMeta):
    method __new__ (line 19) | def __new__(mcs, classname, bases, class_dict):
  class LoadTestShape (line 24) | class LoadTestShape(metaclass=LoadTestShapeMeta):
    method __init__ (line 36) | def __init__(self):
    method reset_time (line 39) | def reset_time(self):
    method get_run_time (line 45) | def get_run_time(self):
    method get_current_user_count (line 51) | def get_current_user_count(self):
    method tick (line 58) | def tick(self) -> tuple[int, float] | tuple[int, float, list[type[User...

FILE: locust/stats.py
  class CSVWriter (line 44) | class CSVWriter(Protocol):
    method writerow (line 46) | def writerow(self, columns: Iterable[str | int | float]) -> None: ...
  class StatsBaseDict (line 49) | class StatsBaseDict(TypedDict):
  class StatsEntryDict (line 54) | class StatsEntryDict(StatsBaseDict):
  class StatsErrorDict (line 69) | class StatsErrorDict(StatsBaseDict):
  class StatsHolder (line 74) | class StatsHolder(Protocol):
  function resize_handler (line 82) | def resize_handler(signum: int, frame: FrameType | None):
  function bucket_response_time (line 122) | def bucket_response_time(response_time: int | float) -> int:
  class RequestStatsAdditionError (line 143) | class RequestStatsAdditionError(Exception):
  function get_readable_percentiles (line 147) | def get_readable_percentiles(percentile_list: list[float]) -> list[str]:
  function calculate_response_time_percentile (line 159) | def calculate_response_time_percentile(response_times: dict[int, int], n...
  function diff_response_time_dicts (line 180) | def diff_response_time_dicts(latest: dict[int, int], old: dict[int, int]...
  class EntriesDict (line 195) | class EntriesDict(dict):
    method __init__ (line 196) | def __init__(self, request_stats):
    method __missing__ (line 199) | def __missing__(self, key):
  class RequestStats (line 206) | class RequestStats:
    method __init__ (line 211) | def __init__(self, use_response_times_cache=True):
    method num_requests (line 225) | def num_requests(self):
    method num_none_requests (line 229) | def num_none_requests(self):
    method num_failures (line 233) | def num_failures(self):
    method last_request_timestamp (line 237) | def last_request_timestamp(self):
    method start_time (line 241) | def start_time(self):
    method log_request (line 244) | def log_request(self, method: str, name: str, response_time: int, cont...
    method log_error (line 248) | def log_error(self, method: str, name: str, error: Exception | str | N...
    method get (line 260) | def get(self, name: str, method: str) -> StatsEntry:
    method reset_all (line 266) | def reset_all(self) -> None:
    method clear_all (line 276) | def clear_all(self) -> None:
    method serialize_stats (line 285) | def serialize_stats(self) -> list[StatsEntryDict]:
    method serialize_errors (line 290) | def serialize_errors(self) -> dict[str, StatsErrorDict]:
  class StatsEntry (line 294) | class StatsEntry:
    method __init__ (line 299) | def __init__(self, stats: RequestStats | None, name: str, method: str,...
    method reset (line 351) | def reset(self):
    method log (line 368) | def log(self, response_time: int, content_length: int) -> None:
    method _log_time_of_request (line 384) | def _log_time_of_request(self, current_time: float) -> None:
    method _log_response_time (line 389) | def _log_response_time(self, response_time: int) -> None:
    method log_error (line 410) | def log_error(self, error: Exception | str | None) -> None:
    method fail_ratio (line 416) | def fail_ratio(self) -> float:
    method avg_response_time (line 426) | def avg_response_time(self) -> float:
    method median_response_time (line 433) | def median_response_time(self) -> int:
    method current_rps (line 450) | def current_rps(self) -> float:
    method current_fail_per_sec (line 461) | def current_fail_per_sec(self):
    method total_rps (line 472) | def total_rps(self):
    method total_fail_per_sec (line 481) | def total_fail_per_sec(self):
    method avg_content_length (line 490) | def avg_content_length(self):
    method extend (line 496) | def extend(self, other: StatsEntry) -> None:
    method serialize (line 540) | def serialize(self) -> StatsEntryDict:
    method unserialize (line 544) | def unserialize(cls, data: StatsEntryDict) -> StatsEntry:
    method get_stripped_report (line 556) | def get_stripped_report(self) -> StatsEntryDict:
    method to_string (line 564) | def to_string(self, current=True) -> str:
    method __str__ (line 595) | def __str__(self) -> str:
    method get_response_time_percentile (line 598) | def get_response_time_percentile(self, percent: float) -> int:
    method get_current_response_time_percentile (line 607) | def get_current_response_time_percentile(self, percent: float) -> int ...
    method percentile (line 651) | def percentile(self) -> str:
    method _cache_response_times (line 663) | def _cache_response_times(self, t: int) -> None:
    method to_dict (line 683) | def to_dict(self, escape_string_values=False):
  class StatsError (line 707) | class StatsError:
    method __init__ (line 708) | def __init__(self, method: str, name: str, error: Exception | str | No...
    method parse_error (line 715) | def parse_error(cls, error: Exception | str | None) -> str:
    method create_key (line 732) | def create_key(cls, method: str, name: str, error: Exception | str | N...
    method occurred (line 736) | def occurred(self) -> None:
    method to_name (line 739) | def to_name(self) -> str:
    method serialize (line 757) | def serialize(self) -> StatsErrorDict:
    method unserialize (line 769) | def unserialize(cls, data: StatsErrorDict) -> StatsError:
    method to_dict (line 772) | def to_dict(self):
  function avg (line 781) | def avg(values: list[float | int]) -> float:
  function median_from_dict (line 785) | def median_from_dict(total: int, count: dict[int, int]) -> int:
  function setup_distributed_stats_event_listeners (line 799) | def setup_distributed_stats_event_listeners(events: Events, stats: Reque...
  function print_stats (line 826) | def print_stats(stats: RequestStats, current=True) -> None:
  function print_stats_json (line 832) | def print_stats_json(stats: RequestStats) -> None:
  function save_stats_json (line 836) | def save_stats_json(stats: RequestStats, filename: str) -> None:
  function get_stats_summary (line 841) | def get_stats_summary(stats: RequestStats, current=True) -> list[str]:
  function print_percentile_stats (line 861) | def print_percentile_stats(stats: RequestStats) -> None:
  function get_percentile_stats_summary (line 867) | def get_percentile_stats_summary(stats: RequestStats) -> list[str]:
  function print_error_report (line 892) | def print_error_report(stats: RequestStats) -> None:
  function get_error_report_summary (line 898) | def get_error_report_summary(stats) -> list[str]:
  function stats_printer (line 910) | def stats_printer(stats: RequestStats) -> Callable[[], None]:
  function sort_stats (line 922) | def sort_stats(stats: dict[Any, S]) -> list[S]:
  function update_stats_history (line 926) | def update_stats_history(runner: Runner, timestamp: str | None = None) -...
  function stats_history (line 948) | def stats_history(runner: Runner) -> None:
  class StatsCSV (line 963) | class StatsCSV:
    method __init__ (line 966) | def __init__(self, environment: Environment, percentiles_to_report: li...
    method _percentile_fields (line 1000) | def _percentile_fields(self, stats_entry: StatsEntry, use_current: boo...
    method requests_csv (line 1008) | def requests_csv(self, csv_writer: CSVWriter) -> None:
    method _requests_data_rows (line 1013) | def _requests_data_rows(self, csv_writer: CSVWriter) -> None:
    method failures_csv (line 1036) | def failures_csv(self, csv_writer: CSVWriter) -> None:
    method _failures_data_rows (line 1040) | def _failures_data_rows(self, csv_writer: CSVWriter) -> None:
    method exceptions_csv (line 1051) | def exceptions_csv(self, csv_writer: CSVWriter) -> None:
    method _exceptions_data_rows (line 1055) | def _exceptions_data_rows(self, csv_writer: CSVWriter) -> None:
  class StatsCSVFileWriter (line 1063) | class StatsCSVFileWriter(StatsCSV):
    method __init__ (line 1066) | def __init__(
    method __call__ (line 1108) | def __call__(self) -> None:
    method stats_writer (line 1111) | def stats_writer(self) -> None:
    method _stats_history_data_rows (line 1157) | def _stats_history_data_rows(self, csv_writer: CSVWriter, now: float) ...
    method requests_flush (line 1196) | def requests_flush(self) -> None:
    method stats_history_flush (line 1199) | def stats_history_flush(self) -> None:
    method failures_flush (line 1202) | def failures_flush(self) -> None:
    method exceptions_flush (line 1205) | def exceptions_flush(self) -> None:
    method close_files (line 1208) | def close_files(self) -> None:
    method stats_history_file_name (line 1214) | def stats_history_file_name(self) -> str:
  function _is_valid_percentile (line 1218) | def _is_valid_percentile(parameter) -> bool:
  function validate_stats_configuration (line 1228) | def validate_stats_configuration() -> None:

FILE: locust/test/fake_module1_for_env_test.py
  class MyUserWithSameName (line 6) | class MyUserWithSameName(User):

FILE: locust/test/fake_module2_for_env_test.py
  class MyUserWithSameName (line 6) | class MyUserWithSameName(User):

FILE: locust/test/subprocess_utils.py
  class TestProcess (line 14) | class TestProcess:
    method __init__ (line 21) | def __init__(
    method on_fail (line 73) | def on_fail(self, reason: str = ""):
    method __enter__ (line 82) | def __enter__(self) -> "TestProcess":
    method __exit__ (line 85) | def __exit__(self, *_) -> None:
    method close (line 88) | def close(self) -> None:
    method expect (line 114) | def expect(self, to_expect, *, stream="stderr"):
    method expect_any (line 137) | def expect_any(self, to_expect, *, stream="stderr"):
    method not_expect_any (line 151) | def not_expect_any(self, to_not_expect, *, stream="stderr"):
    method send_input (line 162) | def send_input(self, content: str):
    method terminate (line 168) | def terminate(self):

FILE: locust/test/test_date.py
  function test_format_utc_timestamp (line 73) | def test_format_utc_timestamp(check):
  function test_format_safe_timestamp (line 79) | def test_format_safe_timestamp(check):
  function test_format_duration (line 85) | def test_format_duration(check):

FILE: locust/test/test_debugging.py
  class DebugTestCase (line 11) | class DebugTestCase(LocustTestCase):
    method setUp (line 12) | def setUp(self):
  class TestDebugging (line 17) | class TestDebugging(DebugTestCase):
    method test_run_single_user_pass_host_to_user_classes (line 19) | def test_run_single_user_pass_host_to_user_classes(self):

FILE: locust/test/test_dispatch.py
  class TestRampUpUsersFromZero (line 16) | class TestRampUpUsersFromZero(unittest.TestCase):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_0_5 (line 17) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_0_5(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_1 (line 154) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_1(self):
    method test_ramp_up_users_to_4_workers_with_spawn_rate_of_1 (line 291) | def test_ramp_up_users_to_4_workers_with_spawn_rate_of_1(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_2 (line 438) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_2(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_2_4 (line 527) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_2_4(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_3 (line 616) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_3(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_4 (line 681) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_4(self):
    method test_ramp_up_users_to_3_workers_with_spawn_rate_of_9 (line 746) | def test_ramp_up_users_to_3_workers_with_spawn_rate_of_9(self):
    method test_users_are_distributed_evenly_across_hosts (line 787) | def test_users_are_distributed_evenly_across_hosts(self):
    method test_implementation_of_dispatch_distribution_with_gcd (line 851) | def test_implementation_of_dispatch_distribution_with_gcd(self):
    method test_implementation_of_dispatch_distribution_with_gcd_float_weight (line 883) | def test_implementation_of_dispatch_distribution_with_gcd_float_weight...
  class TestWaitBetweenDispatch (line 921) | class TestWaitBetweenDispatch(unittest.TestCase):
    method test_wait_between_dispatch (line 922) | def test_wait_between_dispatch(self):
  class TestRampDownUsersToZero (line 943) | class TestRampDownUsersToZero(unittest.TestCase):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_0_5 (line 944) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_0_5(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_1 (line 1126) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_1(self):
    method test_ramp_down_users_to_4_workers_with_spawn_rate_of_1 (line 1265) | def test_ramp_down_users_to_4_workers_with_spawn_rate_of_1(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_2 (line 1413) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_2(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_2_4 (line 1504) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_2_4(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_3 (line 1595) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_3(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_4 (line 1662) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_4(self):
    method test_ramp_down_users_to_3_workers_with_spawn_rate_of_9 (line 1729) | def test_ramp_down_users_to_3_workers_with_spawn_rate_of_9(self):
  class TestRampUpThenDownThenUp (line 1774) | class TestRampUpThenDownThenUp(unittest.TestCase):
    method test_ramp_up_then_down_then_up (line 1775) | def test_ramp_up_then_down_then_up(self):
  class TestDispatchUsersToWorkersHavingTheSameUsersAsTheTarget (line 1837) | class TestDispatchUsersToWorkersHavingTheSameUsersAsTheTarget(unittest.T...
    method test_dispatch_users_to_3_workers (line 1838) | def test_dispatch_users_to_3_workers(self):
  class TestDistributionIsRespectedDuringDispatch (line 1887) | class TestDistributionIsRespectedDuringDispatch(unittest.TestCase):
    method test_dispatch_75_users_to_4_workers_with_spawn_rate_of_5 (line 1888) | def test_dispatch_75_users_to_4_workers_with_spawn_rate_of_5(self):
  class TestLargeScale (line 2113) | class TestLargeScale(unittest.TestCase):
    method test_distribute_users (line 2127) | def test_distribute_users(self):
    method test_ramp_up_from_0_to_100_000_users_with_50_user_classes_and_1000_workers_and_5000_spawn_rate (line 2148) | def test_ramp_up_from_0_to_100_000_users_with_50_user_classes_and_1000...
    method test_ramp_down_from_100_000_to_0_users_with_50_user_classes_and_1000_workers_and_5000_spawn_rate (line 2205) | def test_ramp_down_from_100_000_to_0_users_with_50_user_classes_and_10...
  class TestSmallConsecutiveRamping (line 2265) | class TestSmallConsecutiveRamping(unittest.TestCase):
    method test_consecutive_ramp_up_and_ramp_down (line 2266) | def test_consecutive_ramp_up_and_ramp_down(self):
  class TestRampingMiscellaneous (line 2355) | class TestRampingMiscellaneous(unittest.TestCase):
    method test_spawn_rate_greater_than_target_user_count (line 2356) | def test_spawn_rate_greater_than_target_user_count(self):
  class TestRemoveWorker (line 2387) | class TestRemoveWorker(unittest.TestCase):
    method test_remove_worker_during_ramp_up (line 2388) | def test_remove_worker_during_ramp_up(self):
    method test_remove_two_workers_during_ramp_up (line 2455) | def test_remove_two_workers_during_ramp_up(self):
    method test_remove_worker_between_two_ramp_ups (line 2521) | def test_remove_worker_between_two_ramp_ups(self):
    method test_remove_two_workers_between_two_ramp_ups (line 2593) | def test_remove_two_workers_between_two_ramp_ups(self):
    method test_remove_worker_during_ramp_down (line 2662) | def test_remove_worker_during_ramp_down(self):
    method test_remove_two_workers_during_ramp_down (line 2733) | def test_remove_two_workers_during_ramp_down(self):
    method test_remove_last_worker (line 2803) | def test_remove_last_worker(self):
    method test_remove_worker_during_ramp_up_with_fixed_user (line 2838) | def test_remove_worker_during_ramp_up_with_fixed_user(self):
  class TestAddWorker (line 2906) | class TestAddWorker(unittest.TestCase):
    method test_add_worker_during_ramp_up (line 2907) | def test_add_worker_during_ramp_up(self):
    method test_add_two_workers_during_ramp_up (line 2989) | def test_add_two_workers_during_ramp_up(self):
    method test_add_worker_between_two_ramp_ups (line 3055) | def test_add_worker_between_two_ramp_ups(self):
    method test_add_two_workers_between_two_ramp_ups (line 3131) | def test_add_two_workers_between_two_ramp_ups(self):
    method test_add_worker_during_ramp_down (line 3208) | def test_add_worker_during_ramp_down(self):
    method test_add_two_workers_during_ramp_down (line 3279) | def test_add_two_workers_during_ramp_down(self):
    method test_add_worker_during_ramp_up_with_fixed_user (line 3349) | def test_add_worker_during_ramp_up_with_fixed_user(self):
  class TestRampUpUsersFromZeroWithFixed (line 3432) | class TestRampUpUsersFromZeroWithFixed(unittest.TestCase):
    class RampUpCase (line 3433) | class RampUpCase:
      method __init__ (line 3434) | def __init__(self, fixed_counts: tuple[int], weights: tuple[int], ta...
      method __str__ (line 3439) | def __str__(self):
    method case_handler (line 3442) | def case_handler(self, cases: list[RampUpCase], expected: list[dict[st...
    method test_ramp_up_2_weigted_user_with_1_fixed_user (line 3475) | def test_ramp_up_2_weigted_user_with_1_fixed_user(self):
    method test_ramp_up_various_count_weigted_and_fixed_users (line 3506) | def test_ramp_up_various_count_weigted_and_fixed_users(self):
    method test_ramp_up_only_fixed_users (line 3541) | def test_ramp_up_only_fixed_users(self):
    method test_ramp_up_partially_ramp_down_and_rump_up_to_target (line 3568) | def test_ramp_up_partially_ramp_down_and_rump_up_to_target(self):
    method test_ramp_up_ramp_down_and_ramp_up_again_single_fixed_class (line 3593) | def test_ramp_up_ramp_down_and_ramp_up_again_single_fixed_class(self):
    method test_ramp_up_ramp_down_and_ramp_up_again (line 3623) | def test_ramp_up_ramp_down_and_ramp_up_again(self):
  class TestRampUpDifferentUsers (line 3711) | class TestRampUpDifferentUsers(unittest.TestCase):
    method test_ramp_up_different_users_for_each_dispatch (line 3712) | def test_ramp_up_different_users_for_each_dispatch(self):
    method test_ramp_up_only_one_kind_of_user (line 3737) | def test_ramp_up_only_one_kind_of_user(self):
    method test_ramp_up_first_half_user1_second_half_user2 (line 3754) | def test_ramp_up_first_half_user1_second_half_user2(self):
    method test_ramp_up_first_one_user_then_all_classes (line 3774) | def test_ramp_up_first_one_user_then_all_classes(self):
    method test_ramp_up_different_users_each_dispatch_multiple_worker (line 3794) | def test_ramp_up_different_users_each_dispatch_multiple_worker(self):
    method test_ramp_up_one_user_class_multiple_worker (line 3852) | def test_ramp_up_one_user_class_multiple_worker(self):
    method test_ramp_down_custom_user_classes_respect_weighting (line 3880) | def test_ramp_down_custom_user_classes_respect_weighting(self):
    method test_remove_worker_during_ramp_up_custom_classes (line 3951) | def test_remove_worker_during_ramp_up_custom_classes(self):
    method test_add_worker_during_ramp_up_custom_classes (line 4039) | def test_add_worker_during_ramp_up_custom_classes(self):
  class TestFloatWeithts (line 4126) | class TestFloatWeithts(unittest.TestCase):
    method test_float_weights (line 4127) | def test_float_weights(self):
  function _aggregate_dispatched_users (line 4160) | def _aggregate_dispatched_users(d: dict[str, dict[str, int]]) -> dict[st...
  function _user_count (line 4165) | def _user_count(d: dict[str, dict[str, int]]) -> int:
  function _user_count_on_worker (line 4169) | def _user_count_on_worker(d: dict[str, dict[str, int]], worker_node_id: ...

FILE: locust/test/test_env.py
  class TestEnvironment (line 17) | class TestEnvironment(LocustTestCase):
    method test_user_classes_count (line 18) | def test_user_classes_count(self):
    method test_user_classes_with_same_name_is_error (line 37) | def test_user_classes_with_same_name_is_error(self):
    method test_assign_equal_weights (line 46) | def test_assign_equal_weights(self):
    method test_user_classes_with_zero_weight_are_removed (line 149) | def test_user_classes_with_zero_weight_are_removed(self):
    method test_all_user_classes_with_zero_weight_raises_exception (line 171) | def test_all_user_classes_with_zero_weight_raises_exception(self):
    method test_shape_class_attribute (line 196) | def test_shape_class_attribute(self):
    method test_dispatcher_class_attribute (line 205) | def test_dispatcher_class_attribute(self):
    method test_update_user_class (line 217) | def test_update_user_class(self):
    method test_distributed_update_user_class (line 245) | def test_distributed_update_user_class(self):

FILE: locust/test/test_fasthttp.py
  class TestFastHttpSession (line 20) | class TestFastHttpSession(WebserverTestCase):
    method get_client (line 21) | def get_client(self):
    method test_get (line 24) | def test_get(self):
    method test_connection_error (line 29) | def test_connection_error(self):
    method test_error_message (line 41) | def test_error_message(self):
    method test_404 (line 54) | def test_404(self):
    method test_204 (line 60) | def test_204(self):
    method test_streaming_response (line 69) | def test_streaming_response(self):
    method test_streaming_response_catch_response (line 88) | def test_streaming_response_catch_response(self):
    method test_iter_lines (line 110) | def test_iter_lines(self):
    method test_slow_redirect (line 148) | def test_slow_redirect(self):
    method test_post_redirect (line 156) | def test_post_redirect(self):
    method test_cookie (line 166) | def test_cookie(self):
    method test_head (line 174) | def test_head(self):
    method test_delete (line 180) | def test_delete(self):
    method test_patch (line 186) | def test_patch(self):
    method test_options (line 192) | def test_options(self):
    method test_json_payload (line 202) | def test_json_payload(self):
    method test_catch_response_fail_successful_request (line 209) | def test_catch_response_fail_successful_request(self):
    method test_catch_response_pass_failed_request (line 216) | def test_catch_response_pass_failed_request(self):
    method test_catch_response_multiple_failure_and_success (line 223) | def test_catch_response_multiple_failure_and_success(self):
    method test_catch_response_pass_failed_request_with_other_exception_within_block (line 233) | def test_catch_response_pass_failed_request_with_other_exception_withi...
    method test_catch_response_default_success (line 250) | def test_catch_response_default_success(self):
    method test_catch_response_default_fail (line 257) | def test_catch_response_default_fail(self):
    method test_error_message_with_name_replacement (line 264) | def test_error_message_with_name_replacement(self):
    method test_custom_ssl_context_fail_with_bad_context (line 282) | def test_custom_ssl_context_fail_with_bad_context(self):
    method test_custom_ssl_context_passed_correct_to_client_pool (line 304) | def test_custom_ssl_context_passed_correct_to_client_pool(self):
  class TestRequestStatsWithWebserver (line 335) | class TestRequestStatsWithWebserver(WebserverTestCase):
    method test_request_stats_content_length (line 336) | def test_request_stats_content_length(self):
    method test_request_stats_no_content_length (line 350) | def test_request_stats_no_content_length(self):
    method test_request_stats_no_content_length_streaming (line 362) | def test_request_stats_no_content_length_streaming(self):
    method test_request_stats_named_endpoint (line 371) | def test_request_stats_named_endpoint(self):
    method test_request_stats_query_variables (line 379) | def test_request_stats_query_variables(self):
    method test_request_stats_put (line 387) | def test_request_stats_put(self):
    method test_request_connection_error (line 395) | def test_request_connection_error(self):
  class TestFastHttpUserClass (line 406) | class TestFastHttpUserClass(WebserverTestCase):
    method test_is_abstract (line 407) | def test_is_abstract(self):
    method test_class_context (line 411) | def test_class_context(self):
    method test_get_request (line 432) | def test_get_request(self):
    method test_client_request_headers (line 446) | def test_client_request_headers(self):
    method test_client_get (line 456) | def test_client_get(self):
    method test_client_get_absolute_url (line 463) | def test_client_get_absolute_url(self):
    method test_client_post (line 470) | def test_client_post(self):
    method test_client_put (line 478) | def test_client_put(self):
    method test_client_delete (line 486) | def test_client_delete(self):
    method test_client_head (line 494) | def test_client_head(self):
    method test_complex_content_type (line 501) | def test_complex_content_type(self):
    method test_log_request_name_argument (line 511) | def test_log_request_name_argument(self):
    method test_redirect_url_original_path_as_name (line 528) | def test_redirect_url_original_path_as_name(self):
    method test_network_timeout_setting (line 539) | def test_network_timeout_setting(self):
    method test_max_redirect_setting (line 559) | def test_max_redirect_setting(self):
    method test_allow_redirects_override (line 568) | def test_allow_redirects_override(self):
    method test_slow_redirect (line 578) | def test_slow_redirect(self):
    method test_client_basic_auth (line 586) | def test_client_basic_auth(self):
    method test_shared_client_pool (line 605) | def test_shared_client_pool(self):
    method test_client_pool_per_user_instance (line 627) | def test_client_pool_per_user_instance(self):
    method test_client_pool_concurrency (line 642) | def test_client_pool_concurrency(self):
  class TestFastHttpCatchResponse (line 666) | class TestFastHttpCatchResponse(WebserverTestCase):
    method setUp (line 667) | def setUp(self):
    method test_catch_response (line 687) | def test_catch_response(self):
    method test_catch_response_http_fail (line 704) | def test_catch_response_http_fail(self):
    method test_catch_response_http_manual_fail (line 710) | def test_catch_response_http_manual_fail(self):
    method test_catch_response_http_manual_success (line 720) | def test_catch_response_http_manual_success(self):
    method test_catch_response_allow_404 (line 726) | def test_catch_response_allow_404(self):
    method test_interrupt_taskset_with_catch_response (line 734) | def test_interrupt_taskset_with_catch_response(self):
    method test_catch_response_connection_error_success (line 751) | def test_catch_response_connection_error_success(self):
    method test_catch_response_connection_error_fail (line 763) | def test_catch_response_connection_error_fail(self):
    method test_catch_response_missing_with_block (line 775) | def test_catch_response_missing_with_block(self):
    method test_missing_catch_response_true (line 781) | def test_missing_catch_response_true(self):
    method test_rest_success (line 789) | def test_rest_success(self):
    method test_rest_fail (line 797) | def test_rest_fail(self):
  class TestFastHttpSsl (line 809) | class TestFastHttpSsl(LocustTestCase):
    method setUp (line 810) | def setUp(self):
    method tearDown (line 829) | def tearDown(self):
    method test_ssl_request_insecure (line 833) | def test_ssl_request_insecure(self):

FILE: locust/test/test_html_filename.py
  class TestProcessHtmlFilename (line 7) | class TestProcessHtmlFilename(unittest.TestCase):
    method test_process_html_filename (line 8) | def test_process_html_filename(self):
    method test_process_html_filename_partial_replacement (line 20) | def test_process_html_filename_partial_replacement(self):
    method test_process_html_filename_no_replacement (line 32) | def test_process_html_filename_no_replacement(self):
    method test_process_html_filename_None_arguments (line 44) | def test_process_html_filename_None_arguments(self):

FILE: locust/test/test_http.py
  class TestHttpSession (line 16) | class TestHttpSession(WebserverTestCase):
    method get_client (line 17) | def get_client(self, base_url=None):
    method test_get (line 26) | def test_get(self):
    method test_connection_error (line 31) | def test_connection_error(self):
    method test_wrong_url (line 38) | def test_wrong_url(self):
    method test_streaming_response (line 50) | def test_streaming_response(self):
    method test_slow_redirect (line 69) | def test_slow_redirect(self):
    method test_post_redirect (line 77) | def test_post_redirect(self):
    method test_cookie (line 87) | def test_cookie(self):
    method test_head (line 94) | def test_head(self):
    method test_delete (line 100) | def test_delete(self):
    method test_options (line 106) | def test_options(self):
    method test_error_message (line 116) | def test_error_message(self):
    method test_context_in_success (line 128) | def test_context_in_success(self):
    method test_response_parameter (line 140) | def test_response_parameter(self):
    method test_error_message_with_name_replacement (line 153) | def test_error_message_with_name_replacement(self):
    method test_get_with_params (line 171) | def test_get_with_params(self):
    method test_catch_response_fail_successful_request (line 177) | def test_catch_response_fail_successful_request(self):
    method test_catch_response_fail_successful_request_with_non_string_error_message (line 184) | def test_catch_response_fail_successful_request_with_non_string_error_...
    method test_catch_response_pass_failed_request (line 191) | def test_catch_response_pass_failed_request(self):
    method test_catch_response_multiple_failure_and_success (line 198) | def test_catch_response_multiple_failure_and_success(self):
    method test_catch_response_timeout (line 208) | def test_catch_response_timeout(self):
    method test_catch_response_pass_failed_request_with_other_exception_within_block (line 215) | def test_catch_response_pass_failed_request_with_other_exception_withi...
    method test_catch_response_default_success (line 232) | def test_catch_response_default_success(self):
    method test_catch_response_default_fail (line 239) | def test_catch_response_default_fail(self):
    method test_catch_response_with_name_replacement (line 246) | def test_catch_response_with_name_replacement(self):
    method test_catch_response_missing_with_block (line 262) | def test_catch_response_missing_with_block(self):
    method test_missing_catch_response_true (line 269) | def test_missing_catch_response_true(self):
    method test_event_measure (line 278) | def test_event_measure(self):
    method test_user_context (line 301) | def test_user_context(self):
    method test_verify_true_fails_with_bad_cert (line 323) | def test_verify_true_fails_with_bad_cert(self):
    method test_verify_false_succeeds_with_bad_cert (line 329) | def test_verify_false_succeeds_with_bad_cert(self):

FILE: locust/test/test_interruptable_task.py
  class InterruptableTaskSet (line 9) | class InterruptableTaskSet(SequentialTaskSet):
    method on_start (line 12) | def on_start(self):
    method t1 (line 17) | def t1(self):
    method t2 (line 22) | def t2(self):
    method on_stop (line 25) | def on_stop(self):
  class TestInterruptableTask (line 32) | class TestInterruptableTask(TestCase):
    method setUp (line 33) | def setUp(self):
    method test_interruptable_task (line 43) | def test_interruptable_task(self):

FILE: locust/test/test_load_locustfile.py
  class TestLoadLocustfile (line 17) | class TestLoadLocustfile(LocustTestCase):
    method test_is_user_class (line 18) | def test_is_user_class(self):
    method test_load_locust_file_from_absolute_path (line 41) | def test_load_locust_file_from_absolute_path(self):
    method test_load_locust_file_from_relative_path (line 49) | def test_load_locust_file_from_relative_path(self):
    method test_load_locust_file_called_locust_dot_py (line 55) | def test_load_locust_file_called_locust_dot_py(self):
    method test_load_locust_file_with_a_dot_in_filename (line 65) | def test_load_locust_file_with_a_dot_in_filename(self):
    method test_return_docstring_and_user_classes (line 69) | def test_return_docstring_and_user_classes(self):
    method test_with_shape_class (line 76) | def test_with_shape_class(self):
    method test_with_multiple_shape_classes (line 90) | def test_with_multiple_shape_classes(self):
    method test_with_abstract_shape_class (line 109) | def test_with_abstract_shape_class(self):
    method test_with_not_imported_shape_class (line 130) | def test_with_not_imported_shape_class(self):
    method test_create_environment (line 144) | def test_create_environment(self):
    method test_specify_config_file (line 161) | def test_specify_config_file(self):
    method test_command_line_arguments_override_config_file (line 187) | def test_command_line_arguments_override_config_file(self):
    method test_locustfile_can_be_set_in_config_file (line 199) | def test_locustfile_can_be_set_in_config_file(self):
    method test_locustfile_from_url (line 212) | def test_locustfile_from_url(self):
    method test_profile_flag (line 227) | def test_profile_flag(self):
    method test_pytest_user (line 250) | def test_pytest_user(self):

FILE: locust/test/test_locust_class.py
  class TestTaskSet (line 19) | class TestTaskSet(LocustTestCase):
    method setUp (line 20) | def setUp(self):
    method test_task_ratio (line 28) | def test_task_ratio(self):
    method test_tasks_missing_gives_user_friendly_exception (line 43) | def test_tasks_missing_gives_user_friendly_exception(self):
    method test_tasks_missing_from_user_gives_user_friendly_exception (line 58) | def test_tasks_missing_from_user_gives_user_friendly_exception(self):
    method test_task_decorator_ratio (line 67) | def test_task_decorator_ratio(self):
    method test_tasks_on_locust (line 95) | def test_tasks_on_locust(self):
    method test_tasks_on_abstract_locust (line 109) | def test_tasks_on_abstract_locust(self):
    method test_taskset_on_abstract_locust (line 126) | def test_taskset_on_abstract_locust(self):
    method test_task_decorator_on_taskset (line 147) | def test_task_decorator_on_taskset(self):
    method test_on_start (line 166) | def test_on_start(self):
    method test_on_stop_interrupt (line 187) | def test_on_stop_interrupt(self):
    method test_on_stop_interrupt_reschedule (line 205) | def test_on_stop_interrupt_reschedule(self):
    method test_on_stop_when_locust_stops (line 223) | def test_on_stop_when_locust_stops(self):
    method test_schedule_task (line 249) | def test_schedule_task(self):
    method test_schedule_task_bound_method (line 271) | def test_schedule_task_bound_method(self):
    method test_taskset_inheritance (line 290) | def test_taskset_inheritance(self):
    method test_task_decorator_with_or_without_argument (line 307) | def test_task_decorator_with_or_without_argument(self):
    method test_wait_function (line 332) | def test_wait_function(self):
    method test_sub_taskset (line 343) | def test_sub_taskset(self):
    method test_sub_taskset_tasks_decorator (line 361) | def test_sub_taskset_tasks_decorator(self):
    method test_on_start_interrupt (line 378) | def test_on_start_interrupt(self):
    method test_parent_attribute (line 397) | def test_parent_attribute(self):
    method test_user_is_read_only (line 427) | def test_user_is_read_only(self):
  class TestLocustClass (line 447) | class TestLocustClass(LocustTestCase):
    method test_locust_wait (line 448) | def test_locust_wait(self):
    method test_locust_on_start (line 465) | def test_locust_on_start(self):
    method test_locust_on_stop (line 486) | def test_locust_on_stop(self):
    method test_locust_start (line 504) | def test_locust_start(self):
    method test_locust_graceful_stop (line 527) | def test_locust_graceful_stop(self):
    method test_locust_forced_stop (line 554) | def test_locust_forced_stop(self):
    method test_deprecated_locust_class (line 578) | def test_deprecated_locust_class(self):
  class TestWebLocustClass (line 614) | class TestWebLocustClass(WebserverTestCase):
    method test_get_request (line 615) | def test_get_request(self):
    method test_client_request_headers (line 629) | def test_client_request_headers(self):
    method test_client_get (line 636) | def test_client_get(self):
    method test_client_get_absolute_url (line 643) | def test_client_get_absolute_url(self):
    method test_client_post (line 650) | def test_client_post(self):
    method test_client_put (line 658) | def test_client_put(self):
    method test_client_delete (line 666) | def test_client_delete(self):
    method test_client_head (line 674) | def test_client_head(self):
    method test_client_basic_auth (line 681) | def test_client_basic_auth(self):
    method test_log_request_name_argument (line 700) | def test_log_request_name_argument(self):
    method test_redirect_url_original_path_as_name (line 715) | def test_redirect_url_original_path_as_name(self):
  class TestCatchResponse (line 727) | class TestCatchResponse(WebserverTestCase):
    method setUp (line 728) | def setUp(self):
    method test_catch_response (line 748) | def test_catch_response(self):
    method test_catch_response_http_fail (line 764) | def test_catch_response_http_fail(self):
    method test_catch_response_http_manual_fail (line 770) | def test_catch_response_http_manual_fail(self):
    method test_catch_response_http_manual_success (line 780) | def test_catch_response_http_manual_success(self):
    method test_catch_response_allow_404 (line 786) | def test_catch_response_allow_404(self):
    method test_interrupt_taskset_with_catch_response (line 794) | def test_interrupt_taskset_with_catch_response(self):
    method test_catch_response_connection_error_success (line 811) | def test_catch_response_connection_error_success(self):
    method test_catch_response_connection_error_fail (line 823) | def test_catch_response_connection_error_fail(self):

FILE: locust/test/test_log.py
  class TestGreenletExceptionLogger (line 20) | class TestGreenletExceptionLogger(LocustTestCase):
    method test_greenlet_exception_logger (line 23) | def test_greenlet_exception_logger(self, mocked_stderr):
  class TestLoggingOptions (line 41) | class TestLoggingOptions(LocustTestCase):
    method test_logging_output (line 42) | def test_logging_output(self):
    method test_skip_logging (line 106) | def test_skip_logging(self):
    method test_log_to_file (line 143) | def test_log_to_file(self):
    method test_user_broken_on_start (line 212) | def test_user_broken_on_start(self):

FILE: locust/test/test_main.py
  function is_port_in_use (line 27) | def is_port_in_use(port: int) -> bool:
  class ProcessIntegrationTest (line 54) | class ProcessIntegrationTest(TestCase):
    method setUp (line 55) | def setUp(self):
    method tearDown (line 60) | def tearDown(self):
  class StandaloneIntegrationTests (line 65) | class StandaloneIntegrationTests(ProcessIntegrationTest):
    method test_help_arg (line 66) | def test_help_arg(self):
    method test_custom_arguments (line 80) | def test_custom_arguments(self):
    method test_custom_arguments_in_file (line 121) | def test_custom_arguments_in_file(self):
    method test_custom_exit_code (line 152) | def test_custom_exit_code(self):
    method test_webserver (line 180) | def test_webserver(self):
    method test_percentile_parameter (line 200) | def test_percentile_parameter(self):
    method test_percentiles_to_statistics (line 223) | def test_percentiles_to_statistics(self):
    method test_invalid_percentile_parameter (line 246) | def test_invalid_percentile_parameter(self):
    method test_csv_full_history_requires_csv (line 264) | def test_csv_full_history_requires_csv(self):
    method test_webserver_multiple_locustfiles (line 271) | def test_webserver_multiple_locustfiles(self):
    method test_webserver_multiple_locustfiles_in_directory (line 279) | def test_webserver_multiple_locustfiles_in_directory(self):
    method test_webserver_multiple_locustfiles_with_shape (line 288) | def test_webserver_multiple_locustfiles_with_shape(self):
    method test_default_headless_spawn_options (line 330) | def test_default_headless_spawn_options(self):
    method test_invalid_stop_timeout_string (line 339) | def test_invalid_stop_timeout_string(self):
    method test_headless_spawn_options_wo_run_time (line 351) | def test_headless_spawn_options_wo_run_time(self):
    method test_run_headless_with_multiple_locustfiles (line 363) | def test_run_headless_with_multiple_locustfiles(self):
    method test_default_headless_spawn_options_with_shape (line 387) | def test_default_headless_spawn_options_with_shape(self):
    method test_run_headless_with_multiple_locustfiles_with_shape (line 410) | def test_run_headless_with_multiple_locustfiles_with_shape(self):
    method test_autostart_wo_run_time (line 454) | def test_autostart_wo_run_time(self):
    method test_autostart_w_run_time (line 477) | def test_autostart_w_run_time(self):
    method test_run_autostart_with_multiple_locustfiles (line 502) | def test_run_autostart_with_multiple_locustfiles(self):
    method test_autostart_w_load_shape (line 525) | def test_autostart_w_load_shape(self):
    method test_autostart_multiple_locustfiles_with_shape (line 556) | def test_autostart_multiple_locustfiles_with_shape(self):
    method test_web_options (line 616) | def test_web_options(self):
    method test_input (line 634) | def test_input(self):
    method test_autospawn_browser (line 681) | def test_autospawn_browser(self):
    method test_spawning_with_fixed (line 711) | def test_spawning_with_fixed(self):
    method test_spawing_with_fixed_multiple_locustfiles (line 752) | def test_spawing_with_fixed_multiple_locustfiles(self):
    method test_warning_with_lower_user_count_than_fixed_count (line 769) | def test_warning_with_lower_user_count_than_fixed_count(self):
    method test_with_package_as_locustfile (line 797) | def test_with_package_as_locustfile(self):
    method test_command_line_user_selection (line 805) | def test_command_line_user_selection(self):
    method test_html_report_option (line 839) | def test_html_report_option(self):
    method test_run_with_userclass_picker (line 872) | def test_run_with_userclass_picker(self):
    method test_error_when_duplicate_userclass_names (line 880) | def test_error_when_duplicate_userclass_names(self):
    method test_no_error_when_same_userclass_in_two_files (line 896) | def test_no_error_when_same_userclass_in_two_files(self):
    method test_error_when_duplicate_shape_class_names (line 908) | def test_error_when_duplicate_shape_class_names(self):
    method test_error_when_providing_both_run_time_and_a_shape_class (line 938) | def test_error_when_providing_both_run_time_and_a_shape_class(self):
    method test_shape_class_log_disabled_parameters (line 955) | def test_shape_class_log_disabled_parameters(self):
    method test_shape_class_with_use_common_options (line 974) | def test_shape_class_with_use_common_options(self):
    method test_error_when_locustfiles_directory_is_empty (line 996) | def test_error_when_locustfiles_directory_is_empty(self):
    method test_error_when_no_tasks_match_tags (line 1001) | def test_error_when_no_tasks_match_tags(self):
    method test_graceful_exit_when_keyboard_interrupt (line 1018) | def test_graceful_exit_when_keyboard_interrupt(self):
    method test_exception_in_init_event (line 1053) | def test_exception_in_init_event(self):
    method test_json_schema (line 1075) | def test_json_schema(self):
    method test_json_file (line 1119) | def test_json_file(self):
    method test_pytest_style_locustfile (line 1153) | def test_pytest_style_locustfile(self):
    method test_no_host_should_quit_test (line 1191) | def test_no_host_should_quit_test(self):
    method test_no_host_should_stop_test (line 1217) | def test_no_host_should_stop_test(self):
  class DistributedIntegrationTests (line 1250) | class DistributedIntegrationTests(ProcessIntegrationTest):
    method setUp (line 1253) | def setUp(self):
    method test_expect_workers (line 1267) | def test_expect_workers(self):
    method test_distributed_events (line 1279) | def test_distributed_events(self):
    method test_distributed_tags (line 1314) | def test_distributed_tags(self):
    method test_distributed (line 1342) | def test_distributed(self):
    method test_distributed_report_timeout_expired (line 1365) | def test_distributed_report_timeout_expired(self):
    method test_locustfile_distribution (line 1392) | def test_locustfile_distribution(self):
    method test_locustfile_distribution_with_workers_started_first (line 1419) | def test_locustfile_distribution_with_workers_started_first(self):
    method test_distributed_with_locustfile_distribution_not_plain_filename (line 1443) | def test_distributed_with_locustfile_distribution_not_plain_filename(s...
    method test_worker_indexes (line 1469) | def test_worker_indexes(self):
    method test_processes (line 1501) | def test_processes(self):
    method test_processes_autodetect (line 1513) | def test_processes_autodetect(self):
    method test_processes_separate_worker (line 1525) | def test_processes_separate_worker(self):
    method test_processes_ctrl_c (line 1546) | def test_processes_ctrl_c(self):
    method test_workers_shut_down_if_master_is_gone (line 1582) | def test_workers_shut_down_if_master_is_gone(self):
    method test_processes_error_doesnt_blow_up_completely (line 1615) | def test_processes_error_doesnt_blow_up_completely(self):
    method test_processes_workers_quit_unexpected (line 1633) | def test_processes_workers_quit_unexpected(self):
  class TelemetryTests (line 1663) | class TelemetryTests(ProcessIntegrationTest):
    method test_otel_flag (line 1664) | def test_otel_flag(self):
    method test_httpuser (line 1680) | def test_httpuser(self):
    method test_request_name (line 1694) | def test_request_name(self):

FILE: locust/test/test_markov_taskset.py
  class TestMarkovTaskSet (line 18) | class TestMarkovTaskSet(LocustTestCase):
    method setUp (line 19) | def setUp(self):
    method test_basic_markov_chain (line 23) | def test_basic_markov_chain(self):
    method test_multiple_transitions (line 48) | def test_multiple_transitions(self):
    method test_weighted_transitions (line 77) | def test_weighted_transitions(self):
    method test_transitions_list_format (line 105) | def test_transitions_list_format(self):
    method test_validation_no_markov_tasks (line 133) | def test_validation_no_markov_tasks(self):
    method test_validation_invalid_transition (line 141) | def test_validation_invalid_transition(self):
    method test_validation_non_markov_transition (line 152) | def test_validation_non_markov_transition(self):
    method test_validation_unreachable_tasks (line 166) | def test_validation_unreachable_tasks(self):
    method test_validation_unreachable_tasks_because_of_weights (line 187) | def test_validation_unreachable_tasks_because_of_weights(self):
    method test_validation_no_tags (line 204) | def test_validation_no_tags(self):
    method test_abstract_markov_taskset (line 220) | def test_abstract_markov_taskset(self):

FILE: locust/test/test_parser.py
  class TestParser (line 19) | class TestParser(unittest.TestCase):
    method setUp (line 20) | def setUp(self):
    method test_default (line 23) | def test_default(self):
    method test_reset_stats (line 28) | def test_reset_stats(self):
    method test_skip_log_setup (line 33) | def test_skip_log_setup(self):
    method test_parse_options_from_conf_file (line 38) | def test_parse_options_from_conf_file(self):
    method test_parse_two_line_conf_file (line 60) | def test_parse_two_line_conf_file(self):  # there was an issue with co...
    method test_parse_options_from_toml_file (line 70) | def test_parse_options_from_toml_file(self):
  class TestArgumentParser (line 96) | class TestArgumentParser(LocustTestCase):
    method setUp (line 97) | def setUp(self):
    method tearDown (line 103) | def tearDown(self):
    method test_parse_options (line 108) | def test_parse_options(self):
    method test_parse_options_from_env (line 135) | def test_parse_options_from_env(self):
    method test_parse_locustfile (line 163) | def test_parse_locustfile(self):
    method test_parse_locustfile_multiple_files (line 194) | def test_parse_locustfile_multiple_files(self):
    method test_parse_locustfile_with_directory (line 208) | def test_parse_locustfile_with_directory(self):
    method test_parse_locustfile_with_nested_directory (line 219) | def test_parse_locustfile_with_nested_directory(self):
    method test_parse_locustfile_with_directory_ignores_invalid_filenames (line 243) | def test_parse_locustfile_with_directory_ignores_invalid_filenames(self):
    method test_parse_locustfile_empty_directory_error (line 258) | def test_parse_locustfile_empty_directory_error(self):
    method test_parse_locustfile_and_directory (line 268) | def test_parse_locustfile_and_directory(self):
    method test_parse_multiple_directories (line 282) | def test_parse_multiple_directories(self):
    method test_parse_locustfile_invalid_directory_error (line 295) | def test_parse_locustfile_invalid_directory_error(self):
    method test_unknown_command_line_arg (line 305) | def test_unknown_command_line_arg(self):
    method test_custom_argument (line 330) | def test_custom_argument(self):
    method test_custom_argument_help_message (line 352) | def test_custom_argument_help_message(self):
    method test_custom_argument_included_in_web_ui (line 371) | def test_custom_argument_included_in_web_ui(self):
  class TestFindLocustfiles (line 393) | class TestFindLocustfiles(LocustTestCase):
    method setUp (line 394) | def setUp(self):
    method tearDown (line 400) | def tearDown(self):
    method test_find_locustfiles_with_is_directory (line 406) | def test_find_locustfiles_with_is_directory(self):
    method test_find_locustfiles_error_if_directory_doesnt_exist (line 417) | def test_find_locustfiles_error_if_directory_doesnt_exist(self):
    method test_find_locustfiles_ignores_invalid_files_in_directory (line 422) | def test_find_locustfiles_ignores_invalid_files_in_directory(self):
    method test_find_locustfiles_with_multiple_locustfiles (line 433) | def test_find_locustfiles_with_multiple_locustfiles(self):
    method test_find_locustfiles_error_for_invalid_file_extension (line 443) | def test_find_locustfiles_error_for_invalid_file_extension(self):
    method test_find_locustfiles_error_if_multiple_values_for_directory (line 450) | def test_find_locustfiles_error_if_multiple_values_for_directory(self):

FILE: locust/test/test_pytest_locustfile.py
  function test_regular (line 15) | def test_regular(session: HttpSession):
  function test_fasthttp (line 19) | def test_fasthttp(fastsession: FastHttpSession):
  function test_failure (line 24) | def test_failure(session: HttpSession):
  function test_catch_response (line 33) | def test_catch_response(session: HttpSession):
  function test_fasthttp_catch_response (line 40) | def test_fasthttp_catch_response(fastsession: FastHttpSession):
  function test_fasthttp_failure (line 48) | def test_fasthttp_failure(fastsession: FastHttpSession):
  function test_host (line 60) | def test_host(fastsession: FastHttpSession):

FILE: locust/test/test_runners.py
  function mocked_rpc (line 51) | def mocked_rpc(raise_on_close=True):
  class mocked_options (line 104) | class mocked_options:
    method __init__ (line 105) | def __init__(self):
    method reset_stats (line 121) | def reset_stats(self):
  class HeyAnException (line 125) | class HeyAnException(Exception):
  class LocustRunnerTestCase (line 129) | class LocustRunnerTestCase(LocustTestCase):
    method __init__ (line 130) | def __init__(self, *args, **kwargs):
    method setUp (line 135) | def setUp(self):
    method reset_state (line 139) | def reset_state(self):
  class TestLocustRunner (line 144) | class TestLocustRunner(LocustRunnerTestCase):
    method test_missing_constructor_call_in_user (line 145) | def test_missing_constructor_call_in_user(self):
    method test_cpu_warning (line 163) | def test_cpu_warning(self):
    method test_kill_locusts (line 196) | def test_kill_locusts(self):
    method test_start_event (line 220) | def test_start_event(self):
    method test_stop_event (line 245) | def test_stop_event(self):
    method test_stop_event_quit (line 271) | def test_stop_event_quit(self):
    method test_stop_event_stop_and_quit (line 297) | def test_stop_event_stop_and_quit(self):
    method test_stopping_event (line 324) | def test_stopping_event(self):
    method test_change_user_count_during_spawning (line 351) | def test_change_user_count_during_spawning(self):
    method test_reset_stats (line 368) | def test_reset_stats(self):
    method test_no_reset_stats (line 394) | def test_no_reset_stats(self):
    method test_runner_reference_on_environment (line 419) | def test_runner_reference_on_environment(self):
    method test_users_can_call_runner_quit_without_deadlocking (line 425) | def test_users_can_call_runner_quit_without_deadlocking(self):
    method test_runner_quit_can_run_on_stop_for_multiple_users_concurrently (line 450) | def test_runner_quit_can_run_on_stop_for_multiple_users_concurrently(s...
    method test_stop_users_with_spawn_rate (line 476) | def test_stop_users_with_spawn_rate(self):
    method test_attributes_populated_when_calling_start (line 514) | def test_attributes_populated_when_calling_start(self):
    method test_user_classes_count (line 542) | def test_user_classes_count(self):
    method test_host_class_attribute_from_web (line 570) | def test_host_class_attribute_from_web(self):
    method test_custom_message (line 602) | def test_custom_message(self):
    method test_concurrent_custom_message (line 626) | def test_concurrent_custom_message(self):
    method test_undefined_custom_message (line 651) | def test_undefined_custom_message(self):
    method test_duplicate_message_handler_registration (line 675) | def test_duplicate_message_handler_registration(self):
    method test_swarm_endpoint_is_non_blocking (line 689) | def test_swarm_endpoint_is_non_blocking(self):
    method test_can_call_stop_endpoint_if_currently_swarming (line 726) | def test_can_call_stop_endpoint_if_currently_swarming(self):
    method test_target_user_count_is_set_before_ramp_up (line 774) | def test_target_user_count_is_set_before_ramp_up(self):
    method test_stop_users_count (line 814) | def test_stop_users_count(self):
    method test_user_count_starts_from_specified_amount_when_creating_new_test_after_previous_step_has_been_stopped (line 836) | def test_user_count_starts_from_specified_amount_when_creating_new_tes...
    method test_custom_dispatcher_class (line 891) | def test_custom_dispatcher_class(self):
  class TestMasterWorkerRunners (line 928) | class TestMasterWorkerRunners(LocustTestCase):
    method test_distributed_integration_run (line 929) | def test_distributed_integration_run(self):
    method test_distributed_rebalanced_integration_run (line 992) | def test_distributed_rebalanced_integration_run(self):
    method test_distributed_run_with_custom_args (line 1096) | def test_distributed_run_with_custom_args(self):
    method test_spawning_complete_and_test_stop_event (line 1159) | def test_spawning_complete_and_test_stop_event(self):
    method test_distributed_shape (line 1233) | def test_distributed_shape(self):
    method test_distributed_shape_with_fixed_users (line 1313) | def test_distributed_shape_with_fixed_users(self):
    method test_distributed_shape_with_stop_timeout (line 1415) | def test_distributed_shape_with_stop_timeout(self):
    method test_distributed_shape_fuzzy_test (line 1620) | def test_distributed_shape_fuzzy_test(self):
    method test_distributed_shape_stop_and_restart (line 1759) | def test_distributed_shape_stop_and_restart(self):
    method test_distributed_stop_with_stopping_state (line 1810) | def test_distributed_stop_with_stopping_state(self):
    method test_distributed_shape_statuses_transition (line 1838) | def test_distributed_shape_statuses_transition(self):
    method test_swarm_endpoint_is_non_blocking (line 1925) | def test_swarm_endpoint_is_non_blocking(self):
    method test_can_call_stop_endpoint_if_currently_swarming (line 1973) | def test_can_call_stop_endpoint_if_currently_swarming(self):
    method test_target_user_count_is_set_before_ramp_up (line 2032) | def test_target_user_count_is_set_before_ramp_up(self):
    method test_long_running_test_start_is_run_to_completion_on_worker (line 2086) | def test_long_running_test_start_is_run_to_completion_on_worker(self):
    method test_heartbeat_event (line 2131) | def test_heartbeat_event(self) -> None:
    method test_usage_monitor_event (line 2203) | def test_usage_monitor_event(self) -> None:
  class TestMasterRunner (line 2275) | class TestMasterRunner(LocustRunnerTestCase):
    method setUp (line 2276) | def setUp(self):
    method tearDown (line 2280) | def tearDown(self):
    method get_runner (line 2283) | def get_runner(self, user_classes=None):
    method test_worker_connect (line 2288) | def test_worker_connect(self):
    method test_worker_connect_with_special_versions (line 2304) | def test_worker_connect_with_special_versions(self):
    method test_worker_stats_report_median (line 2322) | def test_worker_stats_report_median(self):
    method test_worker_stats_report_with_none_response_times (line 2339) | def test_worker_stats_report_with_none_response_times(self):
    method test_master_marks_downed_workers_as_missing (line 2365) | def test_master_marks_downed_workers_as_missing(self):
    method test_last_worker_quitting_stops_test (line 2373) | def test_last_worker_quitting_stops_test(self):
    method test_last_worker_missing_stops_test (line 2402) | def test_last_worker_missing_stops_test(self):
    method test_worker_missing_after_heartbeat_dead_interval (line 2474) | def test_worker_missing_after_heartbeat_dead_interval(self):
    method test_master_total_stats (line 2563) | def test_master_total_stats(self):
    method test_master_total_stats_with_none_response_times (line 2598) | def test_master_total_stats_with_none_response_times(self):
    method test_master_current_response_times (line 2649) | def test_master_current_response_times(self):
    method test_rebalance_locust_users_on_worker_connect (line 2714) | def test_rebalance_locust_users_on_worker_connect(self):
    method test_sends_spawn_data_to_ready_running_spawning_workers (line 2746) | def test_sends_spawn_data_to_ready_running_spawning_workers(self):
    method test_start_event (line 2766) | def test_start_event(self):
    method test_stop_event (line 2803) | def test_stop_event(self):
    method test_stop_event_quit (line 2842) | def test_stop_event_quit(self):
    method test_spawn_zero_locusts (line 2872) | def test_spawn_zero_locusts(self):
    method test_spawn_uneven_locusts (line 2896) | def test_spawn_uneven_locusts(self):
    method test_spawn_fewer_locusts_than_workers (line 2919) | def test_spawn_fewer_locusts_than_workers(self):
    method test_spawn_correct_worker_indexes (line 2938) | def test_spawn_correct_worker_indexes(self):
    method test_custom_shape_scale_interval (line 2968) | def test_custom_shape_scale_interval(self):
    method test_custom_shape_scale_up (line 3023) | def test_custom_shape_scale_up(self):
    method test_custom_shape_scale_down (line 3068) | def test_custom_shape_scale_down(self):
    method test_exception_in_task (line 3117) | def test_exception_in_task(self):
    method test_exception_is_caught (line 3137) | def test_exception_is_caught(self):
    method test_master_reset_connection (line 3176) | def test_master_reset_connection(self):
    method test_reset_connection_after_RPCError (line 3190) | def test_reset_connection_after_RPCError(self):
    method test_attributes_populated_when_calling_start (line 3205) | def test_attributes_populated_when_calling_start(self):
    method test_custom_message_send (line 3236) | def test_custom_message_send(self):
    method test_custom_message_receive (line 3257) | def test_custom_message_receive(self):
    method test_undefined_custom_message_receive (line 3281) | def test_undefined_custom_message_receive(self):
    method test_wait_for_workers_report_after_ramp_up (line 3305) | def test_wait_for_workers_report_after_ramp_up(self):
    method test_master_discard_first_client_ready (line 3332) | def test_master_discard_first_client_ready(self):
    method test_worker_sends_bad_message_to_master (line 3347) | def test_worker_sends_bad_message_to_master(self):
    method test_worker_sends_unrecognized_message_to_master (line 3380) | def test_worker_sends_unrecognized_message_to_master(self):
    method test_unknown_host_sends_message_to_master (line 3403) | def test_unknown_host_sends_message_to_master(self):
  class TestWorkerRunner (line 3427) | class TestWorkerRunner(LocustTestCase):
    method setUp (line 3428) | def setUp(self):
    method tearDown (line 3432) | def tearDown(self):
    method get_runner (line 3436) | def get_runner(self, client, environment=None, user_classes=None, auto...
    method test_worker_stop_timeout (line 3445) | def test_worker_stop_timeout(self):
    method test_worker_without_stop_timeout (line 3487) | def test_worker_without_stop_timeout(self):
    method test_spawn_message_with_older_timestamp_is_rejected (line 3529) | def test_spawn_message_with_older_timestamp_is_rejected(self):
    method test_worker_messages_sent_to_master (line 3619) | def test_worker_messages_sent_to_master(self):
    method test_worker_heartbeat_messages_sent_to_master (line 3677) | def test_worker_heartbeat_messages_sent_to_master(self):
    method test_reset_rpc_connection_to_master (line 3705) | def test_reset_rpc_connection_to_master(self):
    method test_change_user_count_during_spawning (line 3752) | def test_change_user_count_during_spawning(self):
    method test_computed_properties (line 3802) | def test_computed_properties(self):
    method test_custom_message_send (line 3858) | def test_custom_message_send(self):
    method test_custom_message_receive (line 3875) | def test_custom_message_receive(self):
    method test_undefined_custom_message_receive (line 3900) | def test_undefined_custom_message_receive(self):
    method test_start_event (line 3924) | def test_start_event(self):
    method test_stop_event (line 4011) | def test_stop_event(self):
    method test_worker_connect_success (line 4088) | def test_worker_connect_success(self):
    method test_worker_connect_failure (line 4103) | def test_worker_connect_failure(self):
    method test_send_logs (line 4118) | def test_send_logs(self):
    method test_quit_worker_logs (line 4148) | def test_quit_worker_logs(self):
  class TestMessageSerializing (line 4184) | class TestMessageSerializing(unittest.TestCase):
    method test_message_serialize (line 4185) | def test_message_serialize(self):
  class TestStopTimeout (line 4193) | class TestStopTimeout(LocustTestCase):
    method test_stop_timeout (line 4194) | def test_stop_timeout(self):
    method test_stop_timeout_during_on_start (line 4240) | def test_stop_timeout_during_on_start(self):
    method test_stop_timeout_exit_during_wait (line 4268) | def test_stop_timeout_exit_during_wait(self):
    method test_stop_timeout_with_interrupt (line 4294) | def test_stop_timeout_with_interrupt(self):
    method test_stop_timeout_with_interrupt_no_reschedule (line 4324) | def test_stop_timeout_with_interrupt_no_reschedule(self):
    method test_kill_locusts_with_stop_timeout (line 4355) | def test_kill_locusts_with_stop_timeout(self):
    method test_users_can_call_runner_quit_with_stop_timeout (line 4403) | def test_users_can_call_runner_quit_with_stop_timeout(self):
    method test_gracefully_handle_exceptions_in_listener (line 4423) | def test_gracefully_handle_exceptions_in_listener(self):
    method test_stop_timeout_with_ramp_down (line 4450) | def test_stop_timeout_with_ramp_down(self):

FILE: locust/test/test_sequential_taskset.py
  class TestTaskSet (line 8) | class TestTaskSet(LocustTestCase):
    method setUp (line 9) | def setUp(self):
    method test_task_sequence_with_list (line 17) | def test_task_sequence_with_list(self):
    method test_task_sequence_with_dictionary (line 37) | def test_task_sequence_with_dictionary(self):
    method test_task_sequence_with_methods (line 57) | def test_task_sequence_with_methods(self):
    method test_task_sequence_with_methods_and_list (line 78) | def test_task_sequence_with_methods_and_list(self):
    method test_task_sequence_with_inheritance (line 107) | def test_task_sequence_with_inheritance(self):
    method test_task_sequence_multiple_iterations (line 134) | def test_task_sequence_multiple_iterations(self):

FILE: locust/test/test_socketio.py
  class TestSocketIOUser (line 11) | class TestSocketIOUser(LocustTestCase):
    method test_everything (line 12) | def test_everything(self):

FILE: locust/test/test_stats.py
  function _write_csv_files (line 40) | def _write_csv_files(environment, stats_base_name, full_history=False):
  class TestStatsValidation (line 49) | class TestStatsValidation(unittest.TestCase):
    method test_stats_validation_normal_no_return_exit (line 50) | def test_stats_validation_normal_no_return_exit(self):
    method test_stats_validation_fail_on_too_many_percentiles_to_chart (line 54) | def test_stats_validation_fail_on_too_many_percentiles_to_chart(self):
    method test_stats_validation_fail_on_too_high_chart_value (line 65) | def test_stats_validation_fail_on_too_high_chart_value(self):
    method test_stats_validation_fail_on_too_high_statistic_value (line 76) | def test_stats_validation_fail_on_too_high_statistic_value(self):
    method test_stats_validation_fail_on_wrong_type_chart_value (line 87) | def test_stats_validation_fail_on_wrong_type_chart_value(self):
    method test_stats_validation_fail_on_wrong_type_statistic_value (line 98) | def test_stats_validation_fail_on_wrong_type_statistic_value(self):
  class TestRequestStats (line 109) | class TestRequestStats(unittest.TestCase):
    method setUp (line 110) | def setUp(self):
    method test_percentile (line 134) | def test_percentile(self):
    method test_median (line 143) | def test_median(self):
    method test_median_out_of_min_max_bounds (line 146) | def test_median_out_of_min_max_bounds(self):
    method test_total_rps (line 154) | def test_total_rps(self):
    method test_rps_less_than_one_second (line 167) | def test_rps_less_than_one_second(self):
    method test_current_rps (line 173) | def test_current_rps(self):
    method test_current_fail_per_sec (line 180) | def test_current_fail_per_sec(self):
    method test_num_reqs_fails (line 190) | def test_num_reqs_fails(self):
    method test_avg (line 194) | def test_avg(self):
    method test_total_content_length (line 197) | def test_total_content_length(self):
    method test_reset (line 200) | def test_reset(self):
    method test_avg_only_none (line 215) | def test_avg_only_none(self):
    method test_reset_min_response_time (line 222) | def test_reset_min_response_time(self):
    method test_aggregation (line 227) | def test_aggregation(self):
    method test_aggregation_with_rounding (line 254) | def test_aggregation_with_rounding(self):
    method test_aggregation_with_decimal_rounding (line 271) | def test_aggregation_with_decimal_rounding(self):
    method test_aggregation_min_response_time (line 282) | def test_aggregation_min_response_time(self):
    method test_aggregation_last_request_timestamp (line 290) | def test_aggregation_last_request_timestamp(self):
    method test_percentile_rounded_down (line 312) | def test_percentile_rounded_down(self):
    method test_percentile_rounded_up (line 319) | def test_percentile_rounded_up(self):
    method test_custom_percentile_list (line 325) | def test_custom_percentile_list(self):
    method test_error_grouping (line 335) | def test_error_grouping(self):
    method test_error_grouping_errors_with_memory_addresses (line 350) | def test_error_grouping_errors_with_memory_addresses(self):
    method test_serialize_through_message (line 360) | def test_serialize_through_message(self):
  class TestStatsPrinting (line 378) | class TestStatsPrinting(LocustTestCase):
    method setUp (line 379) | def setUp(self):
    method test_print_percentile_stats (line 400) | def test_print_percentile_stats(self):
    method test_print_stats (line 411) | def test_print_stats(self):
    method test_print_error_report (line 427) | def test_print_error_report(self):
  class TestCsvStats (line 440) | class TestCsvStats(LocustTestCase):
    method setUp (line 447) | def setUp(self):
    method tearDown (line 454) | def tearDown(self):
    method remove_file_if_exists (line 460) | def remove_file_if_exists(self, filename):
    method test_write_csv_files (line 464) | def test_write_csv_files(self):
    method test_write_csv_files_full_history (line 471) | def test_write_csv_files_full_history(self):
    method test_csv_stats_writer (line 479) | def test_csv_stats_writer(self):
    method test_csv_stats_writer_full_history (line 496) | def test_csv_stats_writer_full_history(self):
    method test_csv_stats_on_master_from_aggregated_stats (line 546) | def test_csv_stats_on_master_from_aggregated_stats(self):
    method test_user_count_in_csv_history_stats (line 580) | def test_user_count_in_csv_history_stats(self):
    method test_requests_csv_quote_escaping (line 625) | def test_requests_csv_quote_escaping(self):
    method test_stats_history (line 651) | def test_stats_history(self):
  class TestStatsEntryResponseTimesCache (line 668) | class TestStatsEntryResponseTimesCache(unittest.TestCase):
    method setUp (line 669) | def setUp(self, *args, **kwargs):
    method test_response_times_cached (line 673) | def test_response_times_cached(self):
    method test_response_times_not_cached_if_not_enabled (line 689) | def test_response_times_not_cached_if_not_enabled(self):
    method test_latest_total_response_times_pruned (line 697) | def test_latest_total_response_times_pruned(self):
    method test_get_current_response_time_percentile (line 715) | def test_get_current_response_time_percentile(self):
    method test_get_current_response_time_percentile_outside_cache_window (line 729) | def test_get_current_response_time_percentile_outside_cache_window(self):
    method test_diff_response_times_dicts (line 735) | def test_diff_response_times_dicts(self):
  class TestStatsEntry (line 773) | class TestStatsEntry(unittest.TestCase):
    method parse_string_output (line 774) | def parse_string_output(self, text):
    method setUp (line 785) | def setUp(self, *args, **kwargs):
    method test_fail_ratio_with_no_failures (line 789) | def test_fail_ratio_with_no_failures(self):
    method test_fail_ratio_with_all_failures (line 804) | def test_fail_ratio_with_all_failures(self):
    method test_fail_ratio_with_half_failures (line 819) | def test_fail_ratio_with_half_failures(self):
  class TestRequestStatsWithWebserver (line 835) | class TestRequestStatsWithWebserver(WebserverTestCase):
    method setUp (line 836) | def setUp(self):
    method test_request_stats_content_length (line 844) | def test_request_stats_content_length(self):
    method test_request_stats_no_content_length (line 855) | def test_request_stats_no_content_length(self):
    method test_request_stats_no_content_length_streaming (line 863) | def test_request_stats_no_content_length_streaming(self):
    method test_request_stats_named_endpoint (line 868) | def test_request_stats_named_endpoint(self):
    method test_request_stats_named_endpoint_request_name (line 872) | def test_request_stats_named_endpoint_request_name(self):
    method test_request_stats_named_endpoint_rename_request (line 878) | def test_request_stats_named_endpoint_rename_request(self):
    method test_request_stats_query_variables (line 883) | def test_request_stats_query_variables(self):
    method test_request_stats_put (line 887) | def test_request_stats_put(self):
    method test_request_connection_error (line 891) | def test_request_connection_error(self):
  class MyTaskSet (line 902) | class MyTaskSet(TaskSet):
    method root_task (line 904) | def root_task(self):
    class MySubTaskSet (line 908) | class MySubTaskSet(TaskSet):
      method task1 (line 910) | def task1(self):
      method task2 (line 914) | def task2(self):
  class TestInspectUser (line 918) | class TestInspectUser(unittest.TestCase):
    method test_get_task_ratio_relative (line 919) | def test_get_task_ratio_relative(self):
    method test_get_task_ratio_total (line 927) | def test_get_task_ratio_total(self):
  class TestBucketResponseTime (line 936) | class TestBucketResponseTime(unittest.TestCase):
    method test_default_bucketing (line 937) | def test_default_bucketing(self):
    method test_custom_bucket_function_override (line 958) | def test_custom_bucket_function_override(self):

FILE: locust/test/test_tags.py
  class TestTags (line 8) | class TestTags(LocustTestCase):
    method test_tagging (line 9) | def test_tagging(self):
    method test_tagging_taskset (line 35) | def test_tagging_taskset(self):
    method test_tagging_without_args_fails (line 67) | def test_tagging_without_args_fails(self):
    method test_including_tags (line 78) | def test_including_tags(self):
    method test_excluding_tags (line 101) | def test_excluding_tags(self):
    method test_including_and_excluding (line 124) | def test_including_and_excluding(self):
    method test_including_tasksets (line 148) | def test_including_tasksets(self):
    method test_excluding_tasksets (line 178) | def test_excluding_tasksets(self):
    method test_including_tags_with_weights (line 215) | def test_including_tags_with_weights(self):
    method test_excluding_tags_with_weights (line 269) | def test_excluding_tags_with_weights(self):
    method test_tagged_tasks_shared_across_tasksets (line 323) | def test_tagged_tasks_shared_across_tasksets(self):
    method test_include_tags_under_user (line 352) | def test_include_tags_under_user(self):
    method test_exclude_tags_under_user (line 372) | def test_exclude_tags_under_user(self):
    method test_env_include_tags (line 392) | def test_env_include_tags(self):
    method test_env_exclude_tags (line 417) | def test_env_exclude_tags(self):

FILE: locust/test/test_taskratio.py
  class TestTaskRatio (line 7) | class TestTaskRatio(unittest.TestCase):
    method test_task_ratio_command (line 8) | def test_task_ratio_command(self):
    method test_task_ratio_command_with_locust_weight (line 37) | def test_task_ratio_command_with_locust_weight(self):

FILE: locust/test/test_users.py
  class TestUserClass (line 9) | class TestUserClass(unittest.TestCase):
    class MyClassScopedUser (line 10) | class MyClassScopedUser(User):
    method test_fullname_module_scoped (line 13) | def test_fullname_module_scoped(self):
    method test_fullname_class_scoped (line 16) | def test_fullname_class_scoped(self):
    method test_fullname_function_scoped (line 19) | def test_fullname_function_scoped(self):
  class MyModuleScopedUser (line 29) | class MyModuleScopedUser(User):
  class TestHttpUserWithWebserver (line 33) | class TestHttpUserWithWebserver(WebserverTestCase):
    method test_shared_pool_manager (line 34) | def test_shared_pool_manager(self):
    method test_pool_manager_per_user_instance (line 56) | def test_pool_manager_per_user_instance(self):

FILE: locust/test/test_util.py
  class TestParseTimespan (line 7) | class TestParseTimespan(unittest.TestCase):
    method test_parse_timespan_invalid_values (line 8) | def test_parse_timespan_invalid_values(self):
    method test_parse_timespan (line 13) | def test_parse_timespan(self):
  class TestRounding (line 21) | class TestRounding(unittest.TestCase):
    method test_rounding_down (line 22) | def test_rounding_down(self):
    method test_rounding_up (line 28) | def test_rounding_up(self):

FILE: locust/test/test_wait_time.py
  class TestWaitTime (line 9) | class TestWaitTime(LocustTestCase):
    method test_between (line 10) | def test_between(self):
    method test_constant (line 35) | def test_constant(self):
    method test_default_wait_time (line 45) | def test_default_wait_time(self):
    method test_constant_throughput (line 59) | def test_constant_throughput(self):

FILE: locust/test/test_web.py
  class _HeaderCheckMixin (line 30) | class _HeaderCheckMixin:
    method _check_csv_headers (line 31) | def _check_csv_headers(self, headers, exp_fn_prefix):
  class TestWebUI (line 44) | class TestWebUI(LocustTestCase, _HeaderCheckMixin):
    method setUp (line 45) | def setUp(self):
    method tearDown (line 57) | def tearDown(self):
    method test_web_ui_reference_on_environment (line 62) | def test_web_ui_reference_on_environment(self):
    method test_web_ui_no_runner (line 65) | def test_web_ui_no_runner(self):
    method test_index (line 76) | def test_index(self):
    method test_index_with_spawn_options (line 101) | def test_index_with_spawn_options(self):
    method test_stats_no_data (line 117) | def test_stats_no_data(self):
    method test_stats (line 120) | def test_stats(self):
    method test_stats_cache (line 133) | def test_stats_cache(self):
    method test_stats_rounding (line 150) | def test_stats_rounding(self):
    method test_request_stats_csv (line 160) | def test_request_stats_csv(self):
    method test_request_stats_full_history_csv_not_present (line 166) | def test_request_stats_full_history_csv_not_present(self):
    method test_failure_stats_csv (line 171) | def test_failure_stats_csv(self):
    method test_request_stats_with_errors (line 177) | def test_request_stats_with_errors(self):
    method test_reset_stats (line 190) | def test_reset_stats(self):
    method test_exceptions (line 213) | def test_exceptions(self):
    method test_exceptions_csv (line 228) | def test_exceptions_csv(self):
    method test_swarm_host_value_specified (line 249) | def test_swarm_host_value_specified(self):
    method test_swarm_userclass_specified (line 281) | def test_swarm_userclass_specified(self):
    method test_swarm_multiple_userclasses_specified (line 336) | def test_swarm_multiple_userclasses_specified(self):
    method test_swarm_updates_parsed_options_when_single_userclass_specified (line 377) | def test_swarm_updates_parsed_options_when_single_userclass_specified(...
    method test_swarm_updates_parsed_options_when_multiple_userclasses_specified (line 419) | def test_swarm_updates_parsed_options_when_multiple_userclasses_specif...
    method test_swarm_defaults_to_all_available_userclasses_when_userclass_picker_is_active_and_no_userclass_in_payload (line 461) | def test_swarm_defaults_to_all_available_userclasses_when_userclass_pi...
    method test_swarm_uses_pre_selected_user_classes_when_empty_payload_and_test_is_already_running_with_class_picker (line 499) | def test_swarm_uses_pre_selected_user_classes_when_empty_payload_and_t...
    method test_swarm_error_when_userclass_picker_is_active_but_no_available_userclasses (line 552) | def test_swarm_error_when_userclass_picker_is_active_but_no_available_...
    method test_swarm_shape_class_specified (line 568) | def test_swarm_shape_class_specified(self):
    method test_swarm_shape_class_defaults_to_none_when_userclass_picker_is_active (line 625) | def test_swarm_shape_class_defaults_to_none_when_userclass_picker_is_a...
    method test_swarm_shape_class_is_updated_when_userclass_picker_is_active (line 675) | def test_swarm_shape_class_is_updated_when_userclass_picker_is_active(...
    method test_swarm_userclass_shapeclass_ignored_when_userclass_picker_is_inactive (line 710) | def test_swarm_userclass_shapeclass_ignored_when_userclass_picker_is_i...
    method test_swarm_custom_arguments (line 761) | def test_swarm_custom_arguments(self):
    method test_swarm_override_command_line_argument (line 837) | def test_swarm_override_command_line_argument(self):
    method test_swarm_host_value_not_specified (line 863) | def test_swarm_host_value_not_specified(self):
    method test_swarm_run_time (line 881) | def test_swarm_run_time(self):
    method test_swarm_run_time_invalid_input (line 904) | def test_swarm_run_time_invalid_input(self):
    method test_swarm_run_time_empty_input (line 929) | def test_swarm_run_time_empty_input(self):
    method test_host_value_from_user_class (line 956) | def test_host_value_from_user_class(self):
    method test_host_value_from_multiple_user_classes (line 966) | def test_host_value_from_multiple_user_classes(self):
    method test_host_value_from_multiple_user_classes_different_hosts (line 979) | def test_host_value_from_multiple_user_classes_different_hosts(self):
    method test_report_page (line 991) | def test_report_page(self):
    method test_report_page_empty_stats (line 1003) | def test_report_page_empty_stats(self):
    method test_report_download (line 1007) | def test_report_download(self):
    method test_report_host (line 1017) | def test_report_host(self):
    method test_report_host2 (line 1027) | def test_report_host2(self):
    method test_report_exceptions (line 1045) | def test_report_exceptions(self):
    method test_html_stats_report (line 1067) | def test_html_stats_report(self):
    method test_logs (line 1080) | def test_logs(self):
    method test_worker_logs (line 1093) | def test_worker_logs(self):
    method test_template_args (line 1111) | def test_template_args(self):
    method test_update_user_endpoint (line 1137) | def test_update_user_endpoint(self):
  class TestWebUIAuth (line 1167) | class TestWebUIAuth(LocustTestCase):
    method setUp (line 1168) | def setUp(self):
    method tearDown (line 1180) | def tearDown(self):
    method test_index_with_web_login_enabled_valid_user (line 1185) | def test_index_with_web_login_enabled_valid_user(self):
    method test_index_with_web_login_enabled_no_user (line 1204) | def test_index_with_web_login_enabled_no_user(self):
  class TestWebUIWithTLS (line 1217) | class TestWebUIWithTLS(LocustTestCase):
    method setUp (line 1218) | def setUp(self):
    method tearDown (line 1243) | def tearDown(self):
    method test_index_with_https (line 1250) | def test_index_with_https(self):
  class TestWebUIFullHistory (line 1258) | class TestWebUIFullHistory(LocustTestCase, _HeaderCheckMixin):
    method setUp (line 1265) | def setUp(self):
    method tearDown (line 1285) | def tearDown(self):
    method remove_file_if_exists (line 1291) | def remove_file_if_exists(self, filename):
    method remove_files_if_exists (line 1295) | def remove_files_if_exists(self):
    method test_request_stats_full_history_csv (line 1301) | def test_request_stats_full_history_csv(self):

FILE: locust/test/test_zmqrpc.py
  class ZMQRPC_tests (line 10) | class ZMQRPC_tests(LocustTestCase):
    method setUp (line 11) | def setUp(self):
    method tearDown (line 16) | def tearDown(self):
    method test_constructor (line 21) | def test_constructor(self):
    method test_client_send (line 29) | def test_client_send(self):
    method test_client_recv (line 36) | def test_client_recv(self):
    method test_client_retry (line 46) | def test_client_retry(self):
    method test_rpc_error (line 52) | def test_rpc_error(self):

FILE: locust/test/testcases.py
  function ultra_fast (line 25) | def ultra_fast():
  function fast (line 30) | def fast():
  function slow (line 36) | def slow():
  function consistent (line 45) | def consistent():
  function request_method (line 51) | def request_method():
  function request_header_test (line 56) | def request_header_test():
  function manipulate (line 66) | def manipulate():
  function get_arg (line 71) | def get_arg():
  function failed_request (line 76) | def failed_request():
  function status_204 (line 81) | def status_204():
  function do_redirect (line 86) | def do_redirect():
  function basic_auth (line 94) | def basic_auth():
  function no_content_length (line 104) | def no_content_length():
  function not_found (line 115) | def not_found(error):
  function streaming_response (line 120) | def streaming_response(iterations):
  function set_cookie (line 134) | def set_cookie():
  function get_cookie (line 141) | def get_cookie():
  function rest (line 146) | def rest():
  function content_type_missing_charset (line 151) | def content_type_missing_charset():
  function content_type_regular (line 158) | def content_type_regular():
  function content_type_with_extra_stuff (line 165) | def content_type_with_extra_stuff():
  class LocustTestCase (line 171) | class LocustTestCase(unittest.TestCase):
    method setUp (line 177) | def setUp(self):
    method tearDown (line 206) | def tearDown(self):
  class WebserverTestCase (line 215) | class WebserverTestCase(LocustTestCase):
    method setUp (line 220) | def setUp(self):
    method tearDown (line 245) | def tearDown(self):

FILE: locust/test/util.py
  function temporary_file (line 24) | def temporary_file(content, suffix="_locustfile.py", dir=None):
  function patch_env (line 36) | def patch_env(name: str, value: str):
  function get_free_tcp_port (line 48) | def get_free_tcp_port():
  function create_tls_cert (line 60) | def create_tls_cert(hostname):
  function clear_all_functools_lru_cache (line 85) | def clear_all_functools_lru_cache() -> None:
  function get_locustfiles_from_args (line 97) | def get_locustfiles_from_args(*args, **kwargs):
  function wait_for_server (line 102) | def wait_for_server(url, timeout=5, interval=0.5):

FILE: locust/user/inspectuser.py
  function print_task_ratio (line 11) | def print_task_ratio(user_classes, num_users, total):
  function print_task_ratio_json (line 19) | def print_task_ratio_json(user_classes, num_users):
  function _calc_distribution (line 29) | def _calc_distribution(user_classes, num_users):
  function _print_task_ratio (line 44) | def _print_task_ratio(x, level=0):
  function get_ratio (line 53) | def get_ratio(user_classes: list[type[User]], user_spawned: dict[str, in...
  function _get_task_ratio (line 66) | def _get_task_ratio(tasks, total, parent_ratio):

FILE: locust/user/markov_taskset.py
  class NoMarkovTasksError (line 12) | class NoMarkovTasksError(LocustError):
  class InvalidTransitionError (line 18) | class InvalidTransitionError(LocustError):
  class NonMarkovTaskTransitionError (line 24) | class NonMarkovTaskTransitionError(LocustError):
  class MarkovTaskTagError (line 30) | class MarkovTaskTagError(LocustError):
  function is_markov_task (line 36) | def is_markov_task(task: MarkovTaskT):
  function transition (line 46) | def transition(func_name: str, weight: int = 1) -> Callable[[MarkovTaskT...
  function transitions (line 80) | def transitions(weights: dict[str, int] | list[tuple[str, int] | str]) -...
  function get_markov_tasks (line 124) | def get_markov_tasks(class_dict: dict) -> list:
  function to_weighted_list (line 137) | def to_weighted_list(transitions: dict):
  function validate_has_markov_tasks (line 141) | def validate_has_markov_tasks(tasks: list, classname: str):
  function validate_transitions (line 158) | def validate_transitions(tasks: list, class_dict: dict, classname: str):
  function validate_no_unreachable_tasks (line 186) | def validate_no_unreachable_tasks(tasks: list, class_dict: dict, classna...
  function validate_no_tags (line 217) | def validate_no_tags(task, classname: str):
  function validate_task_name (line 235) | def validate_task_name(decorated_func):
  function validate_markov_chain (line 258) | def validate_markov_chain(tasks: list, class_dict: dict, classname: str):
  class MarkovTaskSetMeta (line 275) | class MarkovTaskSetMeta(TaskSetMeta):
    method __new__ (line 281) | def __new__(mcs, classname, bases, class_dict):
  class MarkovTaskSet (line 294) | class MarkovTaskSet(TaskSet, metaclass=MarkovTaskSetMeta):
    method __init__ (line 307) | def __init__(self, *args, **kwargs):
    method get_next_task (line 310) | def get_next_task(self):

FILE: locust/user/sequential_taskset.py
  class SequentialTaskSetMeta (line 8) | class SequentialTaskSetMeta(TaskSetMeta):
    method __new__ (line 17) | def __new__(mcs, classname, bases, class_dict):
  class SequentialTaskSet (line 45) | class SequentialTaskSet(TaskSet, metaclass=SequentialTaskSetMeta):
    method __init__ (line 57) | def __init__(self, *args, **kwargs):
    method get_next_task (line 61) | def get_next_task(self):

FILE: locust/user/task.py
  class TaskHolder (line 41) | class TaskHolder(Protocol[TaskT]):
  function task (line 46) | def task(weight: TaskT) -> TaskT: ...
  function task (line 50) | def task(weight: int) -> Callable[[TaskT], TaskT]: ...
  function task (line 53) | def task(weight: TaskT | int = 1) -> TaskT | Callable[[TaskT], TaskT]:
  function tag (line 105) | def tag(*tags: str) -> Callable[[TaskT], TaskT]:
  function get_tasks_from_base_classes (line 144) | def get_tasks_from_base_classes(bases, class_dict):
  function is_markov_taskset (line 175) | def is_markov_taskset(task: type):
  function filter_tasks_by_tags (line 186) | def filter_tasks_by_tags(
  class TaskSetMeta (line 229) | class TaskSetMeta(type):
    method __new__ (line 235) | def __new__(mcs, classname, bases, class_dict):
  class TaskSet (line 240) | class TaskSet(metaclass=TaskSetMeta):
    method __init__ (line 301) | def __init__(self, parent: User) -> None:
    method user (line 323) | def user(self) -> User:
    method parent (line 328) | def parent(self):
    method on_start (line 332) | def on_start(self) -> None:
    method on_stop (line 338) | def on_stop(self):
    method run (line 346) | def run(self):
    method execute_next_task (line 395) | def execute_next_task(self):
    method execute_task (line 398) | def execute_task(self, task):
    method schedule_task (line 410) | def schedule_task(self, task_callable, first=False):
    method get_next_task (line 422) | def get_next_task(self):
    method wait_time (line 433) | def wait_time(self):
    method wait (line 452) | def wait(self):
    method _sleep (line 470) | def _sleep(self, seconds):
    method interrupt (line 473) | def interrupt(self, reschedule=True):
    method client (line 483) | def client(self):
  class DefaultTaskSet (line 490) | class DefaultTaskSet(TaskSet):
    method get_next_task (line 496) | def get_next_task(self):
    method execute_task (line 507) | def execute_task(self, task):

FILE: locust/user/users.py
  class UserMeta (line 40) | class UserMeta(type):
    method __new__ (line 46) | def __new__(mcs, classname, bases, class_dict):
  class User (line 60) | class User(metaclass=UserMeta):
    method __init__ (line 131) | def __init__(self, environment) -> None:
    method on_start (line 142) | def on_start(self) -> None:
    method on_stop (line 148) | def on_stop(self):
    method run (line 155) | def run(self):
    method wait (line 172) | def wait(self):
    method start (line 184) | def start(self, group: Group):
    method stop (line 205) | def stop(self, force: bool = False):
    method group (line 224) | def group(self):
    method greenlet (line 228) | def greenlet(self):
    method context (line 231) | def context(self) -> dict:
    method json (line 239) | def json(cls):
    method fullname (line 248) | def fullname(cls) -> str:
  class HttpUser (line 253) | class HttpUser(User):
    method __init__ (line 271) | def __init__(self, *args, **kwargs):
  class PytestUser (line 291) | class PytestUser(User):
    method run (line 297) | def run(self):  # type: ignore[override] # We actually DO want to chan...

FILE: locust/user/wait_time.py
  function between (line 10) | def between(min_wait: float, max_wait: float) -> Callable[["User"], float]:
  function constant (line 23) | def constant(wait_time: float) -> Callable[["User"], float]:
  function constant_pacing (line 35) | def constant_pacing(wait_time: float) -> Callable[["User"], float]:
  function constant_throughput (line 63) | def constant_throughput(task_runs_per_second: float) -> Callable[["User"...

FILE: locust/util/cache.py
  function memoize (line 5) | def memoize(timeout, dynamic_timeout=False):

FILE: locust/util/date.py
  function format_utc_timestamp (line 4) | def format_utc_timestamp(unix_timestamp):
  function format_safe_timestamp (line 8) | def format_safe_timestamp(unix_timestamp):
  function format_duration (line 12) | def format_duration(start_time, end_time):

FILE: locust/util/deprecation.py
  function check_for_deprecated_task_set_attribute (line 7) | def check_for_deprecated_task_set_attribute(class_dict):
  function deprecated_locust_meta_class (line 20) | def deprecated_locust_meta_class(deprecation_message):
  class DeprecatedLocustClass (line 32) | class DeprecatedLocustClass(
  class DeprecatedHttpLocustClass (line 41) | class DeprecatedHttpLocustClass(
  class DeprecatedFastHttpLocustClass (line 50) | class DeprecatedFastHttpLocustClass(

FILE: locust/util/directory.py
  function get_abspaths_in (line 4) | def get_abspaths_in(path, extension=None):

FILE: locust/util/exception_handler.py
  function retry (line 7) | def retry(delays=(1, 3, 5), exception=Exception):

FILE: locust/util/load_locustfile.py
  function is_user_class (line 14) | def is_user_class(item) -> bool:
  function is_shape_class (line 21) | def is_shape_class(item) -> bool:
  function load_locustfile (line 28) | def load_locustfile(path) -> tuple[dict[str, type[User]], list[LoadTestS...
  function load_locustfile_pytest (line 88) | def load_locustfile_pytest(path) -> dict[str, type[User]]:

FILE: locust/util/rounding.py
  function proper_round (line 1) | def proper_round(val, digits=0):

FILE: locust/util/timespan.py
  function parse_timespan (line 5) | def parse_timespan(time_str) -> int:

FILE: locust/util/url.py
  function is_url (line 4) | def is_url(url: str) -> bool:

FILE: locust/web.py
  class InputField (line 56) | class InputField(TypedDict, total=False):
  class CustomForm (line 67) | class CustomForm(TypedDict, total=False):
  class AuthProvider (line 73) | class AuthProvider(TypedDict, total=False):
  class AuthArgs (line 79) | class AuthArgs(TypedDict, total=False):
  class WebUI (line 87) | class WebUI:
    method __init__ (line 121) | def __init__(
    method login_manager (line 601) | def login_manager(self):
    method login_manager (line 608) | def login_manager(self, value):
    method start (line 611) | def start(self):
    method start_server (line 615) | def start_server(self):
    method stop (line 634) | def stop(self):
    method auth_required_if_enabled (line 640) | def auth_required_if_enabled(self, view_func):
    method update_template_args (line 666) | def update_template_args(self):
    method _update_shape_class (line 759) | def _update_shape_class(self, shape_class_name):
    method _update_user_classes (line 770) | def _update_user_classes(self, user_classes):
    method _stop_runners (line 780) | def _stop_runners(self):

FILE: locust/webui/.yarn/releases/yarn-4.12.0.cjs
  function Cc (line 4) | function Cc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}
  function NGe (line 4) | function NGe(t){return Cc("EBUSY",t)}
  function OGe (line 4) | function OGe(t,e){return Cc("ENOSYS",`${t}, ${e}`)}
  function LGe (line 4) | function LGe(t){return Cc("EINVAL",`invalid argument, ${t}`)}
  function Mo (line 4) | function Mo(t){return Cc("EBADF",`bad file descriptor, ${t}`)}
  function MGe (line 4) | function MGe(t){return Cc("ENOENT",`no such file or directory, ${t}`)}
  function UGe (line 4) | function UGe(t){return Cc("ENOTDIR",`not a directory, ${t}`)}
  function _Ge (line 4) | function _Ge(t){return Cc("EISDIR",`illegal operation on a directory, ${...
  function HGe (line 4) | function HGe(t){return Cc("EEXIST",`file already exists, ${t}`)}
  function jGe (line 4) | function jGe(t){return Cc("EROFS",`read-only filesystem, ${t}`)}
  function GGe (line 4) | function GGe(t){return Cc("ENOTEMPTY",`directory not empty, ${t}`)}
  function qGe (line 4) | function qGe(t){return Cc("EOPNOTSUPP",`operation not supported, ${t}`)}
  function yU (line 4) | function yU(){return Cc("ERR_DIR_CLOSED","Directory handle was closed")}
  function VZ (line 4) | function VZ(){return new nE}
  function WGe (line 4) | function WGe(){return XP(VZ())}
  function XP (line 4) | function XP(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r...
  function YGe (line 4) | function YGe(t){let e=new iE;for(let r in t)if(Object.hasOwn(t,r)){let s...
  function wU (line 4) | function wU(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs...
  method constructor (line 4) | constructor(){this.name="";this.path="";this.mode=0}
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atim...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&61440)===16384}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&61440)===32768}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&61440)===40960}
  method constructor (line 4) | constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);...
  method isBlockDevice (line 4) | isBlockDevice(){return!1}
  method isCharacterDevice (line 4) | isCharacterDevice(){return!1}
  method isDirectory (line 4) | isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}
  method isFIFO (line 4) | isFIFO(){return!1}
  method isFile (line 4) | isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}
  method isSocket (line 4) | isSocket(){return!1}
  method isSymbolicLink (line 4) | isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}
  function XGe (line 4) | function XGe(t){let e,r;if(e=t.match(KGe))t=e[1];else if(r=t.match(zGe))...
  function ZGe (line 4) | function ZGe(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(VGe))?t=...
  function ZP (line 4) | function ZP(t,e){return t===fe?KZ(e):vU(e)}
  function $P (line 4) | async function $P(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.i...
  function zZ (line 4) | async function zZ(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtil...
  function SU (line 4) | async function SU(t,e,r,s,a,n,c){let f=c.didParentExist?await XZ(r,s):nu...
  function XZ (line 4) | async function XZ(t,e){try{return await t.lstatPromise(e)}catch{return n...
  function e5e (line 4) | async function e5e(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p...
  function t5e (line 4) | async function t5e(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromis...
  function r5e (line 4) | async function r5e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(...
  function n5e (line 4) | async function n5e(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type==="Har...
  function i5e (line 4) | async function i5e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(...
  function ex (line 4) | function ex(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return n...
  method constructor (line 4) | constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.clo...
  method throwIfClosed (line 4) | throwIfClosed(){if(this.closed)throw yU()}
  method [Symbol.asyncIterator] (line 4) | async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==nu...
  method read (line 4) | read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.reso...
  method readSync (line 4) | readSync(){return this.throwIfClosed(),this.nextDirent()}
  method close (line 4) | close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}
  method closeSync (line 4) | closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}
  function $Z (line 4) | function $Z(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: e...
  method constructor (line 4) | constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.chang...
  method create (line 4) | static create(r,s,a){let n=new t(r,s,a);return n.start(),n}
  method start (line 4) | start(){$Z(this.status,"ready"),this.status="running",this.startTimeout=...
  method stop (line 4) | stop(){$Z(this.status,"running"),this.status="stopped",this.startTimeout...
  method stat (line 4) | stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}c...
  method makeInterval (line 4) | makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStat...
  method registerChangeListener (line 4) | registerChangeListener(r,s){this.addListener("change",r),this.changeList...
  method unregisterChangeListener (line 4) | unregisterChangeListener(r){this.removeListener("change",r);let s=this.c...
  method unregisterAllChangeListeners (line 4) | unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())...
  method hasChangeListeners (line 4) | hasChangeListeners(){return this.changeListeners.size>0}
  method ref (line 4) | ref(){for(let r of this.changeListeners.values())r.ref();return this}
  method unref (line 4) | unref(){for(let r of this.changeListeners.values())r.unref();return this}
  function sE (line 4) | function sE(t,e,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=...
  function md (line 4) | function md(t,e,r){let s=rx.get(t);if(typeof s>"u")return;let a=s.get(e)...
  function yd (line 4) | function yd(t){let e=rx.get(t);if(!(typeof e>"u"))for(let r of e.keys())...
  function s5e (line 4) | function s5e(t){let e=t.match(/\r?\n/g);if(e===null)return n$.EOL;let r=...
  function Ed (line 7) | function Ed(t,e){return e.replace(/\r?\n/g,s5e(t))}
  method constructor (line 7) | constructor(e){this.pathUtils=e}
  method genTraversePromise (line 7) | async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length...
  method checksumFilePromise (line 7) | async checksumFilePromise(e,{algorithm:r="sha512"}={}){let s=await this....
  method removePromise (line 7) | async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=aw...
  method removeSync (line 7) | removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a)...
  method mkdirpPromise (line 7) | async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===th...
  method mkdirpSync (line 7) | mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUt...
  method copyPromise (line 7) | async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stab...
  method copySync (line 7) | copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=t...
  method changeFilePromise (line 7) | async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeF...
  method changeFileBufferPromise (line 7) | async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try...
  method changeFileTextPromise (line 7) | async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n="...
  method changeFileSync (line 7) | changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBuffer...
  method changeFileBufferSync (line 7) | changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.r...
  method changeFileTextSync (line 7) | changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{...
  method movePromise (line 7) | async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.c...
  method moveSync (line 7) | moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code==="EXDEV")this...
  method lockPromise (line 7) | async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f...
  method readJsonPromise (line 7) | async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{...
  method readJsonSync (line 7) | readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(...
  method writeJsonPromise (line 7) | async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await t...
  method writeJsonSync (line 8) | writeJsonSync(e,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSy...
  method preserveTimePromise (line 9) | async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await ...
  method preserveTimeSync (line 9) | async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<"u"&&...
  method constructor (line 9) | constructor(){super(J)}
  method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
  method resolve (line 9) | resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}
  method getRealPath (line 9) | getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}
  method openPromise (line 9) | async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e...
  method openSync (line 9) | openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}
  method opendirPromise (line 9) | async opendirPromise(e,r){return Object.assign(await this.baseFs.opendir...
  method opendirSync (line 9) | opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapTo...
  method readPromise (line 9) | async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,...
  method readSync (line 9) | readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}
  method writePromise (line 9) | async writePromise(e,r,s,a,n){return typeof r=="string"?await this.baseF...
  method writeSync (line 9) | writeSync(e,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r...
  method closePromise (line 9) | async closePromise(e){return this.baseFs.closePromise(e)}
  method closeSync (line 9) | closeSync(e){this.baseFs.closeSync(e)}
  method createReadStream (line 9) | createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this....
  method createWriteStream (line 9) | createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?thi...
  method realpathPromise (line 9) | async realpathPromise(e){return this.mapFromBase(await this.baseFs.realp...
  method realpathSync (line 9) | realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.ma...
  method existsPromise (line 9) | async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}
  method existsSync (line 9) | existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}
  method accessSync (line 9) | accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}
  method accessPromise (line 9) | async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase...
  method statPromise (line 9) | async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}
  method statSync (line 9) | statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}
  method fstatPromise (line 9) | async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}
  method fstatSync (line 9) | fstatSync(e,r){return this.baseFs.fstatSync(e,r)}
  method lstatPromise (line 9) | lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}
  method lstatSync (line 9) | lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}
  method fchmodPromise (line 9) | async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}
  method fchmodSync (line 9) | fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}
  method chmodPromise (line 9) | async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e...
  method chmodSync (line 9) | chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}
  method fchownPromise (line 9) | async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}
  method fchownSync (line 9) | fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}
  method chownPromise (line 9) | async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase...
  method chownSync (line 9) | chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}
  method renamePromise (line 9) | async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase...
  method renameSync (line 9) | renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.map...
  method copyFilePromise (line 9) | async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.m...
  method copyFileSync (line 9) | copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),...
  method appendFilePromise (line 9) | async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this...
  method appendFileSync (line 9) | appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase...
  method writeFilePromise (line 9) | async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.f...
  method writeFileSync (line 9) | writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e...
  method unlinkPromise (line 9) | async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}
  method unlinkSync (line 9) | unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}
  method utimesPromise (line 9) | async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBa...
  method utimesSync (line 9) | utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}
  method lutimesPromise (line 9) | async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapTo...
  method lutimesSync (line 9) | lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}
  method mkdirPromise (line 9) | async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e...
  method mkdirSync (line 9) | mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}
  method rmdirPromise (line 9) | async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e...
  method rmdirSync (line 9) | rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}
  method rmPromise (line 9) | async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}
  method rmSync (line 9) | rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}
  method linkPromise (line 9) | async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),...
  method linkSync (line 9) | linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBa...
  method symlinkPromise (line 9) | async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.is...
  method symlinkSync (line 9) | symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(...
  method readFilePromise (line 9) | async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMap...
  method readFileSync (line 9) | readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}
  method readdirPromise (line 9) | readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}
  method readdirSync (line 9) | readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}
  method readlinkPromise (line 9) | async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readl...
  method readlinkSync (line 9) | readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.ma...
  method truncatePromise (line 9) | async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapTo...
  method truncateSync (line 9) | truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}
  method ftruncateSync (line 9) | ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}
  method watch (line 9) | watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}
  method watchFile (line 9) | watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}
  method unwatchFile (line 9) | unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}
  method fsMapToBase (line 9) | fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}
  method constructor (line 9) | constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}
  method getRealPath (line 9) | getRealPath(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){return e}
  function s$ (line 9) | function s$(t){let e=t;return typeof t.path=="string"&&(e.path=fe.toPort...
  method constructor (line 9) | constructor(e=o$.default){super(),this.realFs=e}
  method getExtractHint (line 9) | getExtractHint(){return!1}
  method getRealPath (line 9) | getRealPath(){return vt.root}
  method resolve (line 9) | resolve(e){return J.resolve(e)}
  method openPromise (line 9) | async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.op...
  method openSync (line 9) | openSync(e,r,s){return this.realFs.openSync(fe.fromPortablePath(e),r,s)}
  method opendirPromise (line 9) | async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<"u"?...
  method opendirSync (line 9) | opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(fe.fromPorta...
  method readPromise (line 9) | async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{thi...
  method readSync (line 9) | readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}
  method writePromise (line 9) | async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r==...
  method writeSync (line 9) | writeSync(e,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(e,r...
  method closePromise (line 9) | async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this...
  method closeSync (line 9) | closeSync(e){this.realFs.closeSync(e)}
  method createReadStream (line 9) | createReadStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return thi...
  method createWriteStream (line 9) | createWriteStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return th...
  method realpathPromise (line 9) | async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.re...
  method realpathSync (line 9) | realpathSync(e){return fe.toPortablePath(this.realFs.realpathSync(fe.fro...
  method existsPromise (line 9) | async existsPromise(e){return await new Promise(r=>{this.realFs.exists(f...
  method accessSync (line 9) | accessSync(e,r){return this.realFs.accessSync(fe.fromPortablePath(e),r)}
  method accessPromise (line 9) | async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.ac...
  method existsSync (line 9) | existsSync(e){return this.realFs.existsSync(fe.fromPortablePath(e))}
  method statPromise (line 9) | async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.st...
  method statSync (line 9) | statSync(e,r){return r?this.realFs.statSync(fe.fromPortablePath(e),r):th...
  method fstatPromise (line 9) | async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.f...
  method fstatSync (line 9) | fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync...
  method lstatPromise (line 9) | async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.l...
  method lstatSync (line 9) | lstatSync(e,r){return r?this.realFs.lstatSync(fe.fromPortablePath(e),r):...
  method fchmodPromise (line 9) | async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fc...
  method fchmodSync (line 9) | fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}
  method chmodPromise (line 9) | async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chm...
  method chmodSync (line 9) | chmodSync(e,r){return this.realFs.chmodSync(fe.fromPortablePath(e),r)}
  method fchownPromise (line 9) | async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs....
  method fchownSync (line 9) | fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}
  method chownPromise (line 9) | async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.c...
  method chownSync (line 9) | chownSync(e,r,s){return this.realFs.chownSync(fe.fromPortablePath(e),r,s)}
  method renamePromise (line 9) | async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.re...
  method renameSync (line 9) | renameSync(e,r){return this.realFs.renameSync(fe.fromPortablePath(e),fe....
  method copyFilePromise (line 9) | async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.rea...
  method copyFileSync (line 9) | copyFileSync(e,r,s=0){return this.realFs.copyFileSync(fe.fromPortablePat...
  method appendFilePromise (line 9) | async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=ty...
  method appendFileSync (line 9) | appendFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;...
  method writeFilePromise (line 9) | async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typ...
  method writeFileSync (line 9) | writeFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;s...
  method unlinkPromise (line 9) | async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unli...
  method unlinkSync (line 9) | unlinkSync(e){return this.realFs.unlinkSync(fe.fromPortablePath(e))}
  method utimesPromise (line 9) | async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs....
  method utimesSync (line 9) | utimesSync(e,r,s){this.realFs.utimesSync(fe.fromPortablePath(e),r,s)}
  method lutimesPromise (line 9) | async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs...
  method lutimesSync (line 9) | lutimesSync(e,r,s){this.realFs.lutimesSync(fe.fromPortablePath(e),r,s)}
  method mkdirPromise (line 9) | async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkd...
  method mkdirSync (line 9) | mkdirSync(e,r){return this.realFs.mkdirSync(fe.fromPortablePath(e),r)}
  method rmdirPromise (line 9) | async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.r...
  method rmdirSync (line 9) | rmdirSync(e,r){return this.realFs.rmdirSync(fe.fromPortablePath(e),r)}
  method rmPromise (line 9) | async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(f...
  method rmSync (line 9) | rmSync(e,r){return this.realFs.rmSync(fe.fromPortablePath(e),r)}
  method linkPromise (line 9) | async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link...
  method linkSync (line 9) | linkSync(e,r){return this.realFs.linkSync(fe.fromPortablePath(e),fe.from...
  method symlinkPromise (line 9) | async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs...
  method symlinkSync (line 9) | symlinkSync(e,r,s){return this.realFs.symlinkSync(fe.fromPortablePath(e....
  method readFilePromise (line 9) | async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof...
  method readFileSync (line 9) | readFileSync(e,r){let s=typeof e=="string"?fe.fromPortablePath(e):e;retu...
  method readdirPromise (line 9) | async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive...
  method readdirSync (line 9) | readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.with...
  method readlinkPromise (line 9) | async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.re...
  method readlinkSync (line 9) | readlinkSync(e){return fe.toPortablePath(this.realFs.readlinkSync(fe.fro...
  method truncatePromise (line 9) | async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs....
  method truncateSync (line 9) | truncateSync(e,r){return this.realFs.truncateSync(fe.fromPortablePath(e)...
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs...
  method ftruncateSync (line 9) | ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}
  method watch (line 9) | watch(e,r,s){return this.realFs.watch(fe.fromPortablePath(e),r,s)}
  method watchFile (line 9) | watchFile(e,r,s){return this.realFs.watchFile(fe.fromPortablePath(e),r,s)}
  method unwatchFile (line 9) | unwatchFile(e,r){return this.realFs.unwatchFile(fe.fromPortablePath(e),r)}
  method makeCallback (line 9) | makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}
  method constructor (line 9) | constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method resolve (line 9) | resolve(e){return this.pathUtils.isAbsolute(e)?J.normalize(e):this.baseF...
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(t...
  method constructor (line 9) | constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils....
  method getRealPath (line 9) | getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),th...
  method getTarget (line 9) | getTarget(){return this.target}
  method getBaseFs (line 9) | getBaseFs(){return this.baseFs}
  method mapToBase (line 9) | mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsol...
  method mapFromBase (line 9) | mapFromBase(e){return this.pathUtils.resolve(l$,this.pathUtils.relative(...
  method constructor (line 9) | constructor(r,s){super(s);this.instance=null;this.factory=r}
  method baseFs (line 9) | get baseFs(){return this.instance||(this.instance=this.factory()),this.i...
  method baseFs (line 9) | set baseFs(r){this.instance=r}
  method mapFromBase (line 9) | mapFromBase(r){return r}
  method mapToBase (line 9) | mapToBase(r){return r}
  method constructor (line 9) | constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n...
  method getExtractHint (line 9) | getExtractHint(r){return this.baseFs.getExtractHint(r)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method saveAndClose (line 9) | saveAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of ...
  method discardAndClose (line 9) | discardAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]...
  method resolve (line 9) | resolve(r){return this.baseFs.resolve(r)}
  method remapFd (line 9) | remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s...
  method openPromise (line 9) | async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>aw...
  method openSync (line 9) | openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,...
  method opendirPromise (line 9) | async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>a...
  method opendirSync (line 9) | opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(...
  method readPromise (line 9) | async readPromise(r,s,a,n,c){if((r&tl)!==this.magic)return await this.ba...
  method readSync (line 9) | readSync(r,s,a,n,c){if((r&tl)!==this.magic)return this.baseFs.readSync(r...
  method writePromise (line 9) | async writePromise(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="s...
  method writeSync (line 9) | writeSync(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="string"?th...
  method closePromise (line 9) | async closePromise(r){if((r&tl)!==this.magic)return await this.baseFs.cl...
  method closeSync (line 9) | closeSync(r){if((r&tl)!==this.magic)return this.baseFs.closeSync(r);let ...
  method createReadStream (line 9) | createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):...
  method createWriteStream (line 9) | createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s...
  method realpathPromise (line 9) | async realpathPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method realpathSync (line 9) | realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(...
  method existsPromise (line 9) | async existsPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method existsSync (line 9) | existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(...
  method accessPromise (line 9) | async accessPromise(r,s){return await this.makeCallPromise(r,async()=>aw...
  method accessSync (line 9) | accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,...
  method statPromise (line 9) | async statPromise(r,s){return await this.makeCallPromise(r,async()=>awai...
  method statSync (line 9) | statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(...
  method fstatPromise (line 9) | async fstatPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatP...
  method fstatSync (line 9) | fstatSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatSync(r,s);...
  method lstatPromise (line 9) | async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
  method lstatSync (line 9) | lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s)...
  method fchmodPromise (line 9) | async fchmodPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmo...
  method fchmodSync (line 9) | fchmodSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodSync(r,s...
  method chmodPromise (line 9) | async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
  method chmodSync (line 9) | chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s)...
  method fchownPromise (line 9) | async fchownPromise(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fch...
  method fchownSync (line 9) | fchownSync(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownSync(r...
  method chownPromise (line 9) | async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>a...
  method chownSync (line 9) | chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,...
  method renamePromise (line 9) | async renamePromise(r,s){return await this.makeCallPromise(r,async()=>aw...
  method renameSync (line 9) | renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>t...
  method copyFilePromise (line 9) | async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&wd.constants....
  method copyFileSync (line 9) | copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLO...
  method appendFilePromise (line 9) | async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async...
  method appendFileSync (line 9) | appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendF...
  method writeFilePromise (line 9) | async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async(...
  method writeFileSync (line 9) | writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFil...
  method unlinkPromise (line 9) | async unlinkPromise(r){return await this.makeCallPromise(r,async()=>awai...
  method unlinkSync (line 9) | unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(...
  method utimesPromise (line 9) | async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>...
  method utimesSync (line 9) | utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(...
  method lutimesPromise (line 9) | async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=...
  method lutimesSync (line 9) | lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSyn...
  method mkdirPromise (line 9) | async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
  method mkdirSync (line 9) | mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s)...
  method rmdirPromise (line 9) | async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>awa...
  method rmdirSync (line 9) | rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s)...
  method rmPromise (line 9) | async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await ...
  method rmSync (line 9) | rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{s...
  method linkPromise (line 9) | async linkPromise(r,s){return await this.makeCallPromise(s,async()=>awai...
  method linkSync (line 9) | linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(...
  method symlinkPromise (line 9) | async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=...
  method symlinkSync (line 9) | symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSyn...
  method readFilePromise (line 9) | async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await ...
  method readFileSync (line 9) | readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSyn...
  method readdirPromise (line 9) | async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>a...
  method readdirSync (line 9) | readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(...
  method readlinkPromise (line 9) | async readlinkPromise(r){return await this.makeCallPromise(r,async()=>aw...
  method readlinkSync (line 9) | readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(...
  method truncatePromise (line 9) | async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>...
  method truncateSync (line 9) | truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSyn...
  method ftruncatePromise (line 9) | async ftruncatePromise(r,s){if((r&tl)!==this.magic)return this.baseFs.ft...
  method ftruncateSync (line 9) | ftruncateSync(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncateSy...
  method watch (line 9) | watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,...
  method watchFile (line 9) | watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,...
  method unwatchFile (line 9) | unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(...
  method makeCallPromise (line 9) | async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="stri...
  method makeCallSync (line 9) | makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")retur...
  method findMount (line 9) | findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";f...
  method limitOpenFiles (line 9) | limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),...
  method getMountPromise (line 9) | async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInsta...
  method getMountSync (line 9) | getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(...
  method constructor (line 9) | constructor(){super(J)}
  method getExtractHint (line 9) | getExtractHint(){throw er()}
  method getRealPath (line 9) | getRealPath(){throw er()}
  method resolve (line 9) | resolve(){throw er()}
  method openPromise (line 9) | async openPromise(){throw er()}
  method openSync (line 9) | openSync(){throw er()}
  method opendirPromise (line 9) | async opendirPromise(){throw er()}
  method opendirSync (line 9) | opendirSync(){throw er()}
  method readPromise (line 9) | async readPromise(){throw er()}
  method readSync (line 9) | readSync(){throw er()}
  method writePromise (line 9) | async writePromise(){throw er()}
  method writeSync (line 9) | writeSync(){throw er()}
  method closePromise (line 9) | async closePromise(){throw er()}
  method closeSync (line 9) | closeSync(){throw er()}
  method createWriteStream (line 9) | createWriteStream(){throw er()}
  method createReadStream (line 9) | createReadStream(){throw er()}
  method realpathPromise (line 9) | async realpathPromise(){throw er()}
  method realpathSync (line 9) | realpathSync(){throw er()}
  method readdirPromise (line 9) | async readdirPromise(){throw er()}
  method readdirSync (line 9) | readdirSync(){throw er()}
  method existsPromise (line 9) | async existsPromise(e){throw er()}
  method existsSync (line 9) | existsSync(e){throw er()}
  method accessPromise (line 9) | async accessPromise(){throw er()}
  method accessSync (line 9) | accessSync(){throw er()}
  method statPromise (line 9) | async statPromise(){throw er()}
  method statSync (line 9) | statSync(){throw er()}
  method fstatPromise (line 9) | async fstatPromise(e){throw er()}
  method fstatSync (line 9) | fstatSync(e){throw er()}
  method lstatPromise (line 9) | async lstatPromise(e){throw er()}
  method lstatSync (line 9) | lstatSync(e){throw er()}
  method fchmodPromise (line 9) | async fchmodPromise(){throw er()}
  method fchmodSync (line 9) | fchmodSync(){throw er()}
  method chmodPromise (line 9) | async chmodPromise(){throw er()}
  method chmodSync (line 9) | chmodSync(){throw er()}
  method fchownPromise (line 9) | async fchownPromise(){throw er()}
  method fchownSync (line 9) | fchownSync(){throw er()}
  method chownPromise (line 9) | async chownPromise(){throw er()}
  method chownSync (line 9) | chownSync(){throw er()}
  method mkdirPromise (line 9) | async mkdirPromise(){throw er()}
  method mkdirSync (line 9) | mkdirSync(){throw er()}
  method rmdirPromise (line 9) | async rmdirPromise(){throw er()}
  method rmdirSync (line 9) | rmdirSync(){throw er()}
  method rmPromise (line 9) | async rmPromise(){throw er()}
  method rmSync (line 9) | rmSync(){throw er()}
  method linkPromise (line 9) | async linkPromise(){throw er()}
  method linkSync (line 9) | linkSync(){throw er()}
  method symlinkPromise (line 9) | async symlinkPromise(){throw er()}
  method symlinkSync (line 9) | symlinkSync(){throw er()}
  method renamePromise (line 9) | async renamePromise(){throw er()}
  method renameSync (line 9) | renameSync(){throw er()}
  method copyFilePromise (line 9) | async copyFilePromise(){throw er()}
  method copyFileSync (line 9) | copyFileSync(){throw er()}
  method appendFilePromise (line 9) | async appendFilePromise(){throw er()}
  method appendFileSync (line 9) | appendFileSync(){throw er()}
  method writeFilePromise (line 9) | async writeFilePromise(){throw er()}
  method writeFileSync (line 9) | writeFileSync(){throw er()}
  method unlinkPromise (line 9) | async unlinkPromise(){throw er()}
  method unlinkSync (line 9) | unlinkSync(){throw er()}
  method utimesPromise (line 9) | async utimesPromise(){throw er()}
  method utimesSync (line 9) | utimesSync(){throw er()}
  method lutimesPromise (line 9) | async lutimesPromise(){throw er()}
  method lutimesSync (line 9) | lutimesSync(){throw er()}
  method readFilePromise (line 9) | async readFilePromise(){throw er()}
  method readFileSync (line 9) | readFileSync(){throw er()}
  method readlinkPromise (line 9) | async readlinkPromise(){throw er()}
  method readlinkSync (line 9) | readlinkSync(){throw er()}
  method truncatePromise (line 9) | async truncatePromise(){throw er()}
  method truncateSync (line 9) | truncateSync(){throw er()}
  method ftruncatePromise (line 9) | async ftruncatePromise(e,r){throw er()}
  method ftruncateSync (line 9) | ftruncateSync(e,r){throw er()}
  method watch (line 9) | watch(){throw er()}
  method watchFile (line 9) | watchFile(){throw er()}
  method unwatchFile (line 9) | unwatchFile(){throw er()}
  method constructor (line 9) | constructor(e){super(fe),this.baseFs=e}
  method mapFromBase (line 9) | mapFromBase(e){return fe.fromPortablePath(e)}
  method mapToBase (line 9) | mapToBase(e){return fe.toPortablePath(e)}
  method makeVirtualPath (line 9) | static makeVirtualPath(e,r,s){if(J.basename(e)!=="__virtual__")throw new...
  method resolveVirtual (line 9) | static resolveVirtual(e){let r=e.match(PU);if(!r||!r[3]&&r[5])return e;l...
  method constructor (line 9) | constructor({baseFs:e=new Yn}={}){super(J),this.baseFs=e}
  method getExtractHint (line 9) | getExtractHint(e){return this.baseFs.getExtractHint(e)}
  method getRealPath (line 9) | getRealPath(){return this.baseFs.getRealPath()}
  method realpathSync (line 9) | realpathSync(e){let r=e.match(PU);if(!r)return this.baseFs.realpathSync(...
  method realpathPromise (line 9) | async realpathPromise(e){let r=e.match(PU);if(!r)return await this.baseF...
  method mapToBase (line 9) | mapToBase(e){if(e==="")return e;if(this.pathUtils.isAbsolute(e))return t...
  method mapFromBase (line 9) | mapFromBase(e){return e}
  function l5e (line 9) | function l5e(t,e){return typeof xU.default.isUtf8<"u"?xU.default.isUtf8(...
  method constructor (line 9) | constructor(e){super(fe),this.baseFs=e}
  method mapFromBase (line 9) | mapFromBase(e){return e}
  method mapToBase (line 9) | mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0...
  method constructor (line 9) | constructor(e,r){this[C$]=1;this[I$]=void 0;this[E$]=void 0;this[y$]=voi...
  method fd (line 9) | get fd(){return this[Ep]}
  method appendFile (line 9) | async appendFile(e,r){try{this[Ru](this.appendFile);let s=(typeof r=="st...
  method chown (line 9) | async chown(e,r){try{return this[Ru](this.chown),await this[Uo].fchownPr...
  method chmod (line 9) | async chmod(e){try{return this[Ru](this.chmod),await this[Uo].fchmodProm...
  method createReadStream (line 9) | createReadStream(e){return this[Uo].createReadStream(null,{...e,fd:this....
  method createWriteStream (line 9) | createWriteStream(e){return this[Uo].createWriteStream(null,{...e,fd:thi...
  method datasync (line 9) | datasync(){throw new Error("Method not implemented.")}
  method sync (line 9) | sync(){throw new Error("Method not implemented.")}
  method read (line 9) | async read(e,r,s,a){try{this[Ru](this.read);let n,c;return ArrayBuffer.i...
  method readFile (line 9) | async readFile(e){try{this[Ru](this.readFile);let r=(typeof e=="string"?...
  method readLines (line 9) | readLines(e){return(0,w$.createInterface)({input:this.createReadStream(e...
  method stat (line 9) | async stat(e){try{return this[Ru](this.stat),await this[Uo].fstatPromise...
  method truncate (line 9) | async truncate(e){try{return this[Ru](this.truncate),await this[Uo].ftru...
  method utimes (line 9) | utimes(e,r){throw new Error("Method not implemented.")}
  method writeFile (line 9) | async writeFile(e,r){try{this[Ru](this.writeFile);let s=(typeof r=="stri...
  method write (line 9) | async write(...e){try{if(this[Ru](this.write),ArrayBuffer.isView(e[0])){...
  method writev (line 9) | async writev(e,r){try{this[Ru](this.writev);let s=0;if(typeof r<"u")for(...
  method readv (line 9) | readv(e,r){throw new Error("Method not implemented.")}
  method close (line 9) | close(){if(this[Ep]===-1)return Promise.resolve();if(this[r0])return thi...
  method [(Uo,Ep,C$=aE,I$=r0,E$=sx,y$=ox,Ru)] (line 9) | [(Uo,Ep,C$=aE,I$=r0,E$=sx,y$=ox,Ru)](e){if(this[Ep]===-1){let r=new Erro...
  method [Fu] (line 9) | [Fu](){if(this[aE]--,this[aE]===0){let e=this[Ep];this[Ep]=-1,this[Uo].c...
  function U2 (line 9) | function U2(t,e){e=new ix(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?...
  function ax (line 9) | function ax(t,e){let r=Object.create(t);return U2(r,e),r}
  function D$ (line 9) | function D$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).pa...
  function b$ (line 9) | function b$(){if(kU)return kU;let t=fe.toPortablePath(P$.default.tmpdir(...
  method detachTemp (line 9) | detachTemp(t){Nu.delete(t)}
  method mktempSync (line 9) | mktempSync(t){let{tmpdir:e,realTmpdir:r}=b$();for(;;){let s=D$("xfs-");t...
  method mktempPromise (line 9) | async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=b$();for(;;){let s=D$(...
  method rmtempPromise (line 9) | async rmtempPromise(){await Promise.all(Array.from(Nu.values()).map(asyn...
  method rmtempSync (line 9) | rmtempSync(){for(let t of Nu)try{ce.removeSync(t),Nu.delete(t)}catch{}}
  function u5e (line 9) | function u5e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT...
  function Q$ (line 9) | function Q$(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:u5e(e,r)}
  function T$ (line 9) | function T$(t,e,r){k$.stat(t,function(s,a){r(s,s?!1:Q$(a,t,e))})}
  function f5e (line 9) | function f5e(t,e){return Q$(k$.statSync(t),t,e)}
  function O$ (line 9) | function O$(t,e,r){N$.stat(t,function(s,a){r(s,s?!1:L$(a,e))})}
  function A5e (line 9) | function A5e(t,e){return L$(N$.statSync(t),e)}
  function L$ (line 9) | function L$(t,e){return t.isFile()&&p5e(t,e)}
  function p5e (line 9) | function p5e(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:pr...
  function QU (line 9) | function QU(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Pro...
  function h5e (line 9) | function h5e(t,e){try{return lx.sync(t,e||{})}catch(r){if(e&&e.ignoreErr...
  function Z$ (line 9) | function Z$(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.op...
  function E5e (line 9) | function E5e(t){return Z$(t)||Z$(t,!0)}
  function I5e (line 9) | function I5e(t){return t=t.replace(RU,"^$1"),t}
  function C5e (line 9) | function C5e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"...
  function v5e (line 9) | function v5e(t){let r=Buffer.alloc(150),s;try{s=NU.openSync(t,"r"),NU.re...
  function k5e (line 9) | function k5e(t){t.file=lee(t);let e=t.file&&D5e(t.file);return e?(t.args...
  function Q5e (line 9) | function Q5e(t){if(!b5e)return t;let e=k5e(t),r=!P5e.test(e);if(t.option...
  function T5e (line 9) | function T5e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[]...
  function LU (line 9) | function LU(t,e){return Object.assign(new Error(`${e} ${t.command} ENOEN...
  function R5e (line 9) | function R5e(t,e){if(!OU)return;let r=t.emit;t.emit=function(s,a){if(s==...
  function Aee (line 9) | function Aee(t,e){return OU&&t===1&&!e.file?LU(e.original,"spawn"):null}
  function F5e (line 9) | function F5e(t,e){return OU&&t===1&&!e.file?LU(e.original,"spawnSync"):n...
  function dee (line 9) | function dee(t,e,r){let s=MU(t,e,r),a=gee.spawn(s.command,s.args,s.optio...
  function N5e (line 9) | function N5e(t,e,r){let s=MU(t,e,r),a=gee.spawnSync(s.command,s.args,s.o...
  function O5e (line 9) | function O5e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function Bd (line 9) | function Bd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
  function s (line 9) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 9) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 9) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function c (line 9) | function c(h){return r[h.type](h)}
  function f (line 9) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
  function p (line 9) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function L5e (line 9) | function L5e(t,e){e=e!==void 0?e:{};var r={},s={Start:Wa},a=Wa,n=functio...
  function ux (line 12) | function ux(t,e={isGlobPattern:()=>!1}){try{return(0,Eee.parse)(t,e)}cat...
  function fE (line 12) | function fE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a...
  function fx (line 12) | function fx(t){return`${AE(t.chain)}${t.then?` ${HU(t.then)}`:""}`}
  function HU (line 12) | function HU(t){return`${t.type} ${fx(t.line)}`}
  function AE (line 12) | function AE(t){return`${GU(t)}${t.then?` ${jU(t.then)}`:""}`}
  function jU (line 12) | function jU(t){return`${t.type} ${AE(t.chain)}`}
  function GU (line 12) | function GU(t){switch(t.type){case"command":return`${t.envs.length>0?`${...
  function cx (line 12) | function cx(t){return`${t.name}=${t.args[0]?vd(t.args[0]):""}`}
  function qU (line 12) | function qU(t){switch(t.type){case"redirection":return H2(t);case"argume...
  function H2 (line 12) | function H2(t){return`${t.subtype} ${t.args.map(e=>vd(e)).join(" ")}`}
  function vd (line 12) | function vd(t){return t.segments.map(e=>WU(e)).join("")}
  function WU (line 12) | function WU(t){let e=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<...
  function Ax (line 12) | function Ax(t){let e=a=>{switch(a){case"addition":return"+";case"subtrac...
  function _5e (line 13) | function _5e(t,e){function r(){this.constructor=t}r.prototype=e.prototyp...
  function Sd (line 13) | function Sd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.lo...
  function s (line 13) | function s(h){return h.charCodeAt(0).toString(16).toUpperCase()}
  function a (line 13) | function a(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace...
  function n (line 13) | function n(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replac...
  function c (line 13) | function c(h){return r[h.type](h)}
  function f (line 13) | function f(h){var E=new Array(h.length),C,S;for(C=0;C<h.length;C++)E[C]=...
  function p (line 13) | function p(h){return h?'"'+a(h)+'"':"end of input"}
  function H5e (line 13) | function H5e(t,e){e=e!==void 0?e:{};var r={},s={resolution:Ne},a=Ne,n="/...
  function px (line 13) | function px(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The...
  function hx (line 13) | function hx(t){let e="";return t.from&&(e+=t.from.fullName,t.from.descri...
  function bee (line 13) | function bee(t){return typeof t>"u"||t===null}
  function j5e (line 13) | function j5e(t){return typeof t=="object"&&t!==null}
  function G5e (line 13) | function G5e(t){return Array.isArray(t)?t:bee(t)?[]:[t]}
  function q5e (line 13) | function q5e(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r...
  function W5e (line 13) | function W5e(t,e){var r="",s;for(s=0;s<e;s+=1)r+=t;return r}
  function Y5e (line 13) | function Y5e(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}
  function j2 (line 13) | function j2(t,e){Error.call(this),this.name="YAMLException",this.reason=...
  function YU (line 13) | function YU(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.li...
  function K5e (line 17) | function K5e(t){var e={};return t!==null&&Object.keys(t).forEach(functio...
  function z5e (line 17) | function z5e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(V5e.i...
  function VU (line 17) | function VU(t,e,r){var s=[];return t.include.forEach(function(a){r=VU(a,...
  function Z5e (line 17) | function Z5e(){var t={scalar:{},sequence:{},mapping:{},fallba
Condensed preview — 389 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,015K chars).
[
  {
    "path": ".dockerignore",
    "chars": 191,
    "preview": "locust.egg-info/**\nlocustio.egg-info/**\nbuild/\n.coverage\ndocs/_build\n# Dockerfile # We'd like to ignore this, but it mes"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 701,
    "preview": "# Migrate code style to Black\n7c0fcc213d3988f6e7c6ffef63b24afe00e5fbd9\n2e7a8b5697a98d1d314d6fc3ef0589f81f09d7fe\n# upgrad"
  },
  {
    "path": ".gitattributes",
    "chars": 470,
    "preview": "# Set default behaviour, in case users don't have core.autocrlf set.\n* text=auto\n\n# Explicitly declare text files we wan"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 475,
    "preview": "## Release Process\n\n * Install github_changelog_generator (https://github.com/github-changelog-generator/github-changelo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "chars": 1916,
    "preview": "name: Bug\ndescription: Report an error\nlabels: [\"bug\"]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Prerequis"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1285,
    "preview": "name: Feature request\ndescription: Suggest an improvement\nlabels: [\"feature request\"]\nbody:\n  - type: checkboxes\n    att"
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 653,
    "preview": "version: 2\n\nupdates:\n  - package-ecosystem: github-actions\n    directory: /\n    schedule:\n      interval: semiannually\n "
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 1216,
    "preview": "name: Mark stale issues\n\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nj"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 13899,
    "preview": "name: Tests\n\non:\n  push:\n    branches:\n      - master\n    tags:\n      - \"*\"\n    paths-ignore:\n      - \"**.md\"\n  pull_req"
  },
  {
    "path": ".gitignore",
    "chars": 423,
    "preview": "*.pyc\nlocust.wpr\nlocust.egg-info/**\nlocustio.egg-info/**\nlocust/_version.py\nlocust/test/mock_*.py\ndocs/_build/**\ndocs/cl"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 487,
    "preview": "repos:\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    # Ruff version.\n    rev: v0.10.0  # Pin the same versi"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 381,
    "preview": "version: 2\n\n# Set the version of Python and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 102,
    "preview": "{\n    \"recommendations\": [\n        \"charliermarsh.ruff\",\n        \"ms-python.mypy-type-checker\"\n    ]\n}"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1329,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Run current file\",\n            \"type\": "
  },
  {
    "path": ".vscode/launch_locust.json",
    "chars": 512,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Locust: 5 users, with specific config f"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 1545,
    "preview": "{\n    \"editor.formatOnSave\": true,\n    \"files.exclude\": {\n        \".pytest_cache/**/*\": true,\n        \"**/*.pyc\": true,\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 78090,
    "preview": "# Detailed changelog\nThe most important changes can also be found in [the documentation](https://docs.locust.io/en/lates"
  },
  {
    "path": "Dockerfile",
    "chars": 1869,
    "preview": "# This is a local-use Docker image which illustrates the end-to-end build process for Locust\n\n# Stage 1: Build web front"
  },
  {
    "path": "Dockerfile.ci",
    "chars": 1033,
    "preview": "# This is the image pushed to Dockerhub, containing the built and tested Locust package\n\n# Stage 1: Install Locust packa"
  },
  {
    "path": "LICENSE",
    "chars": 1109,
    "preview": "The MIT License\n\nCopyright (c) 2009-2025, Carl Byström, Jonatan Heyman, Lars Holmberg\n\nPermission is hereby granted, fre"
  },
  {
    "path": "Makefile",
    "chars": 1228,
    "preview": "test:\n\tpytest -vv locust/test\n\n.PHONY: build\nbuild: check-uv check-yarn\n\tuv build\n\ninstall: check-uv\n\tuv sync\n\n.SILENT:\n"
  },
  {
    "path": "README.md",
    "chars": 7578,
    "preview": "# Locust\n\n[![PyPI](https://img.shields.io/pypi/v/locust.svg)](https://pypi.org/project/locust/)\n[![Supported Python Vers"
  },
  {
    "path": "SECURITY.md",
    "chars": 713,
    "preview": "# Security Policy\n\n## Supported Versions\n\nOnly latest version is actively supported, but issues reported for earlier min"
  },
  {
    "path": "Vagrantfile",
    "chars": 205,
    "preview": "Vagrant.configure(\"2\") do |config|\n  config.vm.box = \"ubuntu/xenial32\"\n  config.vm.network :forwarded_port, guest: 8089,"
  },
  {
    "path": "benchmarks/dispatch.py",
    "chars": 8319,
    "preview": "\"\"\"\nThis file contains a benchmark to validate the performance of Locust itself.\nMore precisely, the performance of the "
  },
  {
    "path": "docs/_static/theme-overrides.css",
    "chars": 268,
    "preview": "/* Make it possible to have multiline table cells by removing white-space:nowrap */\n.wy-table-responsive table td, .wy-t"
  },
  {
    "path": "docs/_templates/footer.html",
    "chars": 216,
    "preview": "{% extends \"!footer.html\" %}\n{% block extrafooter %}\n  {{ super }}\n  <img referrerpolicy=\"no-referrer-when-downgrade\" sr"
  },
  {
    "path": "docs/api.rst",
    "chars": 5001,
    "preview": "###\nAPI\n###\n\n\nUser class\n============\n\n.. autoclass:: locust.User\n    :members: wait_time, tasks, weight, fixed_count, a"
  },
  {
    "path": "docs/changelog.rst",
    "chars": 69583,
    "preview": "####################\nChangelog Highlights\n####################\n\nFor full details of changes, please see https://github.c"
  },
  {
    "path": "docs/conf.py",
    "chars": 6085,
    "preview": "#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# The contents of this file are pic"
  },
  {
    "path": "docs/configuration.rst",
    "chars": 13975,
    "preview": ".. _configuration:\n\n=============\nConfiguration\n=============\n\n\nCommand Line Options\n====================\n\nLocust is con"
  },
  {
    "path": "docs/custom-load-shape.rst",
    "chars": 5440,
    "preview": ".. _custom-load-shape:\n\n==================\nCustom load shapes\n==================\n\nSometimes a completely custom shaped l"
  },
  {
    "path": "docs/developing-locust.rst",
    "chars": 5856,
    "preview": ".. _developing-locust:\n\n=================================\nDeveloping and Documenting Locust\n============================"
  },
  {
    "path": "docs/extending-locust.rst",
    "chars": 11090,
    "preview": ".. _extending_locust:\n\n===========\nEvent hooks\n===========\n\nLocust comes with a number of event hooks that can be used t"
  },
  {
    "path": "docs/extensions.rst",
    "chars": 1379,
    "preview": ".. _extensions:\n\n======================\nThird party extensions\n======================\n\nSupport for load testing other pr"
  },
  {
    "path": "docs/faq.rst",
    "chars": 5005,
    "preview": ".. _faq:\n\n===\nFAQ\n===\n\nHow do I…\n\nResolve errors that occur during load (error 5xx, Connection aborted, Connection reset"
  },
  {
    "path": "docs/further-reading.rst",
    "chars": 1416,
    "preview": "===============================\nFurther reading / knowledgebase\n===============================\n\n- :ref:`extensions`.\n\n-"
  },
  {
    "path": "docs/history.rst",
    "chars": 1717,
    "preview": ":orphan:\n.. _history:\n\n===============================\nThe history of Locust\n===============================\n\nLocust was"
  },
  {
    "path": "docs/increase-performance.rst",
    "chars": 5360,
    "preview": ".. _increase-performance:\n\n==============================================================\nIncrease performance with a mo"
  },
  {
    "path": "docs/increasing-request-rate.rst",
    "chars": 2445,
    "preview": ".. _increaserr:\n\n===========================\nIncreasing the request rate\n===========================\n\nIf you're not gett"
  },
  {
    "path": "docs/index.rst",
    "chars": 1080,
    "preview": "=====================\nLocust Documentation\n=====================\n\n\n\nGetting started\n---------------\n\n.. toctree ::\n    :"
  },
  {
    "path": "docs/installation.rst",
    "chars": 4037,
    "preview": ".. _installation:\n\nInstallation\n============\n\n.. note::\n\n    Check `Troubleshooting Installation`_ if you encounter issu"
  },
  {
    "path": "docs/kubernetes-operator.rst",
    "chars": 10674,
    "preview": ".. _kubernetes-operator:\n\nKubernetes Operator\n===================\n\nThe Locust Operator for Kubernetes is an operator tha"
  },
  {
    "path": "docs/logging.rst",
    "chars": 2547,
    "preview": ".. _logging:\n\n=======\nLogging\n=======\n\nLocust uses Python's `built in logging framework <https://docs.python.org/3/libra"
  },
  {
    "path": "docs/quickstart.rst",
    "chars": 4400,
    "preview": ".. _quickstart:\n\n===============\nYour first test\n===============\n\nA Locust test is essentially just a Python program mak"
  },
  {
    "path": "docs/retrieving-stats.rst",
    "chars": 1514,
    "preview": "======================================\nRetrieve test statistics in CSV format\n======================================\n\nYo"
  },
  {
    "path": "docs/running-distributed.rst",
    "chars": 7322,
    "preview": ".. _running-distributed:\n\n===========================\nDistributed load generation\n===========================\n\nA single "
  },
  {
    "path": "docs/running-in-debugger.rst",
    "chars": 4310,
    "preview": ".. _running-in-debugger:\n\n===========================\nRunning tests in a debugger\n===========================\n\nRunning L"
  },
  {
    "path": "docs/running-in-docker.rst",
    "chars": 1340,
    "preview": ".. _running-in-docker:\n\n=================\nRunning in Docker\n=================\n\nThe official Docker image is at `locustio"
  },
  {
    "path": "docs/running-without-web-ui.rst",
    "chars": 5229,
    "preview": ".. _running-without-web-ui:\n\n=================================\nRunning without the web UI\n=============================="
  },
  {
    "path": "docs/tasksets.rst",
    "chars": 9261,
    "preview": ":orphan:\n.. _tasksets:\n\nTaskSet class\n=============\n\nIf you are performance testing a website that is structured in a hi"
  },
  {
    "path": "docs/telemetry.rst",
    "chars": 3113,
    "preview": ".. _telemetry:\n\n=========================\nOpenTelemetry Integration\n=========================\n\nLocust now optionally int"
  },
  {
    "path": "docs/testing-other-systems.rst",
    "chars": 5431,
    "preview": ".. _testing-other-systems:\n\n===============================\nTesting other systems/protocols\n============================"
  },
  {
    "path": "docs/use-as-lib.rst",
    "chars": 2647,
    "preview": ".. _use-as-lib:\n\n==========================\nUsing Locust as a library\n==========================\n\nIt is possible to star"
  },
  {
    "path": "docs/vscode-extension.rst",
    "chars": 519,
    "preview": ".. _vscode-extension:\n\nVS Code Extension\n=================\n\nLocust has an official extension for Visual Studio Code that"
  },
  {
    "path": "docs/what-is-locust.rst",
    "chars": 4290,
    "preview": "===============================\nWhat is Locust?\n===============================\n\nLocust is an open source performance/lo"
  },
  {
    "path": "docs/writing-a-locustfile.rst",
    "chars": 26072,
    "preview": ".. _writing-a-locustfile:\n\n======================\nWriting a locustfile\n======================\n\nNow, lets look at a more "
  },
  {
    "path": "examples/add_command_line_argument.py",
    "chars": 1668,
    "preview": "from locust import HttpUser, events, task\n\n\n@events.init_command_line_parser.add_listener\ndef _(parser):\n    parser.add_"
  },
  {
    "path": "examples/basic.py",
    "chars": 589,
    "preview": "from locust import HttpUser, TaskSet, between, task\n\n\ndef index(l):\n    l.client.get(\"/\")\n\n\ndef stats(l):\n    l.client.g"
  },
  {
    "path": "examples/bottlenecked_server.py",
    "chars": 1112,
    "preview": "\"\"\"\nThis example uses extensions in Locust's own WebUI to simulate a bottlenecked server and runs a test against itself."
  },
  {
    "path": "examples/browse_docs_sequence_test.py",
    "chars": 1523,
    "preview": "# This locust test script example will simulate a user\n# browsing the Locust documentation on https://docs.locust.io/\n\nf"
  },
  {
    "path": "examples/browse_docs_test.py",
    "chars": 1378,
    "preview": "# This locust test script example will simulate a user\n# browsing the Locust documentation on https://docs.locust.io/\n\nf"
  },
  {
    "path": "examples/csrf_form_authentication.py",
    "chars": 818,
    "preview": "from locust import HttpUser, between, task\n\nimport re\n\n\nclass WebsiteUser(HttpUser):\n    host = \"http://127.0.0.1:8089\"\n"
  },
  {
    "path": "examples/custom_messages.py",
    "chars": 2645,
    "preview": "from locust import HttpUser, between, events, task\nfrom locust.runners import LocalRunner, MasterRunner, WorkerRunner\n\ni"
  },
  {
    "path": "examples/custom_shape/double_wave.py",
    "chars": 1339,
    "preview": "from locust import HttpUser, LoadTestShape, TaskSet, constant, task\n\nimport math\n\n\nclass UserTasks(TaskSet):\n    @task\n "
  },
  {
    "path": "examples/custom_shape/stages.py",
    "chars": 1473,
    "preview": "from locust import HttpUser, LoadTestShape, TaskSet, constant, task\n\n\nclass UserTasks(TaskSet):\n    @task\n    def get_ro"
  },
  {
    "path": "examples/custom_shape/staging_user_classes.py",
    "chars": 1895,
    "preview": "from locust import HttpUser, LoadTestShape, TaskSet, constant, task\n\n\nclass UserTasks(TaskSet):\n    @task\n    def get_ro"
  },
  {
    "path": "examples/custom_shape/step_load.py",
    "chars": 900,
    "preview": "from locust import HttpUser, LoadTestShape, TaskSet, constant, task\n\nimport math\n\n\nclass UserTasks(TaskSet):\n    @task\n "
  },
  {
    "path": "examples/custom_shape/wait_user_count.py",
    "chars": 2238,
    "preview": "from locust import HttpUser, LoadTestShape, TaskSet, constant, task\n\nimport random\nimport time\nfrom collections import n"
  },
  {
    "path": "examples/custom_wait_function.py",
    "chars": 1369,
    "preview": "from locust import HttpUser, TaskSet, task\n\nimport random\n\n\ndef index(l):\n    l.client.get(\"/\")\n\n\ndef stats(l):\n    l.cl"
  },
  {
    "path": "examples/custom_xmlrpc_client/server.py",
    "chars": 470,
    "preview": "import random\nimport time\nfrom xmlrpc.server import SimpleXMLRPCServer\n\n\ndef get_time():\n    time.sleep(random.random())"
  },
  {
    "path": "examples/custom_xmlrpc_client/xmlrpc_locustfile.py",
    "chars": 2242,
    "preview": "from locust import User, task\n\nimport time\nfrom xmlrpc.client import Fault, ServerProxy\n\n\nclass XmlRpcClient(ServerProxy"
  },
  {
    "path": "examples/debugging.py",
    "chars": 445,
    "preview": "from locust import HttpUser, run_single_user, task\n\n\nclass QuickstartUser(HttpUser):\n    host = \"http://localhost\"\n\n    "
  },
  {
    "path": "examples/debugging_advanced.py",
    "chars": 655,
    "preview": "from locust import HttpUser, run_single_user, task\nfrom locust.exception import StopUser\n\n\nclass User1(HttpUser):\n    ho"
  },
  {
    "path": "examples/dispatch_test_scripts/locustfile.py",
    "chars": 2097,
    "preview": "from locust import HttpUser, LoadTestShape, constant, task\n\n\nclass UserA(HttpUser):\n    wait_time = constant(600)\n\n    #"
  },
  {
    "path": "examples/dispatch_test_scripts/run-disributed-headless.sh",
    "chars": 1282,
    "preview": "#!/usr/bin/env bash\n\nset -o errexit\nset -o pipefail\nset -o nounset\n\nscript_dir=\"$(realpath \"$( cd \"$( dirname \"${BASH_SO"
  },
  {
    "path": "examples/dispatch_test_scripts/run-disributed-web.sh",
    "chars": 1268,
    "preview": "#!/usr/bin/env bash\n\nset -o errexit\nset -o pipefail\nset -o nounset\n\nscript_dir=\"$(realpath \"$( cd \"$( dirname \"${BASH_SO"
  },
  {
    "path": "examples/dispatch_test_scripts/run-local-headless.sh",
    "chars": 458,
    "preview": "#!/usr/bin/env bash\n\nset -o errexit\nset -o pipefail\nset -o nounset\n\nscript_dir=\"$(realpath \"$( cd \"$( dirname \"${BASH_SO"
  },
  {
    "path": "examples/dispatch_test_scripts/run-local-web.sh",
    "chars": 444,
    "preview": "#!/usr/bin/env bash\n\nset -o errexit\nset -o pipefail\nset -o nounset\n\nscript_dir=\"$(realpath \"$( cd \"$( dirname \"${BASH_SO"
  },
  {
    "path": "examples/dns_ex.py",
    "chars": 769,
    "preview": "from locust import run_single_user, task\nfrom locust.contrib.dns import DNSUser\n\nimport time\n\nimport dns.message\nimport "
  },
  {
    "path": "examples/docker-compose/docker-compose.yml",
    "chars": 348,
    "preview": "version: '3'\n\nservices:\n  master:\n    image: locustio/locust\n    ports:\n     - \"8089:8089\"\n    volumes:\n      - ./:/mnt/"
  },
  {
    "path": "examples/dynamic_user_credentials.py",
    "chars": 639,
    "preview": "# locustfile.py\n\nfrom locust import HttpUser, TaskSet, between, task\n\nUSER_CREDENTIALS = [\n    (\"user1\", \"password\"),\n  "
  },
  {
    "path": "examples/events.py",
    "chars": 2307,
    "preview": "\"\"\"\nThis is an example of a locustfile that uses Locust's built in event hooks to\ntrack the sum of the content-length he"
  },
  {
    "path": "examples/extend_web_ui.py",
    "chars": 5142,
    "preview": "\"\"\"\nThis is an example of a locustfile that uses Locust's built in event and web\nUI extension hooks to track the sum of "
  },
  {
    "path": "examples/fast_http_locust.py",
    "chars": 610,
    "preview": "from locust import FastHttpUser, task\n\n\nclass WebsiteUser(FastHttpUser):\n    \"\"\"\n    User class that does requests to th"
  },
  {
    "path": "examples/grpc/grpc_user.py",
    "chars": 1920,
    "preview": "from locust import User\nfrom locust.exception import LocustError\n\nimport time\nfrom collections.abc import Callable\nfrom "
  },
  {
    "path": "examples/grpc/hello.proto",
    "chars": 219,
    "preview": "syntax = \"proto3\";\n\npackage locust.hello;\n\nservice HelloService {\n  rpc SayHello (HelloRequest) returns (HelloResponse) "
  },
  {
    "path": "examples/grpc/hello_pb2.py",
    "chars": 4674,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: hello.proto\n\"\"\"Generated protocol buffer code.\"\"\"\n\n"
  },
  {
    "path": "examples/grpc/hello_pb2_grpc.py",
    "chars": 2416,
    "preview": "# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!\n\"\"\"Client and server classes corresponding to prot"
  },
  {
    "path": "examples/grpc/hello_server.py",
    "chars": 751,
    "preview": "import logging\nimport time\nfrom concurrent import futures\n\nimport grpc\nimport hello_pb2\nimport hello_pb2_grpc\n\nlogger = "
  },
  {
    "path": "examples/grpc/locustfile.py",
    "chars": 542,
    "preview": "from locust import events, task\n\nimport gevent\nimport grpc_user\nimport hello_pb2\nimport hello_pb2_grpc\nfrom hello_server"
  },
  {
    "path": "examples/locustfile.py",
    "chars": 495,
    "preview": "from locust import HttpUser, between, task\n\nimport time\n\n\nclass QuickstartUser(HttpUser):\n    wait_time = between(1, 2)\n"
  },
  {
    "path": "examples/manual_stats_reporting.py",
    "chars": 2127,
    "preview": "\"\"\"\nExample of a manual_report() function that can be used either as a context manager\n(with statement), or a decorator,"
  },
  {
    "path": "examples/markov_taskset.py",
    "chars": 2307,
    "preview": "from locust import MarkovTaskSet, User, constant, transition, transitions\n\n\"\"\"\nThis example demonstrates the different w"
  },
  {
    "path": "examples/milvus/README.md",
    "chars": 815,
    "preview": "# Milvus Load Testing with Locust\n\nSimple example demonstrating load testing for Milvus vector database operations.\n\n## "
  },
  {
    "path": "examples/milvus/locustfile.py",
    "chars": 2422,
    "preview": "\"\"\"\nMinimal example demonstrating Milvus load testing with Locust.\n\"\"\"\n\nfrom locust import between, task\nfrom locust.con"
  },
  {
    "path": "examples/mongodb/README.md",
    "chars": 598,
    "preview": "# Overview\n\n### Prerequisites:\n\n- [`gevent`](https://www.gevent.org/install.html)\n  - [For pymongo to use greenlets inst"
  },
  {
    "path": "examples/mongodb/locustfile.py",
    "chars": 399,
    "preview": "from locust import task\nfrom locust.contrib.mongodb import MongoDBUser\n\nimport os\n\n\nclass MongoUser(MongoDBUser):\n    co"
  },
  {
    "path": "examples/mqtt/README.md",
    "chars": 818,
    "preview": "# MQTT Load testing with Locust\n\n## Prerequisites\n\nHave access to a running mqtt broker.\n\n```bash\n# start mosquitto loca"
  },
  {
    "path": "examples/mqtt/locustfile.py",
    "chars": 1033,
    "preview": "from locust import task\nfrom locust.contrib.mqtt import MqttUser\nfrom locust.user.wait_time import between\n\nimport time\n"
  },
  {
    "path": "examples/mqtt/locustfile_custom_mqtt_client.py",
    "chars": 1367,
    "preview": "from locust import task\nfrom locust.contrib.mqtt import MqttClient, MqttUser\nfrom locust.user.wait_time import between\n\n"
  },
  {
    "path": "examples/mqtt/mosquitto_config/mosquitto.conf",
    "chars": 69,
    "preview": "# mosquitto_config/mosquitto.conf\n\nlistener 1883\nallow_anonymous true"
  },
  {
    "path": "examples/multiple_hosts.py",
    "chars": 862,
    "preview": "from locust import HttpUser, TaskSet, between, task\nfrom locust.clients import HttpSession\n\nimport os\n\n\nclass MultipleHo"
  },
  {
    "path": "examples/nested_inline_tasksets.py",
    "chars": 581,
    "preview": "from locust import HttpUser, TaskSet, between, task\n\n\nclass WebsiteUser(HttpUser):\n    \"\"\"\n    Example of the ability of"
  },
  {
    "path": "examples/open_closed_workload.py",
    "chars": 626,
    "preview": "from locust import HttpUser, constant, constant_pacing, task\n\n\nclass ClosedWorkload(HttpUser):\n    wait_time = constant("
  },
  {
    "path": "examples/openai_ex.py",
    "chars": 1124,
    "preview": "# You need to install the openai package and set OPENAI_API_KEY env var to run this\n\n# OpenAIUser tracks the number of o"
  },
  {
    "path": "examples/postgres/README.md",
    "chars": 379,
    "preview": "# Overview\n\nRead the instruction below for your specific database\n\n## PostgreSQL\n\n### How to run the test\n\n- Prerequisit"
  },
  {
    "path": "examples/postgres/locustfile.py",
    "chars": 881,
    "preview": "from locust import task\nfrom locust.contrib.postgres import PostgresUser\n\nimport os\nimport random\n\n\nclass MyUser(Postgre"
  },
  {
    "path": "examples/qdrant/README.md",
    "chars": 931,
    "preview": "# Qdrant Load Testing with Locust\n\nSimple example demonstrating load testing for Qdrant vector database operations.\n\n## "
  },
  {
    "path": "examples/qdrant/locustfile.py",
    "chars": 1435,
    "preview": "\"\"\"\nMinimal example demonstrating Qdrant load testing with Locust.\n\"\"\"\n\nfrom locust import between, task\nfrom locust.con"
  },
  {
    "path": "examples/response_validations.py",
    "chars": 2651,
    "preview": "\"\"\"\nThis shows some useful ways to validate responses and how to exit tasks early on failure.\n\"\"\"\n\nfrom locust import Fa"
  },
  {
    "path": "examples/rest.py",
    "chars": 4260,
    "preview": "from locust import FastHttpUser, run_single_user, task\nfrom locust.contrib.fasthttp import RestResponseContextManager\nfr"
  },
  {
    "path": "examples/sdk_session_patching/session_patch_locustfile.py",
    "chars": 761,
    "preview": "import locust\nfrom locust.user import task\n\nfrom archivist.archivist import Archivist  # Example library under test\n\n\ncl"
  },
  {
    "path": "examples/semaphore_wait.py",
    "chars": 428,
    "preview": "from locust import HttpUser, events, task\n\nfrom gevent.lock import Semaphore\n\nall_users_spawned = Semaphore()\nall_users_"
  },
  {
    "path": "examples/socketio/echo_server.py",
    "chars": 1510,
    "preview": "# Used by socketio_ex.py as a mock target. Requires installing gevent-websocket\nimport gevent.monkey\n\ngevent.monkey.patc"
  },
  {
    "path": "examples/socketio/socketio_ex.py",
    "chars": 1960,
    "preview": "from locust import HttpUser, task\nfrom locust.contrib.socketio import SocketIOUser\n\nfrom threading import Event\n\nimport "
  },
  {
    "path": "examples/stop_on_threshold.py",
    "chars": 1041,
    "preview": "# An example of how to stop locust if a threshold (in this case the fail ratio) is exceeded\nfrom locust import HttpUser,"
  },
  {
    "path": "examples/terraform/aws/README.md",
    "chars": 1807,
    "preview": "## This doesnt seem to work right now for some people. See https://github.com/locustio/locust/issues/2357\n\n## 1. AWS Aut"
  },
  {
    "path": "examples/terraform/aws/data_subnet.tf",
    "chars": 114,
    "preview": "data \"aws_subnet\" \"current\" {\n    filter {\n        name   = \"tag:Name\"\n        values = [var.subnet_name]\n    }\n}\n"
  },
  {
    "path": "examples/terraform/aws/main.tf",
    "chars": 935,
    "preview": "module \"loadtest\" {\n    \n    # https://registry.terraform.io/modules/marcosborges/loadtest-distribuited/aws/latest\n    s"
  },
  {
    "path": "examples/terraform/aws/output.tf",
    "chars": 759,
    "preview": "output \"leader_public_ip\" {\n    value = module.loadtest.leader_public_ip\n    description = \"The public IP address of the"
  },
  {
    "path": "examples/terraform/aws/plan/basic.py",
    "chars": 490,
    "preview": "from locust import HttpUser, between, task\n\n\nclass Quickstart(HttpUser):\n    wait_time = between(1, 5)\n\n    @task\n    de"
  },
  {
    "path": "examples/terraform/aws/provisioner.tf",
    "chars": 47,
    "preview": "provider \"aws\" {\n    region = var.aws_region\n}\n"
  },
  {
    "path": "examples/terraform/aws/variables.tf",
    "chars": 504,
    "preview": "variable \"aws_region\" {\n    type = string\n    default = \"us-east-1\"\n    description = \"AWS Region\"\n}\n\nvariable \"node_siz"
  },
  {
    "path": "examples/test_data_management.py",
    "chars": 5211,
    "preview": "# This example shows the various ways to run things before/outside of the normal task execution flow,\n# which is very us"
  },
  {
    "path": "examples/test_pytest.py",
    "chars": 1564,
    "preview": "from locust.clients import HttpSession  # this import is just for type hints\n\nimport time\n\n\n# pytest/locust will discove"
  },
  {
    "path": "examples/testdata_from_csv.csv",
    "chars": 60,
    "preview": "myuser1@example.com,password1\nmyuser2@example.com,password2\n"
  },
  {
    "path": "examples/testdata_from_csv.py",
    "chars": 1768,
    "preview": "\"\"\"\nThis shows an easy way to get testdata from a csv file into locust and use it for requests\n\"\"\"\n\nfrom locust import F"
  },
  {
    "path": "examples/use_as_lib.py",
    "chars": 1111,
    "preview": "#!/usr/bin/env python3\nfrom locust import HttpUser, events, task\nfrom locust.env import Environment\nfrom locust.log impo"
  },
  {
    "path": "examples/vagrant/README.md",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/vagrant/supervisord.conf",
    "chars": 1569,
    "preview": "[inet_http_server]          ; inet (TCP) server disabled by default\nport=*:9001                 ; (ip_address:port speci"
  },
  {
    "path": "examples/web_ui_auth/basic.py",
    "chars": 2477,
    "preview": "\"\"\"\nExample of implementing authentication for Locust when the --web-login flag is given\n\nThis is only to serve as a sta"
  },
  {
    "path": "examples/web_ui_auth/custom_form.py",
    "chars": 3762,
    "preview": "\"\"\"\nExample of implementing authentication with a custom form for Locust when the --web-login\nflag is given\n\nThis is onl"
  },
  {
    "path": "examples/web_ui_cache_stats.py",
    "chars": 6845,
    "preview": "\"\"\"\nThis is an example of a locustfile that uses Locust's built in event and web\nUI extension hooks to track the sum of "
  },
  {
    "path": "examples/worker_index.py",
    "chars": 644,
    "preview": "# How to use worker_index to read from a pre-partitioned CSV file (mythings_0.csv, mythings_1.csv, ...)\n# so that each w"
  },
  {
    "path": "examples/x-forwarded-for.py",
    "chars": 576,
    "preview": "from locust import HttpUser, run_single_user, task\n\nimport random\n\n\nclass ForwardedForUser(HttpUser):\n    subnet = \"10.1"
  },
  {
    "path": "generate_changelog.py",
    "chars": 939,
    "preview": "#!/usr/bin/env python3\n\nimport os\nimport subprocess\nimport sys\n\ngithub_api_token = (\n    os.getenv(\"CHANGELOG_GITHUB_TOK"
  },
  {
    "path": "hatch_build.py",
    "chars": 975,
    "preview": "import os\nimport subprocess\nfrom typing import Any\n\nfrom hatchling.builders.hooks.plugin.interface import BuildHookInter"
  },
  {
    "path": "locust/__init__.py",
    "chars": 1876,
    "preview": "import os\n\nif os.getenv(\"LOCUST_PLAYWRIGHT\", None):\n    print(\"LOCUST_PLAYWRIGHT setting is no longer needed (because lo"
  },
  {
    "path": "locust/__main__.py",
    "chars": 31,
    "preview": "from .main import main\n\nmain()\n"
  },
  {
    "path": "locust/argument_parser.py",
    "chars": 34678,
    "preview": "from __future__ import annotations\n\nimport locust\nfrom locust import runners\nfrom locust.rpc import Message, zmqrpc\n\nimp"
  },
  {
    "path": "locust/clients.py",
    "chars": 23592,
    "preview": "from __future__ import annotations\n\nfrom locust.event import EventHook\n\nimport os\nimport re\nimport sys\nimport time\nfrom "
  },
  {
    "path": "locust/contrib/__init__.py",
    "chars": 290,
    "preview": "# This directory contains modules that are experimental.\n\n# Generally they should not have any significant issues, but t"
  },
  {
    "path": "locust/contrib/dns.py",
    "chars": 2054,
    "preview": "from locust import User\nfrom locust.exception import LocustError\n\nimport time\nfrom collections.abc import Callable\n\nimpo"
  },
  {
    "path": "locust/contrib/fasthttp.py",
    "chars": 32534,
    "preview": "from __future__ import annotations\n\nfrom locust.exception import CatchResponseError, LocustError, ResponseError, StopTes"
  },
  {
    "path": "locust/contrib/milvus.py",
    "chars": 13015,
    "preview": "import gevent.monkey\n\ngevent.monkey.patch_all()\nimport grpc.experimental.gevent as grpc_gevent\n\ngrpc_gevent.init_gevent("
  },
  {
    "path": "locust/contrib/mongodb.py",
    "chars": 1246,
    "preview": "from locust import User, events\n\nimport time\n\nfrom pymongo import MongoClient\nfrom pymongo.errors import PyMongoError\n\n\n"
  },
  {
    "path": "locust/contrib/mqtt.py",
    "chars": 19345,
    "preview": "from __future__ import annotations\n\nfrom locust import User\nfrom locust.env import Environment\n\nimport random\nimport sel"
  },
  {
    "path": "locust/contrib/oai.py",
    "chars": 2454,
    "preview": "# Note: this User is experimental and may change without notice.\n# The filename is oai.py so it doesnt clash with the op"
  },
  {
    "path": "locust/contrib/postgres.py",
    "chars": 1230,
    "preview": "from locust import User, events\n\nimport time\n\nimport psycopg\n\n\nclass PostgresClient:\n    def __init__(self, conn_string)"
  },
  {
    "path": "locust/contrib/qdrant.py",
    "chars": 7255,
    "preview": "from locust import User, events\n\nimport time\nfrom typing import Any\n\nfrom qdrant_client import QdrantClient\nfrom qdrant_"
  },
  {
    "path": "locust/contrib/socketio.py",
    "chars": 3236,
    "preview": "from locust import User\nfrom locust.event import EventHook\n\nfrom typing import Any\n\nimport gevent\nimport socketio\n\n\nclas"
  },
  {
    "path": "locust/debug.py",
    "chars": 5109,
    "preview": "from __future__ import annotations\n\nimport locust\nimport locust.log\nfrom locust import argument_parser\nfrom locust.env i"
  },
  {
    "path": "locust/dispatch.py",
    "chars": 16202,
    "preview": "from __future__ import annotations\n\nimport contextlib\nimport itertools\nimport math\nimport time\nfrom collections import d"
  },
  {
    "path": "locust/env.py",
    "chars": 13203,
    "preview": "from __future__ import annotations\n\nfrom collections.abc import Callable\nfrom operator import methodcaller\nfrom typing i"
  },
  {
    "path": "locust/event.py",
    "chars": 9082,
    "preview": "from __future__ import annotations\n\nimport logging\nimport time\nimport traceback\nfrom collections.abc import Generator\nfr"
  },
  {
    "path": "locust/exception.py",
    "chars": 2054,
    "preview": "class LocustError(Exception):\n    pass\n\n\nclass ResponseError(Exception):\n    pass\n\n\nclass CatchResponseError(Exception):"
  },
  {
    "path": "locust/html.py",
    "chars": 4076,
    "preview": "import os\nfrom itertools import chain\n\nfrom jinja2 import Environment as JinjaEnvironment\nfrom jinja2 import FileSystemL"
  },
  {
    "path": "locust/input_events.py",
    "chars": 3323,
    "preview": "from __future__ import annotations\n\nimport collections\nimport logging\nimport os\nimport sys\nfrom collections.abc import C"
  },
  {
    "path": "locust/log.py",
    "chars": 3455,
    "preview": "import logging\nimport logging.config\nimport re\nimport socket\nfrom collections import deque\n\nHOSTNAME = re.sub(r\"\\..*\", \""
  },
  {
    "path": "locust/main.py",
    "chars": 28306,
    "preview": "from __future__ import annotations\n\nimport locust\nfrom locust.opentelemetry import setup_opentelemetry\n\nimport atexit\nim"
  },
  {
    "path": "locust/opentelemetry.py",
    "chars": 6715,
    "preview": "import logging\nimport os\nfrom urllib.parse import urlparse\n\nfrom ._version import __version__\n\nlogger = logging.getLogge"
  },
  {
    "path": "locust/py.typed",
    "chars": 65,
    "preview": "# Marker file for PEP 561. The locust package uses inline types.\n"
  },
  {
    "path": "locust/rpc/__init__.py",
    "chars": 99,
    "preview": "__all__ = (\n    \"Message\",\n    \"rpc\",\n)\n\nfrom . import zmqrpc as rpc\nfrom .protocol import Message\n"
  },
  {
    "path": "locust/rpc/protocol.py",
    "chars": 1282,
    "preview": "from __future__ import annotations\n\nimport datetime\n\nimport msgpack\n\ntry:\n    from bson import ObjectId\nexcept ImportErr"
  },
  {
    "path": "locust/rpc/zmqrpc.py",
    "chars": 3214,
    "preview": "from locust.exception import RPCError, RPCReceiveError, RPCSendError\nfrom locust.util.exception_handler import retry\n\nim"
  },
  {
    "path": "locust/runners.py",
    "chars": 71742,
    "preview": "from __future__ import annotations\n\nfrom locust import __version__\n\nimport functools\nimport inspect\nimport json\nimport l"
  },
  {
    "path": "locust/shape.py",
    "chars": 1973,
    "preview": "from __future__ import annotations\n\nimport time\nfrom abc import ABCMeta, abstractmethod\nfrom typing import TYPE_CHECKING"
  },
  {
    "path": "locust/stats.py",
    "chars": 48155,
    "preview": "from __future__ import annotations\n\nimport csv\nimport hashlib\nimport json\nimport logging\nimport os\nimport signal\nimport "
  },
  {
    "path": "locust/test/__init__.py",
    "chars": 508,
    "preview": "try:\n    import resource\n\n    # work around occasional \"zmq.error.ZMQError: Too many open files\"\n    # this is done in m"
  },
  {
    "path": "locust/test/fake_module1_for_env_test.py",
    "chars": 164,
    "preview": "\"\"\"Module for locust.test.test_env.TestEnvironment.test_user_classes_with_same_name_is_error\"\"\"\n\nfrom locust import User"
  },
  {
    "path": "locust/test/fake_module2_for_env_test.py",
    "chars": 164,
    "preview": "\"\"\"Module for locust.test.test_env.TestEnvironment.test_user_classes_with_same_name_is_error\"\"\"\n\nfrom locust import User"
  },
  {
    "path": "locust/test/subprocess_utils.py",
    "chars": 5557,
    "preview": "import os\nimport shlex\nimport signal\nimport subprocess\nimport time\nfrom typing import IO\n\nimport gevent\nimport pytest\n\nf"
  },
  {
    "path": "locust/test/test_date.py",
    "chars": 2911,
    "preview": "from locust.util.date import format_duration, format_safe_timestamp, format_utc_timestamp\n\nfrom datetime import datetime"
  },
  {
    "path": "locust/test/test_debugging.py",
    "chars": 1053,
    "preview": "from locust import debug, task\nfrom locust.test.testcases import LocustTestCase\nfrom locust.user.task import LOCUST_STAT"
  },
  {
    "path": "locust/test/test_dispatch.py",
    "chars": 168856,
    "preview": "from __future__ import annotations\n\nfrom locust import User\nfrom locust.dispatch import UsersDispatcher\nfrom locust.runn"
  },
  {
    "path": "locust/test/test_env.py",
    "chars": 8919,
    "preview": "from locust import (\n    constant,\n)\nfrom locust.dispatch import UsersDispatcher\nfrom locust.env import Environment, Loa"
  },
  {
    "path": "locust/test/test_fasthttp.py",
    "chars": 32474,
    "preview": "from locust import FastHttpUser\nfrom locust.contrib.fasthttp import FastHttpSession\nfrom locust.exception import CatchRe"
  },
  {
    "path": "locust/test/test_html_filename.py",
    "chars": 1845,
    "preview": "from locust.html import process_html_filename\n\nimport unittest\nfrom unittest.mock import MagicMock\n\n\nclass TestProcessHt"
  },
  {
    "path": "locust/test/test_http.py",
    "chars": 12679,
    "preview": "from locust.clients import HttpSession\nfrom locust.exception import LocustError\nfrom locust.user.users import HttpUser\n\n"
  },
  {
    "path": "locust/test/test_interruptable_task.py",
    "chars": 1377,
    "preview": "from locust import SequentialTaskSet, User, constant, task\nfrom locust.env import Environment\nfrom locust.exception impo"
  },
  {
    "path": "locust/test/test_load_locustfile.py",
    "chars": 9964,
    "preview": "from locust import main\nfrom locust.argument_parser import get_parser\nfrom locust.main import create_environment\nfrom lo"
  },
  {
    "path": "locust/test/test_locust_class.py",
    "chars": 25526,
    "preview": "from locust import HttpUser, TaskSet, User, constant, task\nfrom locust.env import Environment\nfrom locust.exception impo"
  },
  {
    "path": "locust/test/test_log.py",
    "chars": 7509,
    "preview": "from locust import log\nfrom locust.log import greenlet_exception_logger\n\nimport re\nimport socket\nimport subprocess\nimpor"
  },
  {
    "path": "locust/test/test_main.py",
    "chars": 70636,
    "preview": "from __future__ import annotations\n\nimport json\nimport os\nimport platform\nimport socket\nimport subprocess\nimport sys\nimp"
  },
  {
    "path": "locust/test/test_markov_taskset.py",
    "chars": 7046,
    "preview": "from locust import User, tag\nfrom locust.exception import RescheduleTask\nfrom locust.user.markov_taskset import (\n    In"
  },
  {
    "path": "locust/test/test_old_wait_api.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "locust/test/test_parser.py",
    "chars": 18175,
    "preview": "import locust\nfrom locust.argument_parser import (\n    get_parser,\n    parse_locustfile_paths,\n    ui_extra_args_dict,\n)"
  },
  {
    "path": "locust/test/test_pytest_locustfile.py",
    "chars": 2461,
    "preview": "# pytest style locustfiles, can be run from both pytest and locust!\n#\n# Example use:\n#\n# locust -H https://locust.io -f "
  },
  {
    "path": "locust/test/test_runners.py",
    "chars": 169878,
    "preview": "from __future__ import annotations\n\nimport locust\nfrom locust import LoadTestShape, __version__, constant, runners\nfrom "
  },
  {
    "path": "locust/test/test_sequential_taskset.py",
    "chars": 3890,
    "preview": "from locust import User, task\nfrom locust.exception import RescheduleTask\nfrom locust.user.sequential_taskset import Seq"
  },
  {
    "path": "locust/test/test_socketio.py",
    "chars": 1552,
    "preview": "from locust.contrib.socketio import SocketIOUser\n\nimport time\nfrom unittest.mock import patch\n\nimport socketio\n\nfrom .te"
  },
  {
    "path": "locust/test/test_stats.py",
    "chars": 38358,
    "preview": "import locust\nfrom locust import HttpUser, TaskSet, User, __version__, constant, task\nfrom locust.env import Environment"
  },
  {
    "path": "locust/test/test_tags.py",
    "chars": 13138,
    "preview": "from locust import TaskSet, User, tag, task\nfrom locust.env import Environment\nfrom locust.user.task import filter_tasks"
  },
  {
    "path": "locust/test/test_taskratio.py",
    "chars": 2742,
    "preview": "from locust.user import TaskSet, User, task\nfrom locust.user.inspectuser import _get_task_ratio, get_ratio\n\nimport unitt"
  },
  {
    "path": "locust/test/test_users.py",
    "chars": 2135,
    "preview": "from locust import HttpUser, User\nfrom locust.test.testcases import WebserverTestCase\n\nimport unittest\n\nfrom urllib3 imp"
  },
  {
    "path": "locust/test/test_util.py",
    "chars": 1229,
    "preview": "from locust.util.rounding import proper_round\nfrom locust.util.timespan import parse_timespan\n\nimport unittest\n\n\nclass T"
  },
  {
    "path": "locust/test/test_wait_time.py",
    "chars": 2303,
    "preview": "from locust import TaskSet, User, between, constant, constant_throughput\n\nimport random\nimport time\n\nfrom .testcases imp"
  },
  {
    "path": "locust/test/test_web.py",
    "chars": 50014,
    "preview": "from __future__ import annotations\n\nimport locust\nfrom locust import LoadTestShape, constant, stats\nfrom locust.argument"
  }
]

// ... and 189 more files (download for full content)

About this extraction

This page contains the full source code of the locustio/locust GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 389 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 8306 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!