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.
Files changed (352) hide show
  1. locust-2.25.1.dev17/.pre-commit-config.yaml +10 -0
  2. {locust-2.25.1.dev8/locust.egg-info → locust-2.25.1.dev17}/PKG-INFO +1 -1
  3. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/developing-locust.rst +3 -1
  4. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/installation.rst +1 -1
  5. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/rest.py +5 -7
  6. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/_version.py +2 -2
  7. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/argument_parser.py +1 -2
  8. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/clients.py +1 -1
  9. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/contrib/fasthttp.py +3 -3
  10. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/dispatch.py +3 -18
  11. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/event.py +2 -1
  12. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/html.py +1 -2
  13. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/input_events.py +1 -2
  14. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/main.py +8 -25
  15. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/runners.py +1 -3
  16. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/stats.py +5 -6
  17. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/mock_logging.py +1 -1
  18. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_debugging.py +1 -2
  19. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_interruptable_task.py +1 -2
  20. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_main.py +5 -6
  21. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_runners.py +34 -25
  22. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/testcases.py +2 -4
  23. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/task.py +1 -2
  24. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/web.py +1 -2
  25. {locust-2.25.1.dev8 → locust-2.25.1.dev17/locust.egg-info}/PKG-INFO +1 -1
  26. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/SOURCES.txt +1 -0
  27. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/pyproject.toml +1 -1
  28. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.coveragerc +0 -0
  29. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.dockerignore +0 -0
  30. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.git-blame-ignore-revs +0 -0
  31. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.gitattributes +0 -0
  32. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/CONTRIBUTING.md +0 -0
  33. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  34. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  35. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  36. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/workflows/stale.yml +0 -0
  37. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.github/workflows/tests.yml +0 -0
  38. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.gitignore +0 -0
  39. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.readthedocs.yaml +0 -0
  40. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/extensions.json +0 -0
  41. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/launch.json +0 -0
  42. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/launch_locust.json +0 -0
  43. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/.vscode/settings.json +0 -0
  44. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/CHANGELOG.md +0 -0
  45. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Dockerfile +0 -0
  46. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/LICENSE +0 -0
  47. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/MANIFEST.in +0 -0
  48. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Makefile +0 -0
  49. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/README +0 -0
  50. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/README.md +0 -0
  51. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/SECURITY.md +0 -0
  52. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/Vagrantfile +0 -0
  53. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/benchmarks/dispatch.py +0 -0
  54. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/_static/theme-overrides.css +0 -0
  55. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/api.rst +0 -0
  56. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/changelog.rst +0 -0
  57. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/conf.py +0 -0
  58. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/configuration.rst +0 -0
  59. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/custom-load-shape.rst +0 -0
  60. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/extending-locust.rst +0 -0
  61. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/further-reading.rst +0 -0
  62. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/history.rst +0 -0
  63. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
  64. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/locust_workers.png +0 -0
  65. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/number_of_users.png +0 -0
  66. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/response_times.png +0 -0
  67. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/total_requests_per_second.png +0 -0
  68. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/userclass_picker_example.png +0 -0
  69. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/webui-running-statistics.png +0 -0
  70. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/images/webui-splash-screenshot.png +0 -0
  71. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/increase-performance.rst +0 -0
  72. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/index.rst +0 -0
  73. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/logging.rst +0 -0
  74. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/quickstart.rst +0 -0
  75. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/requirements.txt +0 -0
  76. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/retrieving-stats.rst +0 -0
  77. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-cloud-integration.rst +0 -0
  78. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-distributed.rst +0 -0
  79. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-in-debugger.rst +0 -0
  80. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-in-docker.rst +0 -0
  81. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/running-without-web-ui.rst +0 -0
  82. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/tasksets.rst +0 -0
  83. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/testing-other-systems.rst +0 -0
  84. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/use-as-lib.rst +0 -0
  85. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/what-is-locust.rst +0 -0
  86. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/docs/writing-a-locustfile.rst +0 -0
  87. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/add_command_line_argument.py +0 -0
  88. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/basic.py +0 -0
  89. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/browse_docs_sequence_test.py +0 -0
  90. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/browse_docs_test.py +0 -0
  91. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_messages.py +0 -0
  92. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/double_wave.py +0 -0
  93. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/stages.py +0 -0
  94. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/staging_user_classes.py +0 -0
  95. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/step_load.py +0 -0
  96. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_shape/wait_user_count.py +0 -0
  97. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_wait_function.py +0 -0
  98. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_xmlrpc_client/server.py +0 -0
  99. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
  100. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/debugging.py +0 -0
  101. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/debugging_advanced.py +0 -0
  102. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/docker-compose/docker-compose.yml +0 -0
  103. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/dynamic_user_credentials.py +0 -0
  104. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/events.py +0 -0
  105. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_modern_web_ui.py +0 -0
  106. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/extend.py +0 -0
  107. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/static/custom-stats-table.css +0 -0
  108. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/static/extend.js +0 -0
  109. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/extend_web_ui/templates/extend.html +0 -0
  110. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/fast_http_locust.py +0 -0
  111. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/grpc_user.py +0 -0
  112. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello.proto +0 -0
  113. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_pb2.py +0 -0
  114. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_pb2_grpc.py +0 -0
  115. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/hello_server.py +0 -0
  116. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/grpc/locustfile.py +0 -0
  117. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/locustfile.py +0 -0
  118. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/manual_stats_reporting.py +0 -0
  119. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/multiple_hosts.py +0 -0
  120. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/nested_inline_tasksets.py +0 -0
  121. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
  122. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/semaphore_wait.py +0 -0
  123. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/stop_on_threshold.py +0 -0
  124. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/README.md +0 -0
  125. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/data_subnet.tf +0 -0
  126. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/main.tf +0 -0
  127. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/output.tf +0 -0
  128. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/plan/basic.py +0 -0
  129. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/provisioner.tf +0 -0
  130. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/terraform/aws/variables.tf +0 -0
  131. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/test_data_management.py +0 -0
  132. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/use_as_lib.py +0 -0
  133. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/vagrant/README.md +0 -0
  134. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/vagrant/supervisord.conf +0 -0
  135. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/web_ui_auth.py +0 -0
  136. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/web_ui_cache_stats.py +0 -0
  137. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/examples/worker_index.py +0 -0
  138. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/generate_changelog.py +0 -0
  139. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/__init__.py +0 -0
  140. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/__main__.py +0 -0
  141. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/contrib/__init__.py +0 -0
  142. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/debug.py +0 -0
  143. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/env.py +0 -0
  144. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/exception.py +0 -0
  145. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/log.py +0 -0
  146. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/py.typed +0 -0
  147. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/__init__.py +0 -0
  148. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/protocol.py +0 -0
  149. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/rpc/zmqrpc.py +0 -0
  150. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/shape.py +0 -0
  151. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/chart.js +0 -0
  152. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/application.css +0 -0
  153. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/application.css.map +0 -0
  154. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/tables.css +0 -0
  155. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/css/tables.css.map +0 -0
  156. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/echarts.common.min.js +0 -0
  157. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/favicon.ico +0 -0
  158. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/logo.png +0 -0
  159. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-charts.png +0 -0
  160. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-start-test.png +0 -0
  161. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-stats.png +0 -0
  162. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/img/ui-screenshot-workers.png +0 -0
  163. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery-1.11.3.min.js +0 -0
  164. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery.jqote2.min.js +0 -0
  165. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/jquery.tools.min.js +0 -0
  166. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/locust.js +0 -0
  167. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/_base.sass +0 -0
  168. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/_mixins.sass +0 -0
  169. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/application.sass +0 -0
  170. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/sass/tables.sass +0 -0
  171. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/tasks.js +0 -0
  172. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/static/vintage.js +0 -0
  173. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/index.html +0 -0
  174. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/report.html +0 -0
  175. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/templates/stats_data.html +0 -0
  176. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/__init__.py +0 -0
  177. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/fake_module1_for_env_test.py +0 -0
  178. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/fake_module2_for_env_test.py +0 -0
  179. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/mock_locustfile.py +0 -0
  180. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_dispatch.py +0 -0
  181. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_env.py +0 -0
  182. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_fasthttp.py +0 -0
  183. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_http.py +0 -0
  184. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_load_locustfile.py +0 -0
  185. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_locust_class.py +0 -0
  186. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_log.py +0 -0
  187. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_old_wait_api.py +0 -0
  188. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_parser.py +0 -0
  189. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_sequential_taskset.py +0 -0
  190. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_stats.py +0 -0
  191. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_tags.py +0 -0
  192. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_taskratio.py +0 -0
  193. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_users.py +0 -0
  194. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_util.py +0 -0
  195. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_wait_time.py +0 -0
  196. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_web.py +0 -0
  197. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/test_zmqrpc.py +0 -0
  198. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/test/util.py +0 -0
  199. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/__init__.py +0 -0
  200. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/inspectuser.py +0 -0
  201. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/sequential_taskset.py +0 -0
  202. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/users.py +0 -0
  203. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/user/wait_time.py +0 -0
  204. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/__init__.py +0 -0
  205. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/cache.py +0 -0
  206. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/deprecation.py +0 -0
  207. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/exception_handler.py +0 -0
  208. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/load_locustfile.py +0 -0
  209. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/rounding.py +0 -0
  210. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/util/timespan.py +0 -0
  211. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.eslintrc +0 -0
  212. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.gitignore +0 -0
  213. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/.prettierrc +0 -0
  214. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/auth.html +0 -0
  215. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dev.html +0 -0
  216. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/favicon.ico +0 -0
  217. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/index-941b6e82.js +0 -0
  218. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/assets/logo.png +0 -0
  219. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/auth.html +0 -0
  220. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/index.html +0 -0
  221. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/dist/report.html +0 -0
  222. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/index.html +0 -0
  223. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/package.json +0 -0
  224. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/assets/favicon.ico +0 -0
  225. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/assets/logo.png +0 -0
  226. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/public/report.html +0 -0
  227. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/App.test.tsx +0 -0
  228. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/App.tsx +0 -0
  229. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
  230. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
  231. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
  232. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
  233. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
  234. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
  235. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/Form.tsx +0 -0
  236. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/Select.tsx +0 -0
  237. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
  238. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
  239. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
  240. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
  241. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Layout.tsx +0 -0
  242. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
  243. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
  244. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
  245. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
  246. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
  247. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
  248. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
  249. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
  250. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
  251. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
  252. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Modal/Modal.tsx +0 -0
  253. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
  254. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Reports/Reports.tsx +0 -0
  255. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
  256. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
  257. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
  258. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
  259. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
  260. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
  261. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
  262. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
  263. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
  264. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
  265. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
  266. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
  267. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
  268. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
  269. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
  270. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
  271. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
  272. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
  273. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
  274. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
  275. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
  276. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
  277. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Table/Table.test.tsx +0 -0
  278. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Table/Table.tsx +0 -0
  279. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
  280. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
  281. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
  282. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
  283. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
  284. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
  285. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/auth.ts +0 -0
  286. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/swarm.ts +0 -0
  287. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/constants/theme.ts +0 -0
  288. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/global.d.ts +0 -0
  289. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
  290. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
  291. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
  292. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
  293. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useInterval.ts +0 -0
  294. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useNotifications.ts +0 -0
  295. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
  296. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSortByField.ts +0 -0
  297. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
  298. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/index.tsx +0 -0
  299. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/Auth.tsx +0 -0
  300. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/Dashboard.tsx +0 -0
  301. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/HtmlReport.tsx +0 -0
  302. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
  303. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
  304. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
  305. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/api/swarm.ts +0 -0
  306. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/hooks.ts +0 -0
  307. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
  308. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
  309. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/root.slice.ts +0 -0
  310. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
  311. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
  312. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
  313. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
  314. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/slice/url.slice.ts +0 -0
  315. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/store.ts +0 -0
  316. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/redux/utils.ts +0 -0
  317. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/styles/theme.ts +0 -0
  318. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/constants.ts +0 -0
  319. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
  320. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
  321. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/setup.ts +0 -0
  322. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/test/testUtils.tsx +0 -0
  323. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/auth.types.ts +0 -0
  324. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/swarm.types.ts +0 -0
  325. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/tab.types.ts +0 -0
  326. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/table.types.ts +0 -0
  327. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/types/ui.types.ts +0 -0
  328. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/number.ts +0 -0
  329. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/object.ts +0 -0
  330. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/string.ts +0 -0
  331. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/number.test.ts +0 -0
  332. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/object.test.ts +0 -0
  333. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/string.test.ts +0 -0
  334. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/tests/url.test.ts +0 -0
  335. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/src/utils/url.ts +0 -0
  336. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/tsconfig.json +0 -0
  337. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/vite.config.ts +0 -0
  338. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/vitest.config.ts +0 -0
  339. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust/webui/yarn.lock +0 -0
  340. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/dependency_links.txt +0 -0
  341. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/entry_points.txt +0 -0
  342. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/not-zip-safe +0 -0
  343. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/requires.txt +0 -0
  344. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/locust.egg-info/top_level.txt +0 -0
  345. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/package.json +0 -0
  346. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/locustfile.py +0 -0
  347. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-disributed-headless.sh +0 -0
  348. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-disributed-web.sh +0 -0
  349. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-local-headless.sh +0 -0
  350. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/scripts/run-local-web.sh +0 -0
  351. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/setup.cfg +0 -0
  352. {locust-2.25.1.dev8 → locust-2.25.1.dev17}/tox.ini +0 -0
@@ -0,0 +1,10 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ # Ruff version.
4
+ rev: v0.3.7
5
+ hooks:
6
+ # Run the linter.
7
+ - id: ruff
8
+ args: [--fix]
9
+ # Run the formatter.
10
+ - id: ruff-format
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.25.1.dev8
3
+ Version: 2.25.1.dev17
4
4
  Summary: Developer friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -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
- Before you open a pull request, make sure all the checks work. And if you are adding a feature, make sure it is documented (in ``docs/*.rst``).
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.8 or later)
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
- # this only works in python 3.8 and up, so it is commented out:
44
- # if sys.version_info >= (3, 8):
45
- # with self.rest("", "/post", json={"foo": 1}) as resp:
46
- # # assign and assert in one line
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.dev8'
16
- __version_tuple__ = version_tuple = (2, 25, 1, 'dev8')
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 = configargparse.get_toml_section(config, section)
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
@@ -2,8 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  import time
5
+ from collections.abc import Generator
5
6
  from contextlib import contextmanager
6
- from typing import Generator
7
7
  from urllib.parse import urlparse, urlunparse
8
8
 
9
9
  import requests
@@ -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, Generator, cast
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 = self._callstack_regex.match(l)
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, Generator, Iterator
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 = compatible_math_gcd(*weights)
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, Generator
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 = stats.last_request_timestamp
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
@@ -104,8 +104,7 @@ def input_listener(key_to_func_map: dict[str, Callable]):
104
104
 
105
105
  try:
106
106
  while True:
107
- input = poller.poll()
108
- if input:
107
+ if input := poller.poll():
109
108
  for key in key_to_func_map:
110
109
  if input == key:
111
110
  key_to_func_map[key]()
@@ -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 = gevent.fork()
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
- try:
254
- if sys.version_info >= (3, 9):
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
- try:
274
- if sys.version_info >= (3, 9):
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
- try:
295
- if sys.version_info >= (3, 9):
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 = set(options.user_classes) - set(user_classes.keys())
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 = latest[t] - old.get(t, 0)
181
- if diff:
180
+ if diff := latest[t] - old.get(t, 0):
182
181
  new[t] = diff
183
182
  return new
184
183
 
@@ -5,7 +5,7 @@ import logging
5
5
  from typing import List, Union, Dict
6
6
  from types import TracebackType
7
7
 
8
- LogMessage = List[Union[str, Dict[str, TracebackType]]]
8
+ LogMessage = list[Union[str, dict[str, TracebackType]]]
9
9
 
10
10
 
11
11
  class MockedLoggingHandler(logging.Handler):
@@ -27,8 +27,7 @@ class TestDebugging(DebugTestCase):
27
27
  pass
28
28
 
29
29
  def _stop_user():
30
- user = getattr(debug._env, "single_user_instance", None)
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: DefaultDict[str, int] = defaultdict(int)
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 mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked, patch_env(
1622
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.01"
1623
- ) as _:
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
- if sys.version_info >= (3, 9):
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 mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3), patch_env(
996
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
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 mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3), patch_env(
1423
- "LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
1424
- str(locust_worker_additional_wait_before_ready_after_stop),
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 mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3), patch_env(
1680
- "LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
1681
- str(locust_worker_additional_wait_before_ready_after_stop),
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} | ".format(
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 mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=0.3), patch_env(
1826
- "LOCUST_WORKER_ADDITIONAL_WAIT_BEFORE_READY_AFTER_STOP",
1827
- str(locust_worker_additional_wait_before_ready_after_stop),
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 mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
2196
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
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 mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
2224
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
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 mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
2295
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
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 mock.patch("locust.runners.WORKER_REPORT_INTERVAL", new=1.5), patch_env(
3158
- "LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "5.7 * WORKER_REPORT_INTERVAL"
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 = request.args.get("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 = request.args.get("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], Type["TaskSet"])
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 = isinstance(self.environment.runner, MasterRunner)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.25.1.dev8
3
+ Version: 2.25.1.dev17
4
4
  Summary: Developer friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -3,6 +3,7 @@
3
3
  .git-blame-ignore-revs
4
4
  .gitattributes
5
5
  .gitignore
6
+ .pre-commit-config.yaml
6
7
  .readthedocs.yaml
7
8
  CHANGELOG.md
8
9
  Dockerfile
@@ -60,7 +60,7 @@ license-files = ["LICENSE"]
60
60
  include-package-data = false
61
61
 
62
62
  [tool.ruff]
63
- target-version = "py38"
63
+ target-version = "py39"
64
64
  line-length = 120
65
65
  extend-exclude = [
66
66
  "build",
File without changes
File without changes