zrb 0.24.0__py3-none-any.whl → 0.24.1__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.
Files changed (169) hide show
  1. zrb/action/runner.py +6 -5
  2. zrb/advertisement.py +1 -2
  3. zrb/builtin/base64/decode.py +1 -1
  4. zrb/builtin/base64/encode.py +1 -1
  5. zrb/builtin/devtool/install/_helper.py +2 -1
  6. zrb/builtin/env/get.py +3 -2
  7. zrb/builtin/eval.py +2 -1
  8. zrb/builtin/git/get_file_changes.py +2 -1
  9. zrb/builtin/md5/hash.py +1 -1
  10. zrb/builtin/md5/sum.py +1 -1
  11. zrb/builtin/project/_helper.py +3 -3
  12. zrb/builtin/project/add/app/generator/generator.py +1 -1
  13. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/snake_zrb_generator_name.py +1 -1
  14. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/_automate/snake_zrb_app_name/container/remove.py +1 -1
  15. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/_automate/snake_zrb_app_name/container/start.py +1 -1
  16. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/_automate/snake_zrb_app_name/container/stop.py +1 -1
  17. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/src/kebab-zrb-app-name/docker-compose.yml +0 -2
  18. zrb/builtin/project/add/app/python/python.py +1 -1
  19. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/remove.py +1 -1
  20. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/start.py +1 -1
  21. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/stop.py +1 -1
  22. zrb/builtin/project/add/app/python/template/src/kebab-zrb-app-name/docker-compose.yml +0 -2
  23. zrb/builtin/project/add/fastapp/app/app.py +3 -1
  24. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_helper.py +1 -1
  25. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_service_config.py +1 -1
  26. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/_helper.py +2 -2
  27. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/_helper.py +2 -2
  28. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/_helper.py +5 -3
  29. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/frontend/build-once.sh +1 -1
  30. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/frontend/build.sh +1 -1
  31. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/_helper.py +3 -5
  32. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/start.py +3 -3
  33. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/{start_microservices.py → start_services.py} +2 -3
  34. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/.generator-version +1 -0
  35. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/deployment/_common.py +5 -5
  36. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/deployment/app_helper.py +5 -5
  37. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/docker-compose.yml +2 -2
  38. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/error.py +2 -1
  39. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/kafka/admin.py +4 -3
  40. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/kafka/consumer.py +2 -1
  41. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/messagebus.py +4 -3
  42. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/mock.py +4 -3
  43. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/rabbitmq/admin.py +4 -3
  44. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/rabbitmq/consumer.py +3 -2
  45. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/model/repo_model.py +3 -3
  46. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/db_repo.py +7 -6
  47. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/repo.py +2 -2
  48. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/search_filter.py +2 -1
  49. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/messagebus/caller.py +2 -1
  50. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/messagebus/server.py +2 -1
  51. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/rpc.py +3 -2
  52. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/serializer/serializer.py +2 -1
  53. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/config.py +3 -4
  54. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/helper/async_task.py +1 -1
  55. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/component/access_token/scheme.py +2 -1
  56. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/component/access_token/util.py +2 -1
  57. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/group/repo.py +2 -1
  58. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/group/rpc.py +2 -1
  59. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/rpc.py +2 -1
  60. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +2 -1
  61. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py +3 -2
  62. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py +3 -2
  63. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/rpc.py +3 -2
  64. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/register_permission.py +2 -2
  65. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/group.py +3 -5
  66. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/permission.py +1 -3
  67. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/request.py +1 -3
  68. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/user.py +5 -7
  69. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +2 -1
  70. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/entity/activity/rpc.py +2 -1
  71. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/schema/activity.py +1 -3
  72. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +1 -1
  73. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +1 -1
  74. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +1 -1
  75. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +1 -1
  76. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +1 -1
  77. zrb/builtin/project/add/fastapp/crud/_task_factory.py +1 -2
  78. zrb/builtin/project/add/fastapp/crud/crud.py +1 -1
  79. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/rpc.py +2 -1
  80. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +2 -2
  81. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +1 -1
  82. zrb/builtin/project/add/fastapp/field/field.py +1 -1
  83. zrb/builtin/project/add/fastapp/module/_helper/create_microservice_config.py +7 -8
  84. zrb/builtin/project/add/fastapp/module/module.py +1 -1
  85. zrb/builtin/project/add/plugin/plugin.py +1 -1
  86. zrb/builtin/project/add/project_task/add.py +1 -1
  87. zrb/builtin/project/add/project_task/template/_automate/_project/build.py +2 -1
  88. zrb/builtin/project/add/project_task/template/_automate/_project/container/remove.py +2 -1
  89. zrb/builtin/project/add/project_task/template/_automate/_project/container/start.py +2 -1
  90. zrb/builtin/project/add/project_task/template/_automate/_project/container/stop.py +2 -1
  91. zrb/builtin/project/add/project_task/template/_automate/_project/deploy.py +2 -1
  92. zrb/builtin/project/add/project_task/template/_automate/_project/destroy.py +2 -1
  93. zrb/builtin/project/add/project_task/template/_automate/_project/get_env.py +2 -1
  94. zrb/builtin/project/add/project_task/template/_automate/_project/image/build.py +2 -1
  95. zrb/builtin/project/add/project_task/template/_automate/_project/image/push.py +2 -1
  96. zrb/builtin/project/add/project_task/template/_automate/_project/publish.py +2 -1
  97. zrb/builtin/project/add/project_task/template/_automate/_project/start.py +2 -1
  98. zrb/builtin/project/add/task/cmd/add.py +1 -1
  99. zrb/builtin/project/add/task/docker_compose/add.py +1 -1
  100. zrb/builtin/project/add/task/docker_compose/template/src/kebab-zrb-task-name/docker-compose.yml +0 -2
  101. zrb/builtin/project/add/task/python/add.py +1 -1
  102. zrb/builtin/project/add/task/python/template/_automate/snake_zrb_task_name.py +1 -1
  103. zrb/builtin/project/create/_helper.py +1 -1
  104. zrb/builtin/project/create/create.py +1 -1
  105. zrb/builtin/say.py +3 -3
  106. zrb/builtin/version.py +2 -1
  107. zrb/helper/accessories/color.py +2 -1
  108. zrb/helper/advertisement.py +2 -1
  109. zrb/helper/callable.py +2 -1
  110. zrb/helper/codemod/add_import_module.py +3 -2
  111. zrb/helper/codemod/add_property_to_class.py +2 -1
  112. zrb/helper/default_env.py +2 -1
  113. zrb/helper/docker_compose/fetch_external_env.py +4 -2
  114. zrb/helper/docker_compose/file.py +3 -1
  115. zrb/helper/env_map/fetch.py +3 -2
  116. zrb/helper/file/copy_tree.py +2 -1
  117. zrb/helper/file/match.py +2 -2
  118. zrb/helper/git/detect_changes.py +1 -1
  119. zrb/helper/map/conversion.py +3 -1
  120. zrb/helper/string/jinja.py +2 -1
  121. zrb/helper/string/parse_replacement.py +1 -1
  122. zrb/helper/typing.py +5 -27
  123. zrb/helper/util.py +1 -1
  124. zrb/task/any_task.py +9 -17
  125. zrb/task/any_task_event_handler.py +3 -1
  126. zrb/task/base_remote_cmd_task.py +3 -10
  127. zrb/task/base_task/base_task.py +9 -8
  128. zrb/task/base_task/component/base_task_model.py +6 -13
  129. zrb/task/base_task/component/common_task_model.py +15 -22
  130. zrb/task/base_task/component/renderer.py +3 -1
  131. zrb/task/base_task/component/trackers.py +1 -1
  132. zrb/task/checker.py +2 -1
  133. zrb/task/cmd_task.py +4 -11
  134. zrb/task/decorator.py +3 -1
  135. zrb/task/docker_compose_start_task.py +27 -32
  136. zrb/task/docker_compose_task.py +27 -35
  137. zrb/task/flow_task.py +19 -17
  138. zrb/task/http_checker.py +3 -9
  139. zrb/task/looper.py +4 -2
  140. zrb/task/notifier.py +3 -1
  141. zrb/task/parallel.py +4 -4
  142. zrb/task/path_checker.py +6 -12
  143. zrb/task/path_watcher.py +5 -13
  144. zrb/task/port_checker.py +3 -9
  145. zrb/task/recurring_task.py +5 -4
  146. zrb/task/remote_cmd_task.py +2 -1
  147. zrb/task/resource_maker.py +6 -13
  148. zrb/task/rsync_task.py +3 -1
  149. zrb/task/server.py +13 -12
  150. zrb/task/time_watcher.py +3 -10
  151. zrb/task/watcher.py +2 -1
  152. zrb/task/wiki_task.py +4 -3
  153. zrb/task_env/env.py +2 -1
  154. zrb/task_env/env_file.py +7 -6
  155. zrb/task_group/group.py +8 -7
  156. zrb/task_input/any_input.py +4 -3
  157. zrb/task_input/base_input.py +5 -3
  158. zrb/task_input/bool_input.py +2 -1
  159. zrb/task_input/choice_input.py +3 -1
  160. zrb/task_input/float_input.py +2 -1
  161. zrb/task_input/int_input.py +2 -1
  162. zrb/task_input/multiline_input.py +3 -1
  163. zrb/task_input/password_input.py +2 -1
  164. zrb/task_input/str_input.py +2 -1
  165. {zrb-0.24.0.dist-info → zrb-0.24.1.dist-info}/METADATA +1 -1
  166. {zrb-0.24.0.dist-info → zrb-0.24.1.dist-info}/RECORD +169 -168
  167. {zrb-0.24.0.dist-info → zrb-0.24.1.dist-info}/LICENSE +0 -0
  168. {zrb-0.24.0.dist-info → zrb-0.24.1.dist-info}/WHEEL +0 -0
  169. {zrb-0.24.0.dist-info → zrb-0.24.1.dist-info}/entry_points.txt +0 -0
@@ -1,7 +1,8 @@
1
1
  import asyncio
2
2
  import inspect
3
3
  import logging
4
- from typing import Any, Callable, List, Mapping
4
+ from collections.abc import Callable, Mapping
5
+ from typing import Any
5
6
 
6
7
  from component.messagebus.messagebus import (
7
8
  Admin,
@@ -59,8 +60,8 @@ class MockPublisher(Publisher):
59
60
 
60
61
 
61
62
  class MockAdmin(Admin):
62
- async def create_events(self, event_names: List[str]):
63
+ async def create_events(self, event_names: list[str]):
63
64
  return
64
65
 
65
- async def delete_events(self, event_names: List[str]):
66
+ async def delete_events(self, event_names: list[str]):
66
67
  return
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  import logging
3
- from typing import Any, List, Mapping, Optional
3
+ from collections.abc import Mapping
4
+ from typing import Any, Optional
4
5
 
5
6
  import aiormq
6
7
  from component.messagebus.messagebus import Admin
@@ -28,7 +29,7 @@ class RMQAdmin(Admin):
28
29
  self.configs = configs
29
30
  self._existing_events: Mapping[str, bool] = {}
30
31
 
31
- async def create_events(self, event_names: List[str]):
32
+ async def create_events(self, event_names: list[str]):
32
33
  # Only handle non-existing events
33
34
  event_names = [
34
35
  event_name
@@ -60,7 +61,7 @@ class RMQAdmin(Admin):
60
61
  exc_info=True,
61
62
  )
62
63
 
63
- async def delete_events(self, event_names: List[str]):
64
+ async def delete_events(self, event_names: list[str]):
64
65
  # Only handle existing events
65
66
  event_names = [
66
67
  event_name
@@ -1,7 +1,8 @@
1
1
  import asyncio
2
2
  import inspect
3
3
  import logging
4
- from typing import Any, Callable, Mapping, Optional
4
+ from collections.abc import Callable, Mapping
5
+ from typing import Any, Optional
5
6
 
6
7
  import aiormq
7
8
  from component.messagebus.messagebus import (
@@ -68,7 +69,7 @@ class RMQConsumer(Consumer):
68
69
  await self._connect()
69
70
  event_names = list(self._handlers.keys())
70
71
  await self.rmq_admin.create_events(event_names)
71
- f'🐰 [{self.identifier}] Listening from "{event_names}"'
72
+ f'🐰 [{self.identifier}] listening from "{event_names}"'
72
73
  for event_name in event_names:
73
74
  queue_name = self.rmq_admin.get_queue_name(event_name)
74
75
  on_message = self._create_consumer_callback(self.channel, event_name)
@@ -1,4 +1,4 @@
1
- from typing import Generic, List, Optional, Type, TypeVar
1
+ from typing import Generic, Optional, Type, TypeVar
2
2
 
3
3
  from component.repo.repo import Repo
4
4
  from component.repo.search_filter import SearchFilter
@@ -18,10 +18,10 @@ class RepoModel(Generic[Schema, SchemaData, SchemaResult]):
18
18
  async def get_by_id(self, id: str) -> Schema:
19
19
  return await self.repo.get_by_id(id)
20
20
 
21
- async def get_all(self) -> List[Schema]:
21
+ async def get_all(self) -> list[Schema]:
22
22
  count = await self.repo.count()
23
23
  limit = 1000
24
- schema_list: List[Schema] = []
24
+ schema_list: list[Schema] = []
25
25
  for offset in range(0, count, limit):
26
26
  partial_schema_list = await self.repo.get(limit=limit, offset=offset)
27
27
  schema_list += partial_schema_list
@@ -1,5 +1,6 @@
1
1
  import logging
2
- from typing import Any, List, Mapping, Optional, Type, TypeVar
2
+ from collections.abc import Mapping
3
+ from typing import Any, Optional, Type, TypeVar
3
4
 
4
5
  from component.repo.repo import Repo
5
6
  from component.repo.search_filter import SearchFilter
@@ -28,8 +29,8 @@ class DBRepo(Repo[Schema, SchemaData]):
28
29
  ):
29
30
  self.logger = logger
30
31
  self.engine = engine
31
- self.db_entity_attribute_names: List[str] = dir(self.db_entity_cls)
32
- self._keyword_fields: Optional[List[InstrumentedAttribute]] = None
32
+ self.db_entity_attribute_names: list[str] = dir(self.db_entity_cls)
33
+ self._keyword_fields: Optional[list[InstrumentedAttribute]] = None
33
34
 
34
35
  async def get_by_id(self, id: str) -> Schema:
35
36
  """
@@ -48,7 +49,7 @@ class DBRepo(Repo[Schema, SchemaData]):
48
49
  search_filter: Optional[SearchFilter] = None,
49
50
  limit: int = 100,
50
51
  offset: int = 0,
51
- ) -> List[Schema]:
52
+ ) -> list[Schema]:
52
53
  """
53
54
  Find multiple records by keyword with limit and offset.
54
55
  """
@@ -164,7 +165,7 @@ class DBRepo(Repo[Schema, SchemaData]):
164
165
  criterion: _ColumnExpressionArgument[bool],
165
166
  limit: int = 100,
166
167
  offset: int = 0,
167
- ) -> List[DBEntity]:
168
+ ) -> list[DBEntity]:
168
169
  try:
169
170
  db_query = db.query(self.db_entity_cls).filter(criterion)
170
171
  if "created_at" in self.db_entity_attribute_names:
@@ -245,7 +246,7 @@ class DBRepo(Repo[Schema, SchemaData]):
245
246
  ]
246
247
  return or_(*keyword_criterion)
247
248
 
248
- def _get_keyword_fields(self) -> List[InstrumentedAttribute]:
249
+ def _get_keyword_fields(self) -> list[InstrumentedAttribute]:
249
250
  """
250
251
  Return list of fields for keyword filtering
251
252
  """
@@ -1,5 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Generic, List, Optional, TypeVar
2
+ from typing import Generic, Optional, TypeVar
3
3
 
4
4
  from component.repo.search_filter import SearchFilter
5
5
  from pydantic import BaseModel
@@ -16,7 +16,7 @@ class Repo(Generic[Schema, SchemaData], ABC):
16
16
  @abstractmethod
17
17
  async def get(
18
18
  self, search_filter: Optional[SearchFilter], limit: int, offset: int
19
- ) -> List[Schema]:
19
+ ) -> list[Schema]:
20
20
  pass
21
21
 
22
22
  @abstractmethod
@@ -1,4 +1,5 @@
1
- from typing import Any, Mapping
1
+ from collections.abc import Mapping
2
+ from typing import Any
2
3
 
3
4
  from pydantic import BaseModel
4
5
 
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  import logging
3
- from typing import Any, Callable
3
+ from collections.abc import Callable
4
+ from typing import Any
4
5
 
5
6
  from component.messagebus.messagebus import Admin, Consumer, Publisher
6
7
  from component.rpc.rpc import Caller, Message, Result
@@ -1,6 +1,7 @@
1
1
  import inspect
2
2
  import logging
3
- from typing import Any, Mapping
3
+ from collections.abc import Mapping
4
+ from typing import Any
4
5
 
5
6
  from component.messagebus.messagebus import Consumer, Publisher
6
7
  from component.rpc.rpc import Message, Result, Server, TRPCHandler
@@ -1,5 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Any, Callable, List, Mapping, TypeVar
2
+ from collections.abc import Callable, Mapping
3
+ from typing import Any, TypeVar
3
4
 
4
5
  TRPCHandler = Callable[..., Any]
5
6
  TMessage = TypeVar("TMessage", bound="Message")
@@ -27,7 +28,7 @@ class Server(ABC):
27
28
 
28
29
 
29
30
  class Message:
30
- def __init__(self, reply_event: str, args: List[Any], kwargs: Mapping[str, Any]):
31
+ def __init__(self, reply_event: str, args: list[Any], kwargs: Mapping[str, Any]):
31
32
  self.reply_event = reply_event
32
33
  self.args = args
33
34
  self.kwargs = kwargs
@@ -1,5 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Any, Callable
2
+ from collections.abc import Callable
3
+ from typing import Any
3
4
 
4
5
  import jsons
5
6
 
@@ -1,6 +1,5 @@
1
1
  import json
2
2
  import os
3
- from typing import List
4
3
 
5
4
  from helper.conversion import str_to_boolean, str_to_logging_level
6
5
 
@@ -80,14 +79,14 @@ APP_KAFKA_SASL_MECHANISM = os.getenv("APP_KAFKA_SASL_MECHANISM", "SCRAM-SHA-512"
80
79
  APP_KAFKA_SASL_USER = os.getenv("APP_KAFKA_SASL_USER", "admin")
81
80
  APP_KAFKA_SASL_PASS = os.getenv("APP_KAFKA_SASL_PASS", "admin")
82
81
 
83
- APP_CORS_ALLOW_ORIGINS: List[str] = json.loads(
82
+ APP_CORS_ALLOW_ORIGINS: list[str] = json.loads(
84
83
  os.getenv("APP_CORS_ALLOW_ORIGINS", '["*"]')
85
84
  )
86
85
  APP_CORS_ALLOW_ORIGIN_REGEX: str = os.getenv("APP_CORS_ALLOW_ORIGIN_REGEX", "")
87
- APP_CORS_ALLOW_METHODS: List[str] = json.loads(
86
+ APP_CORS_ALLOW_METHODS: list[str] = json.loads(
88
87
  os.getenv("APP_CORS_ALLOW_METHODS", '["*"]')
89
88
  )
90
- APP_CORS_ALLOW_HEADERS: List[str] = json.loads(
89
+ APP_CORS_ALLOW_HEADERS: list[str] = json.loads(
91
90
  os.getenv("APP_CORS_ALLOW_HEADERS", '["*"]')
92
91
  )
93
92
  APP_CORS_ALLOW_CREDENTIALS: bool = str_to_boolean(
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
  import inspect
3
- from typing import Awaitable, Callable
3
+ from collections.abc import Awaitable, Callable
4
4
 
5
5
 
6
6
  def create_task(awaitable: Awaitable, on_error: Callable) -> asyncio.Task:
@@ -1,4 +1,5 @@
1
- from typing import Callable, Optional
1
+ from collections.abc import Callable
2
+ from typing import Optional
2
3
 
3
4
  from fastapi import Depends
4
5
  from fastapi.security import OAuth2PasswordBearer
@@ -1,6 +1,7 @@
1
1
  from abc import ABC, abstractmethod
2
+ from collections.abc import Mapping
2
3
  from datetime import datetime, timedelta
3
- from typing import Any, Mapping
4
+ from typing import Any
4
5
 
5
6
  import jsons
6
7
  from component.error import HTTPAPIException
@@ -1,5 +1,6 @@
1
1
  from abc import ABC
2
- from typing import Any, Mapping
2
+ from collections.abc import Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.repo import DBEntityMixin, DBRepo, Repo
5
6
  from module.auth.entity.permission.repo import DBEntityPermission
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.messagebus import Publisher
5
6
  from component.repo import SearchFilter
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.messagebus import Publisher
5
6
  from component.repo import SearchFilter
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Annotated, List, Mapping
3
+ from typing import Annotated
3
4
 
4
5
  from component.error import HTTPAPIException
5
6
  from component.messagebus import Publisher
@@ -1,4 +1,5 @@
1
- from typing import List, Mapping, Optional
1
+ from collections.abc import Mapping
2
+ from typing import Optional
2
3
 
3
4
  from component.messagebus.messagebus import Publisher
4
5
  from module.auth.component import AccessTokenUtil, RefreshTokenUtil
@@ -81,7 +82,7 @@ class UserModel(HistoricalRepoModel[User, UserData, UserResult]):
81
82
  for permission_name in permission_names
82
83
  }
83
84
 
84
- def _get_permission_names(self, user: User) -> List[str]:
85
+ def _get_permission_names(self, user: User) -> list[str]:
85
86
  permission_names = [permission.name for permission in user.permissions]
86
87
  for group in user.groups:
87
88
  additional_permission_names = [
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  from abc import ABC, abstractmethod
3
- from typing import Any, List, Mapping
3
+ from collections.abc import Mapping
4
+ from typing import Any
4
5
 
5
6
  from component.repo import DBEntityMixin, DBRepo, Repo
6
7
  from module.auth.component import PasswordHasher
@@ -46,7 +47,7 @@ class UserDBRepo(DBRepo[User, UserData], UserRepo):
46
47
 
47
48
  async def get_by_user_login(self, user_login: UserLogin) -> User:
48
49
  db = self._get_db_session()
49
- db_users: List[DBEntityUser] = []
50
+ db_users: list[DBEntityUser] = []
50
51
  try:
51
52
  search_filter = or_(
52
53
  DBEntityUser.username == user_login.identity,
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, List, Mapping, Union
3
+ from typing import Any, Union
3
4
 
4
5
  from component.messagebus import Publisher
5
6
  from component.repo import SearchFilter
@@ -30,7 +31,7 @@ def register_rpc(
30
31
 
31
32
  @rpc_server.register("auth_is_user_authorized")
32
33
  async def is_user_having_permission(
33
- id: str, permission_name: Union[str, List[str]]
34
+ id: str, permission_name: Union[str, list[str]]
34
35
  ) -> Mapping[str, bool]:
35
36
  """
36
37
  Used by RPC Authenticator
@@ -1,4 +1,4 @@
1
- from typing import List, Optional
1
+ from typing import Optional
2
2
 
3
3
  from module.auth.integration.model.permission_model import permission_model
4
4
  from module.auth.schema.permission import PermissionData
@@ -14,7 +14,7 @@ ACTION_DESCRIPTION = {
14
14
 
15
15
 
16
16
  async def ensure_entity_permission(
17
- module_name: str, entity_name: str, action_names: Optional[List[str]] = None
17
+ module_name: str, entity_name: str, action_names: Optional[list[str]] = None
18
18
  ):
19
19
  if action_names is None:
20
20
  action_names = DEFAULT_ACTION_NAMES
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from component.schema import BaseCountSchema, BaseDateTimeSchema
4
2
  from module.auth.schema.permission import Permission
5
3
 
@@ -10,7 +8,7 @@ class GroupBase(BaseDateTimeSchema):
10
8
 
11
9
 
12
10
  class GroupData(GroupBase):
13
- permissions: List[str]
11
+ permissions: list[str]
14
12
 
15
13
 
16
14
  class Group(GroupBase):
@@ -18,8 +16,8 @@ class Group(GroupBase):
18
16
  from_attributes = True
19
17
 
20
18
  id: str
21
- permissions: List[Permission] = []
19
+ permissions: list[Permission] = []
22
20
 
23
21
 
24
22
  class GroupResult(BaseCountSchema):
25
- data: List[Group]
23
+ data: list[Group]
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from component.schema import BaseCountSchema, BaseDateTimeSchema
4
2
 
5
3
 
@@ -16,4 +14,4 @@ class Permission(PermissionData):
16
14
 
17
15
 
18
16
  class PermissionResult(BaseCountSchema):
19
- data: List[Permission]
17
+ data: list[Permission]
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from pydantic import BaseModel
4
2
 
5
3
 
@@ -8,4 +6,4 @@ class RefreshTokenRequest(BaseModel):
8
6
 
9
7
 
10
8
  class IsAuthorizedRequest(BaseModel):
11
- permission_names: List[str]
9
+ permission_names: list[str]
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from component.schema import BaseCountSchema, BaseDateTimeSchema
4
2
  from module.auth.schema.group import Group
5
3
  from module.auth.schema.permission import Permission
@@ -11,8 +9,8 @@ class UserBase(BaseDateTimeSchema):
11
9
  phone: str
12
10
  email: str
13
11
  description: str
14
- groups: List[str]
15
- permissions: List[str]
12
+ groups: list[str]
13
+ permissions: list[str]
16
14
 
17
15
 
18
16
  class UserData(UserBase):
@@ -21,15 +19,15 @@ class UserData(UserBase):
21
19
 
22
20
  class User(UserBase):
23
21
  id: str
24
- permissions: List[Permission] = []
25
- groups: List[Group] = []
22
+ permissions: list[Permission] = []
23
+ groups: list[Group] = []
26
24
 
27
25
  class Config:
28
26
  from_attributes = True
29
27
 
30
28
 
31
29
  class UserResult(BaseCountSchema):
32
- data: List[User]
30
+ data: list[User]
33
31
 
34
32
 
35
33
  class UserLogin(BaseModel):
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.messagebus import Consumer, Publisher
5
6
  from component.rpc import Caller
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.messagebus import Publisher
5
6
  from component.repo import SearchFilter
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from component.schema import BaseCountSchema, BaseDateTimeSchema
4
2
 
5
3
 
@@ -17,4 +15,4 @@ class Activity(ActivityData):
17
15
 
18
16
 
19
17
  class ActivityResult(BaseCountSchema):
20
- data: List[Activity]
18
+ data: list[Activity]
@@ -1,4 +1,4 @@
1
- from typing import AsyncIterator
1
+ from collections.abc import AsyncIterator
2
2
 
3
3
  import pytest
4
4
  from httpx import AsyncClient
@@ -1,4 +1,4 @@
1
- from typing import AsyncIterator
1
+ from collections.abc import AsyncIterator
2
2
 
3
3
  import pytest
4
4
  from httpx import AsyncClient
@@ -1,4 +1,4 @@
1
- from typing import AsyncIterator
1
+ from collections.abc import AsyncIterator
2
2
 
3
3
  import pytest
4
4
  from httpx import AsyncClient
@@ -1,4 +1,4 @@
1
- from typing import AsyncIterator
1
+ from collections.abc import AsyncIterator
2
2
 
3
3
  import pytest
4
4
  from httpx import AsyncClient
@@ -1,4 +1,4 @@
1
- from typing import AsyncIterator
1
+ from collections.abc import AsyncIterator
2
2
 
3
3
  import pytest
4
4
  from httpx import AsyncClient
@@ -5,7 +5,6 @@ from zrb.builtin.project.add.fastapp.app._input import app_name_input
5
5
  from zrb.builtin.project.add.fastapp.crud._input import entity_name_input
6
6
  from zrb.builtin.project.add.fastapp.module._input import module_name_input
7
7
  from zrb.helper.typecheck import typechecked
8
- from zrb.helper.typing import List
9
8
  from zrb.task.any_task import AnyTask
10
9
  from zrb.task.cmd_task import CmdTask
11
10
 
@@ -20,7 +19,7 @@ _NAV_PERMISSION = "{{util.to_snake_case(input.module_name)}}:{{util.to_snake_cas
20
19
 
21
20
 
22
21
  @typechecked
23
- def create_add_navigation_task(upstreams: List[AnyTask]) -> AnyTask:
22
+ def create_add_navigation_task(upstreams: list[AnyTask]) -> AnyTask:
24
23
  return CmdTask(
25
24
  name="add-navigation",
26
25
  inputs=[
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
+ from typing import Any
3
4
 
4
5
  from zrb.builtin.project._helper import validate_existing_project_dir
5
6
  from zrb.builtin.project._input import project_dir_input
@@ -21,7 +22,6 @@ from zrb.builtin.project.add.fastapp.crud._task_factory import (
21
22
  from zrb.builtin.project.add.fastapp.module._input import module_name_input
22
23
  from zrb.helper import util
23
24
  from zrb.helper.accessories.color import colored
24
- from zrb.helper.typing import Any
25
25
  from zrb.runner import runner
26
26
  from zrb.task.cmd_task import CmdTask
27
27
  from zrb.task.decorator import python_task
@@ -1,5 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from logging import Logger
2
- from typing import Any, Mapping
3
+ from typing import Any
3
4
 
4
5
  from component.messagebus import Publisher
5
6
  from component.repo import SearchFilter
@@ -1,5 +1,5 @@
1
1
  from datetime import date, datetime, time
2
- from typing import List, Optional
2
+ from typing import Optional
3
3
 
4
4
  from component.schema import BaseCountSchema, BaseDateTimeSchema
5
5
 
@@ -16,4 +16,4 @@ class PascalZrbEntityName(PascalZrbEntityNameData):
16
16
 
17
17
 
18
18
  class PascalZrbEntityNameResult(BaseCountSchema):
19
- data: List[PascalZrbEntityName]
19
+ data: list[PascalZrbEntityName]
@@ -1,5 +1,5 @@
1
+ from collections.abc import AsyncIterator
1
2
  from datetime import date, datetime, time
2
- from typing import AsyncIterator
3
3
 
4
4
  import pytest
5
5
  from config import APP_AUTH_ADMIN_PASSWORD, APP_AUTH_ADMIN_USERNAME
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
+ from typing import Any
3
4
 
4
5
  from zrb.builtin.project._helper import validate_existing_project_dir
5
6
  from zrb.builtin.project._input import project_dir_input
@@ -23,7 +24,6 @@ from zrb.builtin.project.add.fastapp.field._input import (
23
24
  from zrb.builtin.project.add.fastapp.module._input import module_name_input
24
25
  from zrb.helper import util
25
26
  from zrb.helper.accessories.color import colored
26
- from zrb.helper.typing import Any
27
27
  from zrb.runner import runner
28
28
  from zrb.task.decorator import python_task
29
29
  from zrb.task.task import Task
@@ -1,5 +1,7 @@
1
1
  import asyncio
2
2
  import os
3
+ from collections.abc import Mapping
4
+ from typing import Any
3
5
 
4
6
  import jsons
5
7
  from dotenv import dotenv_values
@@ -11,7 +13,6 @@ from zrb.helper.file.text import (
11
13
  write_text_file_async,
12
14
  )
13
15
  from zrb.helper.typecheck import typechecked
14
- from zrb.helper.typing import Any, List, Mapping
15
16
  from zrb.helper.util import to_kebab_case, to_snake_case
16
17
  from zrb.task.task import Task
17
18
 
@@ -37,7 +38,7 @@ async def create_microservice_config(
37
38
 
38
39
  @typechecked
39
40
  async def _add_docker_compose_service(
40
- task: Task, modules: List[str], project_dir: str, app_name: str, module_name: str
41
+ task: Task, modules: list[str], project_dir: str, app_name: str, module_name: str
41
42
  ):
42
43
  kebab_app_name = to_kebab_case(app_name)
43
44
  snake_module_name = to_snake_case(module_name)
@@ -50,11 +51,9 @@ async def _add_docker_compose_service(
50
51
  app_container_port_env_name = f"APP_{upper_snake_module_name}_MODULE_PORT"
51
52
  app_container_port_env = (
52
53
  "${" + app_container_port_env_name + ":-" + module_app_port_str + "}"
53
- ) # noqa
54
+ )
54
55
  app_host_port_env_name = f"APP_{upper_snake_module_name}_HOST_MODULE_PORT"
55
- app_host_port_env = (
56
- "${" + app_host_port_env_name + ":-" + module_app_port_str + "}"
57
- ) # noqa
56
+ app_host_port_env = "${" + app_host_port_env_name + ":-" + module_app_port_str + "}"
58
57
  service_definition = _get_new_docker_compose_service_definition(
59
58
  app_name=app_name,
60
59
  module_name=module_name,
@@ -127,7 +126,7 @@ async def _create_automation_json_config(
127
126
  task.print_out(f"Read json config from: {json_modules_file_path}")
128
127
  json_str = await read_text_file_async(json_modules_file_path)
129
128
  task.print_out(f'Add "{snake_module_name}" to json config')
130
- modules: List[str] = jsons.loads(json_str)
129
+ modules: list[str] = jsons.loads(json_str)
131
130
  modules.append(snake_module_name)
132
131
  json_str = jsons.dumps(modules)
133
132
  task.print_out(f"Write new json config to: {json_modules_file_path}")
@@ -137,7 +136,7 @@ async def _create_automation_json_config(
137
136
 
138
137
  @typechecked
139
138
  async def _append_compose_env(
140
- task: Task, modules: List[str], project_dir: str, app_name: str, module_name: str
139
+ task: Task, modules: list[str], project_dir: str, app_name: str, module_name: str
141
140
  ):
142
141
  kebab_app_name = to_kebab_case(app_name)
143
142
  snake_module_name = to_snake_case(module_name)