locust 2.27.0__tar.gz → 2.27.1.dev10__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.27.0 → locust-2.27.1.dev10}/CHANGELOG.md +25 -1
  2. {locust-2.27.0 → locust-2.27.1.dev10}/MANIFEST.in +0 -2
  3. {locust-2.27.0/locust.egg-info → locust-2.27.1.dev10}/PKG-INFO +1 -1
  4. {locust-2.27.0 → locust-2.27.1.dev10}/docs/configuration.rst +0 -2
  5. {locust-2.27.0 → locust-2.27.1.dev10}/docs/developing-locust.rst +1 -1
  6. locust-2.27.0/examples/extend_modern_web_ui.py → locust-2.27.1.dev10/examples/extend_web_ui.py +0 -2
  7. {locust-2.27.0 → locust-2.27.1.dev10}/locust/_version.py +2 -2
  8. {locust-2.27.0 → locust-2.27.1.dev10}/locust/argument_parser.py +13 -16
  9. {locust-2.27.0 → locust-2.27.1.dev10}/locust/env.py +0 -2
  10. locust-2.27.1.dev10/locust/html.py +111 -0
  11. {locust-2.27.0 → locust-2.27.1.dev10}/locust/log.py +2 -1
  12. {locust-2.27.0 → locust-2.27.1.dev10}/locust/main.py +8 -12
  13. {locust-2.27.0 → locust-2.27.1.dev10}/locust/stats.py +3 -10
  14. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_fasthttp.py +6 -4
  15. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_main.py +6 -15
  16. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_web.py +53 -199
  17. {locust-2.27.0 → locust-2.27.1.dev10}/locust/web.py +18 -56
  18. {locust-2.27.0 → locust-2.27.1.dev10/locust.egg-info}/PKG-INFO +1 -1
  19. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/SOURCES.txt +1 -30
  20. {locust-2.27.0 → locust-2.27.1.dev10}/pyproject.toml +1 -3
  21. locust-2.27.0/examples/extend_web_ui/extend.py +0 -142
  22. locust-2.27.0/examples/extend_web_ui/static/custom-stats-table.css +0 -49
  23. locust-2.27.0/examples/extend_web_ui/static/extend.js +0 -54
  24. locust-2.27.0/examples/extend_web_ui/templates/extend.html +0 -52
  25. locust-2.27.0/locust/html.py +0 -157
  26. locust-2.27.0/locust/static/chart.js +0 -133
  27. locust-2.27.0/locust/static/css/application.css +0 -491
  28. locust-2.27.0/locust/static/css/application.css.map +0 -1
  29. locust-2.27.0/locust/static/css/tables.css +0 -74
  30. locust-2.27.0/locust/static/css/tables.css.map +0 -1
  31. locust-2.27.0/locust/static/echarts.common.min.js +0 -22
  32. locust-2.27.0/locust/static/img/logo.png +0 -0
  33. locust-2.27.0/locust/static/img/ui-screenshot-charts.png +0 -0
  34. locust-2.27.0/locust/static/img/ui-screenshot-start-test.png +0 -0
  35. locust-2.27.0/locust/static/img/ui-screenshot-stats.png +0 -0
  36. locust-2.27.0/locust/static/img/ui-screenshot-workers.png +0 -0
  37. locust-2.27.0/locust/static/jquery-1.11.3.min.js +0 -5
  38. locust-2.27.0/locust/static/jquery.jqote2.min.js +0 -14
  39. locust-2.27.0/locust/static/jquery.tools.min.js +0 -17
  40. locust-2.27.0/locust/static/locust.js +0 -324
  41. locust-2.27.0/locust/static/sass/_base.sass +0 -27
  42. locust-2.27.0/locust/static/sass/_mixins.sass +0 -3
  43. locust-2.27.0/locust/static/sass/application.sass +0 -320
  44. locust-2.27.0/locust/static/sass/tables.sass +0 -61
  45. locust-2.27.0/locust/static/tasks.js +0 -48
  46. locust-2.27.0/locust/static/vintage.js +0 -35
  47. locust-2.27.0/locust/templates/index.html +0 -370
  48. locust-2.27.0/locust/templates/report.html +0 -265
  49. locust-2.27.0/locust/templates/stats_data.html +0 -10
  50. locust-2.27.0/locust/webui/public/assets/favicon.ico +0 -0
  51. {locust-2.27.0 → locust-2.27.1.dev10}/.coveragerc +0 -0
  52. {locust-2.27.0 → locust-2.27.1.dev10}/.dockerignore +0 -0
  53. {locust-2.27.0 → locust-2.27.1.dev10}/.git-blame-ignore-revs +0 -0
  54. {locust-2.27.0 → locust-2.27.1.dev10}/.gitattributes +0 -0
  55. {locust-2.27.0 → locust-2.27.1.dev10}/.github/CONTRIBUTING.md +0 -0
  56. {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  57. {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  58. {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  59. {locust-2.27.0 → locust-2.27.1.dev10}/.github/workflows/stale.yml +0 -0
  60. {locust-2.27.0 → locust-2.27.1.dev10}/.github/workflows/tests.yml +0 -0
  61. {locust-2.27.0 → locust-2.27.1.dev10}/.gitignore +0 -0
  62. {locust-2.27.0 → locust-2.27.1.dev10}/.pre-commit-config.yaml +0 -0
  63. {locust-2.27.0 → locust-2.27.1.dev10}/.readthedocs.yaml +0 -0
  64. {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/extensions.json +0 -0
  65. {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/launch.json +0 -0
  66. {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/launch_locust.json +0 -0
  67. {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/settings.json +0 -0
  68. {locust-2.27.0 → locust-2.27.1.dev10}/Dockerfile +0 -0
  69. {locust-2.27.0 → locust-2.27.1.dev10}/LICENSE +0 -0
  70. {locust-2.27.0 → locust-2.27.1.dev10}/Makefile +0 -0
  71. {locust-2.27.0 → locust-2.27.1.dev10}/README +0 -0
  72. {locust-2.27.0 → locust-2.27.1.dev10}/README.md +0 -0
  73. {locust-2.27.0 → locust-2.27.1.dev10}/SECURITY.md +0 -0
  74. {locust-2.27.0 → locust-2.27.1.dev10}/Vagrantfile +0 -0
  75. {locust-2.27.0 → locust-2.27.1.dev10}/benchmarks/dispatch.py +0 -0
  76. {locust-2.27.0 → locust-2.27.1.dev10}/docs/_static/theme-overrides.css +0 -0
  77. {locust-2.27.0 → locust-2.27.1.dev10}/docs/api.rst +0 -0
  78. {locust-2.27.0 → locust-2.27.1.dev10}/docs/changelog.rst +0 -0
  79. {locust-2.27.0 → locust-2.27.1.dev10}/docs/conf.py +0 -0
  80. {locust-2.27.0 → locust-2.27.1.dev10}/docs/custom-load-shape.rst +0 -0
  81. {locust-2.27.0 → locust-2.27.1.dev10}/docs/extending-locust.rst +0 -0
  82. {locust-2.27.0 → locust-2.27.1.dev10}/docs/further-reading.rst +0 -0
  83. {locust-2.27.0 → locust-2.27.1.dev10}/docs/history.rst +0 -0
  84. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
  85. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/locust_workers.png +0 -0
  86. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/number_of_users.png +0 -0
  87. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/response_times.png +0 -0
  88. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/total_requests_per_second.png +0 -0
  89. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/userclass_picker_example.png +0 -0
  90. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/webui-running-statistics.png +0 -0
  91. {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/webui-splash-screenshot.png +0 -0
  92. {locust-2.27.0 → locust-2.27.1.dev10}/docs/increase-performance.rst +0 -0
  93. {locust-2.27.0 → locust-2.27.1.dev10}/docs/index.rst +0 -0
  94. {locust-2.27.0 → locust-2.27.1.dev10}/docs/installation.rst +0 -0
  95. {locust-2.27.0 → locust-2.27.1.dev10}/docs/logging.rst +0 -0
  96. {locust-2.27.0 → locust-2.27.1.dev10}/docs/quickstart.rst +0 -0
  97. {locust-2.27.0 → locust-2.27.1.dev10}/docs/requirements.txt +0 -0
  98. {locust-2.27.0 → locust-2.27.1.dev10}/docs/retrieving-stats.rst +0 -0
  99. {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-distributed.rst +0 -0
  100. {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-in-debugger.rst +0 -0
  101. {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-in-docker.rst +0 -0
  102. {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-without-web-ui.rst +0 -0
  103. {locust-2.27.0 → locust-2.27.1.dev10}/docs/tasksets.rst +0 -0
  104. {locust-2.27.0 → locust-2.27.1.dev10}/docs/testing-other-systems.rst +0 -0
  105. {locust-2.27.0 → locust-2.27.1.dev10}/docs/use-as-lib.rst +0 -0
  106. {locust-2.27.0 → locust-2.27.1.dev10}/docs/what-is-locust.rst +0 -0
  107. {locust-2.27.0 → locust-2.27.1.dev10}/docs/writing-a-locustfile.rst +0 -0
  108. {locust-2.27.0 → locust-2.27.1.dev10}/examples/add_command_line_argument.py +0 -0
  109. {locust-2.27.0 → locust-2.27.1.dev10}/examples/basic.py +0 -0
  110. {locust-2.27.0 → locust-2.27.1.dev10}/examples/browse_docs_sequence_test.py +0 -0
  111. {locust-2.27.0 → locust-2.27.1.dev10}/examples/browse_docs_test.py +0 -0
  112. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_messages.py +0 -0
  113. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/double_wave.py +0 -0
  114. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/stages.py +0 -0
  115. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/staging_user_classes.py +0 -0
  116. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/step_load.py +0 -0
  117. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/wait_user_count.py +0 -0
  118. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_wait_function.py +0 -0
  119. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_xmlrpc_client/server.py +0 -0
  120. {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
  121. {locust-2.27.0 → locust-2.27.1.dev10}/examples/debugging.py +0 -0
  122. {locust-2.27.0 → locust-2.27.1.dev10}/examples/debugging_advanced.py +0 -0
  123. {locust-2.27.0 → locust-2.27.1.dev10}/examples/docker-compose/docker-compose.yml +0 -0
  124. {locust-2.27.0 → locust-2.27.1.dev10}/examples/dynamic_user_credentials.py +0 -0
  125. {locust-2.27.0 → locust-2.27.1.dev10}/examples/events.py +0 -0
  126. {locust-2.27.0 → locust-2.27.1.dev10}/examples/fast_http_locust.py +0 -0
  127. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/grpc_user.py +0 -0
  128. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello.proto +0 -0
  129. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_pb2.py +0 -0
  130. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_pb2_grpc.py +0 -0
  131. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_server.py +0 -0
  132. {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/locustfile.py +0 -0
  133. {locust-2.27.0 → locust-2.27.1.dev10}/examples/locustfile.py +0 -0
  134. {locust-2.27.0 → locust-2.27.1.dev10}/examples/manual_stats_reporting.py +0 -0
  135. {locust-2.27.0 → locust-2.27.1.dev10}/examples/multiple_hosts.py +0 -0
  136. {locust-2.27.0 → locust-2.27.1.dev10}/examples/nested_inline_tasksets.py +0 -0
  137. {locust-2.27.0 → locust-2.27.1.dev10}/examples/rest.py +0 -0
  138. {locust-2.27.0 → locust-2.27.1.dev10}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
  139. {locust-2.27.0 → locust-2.27.1.dev10}/examples/semaphore_wait.py +0 -0
  140. {locust-2.27.0 → locust-2.27.1.dev10}/examples/stop_on_threshold.py +0 -0
  141. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/README.md +0 -0
  142. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/data_subnet.tf +0 -0
  143. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/main.tf +0 -0
  144. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/output.tf +0 -0
  145. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/plan/basic.py +0 -0
  146. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/provisioner.tf +0 -0
  147. {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/variables.tf +0 -0
  148. {locust-2.27.0 → locust-2.27.1.dev10}/examples/test_data_management.py +0 -0
  149. {locust-2.27.0 → locust-2.27.1.dev10}/examples/use_as_lib.py +0 -0
  150. {locust-2.27.0 → locust-2.27.1.dev10}/examples/vagrant/README.md +0 -0
  151. {locust-2.27.0 → locust-2.27.1.dev10}/examples/vagrant/supervisord.conf +0 -0
  152. {locust-2.27.0 → locust-2.27.1.dev10}/examples/web_ui_auth.py +0 -0
  153. {locust-2.27.0 → locust-2.27.1.dev10}/examples/web_ui_cache_stats.py +0 -0
  154. {locust-2.27.0 → locust-2.27.1.dev10}/examples/worker_index.py +0 -0
  155. {locust-2.27.0 → locust-2.27.1.dev10}/generate_changelog.py +0 -0
  156. {locust-2.27.0 → locust-2.27.1.dev10}/locust/__init__.py +0 -0
  157. {locust-2.27.0 → locust-2.27.1.dev10}/locust/__main__.py +0 -0
  158. {locust-2.27.0 → locust-2.27.1.dev10}/locust/clients.py +0 -0
  159. {locust-2.27.0 → locust-2.27.1.dev10}/locust/contrib/__init__.py +0 -0
  160. {locust-2.27.0 → locust-2.27.1.dev10}/locust/contrib/fasthttp.py +0 -0
  161. {locust-2.27.0 → locust-2.27.1.dev10}/locust/debug.py +0 -0
  162. {locust-2.27.0 → locust-2.27.1.dev10}/locust/dispatch.py +0 -0
  163. {locust-2.27.0 → locust-2.27.1.dev10}/locust/event.py +0 -0
  164. {locust-2.27.0 → locust-2.27.1.dev10}/locust/exception.py +0 -0
  165. {locust-2.27.0 → locust-2.27.1.dev10}/locust/input_events.py +0 -0
  166. {locust-2.27.0 → locust-2.27.1.dev10}/locust/py.typed +0 -0
  167. {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/__init__.py +0 -0
  168. {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/protocol.py +0 -0
  169. {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/zmqrpc.py +0 -0
  170. {locust-2.27.0 → locust-2.27.1.dev10}/locust/runners.py +0 -0
  171. {locust-2.27.0 → locust-2.27.1.dev10}/locust/shape.py +0 -0
  172. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/__init__.py +0 -0
  173. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/fake_module1_for_env_test.py +0 -0
  174. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/fake_module2_for_env_test.py +0 -0
  175. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/mock_locustfile.py +0 -0
  176. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/mock_logging.py +0 -0
  177. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_debugging.py +0 -0
  178. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_dispatch.py +0 -0
  179. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_env.py +0 -0
  180. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_http.py +0 -0
  181. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_interruptable_task.py +0 -0
  182. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_load_locustfile.py +0 -0
  183. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_locust_class.py +0 -0
  184. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_log.py +0 -0
  185. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_old_wait_api.py +0 -0
  186. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_parser.py +0 -0
  187. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_runners.py +0 -0
  188. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_sequential_taskset.py +0 -0
  189. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_stats.py +0 -0
  190. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_tags.py +0 -0
  191. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_taskratio.py +0 -0
  192. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_users.py +0 -0
  193. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_util.py +0 -0
  194. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_wait_time.py +0 -0
  195. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_zmqrpc.py +0 -0
  196. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/testcases.py +0 -0
  197. {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/util.py +0 -0
  198. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/__init__.py +0 -0
  199. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/inspectuser.py +0 -0
  200. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/sequential_taskset.py +0 -0
  201. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/task.py +0 -0
  202. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/users.py +0 -0
  203. {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/wait_time.py +0 -0
  204. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/__init__.py +0 -0
  205. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/cache.py +0 -0
  206. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/deprecation.py +0 -0
  207. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/exception_handler.py +0 -0
  208. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/load_locustfile.py +0 -0
  209. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/rounding.py +0 -0
  210. {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/timespan.py +0 -0
  211. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.eslintrc +0 -0
  212. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.gitignore +0 -0
  213. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.prettierrc +0 -0
  214. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/auth.html +0 -0
  215. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dev.html +0 -0
  216. {locust-2.27.0/locust/static/img → locust-2.27.1.dev10/locust/webui/dist/assets}/favicon.ico +0 -0
  217. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/assets/index-941b6e82.js +0 -0
  218. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/assets/logo.png +0 -0
  219. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/auth.html +0 -0
  220. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/index.html +0 -0
  221. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/report.html +0 -0
  222. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/index.html +0 -0
  223. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/package.json +0 -0
  224. {locust-2.27.0/locust/webui/dist → locust-2.27.1.dev10/locust/webui/public}/assets/favicon.ico +0 -0
  225. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/public/assets/logo.png +0 -0
  226. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/public/report.html +0 -0
  227. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/App.test.tsx +0 -0
  228. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/App.tsx +0 -0
  229. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
  230. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
  231. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
  232. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
  233. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
  234. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
  235. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/Form.tsx +0 -0
  236. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/Select.tsx +0 -0
  237. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
  238. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
  239. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
  240. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
  241. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Layout.tsx +0 -0
  242. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
  243. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
  244. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
  245. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
  246. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
  247. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
  248. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
  249. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
  250. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
  251. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
  252. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Modal/Modal.tsx +0 -0
  253. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
  254. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Reports/Reports.tsx +0 -0
  255. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
  256. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
  257. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
  258. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
  259. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
  260. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
  261. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
  262. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
  263. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
  264. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
  265. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
  266. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
  267. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
  268. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
  269. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
  270. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
  271. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
  272. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
  273. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
  274. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
  275. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
  276. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
  277. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Table/Table.test.tsx +0 -0
  278. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Table/Table.tsx +0 -0
  279. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
  280. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
  281. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
  282. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
  283. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
  284. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
  285. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/auth.ts +0 -0
  286. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/swarm.ts +0 -0
  287. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/theme.ts +0 -0
  288. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/global.d.ts +0 -0
  289. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
  290. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
  291. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
  292. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
  293. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useInterval.ts +0 -0
  294. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useNotifications.ts +0 -0
  295. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
  296. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSortByField.ts +0 -0
  297. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
  298. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/index.tsx +0 -0
  299. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/Auth.tsx +0 -0
  300. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/Dashboard.tsx +0 -0
  301. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/HtmlReport.tsx +0 -0
  302. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
  303. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
  304. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
  305. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/api/swarm.ts +0 -0
  306. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/hooks.ts +0 -0
  307. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
  308. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
  309. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/root.slice.ts +0 -0
  310. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
  311. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
  312. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
  313. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
  314. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/url.slice.ts +0 -0
  315. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/store.ts +0 -0
  316. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/utils.ts +0 -0
  317. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/styles/theme.ts +0 -0
  318. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/constants.ts +0 -0
  319. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
  320. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
  321. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/setup.ts +0 -0
  322. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/testUtils.tsx +0 -0
  323. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/auth.types.ts +0 -0
  324. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/swarm.types.ts +0 -0
  325. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/tab.types.ts +0 -0
  326. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/table.types.ts +0 -0
  327. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/ui.types.ts +0 -0
  328. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/number.ts +0 -0
  329. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/object.ts +0 -0
  330. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/string.ts +0 -0
  331. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/number.test.ts +0 -0
  332. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/object.test.ts +0 -0
  333. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/string.test.ts +0 -0
  334. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/url.test.ts +0 -0
  335. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/url.ts +0 -0
  336. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/tsconfig.json +0 -0
  337. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/vite.config.ts +0 -0
  338. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/vitest.config.ts +0 -0
  339. {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/yarn.lock +0 -0
  340. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/dependency_links.txt +0 -0
  341. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/entry_points.txt +0 -0
  342. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/not-zip-safe +0 -0
  343. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/requires.txt +0 -0
  344. {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/top_level.txt +0 -0
  345. {locust-2.27.0 → locust-2.27.1.dev10}/package.json +0 -0
  346. {locust-2.27.0 → locust-2.27.1.dev10}/scripts/locustfile.py +0 -0
  347. {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-disributed-headless.sh +0 -0
  348. {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-disributed-web.sh +0 -0
  349. {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-local-headless.sh +0 -0
  350. {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-local-web.sh +0 -0
  351. {locust-2.27.0 → locust-2.27.1.dev10}/setup.cfg +0 -0
  352. {locust-2.27.0 → locust-2.27.1.dev10}/tox.ini +0 -0
@@ -1,6 +1,31 @@
1
1
  # Detailed changelog
2
2
  The most important changes can also be found in [the documentation](https://docs.locust.io/en/latest/changelog.html).
3
3
 
4
+ ## [2.27.0](https://github.com/locustio/locust/tree/2.27.0) (2024-05-06)
5
+
6
+ [Full Changelog](https://github.com/locustio/locust/compare/2.26.0...2.27.0)
7
+
8
+ **Fixed bugs:**
9
+
10
+ - User Classes with Empty Tasks Results in TypeError: 'NoneType' object is not iterable [\#2694](https://github.com/locustio/locust/issues/2694)
11
+
12
+ **Closed issues:**
13
+
14
+ - Why defining run\_time on worker node raises an error [\#2683](https://github.com/locustio/locust/issues/2683)
15
+
16
+ **Merged pull requests:**
17
+
18
+ - annotate return types of a few functions to enable more mypy check [\#2702](https://github.com/locustio/locust/pull/2702) ([tdadela](https://github.com/tdadela))
19
+ - refactor\(WindowsKeyPoller\): change implementation of captured\_chars [\#2701](https://github.com/locustio/locust/pull/2701) ([tdadela](https://github.com/tdadela))
20
+ - refactor: replace deprecated utcfromtimestamp function [\#2700](https://github.com/locustio/locust/pull/2700) ([tdadela](https://github.com/tdadela))
21
+ - Use deque for tasks in taskset instead of plain list [\#2698](https://github.com/locustio/locust/pull/2698) ([cyberw](https://github.com/cyberw))
22
+ - fix: Ensure locust does not crash when an User class has no task [\#2696](https://github.com/locustio/locust/pull/2696) ([hangonlyra](https://github.com/hangonlyra))
23
+ - Fix various spelling errors using codespell [\#2687](https://github.com/locustio/locust/pull/2687) ([cyberw](https://github.com/cyberw))
24
+ - Dispatch/user distribution calculation using Kullback-Leibler divergence [\#2686](https://github.com/locustio/locust/pull/2686) ([tdadela](https://github.com/tdadela))
25
+ - Allow worker process to run with --run-time specified, just log a warning about it being ignored [\#2685](https://github.com/locustio/locust/pull/2685) ([Sawiq](https://github.com/Sawiq))
26
+ - Small cleanup: mypy type-ignore and dev deps [\#2684](https://github.com/locustio/locust/pull/2684) ([tdadela](https://github.com/tdadela))
27
+ - Simplify how locustfiles are found \(using -f\). Don’t automatically append .py [\#2655](https://github.com/locustio/locust/pull/2655) ([DennisKrone](https://github.com/DennisKrone))
28
+
4
29
  ## [2.26.0](https://github.com/locustio/locust/tree/2.26.0) (2024-04-18)
5
30
 
6
31
  [Full Changelog](https://github.com/locustio/locust/compare/2.25.0...2.26.0)
@@ -35,7 +60,6 @@ The most important changes can also be found in [the documentation](https://docs
35
60
  - Add an example that displays cache stats using the new UI. [\#2669](https://github.com/locustio/locust/pull/2669) ([obriat](https://github.com/obriat))
36
61
  - Update User Classes in Distributed Mode [\#2666](https://github.com/locustio/locust/pull/2666) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
37
62
  - fix\(dispatch\): UserClasses weight distribution with gcd [\#2663](https://github.com/locustio/locust/pull/2663) ([llirrikk](https://github.com/llirrikk))
38
- - chore: fix some comments [\#2659](https://github.com/locustio/locust/pull/2659) ([JohnEndson](https://github.com/JohnEndson))
39
63
  - Fix issue with concurrent custom messages and docs [\#2654](https://github.com/locustio/locust/pull/2654) ([cyberw](https://github.com/cyberw))
40
64
  - Add functionality to run listener functions for `custom_messages` concurrently [\#2650](https://github.com/locustio/locust/pull/2650) ([samuelspagl](https://github.com/samuelspagl))
41
65
  - \[Modern UI\] Escape HTML Entities correctly in Exceptions Table [\#2648](https://github.com/locustio/locust/pull/2648) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
@@ -1,5 +1,3 @@
1
1
  include LICENSE
2
2
  include locust/py.typed
3
- recursive-include locust/static *
4
- recursive-include locust/templates *
5
3
  recursive-include locust/webui/dist *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.27.0
3
+ Version: 2.27.1.dev10
4
4
  Summary: Developer friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -272,7 +272,5 @@ The list of statistics parameters that can be modified is:
272
272
  +-------------------------------------------+--------------------------------------------------------------------------------------+
273
273
  | PERCENTILES_TO_CHART | List of response time percentiles in the screen of chart for UI |
274
274
  +-------------------------------------------+--------------------------------------------------------------------------------------+
275
- | MODERN_UI_PERCENTILES_TO_CHART | List of response time percentiles in the screen of chart for the UI |
276
- +-------------------------------------------+--------------------------------------------------------------------------------------+
277
275
  | PERCENTILES_TO_STATISTICS | List of response time percentiles in the screen of statistics for UI |
278
276
  +-------------------------------------------+--------------------------------------------------------------------------------------+
@@ -90,7 +90,7 @@ Then the documentation should be build and available at ``docs/_build/index.html
90
90
  Making changes to Locust's Web UI
91
91
  =================================
92
92
 
93
- The modern Web UI is built using React and Typescript
93
+ The Web UI is built using React and Typescript
94
94
 
95
95
  Setup
96
96
  -----
@@ -92,8 +92,6 @@ def locust_init(environment, **kwargs):
92
92
  """
93
93
  # ensure the template_args are up to date before using them
94
94
  environment.web_ui.update_template_args()
95
- # set the static paths to use the modern ui
96
- environment.web_ui.set_static_modern_ui()
97
95
 
98
96
  return render_template(
99
97
  "index.html",
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.27.0'
16
- __version_tuple__ = version_tuple = (2, 27, 0)
15
+ __version__ = version = '2.27.1.dev10'
16
+ __version_tuple__ = version_tuple = (2, 27, 1, 'dev10')
@@ -32,6 +32,16 @@ version = locust.__version__
32
32
  DEFAULT_CONFIG_FILES = ("~/.locust.conf", "locust.conf", "pyproject.toml")
33
33
 
34
34
 
35
+ # Clean up downloaded locustfile on exit
36
+ def exit_handler(filename) -> None:
37
+ try:
38
+ os.remove(filename)
39
+ except FileNotFoundError:
40
+ pass # when multiple workers are running on the same machine, another one may already have deleted it
41
+ except PermissionError:
42
+ pass # this happens occasionally on windows on GH, maybe for the same reason?
43
+
44
+
35
45
  class LocustArgumentParser(configargparse.ArgumentParser):
36
46
  """Drop-in replacement for `configargparse.ArgumentParser` that adds support for
37
47
  optionally exclude arguments from the UI.
@@ -170,14 +180,7 @@ def download_locustfile_from_url(url: str) -> str:
170
180
  with open(os.path.join(tempfile.gettempdir(), url.rsplit("/", 1)[-1]), "w") as locustfile:
171
181
  locustfile.write(response.text)
172
182
 
173
- # Clean up downloaded files on exit
174
- def exit_handler():
175
- try:
176
- os.remove(locustfile.name)
177
- except FileNotFoundError:
178
- pass # this is normal when multiple workers are running on the same machine
179
-
180
- atexit.register(exit_handler)
183
+ atexit.register(exit_handler, locustfile.name)
181
184
  return locustfile.name
182
185
 
183
186
 
@@ -263,13 +266,7 @@ def download_locustfile_from_master(master_host: str, master_port: int) -> str:
263
266
  with open(os.path.join(tempfile.gettempdir(), filename), "w", encoding="utf-8") as locustfile:
264
267
  locustfile.write(msg.data["contents"])
265
268
 
266
- def exit_handler():
267
- try:
268
- os.remove(locustfile.name)
269
- except FileNotFoundError:
270
- pass # this is normal when multiple workers are running on the same machine
271
-
272
- atexit.register(exit_handler)
269
+ atexit.register(exit_handler, locustfile.name)
273
270
 
274
271
  tempclient.close()
275
272
  return locustfile.name
@@ -500,7 +497,7 @@ def setup_parser_arguments(parser):
500
497
  "--legacy-ui",
501
498
  default=False,
502
499
  action="store_true",
503
- help="Use the legacy frontend for the web UI (deprecated, support will be removed soon)",
500
+ help=configargparse.SUPPRESS,
504
501
  env_var="LOCUST_LEGACY_UI",
505
502
  )
506
503
 
@@ -166,7 +166,6 @@ class Environment:
166
166
  stats_csv_writer: StatsCSV | None = None,
167
167
  delayed_start=False,
168
168
  userclass_picker_is_active=False,
169
- modern_ui=False,
170
169
  ) -> WebUI:
171
170
  """
172
171
  Creates a :class:`WebUI <locust.web.WebUI>` instance for this Environment and start running the web server
@@ -193,7 +192,6 @@ class Environment:
193
192
  stats_csv_writer=stats_csv_writer,
194
193
  delayed_start=delayed_start,
195
194
  userclass_picker_is_active=userclass_picker_is_active,
196
- modern_ui=modern_ui,
197
195
  )
198
196
  return self.web_ui
199
197
 
@@ -0,0 +1,111 @@
1
+ import datetime
2
+ import glob
3
+ import os
4
+ import pathlib
5
+ from html import escape
6
+ from itertools import chain
7
+ from json import dumps
8
+
9
+ from jinja2 import Environment, FileSystemLoader
10
+
11
+ from . import stats as stats_module
12
+ from .runners import STATE_STOPPED, STATE_STOPPING, MasterRunner
13
+ from .stats import sort_stats
14
+ from .user.inspectuser import get_ratio
15
+
16
+ PERCENTILES_FOR_HTML_REPORT = [0.50, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99, 1.0]
17
+ ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
18
+ BUILD_PATH = os.path.join(ROOT_PATH, "webui", "dist")
19
+ STATIC_PATH = os.path.join(BUILD_PATH, "assets")
20
+
21
+
22
+ def render_template(file, **kwargs):
23
+ env = Environment(loader=FileSystemLoader(BUILD_PATH), extensions=["jinja2.ext.do"])
24
+ template = env.get_template(file)
25
+ return template.render(**kwargs)
26
+
27
+
28
+ def get_html_report(
29
+ environment,
30
+ show_download_link=True,
31
+ theme="",
32
+ ):
33
+ stats = environment.runner.stats
34
+
35
+ start_ts = stats.start_time
36
+ start_time = datetime.datetime.fromtimestamp(start_ts, tz=datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
37
+
38
+ if end_ts := stats.last_request_timestamp:
39
+ end_time = datetime.datetime.fromtimestamp(end_ts, tz=datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
40
+ else:
41
+ end_time = start_time
42
+
43
+ host = None
44
+ if environment.host:
45
+ host = environment.host
46
+ elif environment.runner.user_classes:
47
+ all_hosts = {l.host for l in environment.runner.user_classes}
48
+ if len(all_hosts) == 1:
49
+ host = list(all_hosts)[0]
50
+
51
+ requests_statistics = list(chain(sort_stats(stats.entries), [stats.total]))
52
+ failures_statistics = sort_stats(stats.errors)
53
+ exceptions_statistics = [
54
+ {**exc, "nodes": ", ".join(exc["nodes"])} for exc in environment.runner.exceptions.values()
55
+ ]
56
+
57
+ history = stats.history
58
+
59
+ static_js = []
60
+ js_files = [os.path.basename(filepath) for filepath in glob.glob(os.path.join(STATIC_PATH, "*.js"))]
61
+
62
+ for js_file in js_files:
63
+ path = os.path.join(STATIC_PATH, js_file)
64
+ static_js.append("// " + js_file + "\n")
65
+ with open(path, encoding="utf8") as f:
66
+ static_js.append(f.read())
67
+ static_js.extend(["", ""])
68
+
69
+ is_distributed = isinstance(environment.runner, MasterRunner)
70
+ user_spawned = (
71
+ environment.runner.reported_user_classes_count if is_distributed else environment.runner.user_classes_count
72
+ )
73
+
74
+ if environment.runner.state in [STATE_STOPPED, STATE_STOPPING]:
75
+ user_spawned = environment.runner.final_user_classes_count
76
+
77
+ task_data = {
78
+ "per_class": get_ratio(environment.user_classes, user_spawned, False),
79
+ "total": get_ratio(environment.user_classes, user_spawned, True),
80
+ }
81
+
82
+ return render_template(
83
+ "report.html",
84
+ template_args={
85
+ "is_report": True,
86
+ "requests_statistics": [stat.to_dict(escape_string_values=True) for stat in requests_statistics],
87
+ "failures_statistics": [stat.to_dict() for stat in failures_statistics],
88
+ "exceptions_statistics": [stat for stat in exceptions_statistics],
89
+ "response_time_statistics": [
90
+ {
91
+ "name": escape(stat.name),
92
+ "method": escape(stat.method or ""),
93
+ **{
94
+ str(percentile): stat.get_response_time_percentile(percentile)
95
+ for percentile in PERCENTILES_FOR_HTML_REPORT
96
+ },
97
+ }
98
+ for stat in requests_statistics
99
+ ],
100
+ "start_time": start_time,
101
+ "end_time": end_time,
102
+ "host": escape(str(host)),
103
+ "history": history,
104
+ "show_download_link": show_download_link,
105
+ "locustfile": escape(str(environment.locustfile)),
106
+ "tasks": task_data,
107
+ "percentiles_to_chart": stats_module.PERCENTILES_TO_CHART,
108
+ },
109
+ theme=theme,
110
+ static_js="\n".join(static_js),
111
+ )
@@ -1,8 +1,9 @@
1
1
  import logging
2
2
  import logging.config
3
+ import re
3
4
  import socket
4
5
 
5
- HOSTNAME = socket.gethostname()
6
+ HOSTNAME = re.sub(r"\..*", "", socket.gethostname())
6
7
 
7
8
  # Global flag that we set to True if any unhandled exception occurs in a greenlet
8
9
  # Used by main.py to set the process return code to non-zero
@@ -128,12 +128,8 @@ def main():
128
128
  available_user_classes[key] = value
129
129
  available_user_tasks[key] = value.tasks or {}
130
130
 
131
- if len(stats.PERCENTILES_TO_CHART) != 2:
132
- logging.error("stats.PERCENTILES_TO_CHART parameter should be 2 parameters \n")
133
- sys.exit(1)
134
-
135
- if len(stats.MODERN_UI_PERCENTILES_TO_CHART) > 6:
136
- logging.error("stats.MODERN_UI_PERCENTILES_TO_CHART parameter should be a maximum of 6 parameters \n")
131
+ if len(stats.PERCENTILES_TO_CHART) > 6:
132
+ logging.error("stats.PERCENTILES_TO_CHART parameter should be a maximum of 6 parameters \n")
137
133
  sys.exit(1)
138
134
 
139
135
  def is_valid_percentile(parameter):
@@ -183,7 +179,8 @@ def main():
183
179
  options.spawn_rate = options.hatch_rate
184
180
 
185
181
  if options.legacy_ui:
186
- sys.stderr.write("[DEPRECATED] The legacy UI is deprecated and will be removed soon\n")
182
+ sys.stderr.write("[REMOVED] The legacy UI has been removed. Remove this flag to use the new UI")
183
+ sys.exit(1)
187
184
 
188
185
  # setup logging
189
186
  if not options.skip_log_setup:
@@ -480,7 +477,6 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
480
477
  stats_csv_writer=stats_csv_writer,
481
478
  delayed_start=True,
482
479
  userclass_picker_is_active=options.class_picker,
483
- modern_ui=not options.legacy_ui,
484
480
  )
485
481
  else:
486
482
  web_ui = None
@@ -654,8 +650,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
654
650
  logger.info("Got SIGTERM signal")
655
651
  shutdown()
656
652
 
657
- def save_html_report(use_modern_ui=False):
658
- html_report = get_html_report(environment, show_download_link=False, use_modern_ui=use_modern_ui)
653
+ def save_html_report():
654
+ html_report = get_html_report(environment, show_download_link=False)
659
655
  logger.info("writing html report to file: %s", options.html_file)
660
656
  with open(options.html_file, "w", encoding="utf-8") as file:
661
657
  file.write(html_report)
@@ -671,10 +667,10 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
671
667
 
672
668
  main_greenlet.join()
673
669
  if options.html_file:
674
- save_html_report(not options.legacy_ui)
670
+ save_html_report()
675
671
  except KeyboardInterrupt:
676
672
  if options.html_file:
677
- save_html_report(not options.legacy_ui)
673
+ save_html_report()
678
674
  except Exception:
679
675
  raise
680
676
  shutdown()
@@ -126,8 +126,7 @@ CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_
126
126
  PERCENTILES_TO_REPORT = [0.50, 0.66, 0.75, 0.80, 0.90, 0.95, 0.98, 0.99, 0.999, 0.9999, 1.0]
127
127
 
128
128
  PERCENTILES_TO_STATISTICS = [0.95, 0.99]
129
- PERCENTILES_TO_CHART = [0.50, 0.95]
130
- MODERN_UI_PERCENTILES_TO_CHART = [0.95]
129
+ PERCENTILES_TO_CHART = [0.95]
131
130
 
132
131
 
133
132
  class RequestStatsAdditionError(Exception):
@@ -695,9 +694,7 @@ class StatsEntry:
695
694
  "current_rps": self.current_rps,
696
695
  "current_fail_per_sec": self.current_fail_per_sec,
697
696
  "median_response_time": self.median_response_time,
698
- "ninetieth_response_time": self.get_response_time_percentile(0.9), # for legacy ui
699
- "ninety_ninth_response_time": self.get_response_time_percentile(0.99), # for legacy ui
700
- **response_time_percentiles, # for modern ui
697
+ **response_time_percentiles,
701
698
  "avg_content_length": self.avg_content_length,
702
699
  }
703
700
 
@@ -920,7 +917,7 @@ def stats_history(runner: Runner) -> None:
920
917
  current_response_time_percentiles = {
921
918
  f"response_time_percentile_{percentile}": stats.total.get_current_response_time_percentile(percentile)
922
919
  or 0
923
- for percentile in MODERN_UI_PERCENTILES_TO_CHART
920
+ for percentile in PERCENTILES_TO_CHART
924
921
  }
925
922
 
926
923
  r = {
@@ -928,10 +925,6 @@ def stats_history(runner: Runner) -> None:
928
925
  "time": datetime.datetime.now(tz=datetime.timezone.utc).strftime("%H:%M:%S"),
929
926
  "current_rps": stats.total.current_rps or 0,
930
927
  "current_fail_per_sec": stats.total.current_fail_per_sec or 0,
931
- "response_time_percentile_1": stats.total.get_current_response_time_percentile(PERCENTILES_TO_CHART[0])
932
- or 0,
933
- "response_time_percentile_2": stats.total.get_current_response_time_percentile(PERCENTILES_TO_CHART[1])
934
- or 0,
935
928
  "total_avg_response_time": stats.total.avg_response_time,
936
929
  "user_count": runner.user_count or 0,
937
930
  }
@@ -11,6 +11,7 @@ from tempfile import NamedTemporaryFile
11
11
 
12
12
  import gevent
13
13
  from geventhttpclient.client import HTTPClientPool
14
+ from pyquery import PyQuery as pq
14
15
 
15
16
  from .testcases import LocustTestCase, WebserverTestCase
16
17
  from .util import create_tls_cert
@@ -777,7 +778,8 @@ class TestFastHttpSsl(LocustTestCase):
777
778
 
778
779
  def test_ssl_request_insecure(self):
779
780
  s = FastHttpSession(self.environment, "https://127.0.0.1:%i" % self.web_port, insecure=True, user=None)
780
- r = s.get("/")
781
- self.assertEqual(200, r.status_code)
782
- self.assertIn("<title>Locust for None</title>", r.content.decode("utf-8"))
783
- self.assertIn("<p>Script: <span>None</span></p>", r.text)
781
+ response = s.get("/")
782
+ d = pq(response.content.decode("utf-8"))
783
+
784
+ self.assertEqual(200, response.status_code)
785
+ self.assertIn('"users": null', str(d))
@@ -219,9 +219,8 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
219
219
  content=textwrap.dedent(
220
220
  """
221
221
  from locust import User, task, constant, events
222
- from locust.stats import PERCENTILES_TO_CHART
223
- PERCENTILES_TO_CHART[0] = 0.9
224
- PERCENTILES_TO_CHART[1] = 0.4
222
+ from locust import stats
223
+ stats.PERCENTILES_TO_CHART = [0.9, 0.4]
225
224
  class TestUser(User):
226
225
  wait_time = constant(3)
227
226
  @task
@@ -274,8 +273,8 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
274
273
  content=textwrap.dedent(
275
274
  """
276
275
  from locust import User, task, constant, events
277
- from locust.stats import PERCENTILES_TO_CHART
278
- PERCENTILES_TO_CHART[0] = 1.2
276
+ from locust import stats
277
+ stats.PERCENTILES_TO_CHART = [1.2]
279
278
  class TestUser(User):
280
279
  wait_time = constant(3)
281
280
  @task
@@ -728,7 +727,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
728
727
  "locust",
729
728
  "-f",
730
729
  mocked.file_path,
731
- "--legacy-ui",
732
730
  "--web-port",
733
731
  str(port),
734
732
  "--autostart",
@@ -795,7 +793,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
795
793
  "locust",
796
794
  "-f",
797
795
  f"{mocked1.file_path},{mocked2}",
798
- "--legacy-ui",
799
796
  "--web-port",
800
797
  str(port),
801
798
  "--autostart",
@@ -1115,7 +1112,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
1115
1112
  "locust",
1116
1113
  "-f",
1117
1114
  mocked.file_path,
1118
- "--legacy-ui",
1119
1115
  "--host",
1120
1116
  "https://test.com/",
1121
1117
  "--run-time",
@@ -1138,16 +1134,11 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
1138
1134
 
1139
1135
  # make sure title appears in the report
1140
1136
  _, locustfile = os.path.split(mocked.file_path)
1141
- self.assertIn(f"<title>Test Report for {locustfile}</title>", html_report_content)
1142
- self.assertIn(f"<p>Script: <span>{locustfile}</span></p>", html_report_content)
1137
+ self.assertIn(locustfile, html_report_content)
1143
1138
 
1144
1139
  # make sure host appears in the report
1145
1140
  self.assertIn("https://test.com/", html_report_content)
1146
-
1147
- # make sure the charts container appears in the report
1148
- self.assertIn("charts-container", html_report_content)
1149
-
1150
- self.assertNotIn("Download the Report", html_report_content, "Download report link found in HTML content")
1141
+ self.assertIn('"show_download_link": false', html_report_content)
1151
1142
 
1152
1143
  def test_run_with_userclass_picker(self):
1153
1144
  with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_A) as file1: