locust 2.25.1.dev8__tar.gz → 2.25.1.dev17__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- locust-2.25.1.dev17/.pre-commit-config.yaml +10 -0
- {locust-2.25.1.dev8/locust.egg-info → locust-2.25.1.dev17}/PKG-INFO +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/developing-locust.rst +3 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/installation.rst +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/rest.py +5 -7
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/_version.py +2 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/argument_parser.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/clients.py +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/contrib/fasthttp.py +3 -3
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/dispatch.py +3 -18
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/event.py +2 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/html.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/input_events.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/main.py +8 -25
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/runners.py +1 -3
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/stats.py +5 -6
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/mock_logging.py +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_debugging.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_interruptable_task.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_main.py +5 -6
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_runners.py +34 -25
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/testcases.py +2 -4
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/task.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/web.py +1 -2
- {locust-2.25.1.dev8 → locust-2.25.1.dev17/locust.egg-info}/PKG-INFO +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/SOURCES.txt +1 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/pyproject.toml +1 -1
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.coveragerc +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.dockerignore +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.git-blame-ignore-revs +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.gitattributes +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/CONTRIBUTING.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/workflows/stale.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/workflows/tests.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.gitignore +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.readthedocs.yaml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/extensions.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/launch.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/launch_locust.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/settings.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/CHANGELOG.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Dockerfile +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/LICENSE +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/MANIFEST.in +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Makefile +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/README +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/README.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/SECURITY.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Vagrantfile +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/benchmarks/dispatch.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/_static/theme-overrides.css +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/api.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/changelog.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/conf.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/configuration.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/custom-load-shape.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/extending-locust.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/further-reading.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/history.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/locust_workers.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/number_of_users.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/response_times.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/total_requests_per_second.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/userclass_picker_example.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/webui-running-statistics.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/webui-splash-screenshot.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/increase-performance.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/index.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/logging.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/quickstart.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/requirements.txt +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/retrieving-stats.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-cloud-integration.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-distributed.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-in-debugger.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-in-docker.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-without-web-ui.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/tasksets.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/testing-other-systems.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/use-as-lib.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/what-is-locust.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/writing-a-locustfile.rst +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/add_command_line_argument.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/basic.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/browse_docs_sequence_test.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/browse_docs_test.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_messages.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/double_wave.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/stages.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/staging_user_classes.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/step_load.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/wait_user_count.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_wait_function.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_xmlrpc_client/server.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/debugging.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/debugging_advanced.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/docker-compose/docker-compose.yml +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/dynamic_user_credentials.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/events.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_modern_web_ui.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/extend.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/static/custom-stats-table.css +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/static/extend.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/templates/extend.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/fast_http_locust.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/grpc_user.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello.proto +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_pb2.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_pb2_grpc.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_server.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/manual_stats_reporting.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/multiple_hosts.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/nested_inline_tasksets.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/semaphore_wait.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/stop_on_threshold.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/README.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/data_subnet.tf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/main.tf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/output.tf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/plan/basic.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/provisioner.tf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/variables.tf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/test_data_management.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/use_as_lib.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/vagrant/README.md +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/vagrant/supervisord.conf +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/web_ui_auth.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/web_ui_cache_stats.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/worker_index.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/generate_changelog.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/__main__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/contrib/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/debug.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/env.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/exception.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/log.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/py.typed +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/protocol.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/shape.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/chart.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/application.css +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/application.css.map +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/tables.css +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/tables.css.map +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/echarts.common.min.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/favicon.ico +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/logo.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-charts.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-start-test.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-stats.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-workers.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery-1.11.3.min.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery.jqote2.min.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery.tools.min.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/locust.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/_base.sass +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/_mixins.sass +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/application.sass +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/tables.sass +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/tasks.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/vintage.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/index.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/report.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/stats_data.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/fake_module1_for_env_test.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/fake_module2_for_env_test.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/mock_locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_dispatch.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_env.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_fasthttp.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_http.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_load_locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_locust_class.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_log.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_old_wait_api.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_parser.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_sequential_taskset.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_stats.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_tags.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_taskratio.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_users.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_util.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_wait_time.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_web.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_zmqrpc.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/util.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/inspectuser.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/sequential_taskset.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/users.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/wait_time.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/__init__.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/cache.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/deprecation.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/exception_handler.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/load_locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/rounding.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/timespan.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.eslintrc +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.gitignore +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.prettierrc +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/auth.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dev.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/favicon.ico +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/index-941b6e82.js +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/logo.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/auth.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/index.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/report.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/index.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/package.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/assets/favicon.ico +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/assets/logo.png +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/report.html +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/App.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/App.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/Form.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/Select.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Layout.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Modal/Modal.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Reports/Reports.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Table/Table.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Table/Table.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/auth.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/swarm.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/theme.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/global.d.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useInterval.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useNotifications.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSortByField.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/index.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/Auth.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/Dashboard.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/HtmlReport.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/api/swarm.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/hooks.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/root.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/url.slice.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/store.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/utils.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/styles/theme.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/constants.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/setup.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/testUtils.tsx +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/auth.types.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/swarm.types.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/tab.types.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/table.types.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/ui.types.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/number.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/object.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/string.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/number.test.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/object.test.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/string.test.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/url.test.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/url.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/tsconfig.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/vite.config.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/vitest.config.ts +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/yarn.lock +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/dependency_links.txt +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/entry_points.txt +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/not-zip-safe +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/requires.txt +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/top_level.txt +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/package.json +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/locustfile.py +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-disributed-headless.sh +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-disributed-web.sh +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-local-headless.sh +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-local-web.sh +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/setup.cfg +0 -0
- {locust-2.25.1.dev8 → locust-2.25.1.dev17}/tox.ini +0 -0
@@ -20,7 +20,9 @@ Now the ``locust`` command will run *your* code with no need for reinstalling af
|
|
20
20
|
|
21
21
|
To contribute your changes, push to a branch in your repo and then `open a PR on github <https://github.com/locustio/locust/compare>`_.
|
22
22
|
|
23
|
-
|
23
|
+
If you install `pre-commit <https://pre-commit.com/>`_ linting and format checks/fixes will be automatically performed saving you a round trip to GitHub actions.
|
24
|
+
|
25
|
+
Before you open a pull request, make sure all the tests work. And if you are adding a feature, make sure it is documented (in ``docs/*.rst``).
|
24
26
|
|
25
27
|
Testing your changes
|
26
28
|
====================
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Installation
|
4
4
|
============
|
5
5
|
|
6
|
-
0. `Install Python <https://docs.python-guide.org/starting/installation/>`_ (3.
|
6
|
+
0. `Install Python <https://docs.python-guide.org/starting/installation/>`_ (3.9 or later)
|
7
7
|
|
8
8
|
1. Install the package (check `the wiki <https://github.com/locustio/locust/wiki/Installation>`_ if the installation fails)
|
9
9
|
|
@@ -2,8 +2,8 @@ from locust import FastHttpUser, run_single_user, task
|
|
2
2
|
from locust.contrib.fasthttp import RestResponseContextManager
|
3
3
|
from locust.user.wait_time import constant
|
4
4
|
|
5
|
+
from collections.abc import Generator
|
5
6
|
from contextlib import contextmanager
|
6
|
-
from typing import Generator
|
7
7
|
|
8
8
|
|
9
9
|
class MyUser(FastHttpUser):
|
@@ -40,12 +40,10 @@ class MyUser(FastHttpUser):
|
|
40
40
|
# use a trailing comma to append the response text to the custom message
|
41
41
|
assert resp.js["data"]["foo"] == 2, "my custom error message with response text,"
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
# assert (foo := resp.js["foo"])
|
48
|
-
# print(f"the number {foo} is awesome")
|
43
|
+
with self.rest("", "/post", json={"foo": 1}) as resp:
|
44
|
+
# assign and assert in one line
|
45
|
+
assert (foo := resp.js["foo"])
|
46
|
+
print(f"the number {foo} is awesome")
|
49
47
|
|
50
48
|
# rest() catches most exceptions, so any programming mistakes you make automatically marks the request as a failure
|
51
49
|
# and stores the callstack in the failure message
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '2.25.1.
|
16
|
-
__version_tuple__ = version_tuple = (2, 25, 1, '
|
15
|
+
__version__ = version = '2.25.1.dev17'
|
16
|
+
__version_tuple__ = version_tuple = (2, 25, 1, 'dev17')
|
@@ -80,8 +80,7 @@ class LocustTomlConfigParser(configargparse.TomlConfigParser):
|
|
80
80
|
result = OrderedDict()
|
81
81
|
|
82
82
|
for section in self.sections:
|
83
|
-
data
|
84
|
-
if data:
|
83
|
+
if data := configargparse.get_toml_section(config, section):
|
85
84
|
for key, value in data.items():
|
86
85
|
if isinstance(value, list):
|
87
86
|
result[key] = value
|
@@ -12,11 +12,12 @@ import socket
|
|
12
12
|
import time
|
13
13
|
import traceback
|
14
14
|
from base64 import b64encode
|
15
|
+
from collections.abc import Generator
|
15
16
|
from contextlib import contextmanager
|
16
17
|
from http.cookiejar import CookieJar
|
17
18
|
from json.decoder import JSONDecodeError
|
18
19
|
from ssl import SSLError
|
19
|
-
from typing import Any, Callable,
|
20
|
+
from typing import Any, Callable, cast
|
20
21
|
from urllib.parse import urlparse, urlunparse
|
21
22
|
|
22
23
|
import gevent
|
@@ -404,8 +405,7 @@ class FastHttpUser(User):
|
|
404
405
|
except Exception as e:
|
405
406
|
error_lines = []
|
406
407
|
for l in traceback.format_exc().split("\n"):
|
407
|
-
m
|
408
|
-
if m:
|
408
|
+
if m := self._callstack_regex.match(l):
|
409
409
|
filename = re.sub(r"/(home|Users/\w*)/", "~/", m.group(1))
|
410
410
|
error_lines.append(filename + ":" + m.group(2) + m.group(3))
|
411
411
|
short_resp = resp.text[:200] if resp.text else resp.text
|
@@ -1,14 +1,13 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import contextlib
|
4
|
-
import functools
|
5
4
|
import itertools
|
6
5
|
import math
|
7
|
-
import sys
|
8
6
|
import time
|
9
7
|
from collections import defaultdict
|
8
|
+
from collections.abc import Generator, Iterator
|
10
9
|
from operator import attrgetter
|
11
|
-
from typing import TYPE_CHECKING
|
10
|
+
from typing import TYPE_CHECKING
|
12
11
|
|
13
12
|
import gevent
|
14
13
|
from roundrobin import smooth
|
@@ -18,20 +17,6 @@ if TYPE_CHECKING:
|
|
18
17
|
from locust.runners import WorkerNode
|
19
18
|
|
20
19
|
|
21
|
-
def compatible_math_gcd(*args: int) -> int:
|
22
|
-
"""
|
23
|
-
This function is a workaround for the fact that `math.gcd` in:
|
24
|
-
- 3.5 <= Python < 3.9 doesn't accept more than two arguments.
|
25
|
-
- 3.9 <= Python can accept more than two arguments.
|
26
|
-
See more at https://docs.python.org/3.9/library/math.html#math.gcd
|
27
|
-
"""
|
28
|
-
if (3, 5) <= sys.version_info < (3, 9):
|
29
|
-
return functools.reduce(math.gcd, args)
|
30
|
-
elif sys.version_info >= (3, 9):
|
31
|
-
return math.gcd(*args)
|
32
|
-
raise NotImplementedError("This function is only implemented for Python from 3.5")
|
33
|
-
|
34
|
-
|
35
20
|
# To profile line-by-line, uncomment the code below (i.e. `import line_profiler ...`) and
|
36
21
|
# place `@profile` on the functions/methods you wish to profile. Then, in the unit test you are
|
37
22
|
# running, use `from locust.dispatch import profile; profile.print_stats()` at the end of the unit test.
|
@@ -406,7 +391,7 @@ class UsersDispatcher(Iterator):
|
|
406
391
|
max_order_of_magnitude = _get_order_of_magnitude(min(abs(u[1]) for u in users))
|
407
392
|
weights = tuple(int(u[1] * max_order_of_magnitude) for u in users)
|
408
393
|
|
409
|
-
greatest_common_divisor =
|
394
|
+
greatest_common_divisor = math.gcd(*weights)
|
410
395
|
normalized_values = [
|
411
396
|
(
|
412
397
|
user[0].__name__,
|
@@ -3,8 +3,9 @@ from __future__ import annotations
|
|
3
3
|
import logging
|
4
4
|
import time
|
5
5
|
import traceback
|
6
|
+
from collections.abc import Generator
|
6
7
|
from contextlib import contextmanager
|
7
|
-
from typing import Any
|
8
|
+
from typing import Any
|
8
9
|
|
9
10
|
from . import log
|
10
11
|
from .exception import InterruptTaskSet, RescheduleTask, RescheduleTaskImmediately, StopUser
|
@@ -41,8 +41,7 @@ def get_html_report(
|
|
41
41
|
start_ts = stats.start_time
|
42
42
|
start_time = datetime.datetime.utcfromtimestamp(start_ts).strftime("%Y-%m-%d %H:%M:%S")
|
43
43
|
|
44
|
-
end_ts
|
45
|
-
if end_ts:
|
44
|
+
if end_ts := stats.last_request_timestamp:
|
46
45
|
end_time = datetime.datetime.utcfromtimestamp(end_ts).strftime("%Y-%m-%d %H:%M:%S")
|
47
46
|
else:
|
48
47
|
end_time = start_time
|
@@ -216,8 +216,7 @@ def main():
|
|
216
216
|
gc.collect() # avoid freezing garbage
|
217
217
|
gc.freeze() # move all objects to perm gen so ref counts dont get updated
|
218
218
|
for _ in range(options.processes):
|
219
|
-
child_pid
|
220
|
-
if child_pid:
|
219
|
+
if child_pid := gevent.fork():
|
221
220
|
children.append(child_pid)
|
222
221
|
logging.debug(f"Started child worker with pid #{child_pid}")
|
223
222
|
else:
|
@@ -250,12 +249,8 @@ def main():
|
|
250
249
|
# nothing more to do, just wait for the children to exit
|
251
250
|
for child_pid in children:
|
252
251
|
_, child_status = os.waitpid(child_pid, 0)
|
253
|
-
|
254
|
-
|
255
|
-
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
256
|
-
exit_code = max(exit_code, child_exit_code)
|
257
|
-
except AttributeError:
|
258
|
-
pass # dammit python 3.8...
|
252
|
+
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
253
|
+
exit_code = max(exit_code, child_exit_code)
|
259
254
|
sys.exit(exit_code)
|
260
255
|
else:
|
261
256
|
options.master = True
|
@@ -270,12 +265,8 @@ def main():
|
|
270
265
|
try:
|
271
266
|
_, child_status = os.waitpid(child_pid, os.WNOHANG)
|
272
267
|
children.remove(child_pid)
|
273
|
-
|
274
|
-
|
275
|
-
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
276
|
-
exit_code = max(exit_code, child_exit_code)
|
277
|
-
except AttributeError:
|
278
|
-
pass # dammit python 3.8...
|
268
|
+
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
269
|
+
exit_code = max(exit_code, child_exit_code)
|
279
270
|
except OSError as e:
|
280
271
|
if e.errno == errno.EINTR:
|
281
272
|
time.sleep(0.1)
|
@@ -291,12 +282,8 @@ def main():
|
|
291
282
|
pass # never mind, process was already dead
|
292
283
|
for child_pid in children:
|
293
284
|
_, child_status = os.waitpid(child_pid, 0)
|
294
|
-
|
295
|
-
|
296
|
-
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
297
|
-
exit_code = max(exit_code, child_exit_code)
|
298
|
-
except AttributeError:
|
299
|
-
pass # dammit python 3.8...
|
285
|
+
child_exit_code = os.waitstatus_to_exitcode(child_status)
|
286
|
+
exit_code = max(exit_code, child_exit_code)
|
300
287
|
if exit_code > 1:
|
301
288
|
logging.error(f"Bad response code from worker children: {exit_code}")
|
302
289
|
# ensure master doesnt finish until output from workers has arrived
|
@@ -327,8 +314,7 @@ def main():
|
|
327
314
|
|
328
315
|
# make sure specified User exists
|
329
316
|
if options.user_classes:
|
330
|
-
missing
|
331
|
-
if missing:
|
317
|
+
if missing := set(options.user_classes) - set(user_classes.keys()):
|
332
318
|
logger.error(f"Unknown User(s): {', '.join(missing)}\n")
|
333
319
|
sys.exit(1)
|
334
320
|
else:
|
@@ -356,9 +342,6 @@ It's not high enough for load testing, and the OS didn't allow locust to increas
|
|
356
342
|
See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-number-of-open-files-limit for more info."""
|
357
343
|
)
|
358
344
|
|
359
|
-
if sys.version_info < (3, 9):
|
360
|
-
logger.warning("Python 3.8 support is deprecated and will be removed soon")
|
361
|
-
|
362
345
|
# create locust Environment
|
363
346
|
locustfile_path = None if not locustfile else os.path.basename(locustfile)
|
364
347
|
|
@@ -14,7 +14,7 @@ import time
|
|
14
14
|
import traceback
|
15
15
|
from abc import abstractmethod
|
16
16
|
from collections import defaultdict
|
17
|
-
from collections.abc import MutableMapping
|
17
|
+
from collections.abc import Iterator, MutableMapping, ValuesView
|
18
18
|
from operator import (
|
19
19
|
itemgetter,
|
20
20
|
methodcaller,
|
@@ -24,10 +24,8 @@ from typing import (
|
|
24
24
|
TYPE_CHECKING,
|
25
25
|
Any,
|
26
26
|
Callable,
|
27
|
-
Iterator,
|
28
27
|
NoReturn,
|
29
28
|
TypedDict,
|
30
|
-
ValuesView,
|
31
29
|
cast,
|
32
30
|
)
|
33
31
|
from uuid import uuid4
|
@@ -10,6 +10,10 @@ import signal
|
|
10
10
|
import time
|
11
11
|
from abc import abstractmethod
|
12
12
|
from collections import OrderedDict, defaultdict, namedtuple
|
13
|
+
from collections import (
|
14
|
+
OrderedDict as OrderedDictType,
|
15
|
+
)
|
16
|
+
from collections.abc import Iterable
|
13
17
|
from copy import copy
|
14
18
|
from html import escape
|
15
19
|
from itertools import chain
|
@@ -19,16 +23,12 @@ from typing import (
|
|
19
23
|
TYPE_CHECKING,
|
20
24
|
Any,
|
21
25
|
Callable,
|
22
|
-
Iterable,
|
23
26
|
NoReturn,
|
24
27
|
Protocol,
|
25
28
|
TypedDict,
|
26
29
|
TypeVar,
|
27
30
|
cast,
|
28
31
|
)
|
29
|
-
from typing import (
|
30
|
-
OrderedDict as OrderedDictType,
|
31
|
-
)
|
32
32
|
|
33
33
|
import gevent
|
34
34
|
|
@@ -177,8 +177,7 @@ def diff_response_time_dicts(latest: dict[int, int], old: dict[int, int]) -> dic
|
|
177
177
|
"""
|
178
178
|
new = {}
|
179
179
|
for t in latest:
|
180
|
-
diff
|
181
|
-
if diff:
|
180
|
+
if diff := latest[t] - old.get(t, 0):
|
182
181
|
new[t] = diff
|
183
182
|
return new
|
184
183
|
|
@@ -27,8 +27,7 @@ class TestDebugging(DebugTestCase):
|
|
27
27
|
pass
|
28
28
|
|
29
29
|
def _stop_user():
|
30
|
-
user
|
31
|
-
if user:
|
30
|
+
if user := getattr(debug._env, "single_user_instance", None):
|
32
31
|
user._state = LOCUST_STATE_STOPPING
|
33
32
|
|
34
33
|
t = Timer(1, _stop_user)
|
@@ -3,12 +3,11 @@ from locust.env import Environment
|
|
3
3
|
from locust.exception import StopUser
|
4
4
|
|
5
5
|
from collections import defaultdict
|
6
|
-
from typing import DefaultDict
|
7
6
|
from unittest import TestCase
|
8
7
|
|
9
8
|
|
10
9
|
class InterruptableTaskSet(SequentialTaskSet):
|
11
|
-
counter:
|
10
|
+
counter: defaultdict[str, int] = defaultdict(int)
|
12
11
|
|
13
12
|
def on_start(self):
|
14
13
|
super().on_start()
|
@@ -483,7 +483,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
483
483
|
self.assertIn("Shutting down (exit code 0)", stderr)
|
484
484
|
self.assertEqual(0, proc.returncode)
|
485
485
|
|
486
|
-
@unittest.skipIf(sys.version_info < (3, 9), reason="dies in 3.8 on GH and I cant be bothered to investigate it")
|
487
486
|
def test_default_headless_spawn_options_with_shape(self):
|
488
487
|
content = MOCK_LOCUSTFILE_CONTENT + textwrap.dedent(
|
489
488
|
"""
|
@@ -1618,9 +1617,10 @@ class SecondUser(HttpUser):
|
|
1618
1617
|
pass
|
1619
1618
|
"""
|
1620
1619
|
)
|
1621
|
-
with
|
1622
|
-
|
1623
|
-
|
1620
|
+
with (
|
1621
|
+
mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked,
|
1622
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.01") as _,
|
1623
|
+
):
|
1624
1624
|
proc = subprocess.Popen(
|
1625
1625
|
[
|
1626
1626
|
"locust",
|
@@ -2225,7 +2225,6 @@ class AnyUser(User):
|
|
2225
2225
|
|
2226
2226
|
self.assertNotIn("Traceback", stderr)
|
2227
2227
|
self.assertIn("INFO/locust.runners: sys.exit(42) called", stderr)
|
2228
|
-
|
2229
|
-
self.assertEqual(status_code, 42)
|
2228
|
+
self.assertEqual(status_code, 42)
|
2230
2229
|
self.assertNotIn("Traceback", master_stderr)
|
2231
2230
|
self.assertIn("failed to send heartbeat, setting state to missing", master_stderr)
|
@@ -992,8 +992,9 @@ class TestMasterWorkerRunners(LocustTestCase):
|
|
992
992
|
context={},
|
993
993
|
)
|
994
994
|
|
995
|
-
with
|
996
|
-
"
|
995
|
+
with (
|
996
|
+
mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3),
|
997
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"),
|
997
998
|
):
|
998
999
|
# start a Master runner
|
999
1000
|
options = parse_options(["--enable-rebalancing"])
|
@@ -1419,9 +1420,12 @@ class TestMasterWorkerRunners(LocustTestCase):
|
|
1419
1420
|
return None
|
1420
1421
|
|
1421
1422
|
locust_worker_additional_wait_before_ready_after_stop = 5
|
1422
|
-
with
|
1423
|
-
"
|
1424
|
-
|
1423
|
+
with (
|
1424
|
+
mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3),
|
1425
|
+
patch_env(
|
1426
|
+
"LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
|
1427
|
+
str(locust_worker_additional_wait_before_ready_after_stop),
|
1428
|
+
),
|
1425
1429
|
):
|
1426
1430
|
stop_timeout = 5
|
1427
1431
|
master_env = Environment(
|
@@ -1676,9 +1680,12 @@ class TestMasterWorkerRunners(LocustTestCase):
|
|
1676
1680
|
user_class.weight = random.uniform(1, 20)
|
1677
1681
|
|
1678
1682
|
locust_worker_additional_wait_before_ready_after_stop = 5
|
1679
|
-
with
|
1680
|
-
"
|
1681
|
-
|
1683
|
+
with (
|
1684
|
+
mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3),
|
1685
|
+
patch_env(
|
1686
|
+
"LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
|
1687
|
+
str(locust_worker_additional_wait_before_ready_after_stop),
|
1688
|
+
),
|
1682
1689
|
):
|
1683
1690
|
stop_timeout = 5
|
1684
1691
|
master_env = Environment(
|
@@ -1706,12 +1713,7 @@ class TestMasterWorkerRunners(LocustTestCase):
|
|
1706
1713
|
while master.state != STATE_STOPPED:
|
1707
1714
|
self.assertTrue(time.time() - ts <= master_env.shape_class.stages[-1][0] + 60, master.state)
|
1708
1715
|
print(
|
1709
|
-
"{:.2f}/{:.2f} | {} | {:.0f} | "
|
1710
|
-
time.time() - ts,
|
1711
|
-
master_env.shape_class.stages[-1][0],
|
1712
|
-
master.state,
|
1713
|
-
sum(master.reported_user_classes_count.values()),
|
1714
|
-
)
|
1716
|
+
f"{time.time() - ts:.2f}/{master_env.shape_class.stages[-1][0]:.2f} | {master.state} | {sum(master.reported_user_classes_count.values()):.0f} | "
|
1715
1717
|
+ json.dumps(dict(sorted(master.reported_user_classes_count.items(), key=itemgetter(0))))
|
1716
1718
|
)
|
1717
1719
|
sleep(1)
|
@@ -1822,9 +1824,12 @@ class TestMasterWorkerRunners(LocustTestCase):
|
|
1822
1824
|
return None
|
1823
1825
|
|
1824
1826
|
locust_worker_additional_wait_before_ready_after_stop = 2
|
1825
|
-
with
|
1826
|
-
"
|
1827
|
-
|
1827
|
+
with (
|
1828
|
+
mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3),
|
1829
|
+
patch_env(
|
1830
|
+
"LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
|
1831
|
+
str(locust_worker_additional_wait_before_ready_after_stop),
|
1832
|
+
),
|
1828
1833
|
):
|
1829
1834
|
master_env = Environment(user_classes=[TestUser1], shape_class=TestShape())
|
1830
1835
|
|
@@ -2192,8 +2197,9 @@ class TestMasterRunner(LocustRunnerTestCase):
|
|
2192
2197
|
def my_task(self):
|
2193
2198
|
gevent.sleep(600)
|
2194
2199
|
|
2195
|
-
with
|
2196
|
-
"
|
2200
|
+
with (
|
2201
|
+
mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server,
|
2202
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"),
|
2197
2203
|
):
|
2198
2204
|
master = self.get_runner(user_classes=[TestUser])
|
2199
2205
|
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
|
@@ -2220,8 +2226,9 @@ class TestMasterRunner(LocustRunnerTestCase):
|
|
2220
2226
|
def my_task(self):
|
2221
2227
|
gevent.sleep(600)
|
2222
2228
|
|
2223
|
-
with
|
2224
|
-
"
|
2229
|
+
with (
|
2230
|
+
mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server,
|
2231
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"),
|
2225
2232
|
):
|
2226
2233
|
master = self.get_runner(user_classes=[TestUser])
|
2227
2234
|
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
|
@@ -2291,8 +2298,9 @@ class TestMasterRunner(LocustRunnerTestCase):
|
|
2291
2298
|
def my_task(self):
|
2292
2299
|
gevent.sleep(600)
|
2293
2300
|
|
2294
|
-
with
|
2295
|
-
"
|
2301
|
+
with (
|
2302
|
+
mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server,
|
2303
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"),
|
2296
2304
|
):
|
2297
2305
|
master = self.get_runner(user_classes=[TestUser])
|
2298
2306
|
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
|
@@ -3154,8 +3162,9 @@ class TestMasterRunner(LocustRunnerTestCase):
|
|
3154
3162
|
assert_cache_hits()
|
3155
3163
|
|
3156
3164
|
master._wait_for_workers_report_after_ramp_up.cache_clear()
|
3157
|
-
with
|
3158
|
-
"
|
3165
|
+
with (
|
3166
|
+
mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=1.5),
|
3167
|
+
patch_env("LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "5.7 * WORKER_REPORT_INTERVAL"),
|
3159
3168
|
):
|
3160
3169
|
self.assertEqual(master._wait_for_workers_report_after_ramp_up(), 5.7 * 1.5)
|
3161
3170
|
assert_cache_hits()
|
@@ -34,8 +34,7 @@ def fast():
|
|
34
34
|
|
35
35
|
@app.route("/slow")
|
36
36
|
def slow():
|
37
|
-
delay
|
38
|
-
if delay:
|
37
|
+
if delay := request.args.get("delay"):
|
39
38
|
gevent.sleep(float(delay))
|
40
39
|
else:
|
41
40
|
gevent.sleep(random.choice([0.5, 1, 1.5]))
|
@@ -85,8 +84,7 @@ def status_204():
|
|
85
84
|
|
86
85
|
@app.route("/redirect", methods=["GET", "POST"])
|
87
86
|
def do_redirect():
|
88
|
-
delay
|
89
|
-
if delay:
|
87
|
+
if delay := request.args.get("delay"):
|
90
88
|
gevent.sleep(float(delay))
|
91
89
|
url = request.args.get("url", "/ultra_fast")
|
92
90
|
return redirect(url)
|
@@ -10,7 +10,6 @@ from typing import (
|
|
10
10
|
TYPE_CHECKING,
|
11
11
|
Callable,
|
12
12
|
Protocol,
|
13
|
-
Type,
|
14
13
|
TypeVar,
|
15
14
|
final,
|
16
15
|
overload,
|
@@ -25,7 +24,7 @@ if TYPE_CHECKING:
|
|
25
24
|
|
26
25
|
|
27
26
|
logger = logging.getLogger(__name__)
|
28
|
-
TaskT = TypeVar("TaskT", Callable[..., None],
|
27
|
+
TaskT = TypeVar("TaskT", Callable[..., None], type["TaskSet"])
|
29
28
|
|
30
29
|
LOCUST_STATE_RUNNING, LOCUST_STATE_WAITING, LOCUST_STATE_STOPPING = ["running", "waiting", "stopping"]
|
31
30
|
|
@@ -604,8 +604,7 @@ class WebUI:
|
|
604
604
|
|
605
605
|
options = self.environment.parsed_options
|
606
606
|
|
607
|
-
is_distributed
|
608
|
-
if is_distributed:
|
607
|
+
if is_distributed := isinstance(self.environment.runner, MasterRunner):
|
609
608
|
worker_count = self.environment.runner.worker_count
|
610
609
|
else:
|
611
610
|
worker_count = 0
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|