locust 2.28.1.dev5__py3-none-any.whl → 2.28.1.dev13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
locust/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.28.1.dev5'
16
- __version_tuple__ = version_tuple = (2, 28, 1, 'dev5')
15
+ __version__ = version = '2.28.1.dev13'
16
+ __version_tuple__ = version_tuple = (2, 28, 1, 'dev13')
locust/event.py CHANGED
@@ -162,11 +162,11 @@ class Events:
162
162
 
163
163
  spawning_complete: EventHook
164
164
  """
165
- Fired when all simulated users has been spawned.
165
+ Fired when all simulated users has been spawned. The event is fired on master first, and then distributed to workers.
166
166
 
167
167
  Event arguments:
168
168
 
169
- :param user_count: Number of users that were spawned
169
+ :param user_count: Number of users that were spawned (in total, not per-worker)
170
170
  """
171
171
 
172
172
  quitting: EventHook
locust/runners.py CHANGED
@@ -834,7 +834,10 @@ class MasterRunner(DistributedRunner):
834
834
  finally:
835
835
  timeout.cancel()
836
836
 
837
- self.environment.events.spawning_complete.fire(user_count=sum(self.target_user_classes_count.values()))
837
+ user_count = sum(self.target_user_classes_count.values())
838
+ self.environment.events.spawning_complete.fire(user_count=user_count)
839
+ # notify workers so they can fire their own event
840
+ self.send_message("spawning_complete", data={"user_count": user_count})
838
841
  self.spawning_completed = True
839
842
 
840
843
  logger.info(f"{msg_prefix}: {_format_user_classes_count_for_log(self.reported_user_classes_count)}")
@@ -1110,6 +1113,7 @@ class MasterRunner(DistributedRunner):
1110
1113
  logger.warning(f"Got spawning message from unknown worker {msg.node_id}. Asking worker to quit.")
1111
1114
  self.server.send_to_client(Message("quit", None, msg.node_id))
1112
1115
  elif msg.type == "spawning_complete":
1116
+ # a worker finished spawning (this happens multiple times during rampup)
1113
1117
  self.clients[msg.node_id].state = STATE_RUNNING
1114
1118
  self.clients[msg.node_id].user_classes_count = msg.data["user_classes_count"]
1115
1119
  elif msg.type == "quit":
@@ -1217,20 +1221,6 @@ class WorkerRunner(DistributedRunner):
1217
1221
  self.greenlet.spawn(self.heartbeat_timeout_checker).link_exception(greenlet_exception_handler)
1218
1222
  self.greenlet.spawn(self.stats_reporter).link_exception(greenlet_exception_handler)
1219
1223
 
1220
- # register listener for when all users have spawned, and report it to the master node
1221
- def on_spawning_complete(user_count: int) -> None:
1222
- assert user_count == sum(self.user_classes_count.values())
1223
- self.client.send(
1224
- Message(
1225
- "spawning_complete",
1226
- {"user_classes_count": self.user_classes_count, "user_count": self.user_count},
1227
- self.client_id,
1228
- )
1229
- )
1230
- self.worker_state = STATE_RUNNING
1231
-
1232
- self.environment.events.spawning_complete.add_listener(on_spawning_complete)
1233
-
1234
1224
  # register listener that adds the current number of spawned users to the report that is sent to the master node
1235
1225
  def on_report_to_master(client_id: str, data: dict[str, Any]):
1236
1226
  data["user_classes_count"] = self.user_classes_count
@@ -1251,6 +1241,17 @@ class WorkerRunner(DistributedRunner):
1251
1241
 
1252
1242
  self.environment.events.user_error.add_listener(on_user_error)
1253
1243
 
1244
+ def spawning_complete(self, user_count):
1245
+ assert user_count == sum(self.user_classes_count.values())
1246
+ self.client.send(
1247
+ Message(
1248
+ "spawning_complete",
1249
+ {"user_classes_count": self.user_classes_count, "user_count": self.user_count},
1250
+ self.client_id,
1251
+ )
1252
+ )
1253
+ self.worker_state = STATE_RUNNING
1254
+
1254
1255
  def start(
1255
1256
  self, user_count: int, spawn_rate: float, wait: bool = False, user_classes: list[type[User]] | None = None
1256
1257
  ) -> None:
@@ -1282,8 +1283,9 @@ class WorkerRunner(DistributedRunner):
1282
1283
  # can be blocking because of the stop_timeout
1283
1284
  self.spawn_users(user_classes_spawn_count)
1284
1285
  self.stop_users(user_classes_stop_count)
1285
-
1286
- self.environment.events.spawning_complete.fire(user_count=sum(self.user_classes_count.values()))
1286
+ self.spawning_complete(sum(self.user_classes_count.values()))
1287
+ self.update_state(STATE_RUNNING)
1288
+ self.worker_state = STATE_RUNNING
1287
1289
 
1288
1290
  def heartbeat(self) -> NoReturn:
1289
1291
  while True:
@@ -1394,6 +1396,9 @@ class WorkerRunner(DistributedRunner):
1394
1396
  self.last_heartbeat_timestamp = time.time()
1395
1397
  elif msg.type == "update_user_class":
1396
1398
  self.environment.update_user_class(msg.data)
1399
+ elif msg.type == "spawning_complete":
1400
+ # master says we have finished spawning (happens only once during a normal rampup)
1401
+ self.environment.events.spawning_complete.fire(user_count=msg.data["user_count"])
1397
1402
  elif msg.type in self.custom_messages:
1398
1403
  logger.debug("Received %s message from master" % msg.type)
1399
1404
  listener, concurrent = self.custom_messages[msg.type]
@@ -82,6 +82,10 @@ def mocked_rpc(raise_on_close=True):
82
82
  def send_to_client(self, message):
83
83
  self.outbox.append((message.node_id, message))
84
84
 
85
+ @classmethod
86
+ def get_messages(cls, message_type=None) -> list:
87
+ return [message[1] for message in cls.outbox if message_type is None or message[1].type == message_type]
88
+
85
89
  def recv_from_client(self):
86
90
  results = self.queue.get()
87
91
  msg = Message.unserialize(results)
@@ -1157,7 +1161,7 @@ class TestMasterWorkerRunners(LocustTestCase):
1157
1161
  self.assertEqual(master_env.runner.stats.total.max_response_time, 42)
1158
1162
  self.assertEqual(master_env.runner.stats.get("cool-string", "GET").avg_response_time, 42)
1159
1163
 
1160
- def test_test_stop_event(self):
1164
+ def test_spawning_complete_and_test_stop_event(self):
1161
1165
  class TestUser(User):
1162
1166
  wait_time = constant(0.1)
1163
1167
 
@@ -1169,11 +1173,16 @@ class TestMasterWorkerRunners(LocustTestCase):
1169
1173
  # start a Master runner
1170
1174
  master_env = Environment(user_classes=[TestUser])
1171
1175
  test_stop_count = {"master": 0, "worker": 0}
1176
+ spawning_complete_count = {"master": 0, "worker": 0}
1172
1177
 
1173
1178
  @master_env.events.test_stop.add_listener
1174
1179
  def _(*args, **kwargs):
1175
1180
  test_stop_count["master"] += 1
1176
1181
 
1182
+ @master_env.events.spawning_complete.add_listener
1183
+ def _(*args, **kwargs):
1184
+ spawning_complete_count["master"] += 1
1185
+
1177
1186
  master = master_env.create_master_runner("*", 0)
1178
1187
  sleep(0)
1179
1188
  # start a Worker runner
@@ -1183,15 +1192,19 @@ class TestMasterWorkerRunners(LocustTestCase):
1183
1192
  def _(*args, **kwargs):
1184
1193
  test_stop_count["worker"] += 1
1185
1194
 
1195
+ @worker_env.events.spawning_complete.add_listener
1196
+ def _(*args, **kwargs):
1197
+ spawning_complete_count["worker"] += 1
1198
+
1186
1199
  worker = worker_env.create_worker_runner("127.0.0.1", master.server.port)
1187
1200
 
1188
1201
  # give worker time to connect
1189
1202
  sleep(0.1)
1190
1203
  # issue start command that should trigger TestUsers to be spawned in the Workers
1191
- master.start(2, spawn_rate=1000)
1192
- sleep(0.1)
1204
+ master.start(3, spawn_rate=1)
1205
+ sleep(3)
1193
1206
  # check that worker nodes have started locusts
1194
- self.assertEqual(2, worker.user_count)
1207
+ self.assertEqual(3, worker.user_count)
1195
1208
  # give time for users to generate stats, and stats to be sent to master
1196
1209
  sleep(0.1)
1197
1210
  master_env.events.quitting.fire(environment=master_env, reverse=True)
@@ -1200,7 +1213,7 @@ class TestMasterWorkerRunners(LocustTestCase):
1200
1213
  # make sure users are killed
1201
1214
  self.assertEqual(0, worker.user_count)
1202
1215
 
1203
- # check the test_stop event was called one time in master and one time in worker
1216
+ # check the spwaning_complete and test_stop events were called one time in master and one time in worker
1204
1217
  self.assertEqual(
1205
1218
  1,
1206
1219
  test_stop_count["master"],
@@ -1211,6 +1224,16 @@ class TestMasterWorkerRunners(LocustTestCase):
1211
1224
  test_stop_count["worker"],
1212
1225
  "The test_stop event was not called exactly one time in the worker node",
1213
1226
  )
1227
+ self.assertEqual(
1228
+ 1,
1229
+ spawning_complete_count["master"],
1230
+ "The spawning_complete event was not called exactly one time in the master node",
1231
+ )
1232
+ self.assertEqual(
1233
+ 1,
1234
+ spawning_complete_count["worker"],
1235
+ "The spawning_complete event was not called exactly one time in the worker node",
1236
+ )
1214
1237
 
1215
1238
  def test_distributed_shape(self):
1216
1239
  """
@@ -2565,11 +2588,10 @@ class TestMasterRunner(LocustRunnerTestCase):
2565
2588
  )
2566
2589
 
2567
2590
  master.start(100, 20)
2568
- self.assertEqual(6, len(server.outbox))
2569
- # First element of the outbox list is ack msg. That is why it is skipped in for loop
2570
- for i, (_, msg) in enumerate(server.outbox[1:].copy()):
2591
+ self.assertEqual(7, len(server.get_messages()))
2592
+ spawn_messages = server.get_messages("spawn")
2593
+ for i, msg in enumerate(server.get_messages("spawn")):
2571
2594
  self.assertDictEqual({"TestUser": int((i + 1) * 20)}, msg.data["user_classes_count"])
2572
- server.outbox.pop()
2573
2595
 
2574
2596
  # Normally, this attribute would be updated when the
2575
2597
  # master receives the report from the worker.
@@ -2579,11 +2601,9 @@ class TestMasterRunner(LocustRunnerTestCase):
2579
2601
  server.mocked_send(Message("client_ready", __version__, "zeh_fake_client2"))
2580
2602
  self.assertEqual(2, len(master.clients))
2581
2603
  sleep(0.1) # give time for messages to be sent to clients
2582
- self.assertEqual(4, len(server.outbox))
2583
- client_id, msg = server.outbox.pop()
2584
- self.assertEqual({"TestUser": 50}, msg.data["user_classes_count"])
2585
- client_id, msg = server.outbox.pop()
2586
- self.assertEqual({"TestUser": 50}, msg.data["user_classes_count"])
2604
+ spawn_messages = [message for message in server.outbox if message[1].type == "spawn"]
2605
+ self.assertEqual({"TestUser": 50}, spawn_messages[-1][1].data["user_classes_count"])
2606
+ self.assertEqual({"TestUser": 50}, spawn_messages[-2][1].data["user_classes_count"])
2587
2607
 
2588
2608
  def test_sends_spawn_data_to_ready_running_spawning_workers(self):
2589
2609
  """Sends spawn job to running, ready, or spawning workers"""
@@ -2602,8 +2622,8 @@ class TestMasterRunner(LocustRunnerTestCase):
2602
2622
  master.clients[2].state = STATE_SPAWNING
2603
2623
  master.clients[3].state = STATE_RUNNING
2604
2624
  master.start(user_count=5, spawn_rate=5)
2605
-
2606
- self.assertEqual(3, len(server.outbox))
2625
+ self.assertEqual(3, len(server.get_messages("spawn")))
2626
+ self.assertEqual(3, len(server.get_messages("spawning_complete")))
2607
2627
 
2608
2628
  def test_start_event(self):
2609
2629
  """
@@ -2628,7 +2648,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2628
2648
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2629
2649
 
2630
2650
  master.start(7, 7)
2631
- self.assertEqual(10, len(server.outbox))
2651
+ self.assertEqual(15, len(server.outbox))
2632
2652
  self.assertEqual(1, run_count[0])
2633
2653
 
2634
2654
  # change number of users and check that test_start isn't fired again
@@ -2667,7 +2687,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2667
2687
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2668
2688
 
2669
2689
  master.start(7, 7)
2670
- self.assertEqual(10, len(server.outbox))
2690
+ self.assertEqual(15, len(server.outbox))
2671
2691
  master.stop()
2672
2692
  self.assertTrue(self.runner_stopping)
2673
2693
  self.assertTrue(self.runner_stopped)
@@ -2706,7 +2726,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2706
2726
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2707
2727
 
2708
2728
  master.start(7, 7)
2709
- self.assertEqual(10, len(server.outbox))
2729
+ self.assertEqual(15, len(server.outbox))
2710
2730
  master.quit()
2711
2731
  self.assertTrue(self.runner_stopping)
2712
2732
  self.assertTrue(self.runner_stopped)
@@ -2753,13 +2773,10 @@ class TestMasterRunner(LocustRunnerTestCase):
2753
2773
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2754
2774
 
2755
2775
  master.start(7, 7)
2756
- self.assertEqual(10, len(server.outbox))
2757
-
2758
- num_users = sum(
2759
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2760
- )
2776
+ self.assertEqual(15, len(server.outbox))
2761
2777
 
2762
- self.assertEqual(7, num_users, "Total number of locusts that would have been spawned is not 7")
2778
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2779
+ self.assertEqual(7, num_users)
2763
2780
 
2764
2781
  def test_spawn_fewer_locusts_than_workers(self):
2765
2782
  class TestUser(User):
@@ -2774,11 +2791,9 @@ class TestMasterRunner(LocustRunnerTestCase):
2774
2791
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2775
2792
 
2776
2793
  master.start(2, 2)
2777
- self.assertEqual(10, len(server.outbox))
2794
+ self.assertEqual(15, len(server.outbox))
2778
2795
 
2779
- num_users = sum(
2780
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2781
- )
2796
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2782
2797
 
2783
2798
  self.assertEqual(2, num_users, "Total number of locusts that would have been spawned is not 2")
2784
2799
 
@@ -2801,7 +2816,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2801
2816
  server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
2802
2817
 
2803
2818
  master.start(USERS_COUNT, USERS_COUNT)
2804
- self.assertEqual(USERS_COUNT * 2, len(server.outbox))
2819
+ self.assertEqual(USERS_COUNT * 3, len(server.outbox))
2805
2820
 
2806
2821
  indexes = []
2807
2822
  for _, msg in server.outbox:
@@ -2845,27 +2860,21 @@ class TestMasterRunner(LocustRunnerTestCase):
2845
2860
 
2846
2861
  # Wait for shape_worker to update user_count
2847
2862
  sleep(0.5)
2848
- num_users = sum(
2849
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2850
- )
2863
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2851
2864
  self.assertEqual(
2852
2865
  1, num_users, "Total number of users in first stage of shape test is not 1: %i" % num_users
2853
2866
  )
2854
2867
 
2855
2868
  # Wait for shape_worker to update user_count again
2856
2869
  sleep(1.5)
2857
- num_users = sum(
2858
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2859
- )
2870
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2860
2871
  self.assertEqual(
2861
2872
  1, num_users, "Total number of users in second stage of shape test is not 1: %i" % num_users
2862
2873
  )
2863
2874
 
2864
2875
  # Wait for shape_worker to update user_count few times but not reach the end yet
2865
2876
  sleep(2.5)
2866
- num_users = sum(
2867
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2868
- )
2877
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2869
2878
  self.assertEqual(
2870
2879
  3, num_users, "Total number of users in second stage of shape test is not 3: %i" % num_users
2871
2880
  )
@@ -2903,18 +2912,14 @@ class TestMasterRunner(LocustRunnerTestCase):
2903
2912
  sleep(0.5)
2904
2913
 
2905
2914
  # Wait for shape_worker to update user_count
2906
- num_users = sum(
2907
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2908
- )
2915
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2909
2916
  self.assertEqual(
2910
2917
  1, num_users, "Total number of users in first stage of shape test is not 1: %i" % num_users
2911
2918
  )
2912
2919
 
2913
2920
  # Wait for shape_worker to update user_count again
2914
2921
  sleep(2)
2915
- num_users = sum(
2916
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2917
- )
2922
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2918
2923
  self.assertEqual(
2919
2924
  3, num_users, "Total number of users in second stage of shape test is not 3: %i" % num_users
2920
2925
  )
@@ -2952,9 +2957,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2952
2957
  sleep(0.5)
2953
2958
 
2954
2959
  # Wait for shape_worker to update user_count
2955
- num_users = sum(
2956
- sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
2957
- )
2960
+ num_users = sum(sum(msg.data["user_classes_count"].values()) for msg in server.get_messages("spawn"))
2958
2961
  self.assertEqual(
2959
2962
  5, num_users, "Total number of users in first stage of shape test is not 5: %i" % num_users
2960
2963
  )
@@ -2962,9 +2965,7 @@ class TestMasterRunner(LocustRunnerTestCase):
2962
2965
  # Wait for shape_worker to update user_count again
2963
2966
  sleep(2)
2964
2967
  msgs = defaultdict(dict)
2965
- for _, msg in server.outbox:
2966
- if msg.type == "ack":
2967
- continue
2968
+ for msg in server.get_messages("spawn"):
2968
2969
  msgs[msg.node_id][msg.data["timestamp"]] = sum(msg.data["user_classes_count"].values())
2969
2970
  # Count users for the last received messages
2970
2971
  num_users = sum(v[max(v.keys())] for v in msgs.values())
@@ -3223,11 +3224,11 @@ class TestMasterRunner(LocustRunnerTestCase):
3223
3224
  master.start(10, 10)
3224
3225
  sleep(0.1)
3225
3226
  server.mocked_send(Message("stats", BAD_MESSAGE, "zeh_fake_client1"))
3226
- self.assertEqual(4, len(server.outbox))
3227
+ self.assertEqual(5, len(server.outbox))
3227
3228
 
3228
3229
  # Expected message order in outbox: ack, spawn, reconnect, ack
3229
3230
  self.assertEqual(
3230
- "reconnect", server.outbox[2][1].type, "Master didn't send worker reconnect message when expected."
3231
+ "reconnect", server.outbox[3][1].type, "Master didn't send worker reconnect message when expected."
3231
3232
  )
3232
3233
 
3233
3234
  def test_worker_sends_unrecognized_message_to_master(self):
@@ -3251,7 +3252,7 @@ class TestMasterRunner(LocustRunnerTestCase):
3251
3252
  master.start(10, 10)
3252
3253
  sleep(0.1)
3253
3254
  server.mocked_send(Message("stats", UNRECOGNIZED_MESSAGE, "zeh_fake_client1"))
3254
- self.assertEqual(2, len(server.outbox))
3255
+ self.assertEqual(3, len(server.outbox))
3255
3256
 
3256
3257
  def test_unknown_host_sends_message_to_master(self):
3257
3258
  """
@@ -3274,7 +3275,7 @@ class TestMasterRunner(LocustRunnerTestCase):
3274
3275
  master.start(10, 10)
3275
3276
  sleep(0.1)
3276
3277
  server.mocked_send(Message("stats", UNRECOGNIZED_HOST_MESSAGE, "unknown_host"))
3277
- self.assertEqual(2, len(server.outbox))
3278
+ self.assertEqual(3, len(server.outbox))
3278
3279
 
3279
3280
 
3280
3281
  class TestWorkerRunner(LocustTestCase):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.28.1.dev5
3
+ Version: 2.28.1.dev13
4
4
  Summary: Developer-friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -1,19 +1,19 @@
1
1
  locust/__init__.py,sha256=g6oA-Ba_hs3gLWVf5MKJ1mvfltI8MFnDWG8qslqm8yg,1402
2
2
  locust/__main__.py,sha256=vBQ82334kX06ImDbFlPFgiBRiLIinwNk3z8Khs6hd74,31
3
- locust/_version.py,sha256=qMWDhIpQqlRPvupt6JirBlvLKSD860__bom6YB9_htI,426
3
+ locust/_version.py,sha256=Q1TWGd4oNv3QSU1p6QqsAkYKTrQr8ThKLvEBRf3l2H0,428
4
4
  locust/argument_parser.py,sha256=VVhInNMKaisjiywQ7H43ooONpHe1Ve1JmftHgnQnRfY,28715
5
5
  locust/clients.py,sha256=YKuAyMAbxs8_-w7XJw0hc67KFBNNLxibsw6FwiS01Q8,14781
6
6
  locust/debug.py,sha256=We6Z9W0btkKSc7PxWmrZx-xMynvOOsKhG6jmDgQin0g,5134
7
7
  locust/dispatch.py,sha256=vYh0QEDFgJ3hY0HgSk-EiNO7IP9ffzXF_Et8wB9JvsI,16995
8
8
  locust/env.py,sha256=SLtUQCYaiv_oq_Nz1xaB0OD8RkTdESt2b71vz_qohpo,12452
9
- locust/event.py,sha256=xgNKbcejxy1TNUfIdgV75KgD2_BOwQmvjrJ4hWuydRw,7740
9
+ locust/event.py,sha256=m-egSPfOEd1Q6HEXx5lB0LlXOuEdzeS7B1XSFIDgRy0,7836
10
10
  locust/exception.py,sha256=jGgJ32ubuf4pWdlaVOkbh2Y0LlG0_DHi-lv3ib8ppOE,1791
11
11
  locust/html.py,sha256=C-RvShjgRRqzzYGdOGCelobm_SlEGjp8TutvHou1er0,4050
12
12
  locust/input_events.py,sha256=ZIyePyAMuA_YFYWg18g_pE4kwuQV3RbEB250MzXRwjY,3314
13
13
  locust/log.py,sha256=cqLt7nnxnQuM4vWFB5EpJpNUTxGBVEkUJuaJPI1S7_Y,3186
14
14
  locust/main.py,sha256=NGjL5QqakU5aeyUzwu2Fh00xVZfC3eoBE3DtfOmRtcM,27854
15
15
  locust/py.typed,sha256=gkWLl8yD4mIZnNYYAIRM8g9VarLvWmTAFeUfEbxJLBw,65
16
- locust/runners.py,sha256=kbEJtHVbDyQnd4IFo0GogasiZKWGXqFgiOiKt3aMjxw,68083
16
+ locust/runners.py,sha256=Xc_cyRig7nL5Rtuk4hfH029JoQZP4U_yXGGK7t-h-SE,68406
17
17
  locust/shape.py,sha256=t-lwBS8LOjWcKXNL7j2U3zroIXJ1b0fazUwpRYQOKXw,1973
18
18
  locust/stats.py,sha256=IXhOtYJ_B863kyrHysNQmuFHv2Vd57vE3Rnerwp3bzs,45859
19
19
  locust/web.py,sha256=5Zj8nTa3Kr0aLhC1bXjZ5bissSOddYFQnIw8NOFUdPI,26976
@@ -39,7 +39,7 @@ locust/test/test_log.py,sha256=YPY6vgTAy1KaNU2qoVvQrTH5x_mzRrljEHrkSBy3yxs,7553
39
39
  locust/test/test_main.py,sha256=7OuH2-7noD_rbeoKJD9hIZsylSugu7ze3XFIrU1u0HI,85016
40
40
  locust/test/test_old_wait_api.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  locust/test/test_parser.py,sha256=-2VO5Dopg-VoWvIgXrmr7GN40cqrnjUoctBHmVlyewg,17826
42
- locust/test/test_runners.py,sha256=UWHmQW59QV1ZQzHRZjFIZiSW8ROUIVCuUgU-VAwOpH8,160110
42
+ locust/test/test_runners.py,sha256=pUqxY9IvlDXbYlkEZGX3PZIo25upBdPsDwt3g1dPqbA,160681
43
43
  locust/test/test_sequential_taskset.py,sha256=QjVMWWfGHn9hU5AvPxRDU7Vo5DcVW1VkMVfDA0k9OPE,3398
44
44
  locust/test/test_stats.py,sha256=F51VkL3k3y4OhYBlRyV6vWzisenSAOmSWKy2IPVrnWM,33929
45
45
  locust/test/test_tags.py,sha256=mzhGLPMizSnSItTHLHizYvloxDfuIDAOgelwInyrf28,13138
@@ -70,9 +70,9 @@ locust/webui/dist/report.html,sha256=sOdZZVgZbqgu86BBCSQf3uQUYXgmgSnXF32JpnyAII8
70
70
  locust/webui/dist/assets/favicon.ico,sha256=IUl-rYqfpHdV38e-s0bkmFIeLS-n3Ug0DQxk-h202hI,8348
71
71
  locust/webui/dist/assets/index-e569e7ff.js,sha256=Oq8fMAMNzgRmzBEFzrQTarNoTm5AENM0lIegSwnYMUM,1645744
72
72
  locust/webui/dist/assets/logo.png,sha256=EIVPqr6wE_yqguHaqFHIsH0ZACLSrvNWyYO7PbyIj4w,19299
73
- locust-2.28.1.dev5.dist-info/LICENSE,sha256=78XGpIn3fHVBfaxlPNUfjVufSN7QsdhpJMRJHv2AFpo,1095
74
- locust-2.28.1.dev5.dist-info/METADATA,sha256=vg1XisoLZJAJzC8NkzbrVI-daoTpc9OH20H6gDMKHO8,7263
75
- locust-2.28.1.dev5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
76
- locust-2.28.1.dev5.dist-info/entry_points.txt,sha256=RAdt8Ku-56m7bFjmdj-MBhbF6h4NX7tVODR9QNnOg0E,44
77
- locust-2.28.1.dev5.dist-info/top_level.txt,sha256=XSsjgPA8Ggf9TqKVbkwSqZFuPlZ085X13M9orDycE20,7
78
- locust-2.28.1.dev5.dist-info/RECORD,,
73
+ locust-2.28.1.dev13.dist-info/LICENSE,sha256=78XGpIn3fHVBfaxlPNUfjVufSN7QsdhpJMRJHv2AFpo,1095
74
+ locust-2.28.1.dev13.dist-info/METADATA,sha256=S2zcEtf4B_NZB4HbybXzfoV78kEtowsCzcsDnqfhegM,7264
75
+ locust-2.28.1.dev13.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
76
+ locust-2.28.1.dev13.dist-info/entry_points.txt,sha256=RAdt8Ku-56m7bFjmdj-MBhbF6h4NX7tVODR9QNnOg0E,44
77
+ locust-2.28.1.dev13.dist-info/top_level.txt,sha256=XSsjgPA8Ggf9TqKVbkwSqZFuPlZ085X13M9orDycE20,7
78
+ locust-2.28.1.dev13.dist-info/RECORD,,