locust 2.26.1.dev48__tar.gz → 2.26.1.dev65__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 (351) hide show
  1. {locust-2.26.1.dev48/locust.egg-info → locust-2.26.1.dev65}/PKG-INFO +1 -2
  2. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/benchmarks/dispatch.py +45 -503
  3. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/_version.py +2 -2
  4. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/dispatch.py +35 -69
  5. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/env.py +2 -2
  6. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_dispatch.py +35 -1
  7. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_runners.py +2 -2
  8. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/task.py +4 -3
  9. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/users.py +21 -23
  10. {locust-2.26.1.dev48 → locust-2.26.1.dev65/locust.egg-info}/PKG-INFO +1 -2
  11. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/requires.txt +0 -1
  12. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/pyproject.toml +0 -1
  13. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/tox.ini +1 -1
  14. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.coveragerc +0 -0
  15. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.dockerignore +0 -0
  16. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.git-blame-ignore-revs +0 -0
  17. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.gitattributes +0 -0
  18. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/CONTRIBUTING.md +0 -0
  19. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  20. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/workflows/stale.yml +0 -0
  23. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.github/workflows/tests.yml +0 -0
  24. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.gitignore +0 -0
  25. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.pre-commit-config.yaml +0 -0
  26. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.readthedocs.yaml +0 -0
  27. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.vscode/extensions.json +0 -0
  28. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.vscode/launch.json +0 -0
  29. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.vscode/launch_locust.json +0 -0
  30. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/.vscode/settings.json +0 -0
  31. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/CHANGELOG.md +0 -0
  32. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/Dockerfile +0 -0
  33. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/LICENSE +0 -0
  34. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/MANIFEST.in +0 -0
  35. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/Makefile +0 -0
  36. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/README +0 -0
  37. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/README.md +0 -0
  38. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/SECURITY.md +0 -0
  39. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/Vagrantfile +0 -0
  40. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/_static/theme-overrides.css +0 -0
  41. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/api.rst +0 -0
  42. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/changelog.rst +0 -0
  43. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/conf.py +0 -0
  44. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/configuration.rst +0 -0
  45. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/custom-load-shape.rst +0 -0
  46. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/developing-locust.rst +0 -0
  47. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/extending-locust.rst +0 -0
  48. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/further-reading.rst +0 -0
  49. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/history.rst +0 -0
  50. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
  51. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/locust_workers.png +0 -0
  52. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/number_of_users.png +0 -0
  53. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/response_times.png +0 -0
  54. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/total_requests_per_second.png +0 -0
  55. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/userclass_picker_example.png +0 -0
  56. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/webui-running-statistics.png +0 -0
  57. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/images/webui-splash-screenshot.png +0 -0
  58. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/increase-performance.rst +0 -0
  59. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/index.rst +0 -0
  60. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/installation.rst +0 -0
  61. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/logging.rst +0 -0
  62. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/quickstart.rst +0 -0
  63. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/requirements.txt +0 -0
  64. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/retrieving-stats.rst +0 -0
  65. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/running-distributed.rst +0 -0
  66. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/running-in-debugger.rst +0 -0
  67. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/running-in-docker.rst +0 -0
  68. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/running-without-web-ui.rst +0 -0
  69. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/tasksets.rst +0 -0
  70. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/testing-other-systems.rst +0 -0
  71. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/use-as-lib.rst +0 -0
  72. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/what-is-locust.rst +0 -0
  73. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/docs/writing-a-locustfile.rst +0 -0
  74. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/add_command_line_argument.py +0 -0
  75. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/basic.py +0 -0
  76. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/browse_docs_sequence_test.py +0 -0
  77. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/browse_docs_test.py +0 -0
  78. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_messages.py +0 -0
  79. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_shape/double_wave.py +0 -0
  80. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_shape/stages.py +0 -0
  81. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_shape/staging_user_classes.py +0 -0
  82. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_shape/step_load.py +0 -0
  83. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_shape/wait_user_count.py +0 -0
  84. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_wait_function.py +0 -0
  85. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_xmlrpc_client/server.py +0 -0
  86. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
  87. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/debugging.py +0 -0
  88. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/debugging_advanced.py +0 -0
  89. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/docker-compose/docker-compose.yml +0 -0
  90. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/dynamic_user_credentials.py +0 -0
  91. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/events.py +0 -0
  92. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/extend_modern_web_ui.py +0 -0
  93. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/extend_web_ui/extend.py +0 -0
  94. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/extend_web_ui/static/custom-stats-table.css +0 -0
  95. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/extend_web_ui/static/extend.js +0 -0
  96. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/extend_web_ui/templates/extend.html +0 -0
  97. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/fast_http_locust.py +0 -0
  98. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/grpc_user.py +0 -0
  99. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/hello.proto +0 -0
  100. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/hello_pb2.py +0 -0
  101. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/hello_pb2_grpc.py +0 -0
  102. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/hello_server.py +0 -0
  103. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/grpc/locustfile.py +0 -0
  104. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/locustfile.py +0 -0
  105. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/manual_stats_reporting.py +0 -0
  106. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/multiple_hosts.py +0 -0
  107. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/nested_inline_tasksets.py +0 -0
  108. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/rest.py +0 -0
  109. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
  110. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/semaphore_wait.py +0 -0
  111. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/stop_on_threshold.py +0 -0
  112. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/README.md +0 -0
  113. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/data_subnet.tf +0 -0
  114. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/main.tf +0 -0
  115. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/output.tf +0 -0
  116. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/plan/basic.py +0 -0
  117. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/provisioner.tf +0 -0
  118. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/terraform/aws/variables.tf +0 -0
  119. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/test_data_management.py +0 -0
  120. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/use_as_lib.py +0 -0
  121. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/vagrant/README.md +0 -0
  122. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/vagrant/supervisord.conf +0 -0
  123. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/web_ui_auth.py +0 -0
  124. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/web_ui_cache_stats.py +0 -0
  125. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/examples/worker_index.py +0 -0
  126. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/generate_changelog.py +0 -0
  127. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/__init__.py +0 -0
  128. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/__main__.py +0 -0
  129. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/argument_parser.py +0 -0
  130. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/clients.py +0 -0
  131. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/contrib/__init__.py +0 -0
  132. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/contrib/fasthttp.py +0 -0
  133. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/debug.py +0 -0
  134. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/event.py +0 -0
  135. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/exception.py +0 -0
  136. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/html.py +0 -0
  137. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/input_events.py +0 -0
  138. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/log.py +0 -0
  139. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/main.py +0 -0
  140. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/py.typed +0 -0
  141. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/rpc/__init__.py +0 -0
  142. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/rpc/protocol.py +0 -0
  143. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/rpc/zmqrpc.py +0 -0
  144. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/runners.py +0 -0
  145. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/shape.py +0 -0
  146. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/chart.js +0 -0
  147. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/css/application.css +0 -0
  148. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/css/application.css.map +0 -0
  149. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/css/tables.css +0 -0
  150. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/css/tables.css.map +0 -0
  151. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/echarts.common.min.js +0 -0
  152. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/favicon.ico +0 -0
  153. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/logo.png +0 -0
  154. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/ui-screenshot-charts.png +0 -0
  155. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/ui-screenshot-start-test.png +0 -0
  156. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/ui-screenshot-stats.png +0 -0
  157. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/img/ui-screenshot-workers.png +0 -0
  158. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/jquery-1.11.3.min.js +0 -0
  159. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/jquery.jqote2.min.js +0 -0
  160. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/jquery.tools.min.js +0 -0
  161. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/locust.js +0 -0
  162. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/sass/_base.sass +0 -0
  163. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/sass/_mixins.sass +0 -0
  164. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/sass/application.sass +0 -0
  165. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/sass/tables.sass +0 -0
  166. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/tasks.js +0 -0
  167. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/static/vintage.js +0 -0
  168. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/stats.py +0 -0
  169. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/templates/index.html +0 -0
  170. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/templates/report.html +0 -0
  171. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/templates/stats_data.html +0 -0
  172. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/__init__.py +0 -0
  173. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/fake_module1_for_env_test.py +0 -0
  174. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/fake_module2_for_env_test.py +0 -0
  175. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/mock_locustfile.py +0 -0
  176. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/mock_logging.py +0 -0
  177. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_debugging.py +0 -0
  178. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_env.py +0 -0
  179. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_fasthttp.py +0 -0
  180. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_http.py +0 -0
  181. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_interruptable_task.py +0 -0
  182. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_load_locustfile.py +0 -0
  183. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_locust_class.py +0 -0
  184. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_log.py +0 -0
  185. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_main.py +0 -0
  186. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_old_wait_api.py +0 -0
  187. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_parser.py +0 -0
  188. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_sequential_taskset.py +0 -0
  189. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_stats.py +0 -0
  190. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_tags.py +0 -0
  191. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_taskratio.py +0 -0
  192. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_users.py +0 -0
  193. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_util.py +0 -0
  194. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_wait_time.py +0 -0
  195. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_web.py +0 -0
  196. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/test_zmqrpc.py +0 -0
  197. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/testcases.py +0 -0
  198. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/test/util.py +0 -0
  199. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/__init__.py +0 -0
  200. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/inspectuser.py +0 -0
  201. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/sequential_taskset.py +0 -0
  202. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/user/wait_time.py +0 -0
  203. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/__init__.py +0 -0
  204. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/cache.py +0 -0
  205. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/deprecation.py +0 -0
  206. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/exception_handler.py +0 -0
  207. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/load_locustfile.py +0 -0
  208. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/rounding.py +0 -0
  209. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/util/timespan.py +0 -0
  210. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/web.py +0 -0
  211. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/.eslintrc +0 -0
  212. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/.gitignore +0 -0
  213. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/.prettierrc +0 -0
  214. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/auth.html +0 -0
  215. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dev.html +0 -0
  216. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/assets/favicon.ico +0 -0
  217. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/assets/index-941b6e82.js +0 -0
  218. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/assets/logo.png +0 -0
  219. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/auth.html +0 -0
  220. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/index.html +0 -0
  221. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/dist/report.html +0 -0
  222. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/index.html +0 -0
  223. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/package.json +0 -0
  224. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/public/assets/favicon.ico +0 -0
  225. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/public/assets/logo.png +0 -0
  226. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/public/report.html +0 -0
  227. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/App.test.tsx +0 -0
  228. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/App.tsx +0 -0
  229. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
  230. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
  231. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
  232. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
  233. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
  234. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
  235. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Form/Form.tsx +0 -0
  236. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Form/Select.tsx +0 -0
  237. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
  238. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
  239. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
  240. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
  241. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Layout.tsx +0 -0
  242. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
  243. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
  244. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
  245. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
  246. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
  247. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
  248. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
  249. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
  250. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
  251. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
  252. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Modal/Modal.tsx +0 -0
  253. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
  254. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Reports/Reports.tsx +0 -0
  255. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
  256. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
  257. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
  258. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
  259. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
  260. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
  261. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
  262. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
  263. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
  264. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
  265. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
  266. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
  267. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
  268. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
  269. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
  270. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
  271. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
  272. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
  273. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
  274. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
  275. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
  276. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
  277. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Table/Table.test.tsx +0 -0
  278. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Table/Table.tsx +0 -0
  279. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
  280. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
  281. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
  282. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
  283. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
  284. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
  285. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/constants/auth.ts +0 -0
  286. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/constants/swarm.ts +0 -0
  287. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/constants/theme.ts +0 -0
  288. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/global.d.ts +0 -0
  289. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
  290. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
  291. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
  292. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
  293. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/useInterval.ts +0 -0
  294. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/useNotifications.ts +0 -0
  295. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
  296. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/useSortByField.ts +0 -0
  297. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
  298. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/index.tsx +0 -0
  299. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/Auth.tsx +0 -0
  300. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/Dashboard.tsx +0 -0
  301. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/HtmlReport.tsx +0 -0
  302. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
  303. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
  304. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
  305. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/api/swarm.ts +0 -0
  306. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/hooks.ts +0 -0
  307. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
  308. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
  309. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/root.slice.ts +0 -0
  310. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
  311. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
  312. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
  313. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
  314. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/slice/url.slice.ts +0 -0
  315. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/store.ts +0 -0
  316. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/redux/utils.ts +0 -0
  317. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/styles/theme.ts +0 -0
  318. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/test/constants.ts +0 -0
  319. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
  320. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
  321. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/test/setup.ts +0 -0
  322. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/test/testUtils.tsx +0 -0
  323. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/types/auth.types.ts +0 -0
  324. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/types/swarm.types.ts +0 -0
  325. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/types/tab.types.ts +0 -0
  326. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/types/table.types.ts +0 -0
  327. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/types/ui.types.ts +0 -0
  328. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/number.ts +0 -0
  329. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/object.ts +0 -0
  330. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/string.ts +0 -0
  331. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/tests/number.test.ts +0 -0
  332. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/tests/object.test.ts +0 -0
  333. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/tests/string.test.ts +0 -0
  334. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/tests/url.test.ts +0 -0
  335. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/src/utils/url.ts +0 -0
  336. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/tsconfig.json +0 -0
  337. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/vite.config.ts +0 -0
  338. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/vitest.config.ts +0 -0
  339. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust/webui/yarn.lock +0 -0
  340. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/SOURCES.txt +0 -0
  341. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/dependency_links.txt +0 -0
  342. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/entry_points.txt +0 -0
  343. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/not-zip-safe +0 -0
  344. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/locust.egg-info/top_level.txt +0 -0
  345. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/package.json +0 -0
  346. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/scripts/locustfile.py +0 -0
  347. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/scripts/run-disributed-headless.sh +0 -0
  348. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/scripts/run-disributed-web.sh +0 -0
  349. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/scripts/run-local-headless.sh +0 -0
  350. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/scripts/run-local-web.sh +0 -0
  351. {locust-2.26.1.dev48 → locust-2.26.1.dev65}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.26.1.dev48
3
+ Version: 2.26.1.dev65
4
4
  Summary: Developer friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -38,7 +38,6 @@ Requires-Dist: tomli>=1.1.0; python_version < "3.11"
38
38
  Requires-Dist: psutil>=5.9.1
39
39
  Requires-Dist: Flask-Login>=0.6.3
40
40
  Requires-Dist: Flask-Cors>=3.0.10
41
- Requires-Dist: roundrobin>=0.0.2
42
41
  Requires-Dist: pywin32; platform_system == "Windows"
43
42
 
44
43
  # Locust
@@ -15,509 +15,48 @@ import time
15
15
 
16
16
  from prettytable import PrettyTable
17
17
 
18
-
19
- class User1(User):
20
- weight = 5
21
-
22
-
23
- class User2(User):
24
- weight = 55
25
-
26
-
27
- class User3(User):
28
- weight = 37
29
-
30
-
31
- class User4(User):
32
- weight = 2
33
-
34
-
35
- class User5(User):
36
- weight = 97
37
-
38
-
39
- class User6(User):
40
- weight = 41
41
-
42
-
43
- class User7(User):
44
- weight = 33
45
-
46
-
47
- class User8(User):
48
- weight = 19
49
-
50
-
51
- class User9(User):
52
- weight = 19
53
-
54
-
55
- class User10(User):
56
- weight = 34
57
-
58
-
59
- class User11(User):
60
- weight = 78
61
-
62
-
63
- class User12(User):
64
- weight = 76
65
-
66
-
67
- class User13(User):
68
- weight = 28
69
-
70
-
71
- class User14(User):
72
- weight = 62
73
-
74
-
75
- class User15(User):
76
- weight = 69
77
-
78
-
79
- class User16(User):
80
- weight = 5
81
-
82
-
83
- class User17(User):
84
- weight = 55
85
-
86
-
87
- class User18(User):
88
- weight = 37
89
-
90
-
91
- class User19(User):
92
- weight = 2
93
-
94
-
95
- class User20(User):
96
- weight = 97
97
-
98
-
99
- class User21(User):
100
- weight = 41
101
-
102
-
103
- class User22(User):
104
- weight = 33
105
-
106
-
107
- class User23(User):
108
- weight = 19
109
-
110
-
111
- class User24(User):
112
- weight = 19
113
-
114
-
115
- class User25(User):
116
- weight = 34
117
-
118
-
119
- class User26(User):
120
- weight = 78
121
-
122
-
123
- class User27(User):
124
- weight = 76
125
-
126
-
127
- class User28(User):
128
- weight = 28
129
-
130
-
131
- class User29(User):
132
- weight = 62
133
-
134
-
135
- class User30(User):
136
- weight = 69
137
-
138
-
139
- class User31(User):
140
- weight = 41
141
-
142
-
143
- class User32(User):
144
- weight = 33
145
-
146
-
147
- class User33(User):
148
- weight = 19
149
-
150
-
151
- class User34(User):
152
- weight = 19
153
-
154
-
155
- class User35(User):
156
- weight = 34
157
-
158
-
159
- class User36(User):
160
- weight = 78
161
-
162
-
163
- class User37(User):
164
- weight = 76
165
-
166
-
167
- class User38(User):
168
- weight = 28
169
-
170
-
171
- class User39(User):
172
- weight = 62
173
-
174
-
175
- class User40(User):
176
- weight = 69
177
-
178
-
179
- class User41(User):
180
- weight = 41
181
-
182
-
183
- class User42(User):
184
- weight = 33
185
-
186
-
187
- class User43(User):
188
- weight = 19
189
-
190
-
191
- class User44(User):
192
- weight = 19
193
-
194
-
195
- class User45(User):
196
- weight = 34
197
-
198
-
199
- class User46(User):
200
- weight = 78
201
-
202
-
203
- class User47(User):
204
- weight = 76
205
-
206
-
207
- class User48(User):
208
- weight = 28
209
-
210
-
211
- class User49(User):
212
- weight = 62
213
-
214
-
215
- class User50(User):
216
- weight = 69
217
-
218
-
219
- class User51(User):
220
- weight = 5
221
-
222
-
223
- class User52(User):
224
- weight = 55
225
-
226
-
227
- class User53(User):
228
- weight = 37
229
-
230
-
231
- class User54(User):
232
- weight = 2
233
-
234
-
235
- class User55(User):
236
- weight = 97
237
-
238
-
239
- class User56(User):
240
- weight = 41
241
-
242
-
243
- class User57(User):
244
- weight = 33
245
-
246
-
247
- class User58(User):
248
- weight = 19
249
-
250
-
251
- class User59(User):
252
- weight = 19
253
-
254
-
255
- class User60(User):
256
- weight = 34
257
-
258
-
259
- class User61(User):
260
- weight = 78
261
-
262
-
263
- class User62(User):
264
- weight = 76
265
-
266
-
267
- class User63(User):
268
- weight = 28
269
-
270
-
271
- class User64(User):
272
- weight = 62
273
-
274
-
275
- class User65(User):
276
- weight = 69
277
-
278
-
279
- class User66(User):
280
- weight = 5
281
-
282
-
283
- class User67(User):
284
- weight = 55
285
-
286
-
287
- class User68(User):
288
- weight = 37
289
-
290
-
291
- class User69(User):
292
- weight = 2
293
-
294
-
295
- class User70(User):
296
- weight = 97
297
-
298
-
299
- class User71(User):
300
- weight = 41
301
-
302
-
303
- class User72(User):
304
- weight = 33
305
-
306
-
307
- class User73(User):
308
- weight = 19
309
-
310
-
311
- class User74(User):
312
- weight = 19
313
-
314
-
315
- class User75(User):
316
- weight = 34
317
-
318
-
319
- class User76(User):
320
- weight = 78
321
-
322
-
323
- class User77(User):
324
- weight = 76
325
-
326
-
327
- class User78(User):
328
- weight = 28
329
-
330
-
331
- class User79(User):
332
- weight = 62
333
-
334
-
335
- class User80(User):
336
- weight = 69
337
-
338
-
339
- class User81(User):
340
- weight = 41
341
-
342
-
343
- class User82(User):
344
- weight = 33
345
-
346
-
347
- class User83(User):
348
- weight = 19
349
-
350
-
351
- class User84(User):
352
- weight = 19
353
-
354
-
355
- class User85(User):
356
- weight = 34
357
-
358
-
359
- class User86(User):
360
- weight = 78
361
-
362
-
363
- class User87(User):
364
- weight = 76
365
-
366
-
367
- class User88(User):
368
- weight = 28
369
-
370
-
371
- class User89(User):
372
- weight = 62
373
-
374
-
375
- class User90(User):
376
- weight = 69
377
-
378
-
379
- class User91(User):
380
- weight = 41
381
-
382
-
383
- class User92(User):
384
- weight = 33
385
-
386
-
387
- class User93(User):
388
- weight = 19
389
-
390
-
391
- class User94(User):
392
- weight = 19
393
-
394
-
395
- class User95(User):
396
- weight = 34
397
-
398
-
399
- class User96(User):
400
- weight = 78
401
-
402
-
403
- class User97(User):
404
- weight = 76
405
-
406
-
407
- class User98(User):
408
- weight = 28
409
-
410
-
411
- class User99(User):
412
- weight = 62
413
-
414
-
415
- class User100(User):
416
- weight = 69
417
-
418
-
419
- USER_CLASSES = [
420
- User1,
421
- User2,
422
- User3,
423
- User4,
424
- User5,
425
- User6,
426
- User7,
427
- User8,
428
- User9,
429
- User10,
430
- User11,
431
- User12,
432
- User13,
433
- User14,
434
- User15,
435
- User16,
436
- User17,
437
- User18,
438
- User19,
439
- User20,
440
- User21,
441
- User22,
442
- User23,
443
- User24,
444
- User25,
445
- User26,
446
- User27,
447
- User28,
448
- User29,
449
- User30,
450
- User31,
451
- User32,
452
- User33,
453
- User34,
454
- User35,
455
- User36,
456
- User37,
457
- User38,
458
- User39,
459
- User40,
460
- User41,
461
- User42,
462
- User43,
463
- User44,
464
- User45,
465
- User46,
466
- User47,
467
- User48,
468
- User49,
469
- User50,
470
- User51,
471
- User52,
472
- User53,
473
- User54,
474
- User55,
475
- User56,
476
- User57,
477
- User58,
478
- User59,
479
- User60,
480
- User61,
481
- User62,
482
- User63,
483
- User64,
484
- User65,
485
- User66,
486
- User67,
487
- User68,
488
- User69,
489
- User70,
490
- User71,
491
- User72,
492
- User73,
493
- User74,
494
- User75,
495
- User76,
496
- User77,
497
- User78,
498
- User79,
499
- User80,
500
- User81,
501
- User82,
502
- User83,
503
- User84,
504
- User85,
505
- User86,
506
- User87,
507
- User88,
508
- User89,
509
- User90,
510
- User91,
511
- User92,
512
- User93,
513
- User94,
514
- User95,
515
- User96,
516
- User97,
517
- User98,
518
- User99,
519
- User100,
18
+ # fmt: off
19
+ WEIGHTS = [
20
+ 5, 55, 37, 2, 97, 41, 33, 19, 19, 34,
21
+ 78, 76, 28, 62, 69, 5, 55, 37, 2, 97,
22
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
23
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
24
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
25
+ 5, 55, 37, 2, 97, 41, 33, 19, 19, 34,
26
+ 78, 76, 28, 62, 69, 5, 55, 37, 2, 97,
27
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
28
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
29
+ 41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
520
30
  ]
31
+ # fmt: on
32
+
33
+ for i, x in enumerate(WEIGHTS):
34
+ exec(f"class User{i+1}(User): weight = {x}")
35
+
36
+ # Equivalent to:
37
+ #
38
+ # class User1(User):
39
+ # weight = 5
40
+ #
41
+ # class User2(User):
42
+ # weight = 55
43
+ # .
44
+ # .
45
+ # .
46
+ # class User100(User):
47
+ # weight = 69
48
+
49
+ exec("USER_CLASSES = [" + ",".join(f"User{i+1}" for i in range(len(WEIGHTS))) + "]")
50
+ # Equivalent to:
51
+ #
52
+ # USER_CLASSES = [
53
+ # User1,
54
+ # User2,
55
+ # .
56
+ # .
57
+ # .
58
+ # User100,
59
+ # ]
521
60
 
522
61
 
523
62
  if __name__ == "__main__":
@@ -545,7 +84,10 @@ if __name__ == "__main__":
545
84
  workers = [WorkerNode(str(i + 1)) for i in range(worker_count)]
546
85
 
547
86
  ts = time.perf_counter()
548
- users_dispatcher = UsersDispatcher(worker_nodes=workers, user_classes=USER_CLASSES[:number_of_user_classes])
87
+ users_dispatcher = UsersDispatcher(
88
+ worker_nodes=workers,
89
+ user_classes=USER_CLASSES[:number_of_user_classes], # noqa: F821 (Undefined name `USER_CLASSES`) -> It's created inside "exec"
90
+ )
549
91
  instantiate_duration = time.perf_counter() - ts
550
92
 
551
93
  # Ramp-up
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.26.1.dev48'
16
- __version_tuple__ = version_tuple = (2, 26, 1, 'dev48')
15
+ __version__ = version = '2.26.1.dev65'
16
+ __version_tuple__ = version_tuple = (2, 26, 1, 'dev65')
@@ -6,11 +6,12 @@ import math
6
6
  import time
7
7
  from collections import defaultdict
8
8
  from collections.abc import Generator, Iterator
9
+ from heapq import heapify, heapreplace
10
+ from math import log2
9
11
  from operator import attrgetter
10
12
  from typing import TYPE_CHECKING
11
13
 
12
14
  import gevent
13
- from roundrobin import smooth
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  from locust import User
@@ -26,6 +27,33 @@ if TYPE_CHECKING:
26
27
  # profile = line_profiler.LineProfiler()
27
28
 
28
29
 
30
+ def _kl_generator(users: list[tuple[type[User], float]]) -> Iterator[str | None]:
31
+ """Generator based on Kullback-Leibler divergence
32
+
33
+ For example, given users A, B with weights 5 and 1 respectively,
34
+ this algorithm will yield AAABAAAAABAA.
35
+ """
36
+ if not users:
37
+ while True:
38
+ yield None
39
+
40
+ names = [u[0].__name__ for u in users]
41
+ weights = [u[1] for u in users]
42
+ generated = weights.copy()
43
+
44
+ heap = [(x * log2(x / (x + 1.0)), i) for i, x in enumerate(generated)]
45
+ heapify(heap)
46
+
47
+ while True:
48
+ i = heap[0][1] # choose element which choosing minimizes divergence the most
49
+ yield names[i]
50
+ generated[i] += 1.0
51
+ x = generated[i]
52
+ kl_diff = weights[i] * log2(x / (x + 1.0))
53
+ # calculate how much choosing element i for (x + 1)th time decreases divergence
54
+ heapreplace(heap, (kl_diff, i))
55
+
56
+
29
57
  class UsersDispatcher(Iterator):
30
58
  """
31
59
  Iterator that dispatches the users to the workers.
@@ -319,9 +347,7 @@ class UsersDispatcher(Iterator):
319
347
 
320
348
  def _distribute_users(
321
349
  self, target_user_count: int
322
- ) -> tuple[
323
- dict[str, dict[str, int]], Generator[str | None, None, None], itertools.cycle, list[tuple[WorkerNode, str]]
324
- ]:
350
+ ) -> tuple[dict[str, dict[str, int]], Iterator[str | None], itertools.cycle, list[tuple[WorkerNode, str]]]:
325
351
  """
326
352
  This function might take some time to complete if the `target_user_count` is a big number. A big number
327
353
  is typically > 50 000. However, this function is only called if a worker is added or removed while a test
@@ -350,71 +376,11 @@ class UsersDispatcher(Iterator):
350
376
 
351
377
  return users_on_workers, user_gen, worker_gen, active_users
352
378
 
353
- def _user_gen(self) -> Generator[str | None, None, None]:
354
- """
355
- This method generates users according to their weights using
356
- a smooth weighted round-robin algorithm implemented by https://github.com/linnik/roundrobin.
357
-
358
- For example, given users A, B with weights 5 and 1 respectively, this algorithm
359
- will yield AAABAAAAABAA. The smooth aspect of this algorithm is what makes it possible
360
- to keep the distribution during ramp-up and ramp-down. If we were to use a normal
361
- weighted round-robin algorithm, we'd get AAAAABAAAAAB which would make the distribution
362
- less accurate during ramp-up/down.
363
- """
364
-
365
- def infinite_cycle_gen(users: list[tuple[type[User], int]]) -> itertools.cycle:
366
- if not users:
367
- return itertools.cycle([None])
368
-
369
- def _get_order_of_magnitude(n: float) -> int:
370
- """Get how many times we need to multiply `n` to get an integer-like number.
371
- For example:
372
- 0.1 would return 10,
373
- 0.04 would return 100,
374
- 0.0007 would return 10000.
375
- """
376
- if n <= 0:
377
- raise ValueError("To get the order of magnitude, the number must be greater than 0.")
378
-
379
- counter = 0
380
- while n < 1:
381
- n *= 10
382
- counter += 1
383
- return 10**counter
384
-
385
- # Get maximum order of magnitude to "normalize the weights".
386
- # "Normalizing the weights" is to multiply all weights by the same number so that
387
- # they become integers. Then we can find the largest common divisor of all the
388
- # weights, divide them by it and get the smallest possible numbers with the same
389
- # ratio as the numbers originally had.
390
- max_order_of_magnitude = _get_order_of_magnitude(min(abs(u[1]) for u in users))
391
- weights = tuple(int(u[1] * max_order_of_magnitude) for u in users)
392
-
393
- greatest_common_divisor = math.gcd(*weights)
394
- normalized_values = [
395
- (
396
- user[0].__name__,
397
- normalized_weight // greatest_common_divisor,
398
- )
399
- for user, normalized_weight in zip(users, weights)
400
- ]
401
- generation_length_to_get_proper_distribution = sum(
402
- normalized_val[1] for normalized_val in normalized_values
403
- )
404
- gen = smooth(normalized_values)
405
-
406
- # Instead of calling `gen()` for each user, we cycle through a generator of fixed-length
407
- # `generation_length_to_get_proper_distribution`. Doing so greatly improves performance because
408
- # we only ever need to call `gen()` a relatively small number of times. The length of this generator
409
- # is chosen as the sum of the normalized weights. So, for users A, B, C of weights 2, 5, 6, the length is
410
- # 2 + 5 + 6 = 13 which would yield the distribution `CBACBCBCBCABC` that gets repeated over and over
411
- # until the target user count is reached.
412
- return itertools.cycle(gen() for _ in range(generation_length_to_get_proper_distribution))
413
-
379
+ def _user_gen(self) -> Iterator[str | None]:
414
380
  fixed_users = {u.__name__: u for u in self._user_classes if u.fixed_count}
415
381
 
416
- cycle_fixed_gen = infinite_cycle_gen([(u, u.fixed_count) for u in fixed_users.values()])
417
- cycle_weighted_gen = infinite_cycle_gen([(u, u.weight) for u in self._user_classes if not u.fixed_count])
382
+ fixed_users_gen = _kl_generator([(u, u.fixed_count) for u in fixed_users.values()])
383
+ weighted_users_gen = _kl_generator([(u, u.weight) for u in self._user_classes if not u.fixed_count])
418
384
 
419
385
  # Spawn users
420
386
  while True:
@@ -423,7 +389,7 @@ class UsersDispatcher(Iterator):
423
389
  current_fixed_users_count = {u: self._get_user_current_count(u) for u in fixed_users}
424
390
  spawned_classes: set[str] = set()
425
391
  while len(spawned_classes) != len(fixed_users):
426
- user_name: str | None = next(cycle_fixed_gen)
392
+ user_name: str | None = next(fixed_users_gen)
427
393
  if not user_name:
428
394
  break
429
395
 
@@ -439,7 +405,7 @@ class UsersDispatcher(Iterator):
439
405
  else:
440
406
  spawned_classes.add(user_name)
441
407
 
442
- yield next(cycle_weighted_gen)
408
+ yield next(weighted_users_gen)
443
409
 
444
410
  @staticmethod
445
411
  def _fast_users_on_workers_copy(users_on_workers: dict[str, dict[str, int]]) -> dict[str, dict[str, int]]: