kiba-core 0.5.3.dev81__tar.gz → 0.5.3.dev83__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 (144) hide show
  1. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.github/workflows/deploy.yml +1 -1
  2. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.github/workflows/pull-request.yml +3 -3
  3. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/CHANGELOG.md +1 -0
  4. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/PKG-INFO +9 -9
  5. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/request_context.py +1 -1
  6. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/locks/lock.py +2 -2
  7. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/store/database.py +4 -4
  8. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/store/saver.py +2 -2
  9. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/web3/eth_client.py +3 -1
  10. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/kiba_core.egg-info/PKG-INFO +9 -9
  11. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/kiba_core.egg-info/requires.txt +8 -8
  12. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/pyproject.toml +10 -10
  13. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/web3/test_rest_eth_client.py +13 -0
  14. kiba_core-0.5.3.dev83/uv.lock +3719 -0
  15. kiba_core-0.5.3.dev81/uv.lock +0 -3494
  16. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.github/pull_request_template.md +0 -0
  17. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.github/workflows/publish.yml +0 -0
  18. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.github/workflows/release.yml +0 -0
  19. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/.gitignore +0 -0
  20. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/Dockerfile +0 -0
  21. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/README.md +0 -0
  22. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/__init__.py +0 -0
  23. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/__init__.py +0 -0
  24. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/api_request.py +0 -0
  25. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/api_response.py +0 -0
  26. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/authorizer.py +0 -0
  27. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/default_routes.py +0 -0
  28. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/health.py +0 -0
  29. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/json_route.py +0 -0
  30. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/__init__.py +0 -0
  31. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/database_connection_middleware.py +0 -0
  32. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/exception_handling_middleware.py +0 -0
  33. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/logging_middleware.py +0 -0
  34. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/origin_ip_middleware.py +0 -0
  35. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/middleware/server_headers_middleware.py +0 -0
  36. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/openapi.py +0 -0
  37. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/rate_limit.py +0 -0
  38. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/route.py +0 -0
  39. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/route_auth.py +0 -0
  40. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/route_metadata.py +0 -0
  41. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/api/streaming_json_route.py +0 -0
  42. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/aws_requester.py +0 -0
  43. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/caching/__init__.py +0 -0
  44. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/caching/cache.py +0 -0
  45. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/caching/dict_cache.py +0 -0
  46. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/caching/file_cache.py +0 -0
  47. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/cron/__init__.py +0 -0
  48. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/cron/api_request_cron_job_processor.py +0 -0
  49. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/cron/cron_executor.py +0 -0
  50. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/cron/cron_job_processor.py +0 -0
  51. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/cron/model.py +0 -0
  52. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/exceptions.py +0 -0
  53. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/http/__init__.py +0 -0
  54. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/http/basic_authentication.py +0 -0
  55. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/http/jwt.py +0 -0
  56. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/http/rest_method.py +0 -0
  57. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/locks/__init__.py +0 -0
  58. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/locks/model.py +0 -0
  59. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/locks/sql.py +0 -0
  60. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/logging.py +0 -0
  61. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/notifications/__init__.py +0 -0
  62. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/notifications/discord_client.py +0 -0
  63. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/notifications/notification_client.py +0 -0
  64. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/notifications/slack_client.py +0 -0
  65. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/py.typed +0 -0
  66. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/__init__.py +0 -0
  67. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/aqs.py +0 -0
  68. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/cosmos.py +0 -0
  69. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/message_queue.py +0 -0
  70. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/message_queue_processor.py +0 -0
  71. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/model.py +0 -0
  72. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/sql.py +0 -0
  73. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/queues/sqs.py +0 -0
  74. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/requester/__init__.py +0 -0
  75. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/requester/requester.py +0 -0
  76. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/s3_manager.py +0 -0
  77. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/service_client.py +0 -0
  78. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/store/__init__.py +0 -0
  79. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/store/entity_repository.py +0 -0
  80. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/store/retriever.py +0 -0
  81. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/__init__.py +0 -0
  82. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/async_util.py +0 -0
  83. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/chain_util.py +0 -0
  84. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/date_util.py +0 -0
  85. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/dict_util.py +0 -0
  86. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/file_util.py +0 -0
  87. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/hashing_util.py +0 -0
  88. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/http_util.py +0 -0
  89. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/json_util.py +0 -0
  90. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/list_util.py +0 -0
  91. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/process_util.py +0 -0
  92. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/string_util.py +0 -0
  93. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/typing_util.py +0 -0
  94. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/url_util.py +0 -0
  95. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/util/value_holder.py +0 -0
  96. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/web3/__init__.py +0 -0
  97. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/web3/eth_client_registry.py +0 -0
  98. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/core/web3/multicall3.py +0 -0
  99. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/kiba_core.egg-info/SOURCES.txt +0 -0
  100. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/kiba_core.egg-info/dependency_links.txt +0 -0
  101. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/kiba_core.egg-info/top_level.txt +0 -0
  102. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/makefile +0 -0
  103. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/setup.cfg +0 -0
  104. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/__init__.py +0 -0
  105. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_api_response.py +0 -0
  106. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_authorizer.py +0 -0
  107. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_exception_handling_middleware.py +0 -0
  108. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_json_route.py +0 -0
  109. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_openapi.py +0 -0
  110. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_origin_ip_middleware.py +0 -0
  111. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_rate_limit.py +0 -0
  112. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_request_context.py +0 -0
  113. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_route.py +0 -0
  114. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/api/test_streaming_json_route.py +0 -0
  115. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/caching/test_dict_cache.py +0 -0
  116. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/caching/test_file_cache.py +0 -0
  117. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/cron/__init__.py +0 -0
  118. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/cron/test_cron_executor.py +0 -0
  119. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/locks/test_sql_lock.py +0 -0
  120. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/conftest.py +0 -0
  121. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/test_aqs_queue.py +0 -0
  122. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/test_cosmos_queue.py +0 -0
  123. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/test_message_queue_processor.py +0 -0
  124. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/test_sql_queue.py +0 -0
  125. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/queues/test_sqs_queue.py +0 -0
  126. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/requester/__init__.py +0 -0
  127. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/requester/test_requester.py +0 -0
  128. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/test_database.py +0 -0
  129. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/test_entity_repository.py +0 -0
  130. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/test_exceptions.py +0 -0
  131. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/test_logging.py +0 -0
  132. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/__init__.py +0 -0
  133. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_async_util.py +0 -0
  134. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_chain_util.py +0 -0
  135. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_date_util.py +0 -0
  136. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_dict_util.py +0 -0
  137. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_file_util.py +0 -0
  138. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_json_util.py +0 -0
  139. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_list_util.py +0 -0
  140. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_process_util.py +0 -0
  141. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_string_util.py +0 -0
  142. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/util/test_url_util.py +0 -0
  143. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/web3/__init__.py +0 -0
  144. {kiba_core-0.5.3.dev81 → kiba_core-0.5.3.dev83}/tests/web3/test_eth_client_registry.py +0 -0
@@ -10,7 +10,7 @@ jobs:
10
10
  PYPI_PUBLISH_TOKEN: ${{ secrets.PYPI_PUBLISH_TOKEN }}
11
11
  steps:
12
12
  - name: Check out the repo
13
- uses: actions/checkout@v2
13
+ uses: actions/checkout@v7
14
14
  with:
15
15
  # NOTE(krishan711): need full history to calculate difference
16
16
  fetch-depth: 0
@@ -12,11 +12,11 @@ jobs:
12
12
  DOCKER_IMAGE: core
13
13
  steps:
14
14
  - name: Check out the repo
15
- uses: actions/checkout@v2
15
+ uses: actions/checkout@v7
16
16
  - name: Set up Docker Buildx
17
- uses: docker/setup-buildx-action@v1
17
+ uses: docker/setup-buildx-action@v4
18
18
  - name: Build docker image
19
- uses: docker/build-push-action@v2
19
+ uses: docker/build-push-action@v7
20
20
  with:
21
21
  context: .
22
22
  load: true
@@ -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 optional `timeoutSeconds` (default 10) to `RestEthClient` to set the timeout of each request, e.g. a shorter one for an archive node so a degraded node fails fast
11
12
  - [MINOR] Added `UNDEFINED`, `Undefined` and `UpdateValue[T]` to `core.util.typing_util` for partial updates: `UpdateValue[T]` is `T` or the `UNDEFINED` sentinel, so an update can tell "not provided" apart from an explicit `None`. Use it as a pydantic field default (`title: UpdateValue[str | None] = UNDEFINED`); request input never validates to `UNDEFINED` (a JSON `"UNDEFINED"` stays a string), and `x is not UNDEFINED` narrows `x` to `T` for type checkers
12
13
  - [MINOR] Added `core.store.entity_repository.EntityRepository`, which reads and writes rows of a table as pydantic models: `create`, `update`, `upsert`, `upsert_many` (postgres and sqlite), `delete`, `list_many`, `get_first`, `get`, `get_one` and `get_one_or_none`. It exposes UUID columns as strings and datetimes as aware utc datetimes, dumps pydantic values in JSON columns, generates ids for UUID primary keys and stamps `createdDate`/`updatedDate` when the table has them; subclasses can override `_convert_value_from_db`/`_convert_value_to_db` for other columns
13
14
  - [MINOR] Added `UUIDFieldFilter` (accepts `uuid.UUID` or `str` values) and module-level `apply_orders`, `apply_field_filters` and `get_field_filters_conditions` (conditions usable on selects, updates and deletes) to `core.store.retriever`; `Retriever` now uses them
@@ -1,19 +1,19 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiba-core
3
- Version: 0.5.3.dev81
3
+ Version: 0.5.3.dev83
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
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: aiofiles>=25.1.0
9
- Requires-Dist: pydantic>=2.13.5
10
- Requires-Dist: orjson>=3.12.0
9
+ Requires-Dist: pydantic>=2.14.1
10
+ Requires-Dist: orjson>=3.13.0
11
11
  Provides-Extra: api
12
- Requires-Dist: fastapi>=0.141.1; extra == "api"
13
- Requires-Dist: uvicorn[standard]>=0.53.0; extra == "api"
12
+ Requires-Dist: fastapi>=0.143.0; extra == "api"
13
+ Requires-Dist: uvicorn[standard]>=0.54.0; extra == "api"
14
14
  Provides-Extra: core-api
15
15
  Requires-Dist: starlette>=1.7.0; extra == "core-api"
16
- Requires-Dist: uvicorn[standard]>=0.53.0; extra == "core-api"
16
+ Requires-Dist: uvicorn[standard]>=0.54.0; extra == "core-api"
17
17
  Provides-Extra: storage
18
18
  Requires-Dist: aiobotocore>=3.9.2; extra == "storage"
19
19
  Provides-Extra: queues
@@ -25,10 +25,10 @@ Requires-Dist: azure-storage-queue[aio]>=12.18.0; extra == "queue-aqs"
25
25
  Provides-Extra: queue-cosmos
26
26
  Requires-Dist: azure-cosmos>=4.17.1; extra == "queue-cosmos"
27
27
  Provides-Extra: database-psql
28
- Requires-Dist: sqlalchemy[asyncio]>=2.1.3; extra == "database-psql"
29
- Requires-Dist: asyncpg>=0.31.0; extra == "database-psql"
28
+ Requires-Dist: sqlalchemy[asyncio]>=2.1.4; extra == "database-psql"
29
+ Requires-Dist: asyncpg>=0.32.0; extra == "database-psql"
30
30
  Provides-Extra: database-sqlite
31
- Requires-Dist: sqlalchemy[asyncio]>=2.1.3; extra == "database-sqlite"
31
+ Requires-Dist: sqlalchemy[asyncio]>=2.1.4; extra == "database-sqlite"
32
32
  Requires-Dist: aiosqlite>=0.22.1; extra == "database-sqlite"
33
33
  Provides-Extra: requester
34
34
  Requires-Dist: httpx2>=2.13.1; extra == "requester"
@@ -30,7 +30,7 @@ class RequestContextHolder[RequestContextType: RequestContext]:
30
30
  return value
31
31
 
32
32
  @contextmanager
33
- def use_value(self, value: RequestContextType) -> typing.Iterator[RequestContextType]:
33
+ def use_value(self, value: RequestContextType) -> typing.Generator[RequestContextType]:
34
34
  token = self._valueContext.set(value)
35
35
  try:
36
36
  yield value
@@ -2,7 +2,7 @@ import abc
2
2
  import asyncio
3
3
  import contextlib
4
4
  from abc import ABC
5
- from collections.abc import AsyncIterator
5
+ from collections.abc import AsyncGenerator
6
6
 
7
7
  from core import logging
8
8
  from core.exceptions import LockedException
@@ -55,7 +55,7 @@ class Lock(ABC):
55
55
  return
56
56
 
57
57
  @contextlib.asynccontextmanager
58
- async def with_lock(self, name: str, ttlSeconds: int = 60, maxWaitSeconds: float = 0) -> AsyncIterator[LockLease]:
58
+ async def with_lock(self, name: str, ttlSeconds: int = 60, maxWaitSeconds: float = 0) -> AsyncGenerator[LockLease]:
59
59
  lease = await self.acquire(name=name, ttlSeconds=ttlSeconds, maxWaitSeconds=maxWaitSeconds)
60
60
  keepAliveTask = asyncio.create_task(self._keep_alive(lease=lease))
61
61
  try:
@@ -3,7 +3,7 @@ import contextvars
3
3
  import datetime
4
4
  import typing
5
5
  import weakref
6
- from collections.abc import AsyncIterator
6
+ from collections.abc import AsyncGenerator
7
7
  from typing import TypeVarTuple
8
8
 
9
9
  import sqlalchemy
@@ -80,7 +80,7 @@ class Database:
80
80
  raise InternalServerErrorException(message=f'Database.now does not support dialect: {dialectName}')
81
81
 
82
82
  @contextlib.asynccontextmanager
83
- async def create_transaction(self) -> AsyncIterator[DatabaseConnection]:
83
+ async def create_transaction(self) -> AsyncGenerator[DatabaseConnection]:
84
84
  if not self._engine:
85
85
  raise InternalServerErrorException(message='Engine has not been established. Please called collect() first.')
86
86
  async with self._engine.begin() as connection:
@@ -102,7 +102,7 @@ class Database:
102
102
  # uncaught exception raised whilst parallel queries are running.
103
103
  # We have the forced reconnect at the bottom just to catch for this wierd case.
104
104
  @contextlib.asynccontextmanager
105
- async def create_context_connection(self) -> AsyncIterator[DatabaseConnection]:
105
+ async def create_context_connection(self) -> AsyncGenerator[DatabaseConnection]:
106
106
  if not self._engine:
107
107
  raise InternalServerErrorException(message='Engine has not been established. Please called collect() first.')
108
108
  if self._get_context_connection() is not None:
@@ -128,7 +128,7 @@ class Database:
128
128
  # transaction's uncommitted writes and will block forever on rows the outer transaction has written, so
129
129
  # callers must commit their writes before entering. Violations are logged (with the caller's stack) for now.
130
130
  @contextlib.asynccontextmanager
131
- async def create_isolated_context_connection(self) -> AsyncIterator[DatabaseConnection]:
131
+ async def create_isolated_context_connection(self) -> AsyncGenerator[DatabaseConnection]:
132
132
  if not self._engine:
133
133
  raise InternalServerErrorException(message='Engine has not been established. Please called collect() first.')
134
134
  outerConnection = self._get_context_connection()
@@ -1,5 +1,5 @@
1
1
  import contextlib
2
- from collections.abc import AsyncIterator
2
+ from collections.abc import AsyncGenerator
3
3
  from typing import TYPE_CHECKING
4
4
  from typing import Any
5
5
 
@@ -35,7 +35,7 @@ class Saver:
35
35
  self.database = database
36
36
 
37
37
  @contextlib.asynccontextmanager
38
- async def create_transaction(self) -> AsyncIterator[DatabaseConnection]:
38
+ async def create_transaction(self) -> AsyncGenerator[DatabaseConnection]:
39
39
  async with self.database.create_transaction() as connection:
40
40
  yield connection
41
41
 
@@ -316,10 +316,12 @@ class RestEthClient(EthClientInterface):
316
316
  retryLimit: int = 10,
317
317
  maxConcurrentRequestCount: int | None = None,
318
318
  semaphore: asyncio.Semaphore | None = None,
319
+ timeoutSeconds: int = 10,
319
320
  ) -> None:
320
321
  super().__init__(web3Connection=Web3(), chainId=chainId, isTestnet=isTestnet)
321
322
  self.url = url
322
323
  self.requester = requester
324
+ self.timeoutSeconds = timeoutSeconds
323
325
  self.shouldBackoffRetryOnRateLimit = shouldBackoffRetryOnRateLimit
324
326
  self.retryLimit = retryLimit
325
327
  # NOTE(krishan711): pass the same semaphore to several clients to cap their combined concurrent requests, or set maxConcurrentRequestCount to cap just this client
@@ -342,7 +344,7 @@ class RestEthClient(EthClientInterface):
342
344
  response = await self.requester.post_json(
343
345
  url=self.url,
344
346
  dataDict={'jsonrpc': '2.0', 'method': method, 'params': params or [], 'id': None},
345
- timeout=10,
347
+ timeout=self.timeoutSeconds,
346
348
  )
347
349
  responseDict = response.json()
348
350
  if responseDict.get('error'):
@@ -1,19 +1,19 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiba-core
3
- Version: 0.5.3.dev81
3
+ Version: 0.5.3.dev83
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
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: aiofiles>=25.1.0
9
- Requires-Dist: pydantic>=2.13.5
10
- Requires-Dist: orjson>=3.12.0
9
+ Requires-Dist: pydantic>=2.14.1
10
+ Requires-Dist: orjson>=3.13.0
11
11
  Provides-Extra: api
12
- Requires-Dist: fastapi>=0.141.1; extra == "api"
13
- Requires-Dist: uvicorn[standard]>=0.53.0; extra == "api"
12
+ Requires-Dist: fastapi>=0.143.0; extra == "api"
13
+ Requires-Dist: uvicorn[standard]>=0.54.0; extra == "api"
14
14
  Provides-Extra: core-api
15
15
  Requires-Dist: starlette>=1.7.0; extra == "core-api"
16
- Requires-Dist: uvicorn[standard]>=0.53.0; extra == "core-api"
16
+ Requires-Dist: uvicorn[standard]>=0.54.0; extra == "core-api"
17
17
  Provides-Extra: storage
18
18
  Requires-Dist: aiobotocore>=3.9.2; extra == "storage"
19
19
  Provides-Extra: queues
@@ -25,10 +25,10 @@ Requires-Dist: azure-storage-queue[aio]>=12.18.0; extra == "queue-aqs"
25
25
  Provides-Extra: queue-cosmos
26
26
  Requires-Dist: azure-cosmos>=4.17.1; extra == "queue-cosmos"
27
27
  Provides-Extra: database-psql
28
- Requires-Dist: sqlalchemy[asyncio]>=2.1.3; extra == "database-psql"
29
- Requires-Dist: asyncpg>=0.31.0; extra == "database-psql"
28
+ Requires-Dist: sqlalchemy[asyncio]>=2.1.4; extra == "database-psql"
29
+ Requires-Dist: asyncpg>=0.32.0; extra == "database-psql"
30
30
  Provides-Extra: database-sqlite
31
- Requires-Dist: sqlalchemy[asyncio]>=2.1.3; extra == "database-sqlite"
31
+ Requires-Dist: sqlalchemy[asyncio]>=2.1.4; extra == "database-sqlite"
32
32
  Requires-Dist: aiosqlite>=0.22.1; extra == "database-sqlite"
33
33
  Provides-Extra: requester
34
34
  Requires-Dist: httpx2>=2.13.1; extra == "requester"
@@ -1,24 +1,24 @@
1
1
  aiofiles>=25.1.0
2
- pydantic>=2.13.5
3
- orjson>=3.12.0
2
+ pydantic>=2.14.1
3
+ orjson>=3.13.0
4
4
 
5
5
  [api]
6
- fastapi>=0.141.1
7
- uvicorn[standard]>=0.53.0
6
+ fastapi>=0.143.0
7
+ uvicorn[standard]>=0.54.0
8
8
 
9
9
  [core-api]
10
10
  starlette>=1.7.0
11
- uvicorn[standard]>=0.53.0
11
+ uvicorn[standard]>=0.54.0
12
12
 
13
13
  [cron]
14
14
  apscheduler<4,>=3.11.3
15
15
 
16
16
  [database-psql]
17
- sqlalchemy[asyncio]>=2.1.3
18
- asyncpg>=0.31.0
17
+ sqlalchemy[asyncio]>=2.1.4
18
+ asyncpg>=0.32.0
19
19
 
20
20
  [database-sqlite]
21
- sqlalchemy[asyncio]>=2.1.3
21
+ sqlalchemy[asyncio]>=2.1.4
22
22
  aiosqlite>=0.22.1
23
23
 
24
24
  [queue-aqs]
@@ -1,23 +1,23 @@
1
1
  [project]
2
2
  name = "kiba-core"
3
- version = "0.5.3.dev81"
3
+ version = "0.5.3.dev83"
4
4
  description = "Kiba Labs' python utilities"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12, <4"
7
7
  dependencies = [
8
8
  "aiofiles>=25.1.0",
9
- "pydantic>=2.13.5",
10
- "orjson>=3.12.0",
9
+ "pydantic>=2.14.1",
10
+ "orjson>=3.13.0",
11
11
  ]
12
12
 
13
13
  [project.optional-dependencies]
14
14
  api = [
15
- "fastapi>=0.141.1",
16
- "uvicorn[standard]>=0.53.0",
15
+ "fastapi>=0.143.0",
16
+ "uvicorn[standard]>=0.54.0",
17
17
  ]
18
18
  core-api = [
19
19
  "starlette>=1.7.0",
20
- "uvicorn[standard]>=0.53.0",
20
+ "uvicorn[standard]>=0.54.0",
21
21
  ]
22
22
  storage = [
23
23
  "aiobotocore>=3.9.2",
@@ -36,11 +36,11 @@ queue-cosmos = [
36
36
  "azure-cosmos>=4.17.1",
37
37
  ]
38
38
  database-psql = [
39
- "sqlalchemy[asyncio]>=2.1.3",
40
- "asyncpg>=0.31.0",
39
+ "sqlalchemy[asyncio]>=2.1.4",
40
+ "asyncpg>=0.32.0",
41
41
  ]
42
42
  database-sqlite = [
43
- "sqlalchemy[asyncio]>=2.1.3",
43
+ "sqlalchemy[asyncio]>=2.1.4",
44
44
  "aiosqlite>=0.22.1",
45
45
  ]
46
46
  requester = [
@@ -59,7 +59,7 @@ types = [
59
59
 
60
60
  [dependency-groups]
61
61
  dev = [
62
- "kiba-build==0.1.11.dev15",
62
+ "kiba-build==0.1.11.dev17",
63
63
  ]
64
64
 
65
65
  [project.urls]
@@ -571,6 +571,19 @@ class TestRestEthClient:
571
571
  assert all(client.semaphore is semaphore for client in clients)
572
572
  assert await self._max_concurrent_request_count(mock_requester=mock_requester, clients=clients) == 2
573
573
 
574
+ @pytest.mark.asyncio
575
+ async def test_requests_use_default_timeout(self, client, mock_requester):
576
+ mock_requester.responses['eth_blockNumber'] = {'jsonrpc': '2.0', 'result': '0x1b4', 'id': None}
577
+ await client.get_latest_block_number()
578
+ assert mock_requester.requests_made[0]['timeout'] == 10
579
+
580
+ @pytest.mark.asyncio
581
+ async def test_requests_use_timeout_seconds(self, mock_requester):
582
+ mock_requester.responses['eth_blockNumber'] = {'jsonrpc': '2.0', 'result': '0x1b4', 'id': None}
583
+ client = RestEthClient(url='https://test-rpc-url.com', requester=mock_requester, chainId=1, timeoutSeconds=3)
584
+ await client.get_latest_block_number()
585
+ assert mock_requester.requests_made[0]['timeout'] == 3
586
+
574
587
  @pytest.mark.asyncio
575
588
  async def test_fill_transaction_params_all_provided(self, client, mock_requester):
576
589
  params = {