kiba-core 0.5.3.dev72__tar.gz → 0.5.3.dev73__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 (140) hide show
  1. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/CHANGELOG.md +1 -0
  2. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/PKG-INFO +1 -1
  3. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/message_queue_processor.py +7 -2
  4. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/kiba_core.egg-info/PKG-INFO +1 -1
  5. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/kiba_core.egg-info/SOURCES.txt +1 -0
  6. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/pyproject.toml +1 -1
  7. kiba_core-0.5.3.dev73/tests/queues/test_message_queue_processor.py +46 -0
  8. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/.github/pull_request_template.md +0 -0
  9. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/.github/workflows/deploy.yml +0 -0
  10. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/.github/workflows/pull-request.yml +0 -0
  11. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/.github/workflows/release.yml +0 -0
  12. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/.gitignore +0 -0
  13. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/Dockerfile +0 -0
  14. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/README.md +0 -0
  15. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/__init__.py +0 -0
  16. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/__init__.py +0 -0
  17. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/api_request.py +0 -0
  18. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/api_response.py +0 -0
  19. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/authorizer.py +0 -0
  20. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/default_routes.py +0 -0
  21. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/health.py +0 -0
  22. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/json_route.py +0 -0
  23. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/__init__.py +0 -0
  24. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/database_connection_middleware.py +0 -0
  25. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/exception_handling_middleware.py +0 -0
  26. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/logging_middleware.py +0 -0
  27. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/origin_ip_middleware.py +0 -0
  28. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/middleware/server_headers_middleware.py +0 -0
  29. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/openapi.py +0 -0
  30. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/rate_limit.py +0 -0
  31. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/request_context.py +0 -0
  32. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/route.py +0 -0
  33. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/route_auth.py +0 -0
  34. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/route_metadata.py +0 -0
  35. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/api/streaming_json_route.py +0 -0
  36. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/aws_requester.py +0 -0
  37. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/caching/__init__.py +0 -0
  38. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/caching/cache.py +0 -0
  39. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/caching/dict_cache.py +0 -0
  40. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/caching/file_cache.py +0 -0
  41. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/cron/__init__.py +0 -0
  42. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/cron/api_request_cron_job_processor.py +0 -0
  43. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/cron/cron_executor.py +0 -0
  44. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/cron/cron_job_processor.py +0 -0
  45. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/cron/model.py +0 -0
  46. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/exceptions.py +0 -0
  47. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/http/__init__.py +0 -0
  48. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/http/basic_authentication.py +0 -0
  49. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/http/jwt.py +0 -0
  50. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/http/rest_method.py +0 -0
  51. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/locks/__init__.py +0 -0
  52. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/locks/lock.py +0 -0
  53. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/locks/model.py +0 -0
  54. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/locks/sql.py +0 -0
  55. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/logging.py +0 -0
  56. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/notifications/__init__.py +0 -0
  57. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/notifications/discord_client.py +0 -0
  58. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/notifications/notification_client.py +0 -0
  59. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/notifications/slack_client.py +0 -0
  60. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/py.typed +0 -0
  61. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/__init__.py +0 -0
  62. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/aqs.py +0 -0
  63. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/cosmos.py +0 -0
  64. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/message_queue.py +0 -0
  65. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/model.py +0 -0
  66. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/sql.py +0 -0
  67. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/queues/sqs.py +0 -0
  68. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/requester/__init__.py +0 -0
  69. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/requester/requester.py +0 -0
  70. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/s3_manager.py +0 -0
  71. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/service_client.py +0 -0
  72. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/store/__init__.py +0 -0
  73. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/store/database.py +0 -0
  74. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/store/retriever.py +0 -0
  75. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/store/saver.py +0 -0
  76. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/__init__.py +0 -0
  77. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/async_util.py +0 -0
  78. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/chain_util.py +0 -0
  79. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/date_util.py +0 -0
  80. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/dict_util.py +0 -0
  81. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/file_util.py +0 -0
  82. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/hashing_util.py +0 -0
  83. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/http_util.py +0 -0
  84. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/json_util.py +0 -0
  85. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/list_util.py +0 -0
  86. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/process_util.py +0 -0
  87. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/string_util.py +0 -0
  88. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/typing_util.py +0 -0
  89. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/url_util.py +0 -0
  90. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/util/value_holder.py +0 -0
  91. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/web3/__init__.py +0 -0
  92. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/web3/eth_client.py +0 -0
  93. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/web3/eth_client_registry.py +0 -0
  94. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/core/web3/multicall3.py +0 -0
  95. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/kiba_core.egg-info/dependency_links.txt +0 -0
  96. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/kiba_core.egg-info/requires.txt +0 -0
  97. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/kiba_core.egg-info/top_level.txt +0 -0
  98. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/makefile +0 -0
  99. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/setup.cfg +0 -0
  100. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/__init__.py +0 -0
  101. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_api_response.py +0 -0
  102. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_authorizer.py +0 -0
  103. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_exception_handling_middleware.py +0 -0
  104. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_json_route.py +0 -0
  105. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_openapi.py +0 -0
  106. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_origin_ip_middleware.py +0 -0
  107. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_rate_limit.py +0 -0
  108. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_request_context.py +0 -0
  109. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_route.py +0 -0
  110. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/api/test_streaming_json_route.py +0 -0
  111. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/caching/test_dict_cache.py +0 -0
  112. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/caching/test_file_cache.py +0 -0
  113. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/cron/__init__.py +0 -0
  114. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/cron/test_cron_executor.py +0 -0
  115. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/locks/test_sql_lock.py +0 -0
  116. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/queues/conftest.py +0 -0
  117. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/queues/test_aqs_queue.py +0 -0
  118. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/queues/test_cosmos_queue.py +0 -0
  119. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/queues/test_sql_queue.py +0 -0
  120. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/queues/test_sqs_queue.py +0 -0
  121. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/requester/__init__.py +0 -0
  122. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/requester/test_requester.py +0 -0
  123. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/test_database.py +0 -0
  124. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/test_exceptions.py +0 -0
  125. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/test_logging.py +0 -0
  126. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/__init__.py +0 -0
  127. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_async_util.py +0 -0
  128. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_chain_util.py +0 -0
  129. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_date_util.py +0 -0
  130. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_dict_util.py +0 -0
  131. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_file_util.py +0 -0
  132. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_json_util.py +0 -0
  133. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_list_util.py +0 -0
  134. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_process_util.py +0 -0
  135. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_string_util.py +0 -0
  136. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/util/test_url_util.py +0 -0
  137. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/web3/__init__.py +0 -0
  138. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/web3/test_eth_client_registry.py +0 -0
  139. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/tests/web3/test_rest_eth_client.py +0 -0
  140. {kiba_core-0.5.3.dev72 → kiba_core-0.5.3.dev73}/uv.lock +0 -0
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
8
8
  ## [Unreleased]
9
9
 
10
10
  ### Added
11
+ - [MINOR] Added `pollLogIntervalSeconds` (default 600) to `MessageQueueProcessor`: `Retrieving messages...` is now logged on the first poll and then at most once per interval instead of on every poll, so it still shows the worker is alive without flooding the logs; pass `0` to log every poll as before
11
12
  - [MAJOR] Updated `RestEthClient` to raise `RpcServerException` (a `ServerException` keeping the original status code and message, with the original exception as its cause) when the node responds with a 5xx, so callers can tell node failures apart from other server errors; `RequesterTimeoutException` is still raised unchanged. Code catching `InternalServerErrorException` (or `BadGatewayException`, `ServiceUnavailableException`, …) around `RestEthClient` calls must catch `RpcServerException` instead
12
13
  - [MINOR] Added `RestEthClient.get_code`
13
14
  - [MINOR] Added optional `maxConcurrentRequestCount` and `semaphore` to `RestEthClient` to limit concurrent requests; pass the same `semaphore` to several clients to limit them together (it takes precedence over `maxConcurrentRequestCount`)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiba-core
3
- Version: 0.5.3.dev72
3
+ Version: 0.5.3.dev73
4
4
  Summary: Kiba Labs' python utilities
5
5
  Project-URL: repository, https://github.com/kibalabs/core-py
6
6
  Requires-Python: <4,>=3.12
@@ -40,11 +40,13 @@ class MessageLeaseLostException(InternalServerErrorException):
40
40
 
41
41
 
42
42
  class MessageQueueProcessor[MessageType: Message]:
43
- def __init__(self, queue: MessageQueue[MessageType], messageProcessor: MessageProcessor, notificationClients: list[NotificationClient], requestIdHolder: RequestIdHolder | None = None) -> None:
43
+ def __init__(self, queue: MessageQueue[MessageType], messageProcessor: MessageProcessor, notificationClients: list[NotificationClient], requestIdHolder: RequestIdHolder | None = None, pollLogIntervalSeconds: float = 600) -> None:
44
44
  self.queue = queue
45
45
  self.messageProcessor = messageProcessor
46
46
  self.notificationClients = notificationClients
47
47
  self.requestIdHolder = requestIdHolder
48
+ self.pollLogIntervalSeconds = pollLogIntervalSeconds
49
+ self._lastPollLogTime: float | None = None
48
50
 
49
51
  async def _handle_failure(self, message: MessageType, exception: Exception, requestId: str) -> int:
50
52
  logging.error('Caught exception whilst processing message:')
@@ -117,7 +119,10 @@ class MessageQueueProcessor[MessageType: Message]:
117
119
  self.requestIdHolder.set_value(value=None)
118
120
 
119
121
  async def execute_batch(self, batchSize: int, expectedProcessingSeconds: int = 300, longPollSeconds: int = 20, shouldProcessInParallel: bool = False) -> int:
120
- logging.info('Retrieving messages...')
122
+ now = time.monotonic()
123
+ if self._lastPollLogTime is None or now - self._lastPollLogTime >= self.pollLogIntervalSeconds:
124
+ logging.info('Retrieving messages...')
125
+ self._lastPollLogTime = now
121
126
  messages = await self.queue.get_messages(expectedProcessingSeconds=expectedProcessingSeconds, longPollSeconds=longPollSeconds, limit=batchSize)
122
127
  if shouldProcessInParallel:
123
128
  await asyncio.gather(*[self._process_message(message=message, expectedProcessingSeconds=expectedProcessingSeconds) for message in messages])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiba-core
3
- Version: 0.5.3.dev72
3
+ Version: 0.5.3.dev73
4
4
  Summary: Kiba Labs' python utilities
5
5
  Project-URL: repository, https://github.com/kibalabs/core-py
6
6
  Requires-Python: <4,>=3.12
@@ -117,6 +117,7 @@ tests/locks/test_sql_lock.py
117
117
  tests/queues/conftest.py
118
118
  tests/queues/test_aqs_queue.py
119
119
  tests/queues/test_cosmos_queue.py
120
+ tests/queues/test_message_queue_processor.py
120
121
  tests/queues/test_sql_queue.py
121
122
  tests/queues/test_sqs_queue.py
122
123
  tests/requester/__init__.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kiba-core"
3
- version = "0.5.3.dev72"
3
+ version = "0.5.3.dev73"
4
4
  description = "Kiba Labs' python utilities"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12, <4"
@@ -0,0 +1,46 @@
1
+ import asyncio
2
+
3
+ import pytest
4
+
5
+ from core.queues.message_queue_processor import MessageProcessor
6
+ from core.queues.message_queue_processor import MessageQueueProcessor
7
+ from core.queues.model import Message
8
+
9
+
10
+ class EmptyQueue:
11
+ async def get_messages(self, expectedProcessingSeconds: int, longPollSeconds: int, limit: int) -> list[Message]: # noqa: ARG002
12
+ return []
13
+
14
+
15
+ class NoopProcessor(MessageProcessor):
16
+ async def process_message(self, message: Message) -> None:
17
+ pass
18
+
19
+
20
+ def _processor(pollLogIntervalSeconds: float) -> MessageQueueProcessor[Message]:
21
+ return MessageQueueProcessor(queue=EmptyQueue(), messageProcessor=NoopProcessor(), notificationClients=[], pollLogIntervalSeconds=pollLogIntervalSeconds) # type: ignore[arg-type]
22
+
23
+
24
+ def _pollLogCount(caplog: pytest.LogCaptureFixture) -> int:
25
+ return sum(1 for record in caplog.records if record.getMessage() == 'Retrieving messages...')
26
+
27
+
28
+ @pytest.mark.asyncio
29
+ async def test_poll_is_logged_once_per_interval(caplog: pytest.LogCaptureFixture) -> None:
30
+ caplog.set_level('INFO')
31
+ processor = _processor(pollLogIntervalSeconds=0.2)
32
+ await processor.execute_batch(batchSize=1)
33
+ await processor.execute_batch(batchSize=1)
34
+ assert _pollLogCount(caplog) == 1
35
+ await asyncio.sleep(0.25)
36
+ await processor.execute_batch(batchSize=1)
37
+ assert _pollLogCount(caplog) == 2 # noqa: PLR2004
38
+
39
+
40
+ @pytest.mark.asyncio
41
+ async def test_zero_interval_logs_every_poll(caplog: pytest.LogCaptureFixture) -> None:
42
+ caplog.set_level('INFO')
43
+ processor = _processor(pollLogIntervalSeconds=0)
44
+ for _ in range(3):
45
+ await processor.execute_batch(batchSize=1)
46
+ assert _pollLogCount(caplog) == 3 # noqa: PLR2004
File without changes