csrd-utils 0.3.110__tar.gz → 0.4.0__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 (215) hide show
  1. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/PKG-INFO +1 -1
  2. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/pyproject.toml +1 -1
  3. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/augments.py +142 -0
  4. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/scaffolder.py +22 -3
  5. csrd_utils-0.4.0/src/csrd_utils/v2/templates/augments/crud-proxy/delegates/${entity_name_snake}_delegate.py.template +55 -0
  6. csrd_utils-0.4.0/src/csrd_utils/v2/templates/augments/crud-proxy/dependencies/${entity_name_snake}_delegate.py.template +21 -0
  7. csrd_utils-0.4.0/src/csrd_utils/v2/templates/augments/crud-proxy/models/${entity_name_snake}.py.template +31 -0
  8. csrd_utils-0.4.0/src/csrd_utils/v2/templates/augments/crud-proxy/views/${entity_name_snake}_proxy_view.py.template +61 -0
  9. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/.gitignore +0 -0
  10. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/README.md +0 -0
  11. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/__init__.py +0 -0
  12. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/__main__.py +0 -0
  13. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/audit.py +0 -0
  14. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/augmentor.py +0 -0
  15. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/cluster.py +0 -0
  16. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/doctor.py +0 -0
  17. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/conftest.fragment.py +0 -0
  18. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/docker-compose.fragment.yaml +0 -0
  19. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/manifest.yaml +0 -0
  20. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/requirements.fragment +0 -0
  21. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/settings.fragment.py +0 -0
  22. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/src/app/cache.py +0 -0
  23. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/caching/tests/test_cache.py +0 -0
  24. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/conftest.fragment.py +0 -0
  25. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/manifest.yaml +0 -0
  26. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/requirements.fragment +0 -0
  27. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/settings.fragment.py +0 -0
  28. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/src/app/middleware/logging.py +0 -0
  29. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/logging/tests/test_logging_middleware.py +0 -0
  30. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/conftest.fragment.py +0 -0
  31. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/docker-compose.fragment.yaml +0 -0
  32. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/manifest.yaml +0 -0
  33. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/requirements.fragment +0 -0
  34. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/settings.fragment.py +0 -0
  35. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/src/app/middleware/metrics.py +0 -0
  36. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/metrics/tests/test_metrics_middleware.py +0 -0
  37. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/conftest.fragment.py +0 -0
  38. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/manifest.yaml +0 -0
  39. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/requirements.fragment +0 -0
  40. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/settings.fragment.py +0 -0
  41. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/src/app/middleware/tracing.py +0 -0
  42. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/tracing/tests/test_tracing_middleware.py +0 -0
  43. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/conftest.fragment.py +0 -0
  44. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/docker-compose.fragment.yaml +0 -0
  45. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/manifest.yaml +0 -0
  46. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/requirements.fragment +0 -0
  47. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/settings.fragment.py +0 -0
  48. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/src/app/workers/__init__.py +0 -0
  49. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/src/app/workers/celery_app.py +0 -0
  50. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/src/app/workers/tasks.py +0 -0
  51. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/features/workers/tests/test_workers.py +0 -0
  52. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/fragments.py +0 -0
  53. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/generator.py +0 -0
  54. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/resources.py +0 -0
  55. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/README.md +0 -0
  56. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/cookiecutter.json +0 -0
  57. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/hooks/post_gen_project.py +0 -0
  58. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.cookiecutterignore +0 -0
  59. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  60. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  61. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  62. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  63. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/cache.py +0 -0
  64. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +0 -0
  65. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/upstreams.py +0 -0
  66. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  67. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_service.py +0 -0
  68. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/delegates.py +0 -0
  69. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +0 -0
  70. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/worker_broker.py +0 -0
  71. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/docker-compose.yml +0 -0
  72. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/__init__.py +0 -0
  73. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/logging.py +0 -0
  74. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  75. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +0 -0
  76. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  77. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  78. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/__init__.py +0 -0
  79. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/__init__.py +0 -0
  80. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/test_logging_middleware.py +0 -0
  81. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/conftest.py +0 -0
  82. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/test_items.py +0 -0
  83. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/__init__.py +0 -0
  84. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_cache.py +0 -0
  85. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_database_settings.py +0 -0
  86. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_delegates.py +0 -0
  87. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_settings_contracts.py +0 -0
  88. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_worker_broker.py +0 -0
  89. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  90. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  91. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  92. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +0 -0
  93. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/__init__.py +0 -0
  94. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/tasks.py +0 -0
  95. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/cookiecutter.json +0 -0
  96. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  97. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  98. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  99. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  100. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +0 -0
  101. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/auth_delegate.py +0 -0
  102. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/identity_delegate.py +0 -0
  103. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  104. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_passthrough.py +0 -0
  105. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_service.py +0 -0
  106. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +0 -0
  107. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/models/__init__.py +0 -0
  108. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/models/auth_service.py +0 -0
  109. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/models/items.py +0 -0
  110. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  111. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +0 -0
  112. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  113. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  114. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  115. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  116. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/auth_service_view.py +0 -0
  117. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  118. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +0 -0
  119. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/cookiecutter.json +0 -0
  120. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  121. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  122. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  123. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  124. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  125. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/models/__init__.py +0 -0
  126. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/models/auth.py +0 -0
  127. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  128. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/repositories/token_repository.py +0 -0
  129. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  130. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  131. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  132. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  133. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/auth_view.py +0 -0
  134. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  135. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/cookiecutter.json +0 -0
  136. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  137. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  138. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  139. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  140. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  141. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/models/__init__.py +0 -0
  142. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/models/users.py +0 -0
  143. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  144. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/repositories/user_repository.py +0 -0
  145. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  146. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  147. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  148. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  149. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  150. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/users_view.py +0 -0
  151. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/AGENTS.md +0 -0
  152. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/__init__.py +0 -0
  153. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/__init__.py +0 -0
  154. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/git.py +0 -0
  155. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/infra.py +0 -0
  156. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/loader.py +0 -0
  157. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/operations.py +0 -0
  158. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/presets.py +0 -0
  159. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/renderer.py +0 -0
  160. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/service_renderers.py +0 -0
  161. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/compose/yaml_editor.py +0 -0
  162. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/generate/__init__.py +0 -0
  163. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/generate/handlers.py +0 -0
  164. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/generate/helpers.py +0 -0
  165. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/generate/menu.py +0 -0
  166. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/models/__init__.py +0 -0
  167. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/models/base.py +0 -0
  168. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/models/spec.py +0 -0
  169. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/models/types.py +0 -0
  170. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/auth-passthrough/delegates/auth_delegate.py +0 -0
  171. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/auth-passthrough/dependencies/auth_passthrough.py +0 -0
  172. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/auth-passthrough/models/auth_passthrough.py +0 -0
  173. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/auth-passthrough/views/auth_passthrough_view.py +0 -0
  174. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/crud-scaffold/dependencies/${entity_name_snake}_repository.py.template +0 -0
  175. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/crud-scaffold/migrations_${entity_name_snake}.py.template +0 -0
  176. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/crud-scaffold/models/${entity_name_snake}.py.template +0 -0
  177. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/crud-scaffold/repositories/${entity_name_snake}_repository.py.template +0 -0
  178. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/crud-scaffold/views/${entity_name_snake}_view.py.template +0 -0
  179. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/db-config/dependencies/db.py.template +0 -0
  180. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-consumer/dependencies/auth.py.template +0 -0
  181. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/AUTH.md +0 -0
  182. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/dependencies/auth.py +0 -0
  183. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/dependencies/db.py.template +0 -0
  184. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/dependencies/token_service.py +0 -0
  185. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/migrations.py.template +0 -0
  186. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/models/auth.py +0 -0
  187. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/models/jwks.py +0 -0
  188. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/models/users.py +0 -0
  189. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/repositories/user_repository.py +0 -0
  190. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/services/token_service.py +0 -0
  191. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/views/auth_view.py +0 -0
  192. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/views/jwks_view.py +0 -0
  193. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/views/users_admin_view.py +0 -0
  194. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/augments/jwt-auth-provider/views/users_view.py +0 -0
  195. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/cookiecutter.json +0 -0
  196. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  197. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  198. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  199. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  200. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/models/__init__.py +0 -0
  201. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/models/health.py +0 -0
  202. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  203. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  204. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/tests/__init__.py +0 -0
  205. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/tests/conftest.py +0 -0
  206. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/tests/test_health.py +0 -0
  207. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  208. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/csrd_utils/v2/templates/service/{{cookiecutter.__service_name_snake}}/views/health_view.py +0 -0
  209. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/__init__.py +0 -0
  210. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/exceptions.py +0 -0
  211. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/menu.py +0 -0
  212. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/models.py +0 -0
  213. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/prompts.py +0 -0
  214. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/terminal.py +0 -0
  215. {csrd_utils-0.3.110 → csrd_utils-0.4.0}/src/tui_wizard/wizard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csrd-utils
3
- Version: 0.3.110
3
+ Version: 0.4.0
4
4
  Summary: CLI utilities for csrd service generation and feature augmentation
5
5
  Project-URL: Repository, https://github.com/csrd-api/fastapi-common
6
6
  Project-URL: Documentation, https://github.com/csrd-api/fastapi-common/tree/main/packages/utils
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "csrd-utils"
3
- version = "0.3.110"
3
+ version = "0.4.0"
4
4
  description = "CLI utilities for csrd service generation and feature augmentation"
5
5
  license = { text = "MIT" }
6
6
  requires-python = ">=3.12"
@@ -42,6 +42,10 @@ DynamicMigrationResolver = Callable[
42
42
  [ServiceAugment, ServiceNode, ComposeSpec], list[tuple[str, str]]
43
43
  ]
44
44
 
45
+ #: Returns multiple variable dicts for multi-instance template rendering.
46
+ #: Each dict is used to render the full template set once (e.g. per entity).
47
+ MultiScaffoldResolver = Callable[[ServiceAugment, ServiceNode, ComposeSpec], list[dict[str, str]]]
48
+
45
49
 
46
50
  # ---------------------------------------------------------------------------
47
51
  # Role registry
@@ -297,6 +301,10 @@ class AugmentDescriptor:
297
301
  # Dynamic migration imports resolved from augment options
298
302
  resolve_dynamic_migrations: DynamicMigrationResolver | None = None
299
303
 
304
+ # Multi-instance scaffolding: when set, templates are rendered once
305
+ # per returned variable dict (e.g. one per discovered entity).
306
+ resolve_multi_scaffold_vars: MultiScaffoldResolver | None = None
307
+
300
308
 
301
309
  # ---------------------------------------------------------------------------
302
310
  # Resolver functions — dynamic wiring extracted from renderer/scaffolder
@@ -597,6 +605,126 @@ def _crud_scaffold_dynamic_migrations(
597
605
  return [(import_line, f"{snake}_migration")]
598
606
 
599
607
 
608
+ # ── crud-proxy ───────────────────────────────────────────────────────────
609
+
610
+
611
+ def _resolve_target_entities(
612
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
613
+ ) -> list[dict[str, str]]:
614
+ """Introspect target services' crud-scaffold augments to discover entities.
615
+
616
+ Returns a list of dicts with keys: target_name, target_port,
617
+ entity_name_snake, entity_name_pascal, entity_name_plural.
618
+ """
619
+ targets = augment.options.get("targets", [])
620
+ if isinstance(targets, str):
621
+ targets = [targets]
622
+
623
+ entities: list[dict[str, str]] = []
624
+ for target_name in targets:
625
+ target_svc = find_service_by_name(spec, target_name)
626
+ if target_svc is None:
627
+ continue
628
+ for target_aug in target_svc.augments:
629
+ if target_aug.name != "crud-scaffold":
630
+ continue
631
+ entity_raw = target_aug.options.get("entity_name", "item")
632
+ entity = entity_raw if isinstance(entity_raw, str) else entity_raw[0]
633
+ snake = entity.replace("-", "_").lower()
634
+ pascal = "".join(w.capitalize() for w in snake.split("_"))
635
+ plural_raw = target_aug.options.get("entity_name_plural", snake + "s")
636
+ plural = plural_raw if isinstance(plural_raw, str) else plural_raw[0]
637
+ entities.append(
638
+ {
639
+ "target_name": target_name,
640
+ "target_name_snake": target_name.replace("-", "_"),
641
+ "target_port": str(target_svc.port),
642
+ "entity_name_snake": snake,
643
+ "entity_name_pascal": pascal,
644
+ "entity_name_plural": plural,
645
+ }
646
+ )
647
+ return entities
648
+
649
+
650
+ def _crud_proxy_compose_env(
651
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
652
+ ) -> dict[str, str]:
653
+ """Compose env vars: delegate URLs for each target service."""
654
+ return _delegate_compose_env(augment, svc, spec)
655
+
656
+
657
+ def _crud_proxy_settings(
658
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
659
+ ) -> dict[str, str]:
660
+ """Settings fields: service URL for each target."""
661
+ return _delegate_settings(augment, svc, spec)
662
+
663
+
664
+ def _crud_proxy_template_vars(
665
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
666
+ ) -> dict[str, str]:
667
+ """Template vars for rendering proxy files.
668
+
669
+ Passes target and entity info as comma-separated lists for template
670
+ iteration. Individual entity templates use per-entity variables.
671
+ """
672
+ variables: dict[str, str] = {}
673
+ entities = _resolve_target_entities(augment, svc, spec)
674
+
675
+ # For multi-file scaffolding, each entity gets its own template render.
676
+ # Here we export the first entity's vars for the template (each entity
677
+ # file is scaffolded separately via resolve_dynamic_routers and the
678
+ # file-path substitution).
679
+ if entities:
680
+ for key, value in entities[0].items():
681
+ variables[key] = value
682
+
683
+ # Also pass delegate-config style target vars
684
+ variables.update(_delegate_template_vars(augment, svc, spec))
685
+
686
+ return variables
687
+
688
+
689
+ def _crud_proxy_dynamic_routers(
690
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
691
+ ) -> list[tuple[str, str]]:
692
+ """Resolve dynamic router imports for each proxied entity."""
693
+ entities = _resolve_target_entities(augment, svc, spec)
694
+ result: list[tuple[str, str]] = []
695
+ for ent in entities:
696
+ snake = ent["entity_name_snake"]
697
+ alias = f"{snake}_proxy_router"
698
+ import_line = f"from .views.{snake}_proxy_view import router as {alias}"
699
+ result.append((import_line, alias))
700
+ return result
701
+
702
+
703
+ def _crud_proxy_multi_scaffold_vars(
704
+ augment: ServiceAugment, svc: ServiceNode, spec: ComposeSpec
705
+ ) -> list[dict[str, str]]:
706
+ """Return one variable dict per discovered entity for multi-file scaffolding."""
707
+ svc_snake = svc.name.replace("-", "_")
708
+ base: dict[str, str] = {
709
+ "service_name": svc.name,
710
+ "service_name_snake": svc_snake,
711
+ "port": str(svc.port),
712
+ }
713
+ # Merge delegate-config style target vars
714
+ base.update(_delegate_template_vars(augment, svc, spec))
715
+
716
+ entities = _resolve_target_entities(augment, svc, spec)
717
+ if not entities:
718
+ return []
719
+
720
+ result: list[dict[str, str]] = []
721
+ for ent in entities:
722
+ variables = dict(base)
723
+ variables.update(ent)
724
+ result.append(variables)
725
+ return result
726
+
727
+
600
728
  # ── jwt-auth-provider ────────────────────────────────────────────────────
601
729
 
602
730
 
@@ -811,6 +939,20 @@ AUGMENT_REGISTRY: dict[str, AugmentDescriptor] = {
811
939
  resolve_dynamic_routers=_crud_scaffold_dynamic_routers,
812
940
  resolve_dynamic_migrations=_crud_scaffold_dynamic_migrations,
813
941
  ),
942
+ "crud-proxy": AugmentDescriptor(
943
+ name="crud-proxy",
944
+ scope="service",
945
+ description="Delegate-backed CRUD proxy endpoints mirroring another service's entities",
946
+ packages=["csrd-delegate", "csrd-models"],
947
+ template_dir="crud-proxy",
948
+ needs_target_selection=True,
949
+ routers=[], # routers are dynamic per entity — wired via resolve_dynamic_routers
950
+ resolve_template_vars=_crud_proxy_template_vars,
951
+ resolve_dynamic_routers=_crud_proxy_dynamic_routers,
952
+ resolve_compose_env=_crud_proxy_compose_env,
953
+ resolve_settings_fields=_crud_proxy_settings,
954
+ resolve_multi_scaffold_vars=_crud_proxy_multi_scaffold_vars,
955
+ ),
814
956
  }
815
957
 
816
958
 
@@ -167,6 +167,10 @@ def scaffold_augment(
167
167
  Each file is rendered with ``string.Template`` substitution and copied
168
168
  into the service's source directory, preserving subdirectory structure.
169
169
 
170
+ When the descriptor provides ``resolve_multi_scaffold_vars``, templates
171
+ are rendered once per returned variable dict (e.g. one per discovered
172
+ entity). Otherwise templates are rendered once with the standard vars.
173
+
170
174
  Files that already exist are **never overwritten** — they may contain
171
175
  user edits. This makes the operation idempotent and safe to re-run.
172
176
  """
@@ -186,8 +190,23 @@ def scaffold_augment(
186
190
  if not svc_dest.exists():
187
191
  return
188
192
 
189
- variables = _augment_template_vars(augment, service, spec)
190
-
193
+ # Multi-instance scaffolding (e.g. crud-proxy renders per entity)
194
+ if desc.resolve_multi_scaffold_vars is not None:
195
+ var_sets = desc.resolve_multi_scaffold_vars(augment, service, spec)
196
+ for variables in var_sets:
197
+ _render_template_set(template_dir, svc_dest, variables, augment.name)
198
+ else:
199
+ variables = _augment_template_vars(augment, service, spec)
200
+ _render_template_set(template_dir, svc_dest, variables, augment.name)
201
+
202
+
203
+ def _render_template_set(
204
+ template_dir: Path,
205
+ svc_dest: Path,
206
+ variables: dict[str, str],
207
+ augment_name: str,
208
+ ) -> None:
209
+ """Render a set of template files with the given variables."""
191
210
  for template_file in sorted(template_dir.rglob("*")):
192
211
  if template_file.is_dir():
193
212
  continue
@@ -215,4 +234,4 @@ def scaffold_augment(
215
234
  rendered = Template(content).safe_substitute(variables)
216
235
  dest.write_text(rendered, encoding="utf-8")
217
236
 
218
- logger.debug("Scaffolded %s for augment '%s'", dest, augment.name)
237
+ logger.debug("Scaffolded %s for augment '%s'", dest, augment_name)
@@ -0,0 +1,55 @@
1
+ """${entity_name_pascal} delegate — proxies CRUD operations to ${target_name}.
2
+
3
+ This file is scaffolded once and never overwritten.
4
+ """
5
+
6
+ from csrd.delegate import BaseDelegate
7
+
8
+ from ..models.${entity_name_snake} import (
9
+ ${entity_name_pascal}ListResponse,
10
+ ${entity_name_pascal}Response,
11
+ )
12
+
13
+
14
+ class ${entity_name_pascal}Delegate(BaseDelegate):
15
+ """HTTP delegate for ${entity_name_plural} on ${target_name}."""
16
+
17
+ def __init__(self, base_url: str) -> None:
18
+ super().__init__(base_url)
19
+
20
+ async def list_all(self) -> ${entity_name_pascal}ListResponse:
21
+ """List all ${entity_name_plural}."""
22
+ return await self.get(
23
+ "/api/${entity_name_plural}",
24
+ response_model=${entity_name_pascal}ListResponse,
25
+ )
26
+
27
+ async def get_by_id(self, entity_id: str) -> ${entity_name_pascal}Response:
28
+ """Get a ${entity_name_snake} by ID."""
29
+ return await self.get(
30
+ f"/api/${entity_name_plural}/{entity_id}",
31
+ response_model=${entity_name_pascal}Response,
32
+ )
33
+
34
+ async def create(self, name: str) -> ${entity_name_pascal}Response:
35
+ """Create a new ${entity_name_snake}."""
36
+ return await self.post(
37
+ "/api/${entity_name_plural}",
38
+ json={"name": name},
39
+ response_model=${entity_name_pascal}Response,
40
+ )
41
+
42
+ async def update(self, entity_id: str, name: str) -> ${entity_name_pascal}Response:
43
+ """Update an existing ${entity_name_snake}."""
44
+ return await self.put(
45
+ f"/api/${entity_name_plural}/{entity_id}",
46
+ json={"name": name},
47
+ response_model=${entity_name_pascal}Response,
48
+ )
49
+
50
+ async def remove(self, entity_id: str) -> None:
51
+ """Delete a ${entity_name_snake}."""
52
+ await self.delete(f"/api/${entity_name_plural}/{entity_id}")
53
+
54
+
55
+ __all__ = ("${entity_name_pascal}Delegate",)
@@ -0,0 +1,21 @@
1
+ """${entity_name_pascal} delegate dependency.
2
+
3
+ This file is scaffolded once and never overwritten.
4
+ """
5
+
6
+ from typing import Annotated
7
+
8
+ from fastapi import Depends
9
+
10
+ from ..delegates.${entity_name_snake}_delegate import ${entity_name_pascal}Delegate
11
+ from ..settings import settings
12
+
13
+
14
+ def _${entity_name_snake}_delegate_factory() -> ${entity_name_pascal}Delegate:
15
+ """Create a ``${entity_name_pascal}Delegate`` bound to ${target_name}."""
16
+ return ${entity_name_pascal}Delegate(settings.${target_name_snake}_service_url)
17
+
18
+
19
+ ${entity_name_pascal}Del = Annotated[${entity_name_pascal}Delegate, Depends(_${entity_name_snake}_delegate_factory)]
20
+
21
+ __all__ = ("${entity_name_pascal}Del",)
@@ -0,0 +1,31 @@
1
+ """${entity_name_pascal} models — mirrors target service's entity schema.
2
+
3
+ This file is scaffolded once and never overwritten.
4
+ """
5
+
6
+ from csrd.models import BaseModel
7
+
8
+
9
+ class Create${entity_name_pascal}Request(BaseModel):
10
+ """Request body for creating a new ${entity_name_snake}."""
11
+
12
+ name: str
13
+
14
+
15
+ class Update${entity_name_pascal}Request(BaseModel):
16
+ """Request body for updating an existing ${entity_name_snake}."""
17
+
18
+ name: str
19
+
20
+
21
+ class ${entity_name_pascal}Response(BaseModel):
22
+ """Response model for a single ${entity_name_snake}."""
23
+
24
+ id: str
25
+ name: str
26
+
27
+
28
+ class ${entity_name_pascal}ListResponse(BaseModel):
29
+ """Response model for a list of ${entity_name_plural}."""
30
+
31
+ items: list[${entity_name_pascal}Response]
@@ -0,0 +1,61 @@
1
+ """${entity_name_pascal} proxy endpoints — delegates to ${target_name}.
2
+
3
+ This file is scaffolded once and never overwritten.
4
+ """
5
+
6
+ from fastapi import APIRouter
7
+
8
+ from ..dependencies.${entity_name_snake}_delegate import ${entity_name_pascal}Del
9
+ from ..models.${entity_name_snake} import (
10
+ Create${entity_name_pascal}Request,
11
+ ${entity_name_pascal}ListResponse,
12
+ ${entity_name_pascal}Response,
13
+ Update${entity_name_pascal}Request,
14
+ )
15
+
16
+ router = APIRouter(prefix="/api/${entity_name_plural}", tags=["${entity_name_plural}"])
17
+
18
+
19
+ @router.get("", response_model=${entity_name_pascal}ListResponse)
20
+ async def list_${entity_name_plural}(
21
+ delegate: ${entity_name_pascal}Del,
22
+ ) -> ${entity_name_pascal}ListResponse:
23
+ """List all ${entity_name_plural} (proxied from ${target_name})."""
24
+ return await delegate.list_all()
25
+
26
+
27
+ @router.get("/{entity_id}", response_model=${entity_name_pascal}Response)
28
+ async def get_${entity_name_snake}(
29
+ entity_id: str,
30
+ delegate: ${entity_name_pascal}Del,
31
+ ) -> ${entity_name_pascal}Response:
32
+ """Get a ${entity_name_snake} by ID (proxied from ${target_name})."""
33
+ return await delegate.get_by_id(entity_id)
34
+
35
+
36
+ @router.post("", status_code=201, response_model=${entity_name_pascal}Response)
37
+ async def create_${entity_name_snake}(
38
+ body: Create${entity_name_pascal}Request,
39
+ delegate: ${entity_name_pascal}Del,
40
+ ) -> ${entity_name_pascal}Response:
41
+ """Create a new ${entity_name_snake} (proxied to ${target_name})."""
42
+ return await delegate.create(body.name)
43
+
44
+
45
+ @router.put("/{entity_id}", response_model=${entity_name_pascal}Response)
46
+ async def update_${entity_name_snake}(
47
+ entity_id: str,
48
+ body: Update${entity_name_pascal}Request,
49
+ delegate: ${entity_name_pascal}Del,
50
+ ) -> ${entity_name_pascal}Response:
51
+ """Update a ${entity_name_snake} (proxied to ${target_name})."""
52
+ return await delegate.update(entity_id, body.name)
53
+
54
+
55
+ @router.delete("/{entity_id}", status_code=204)
56
+ async def delete_${entity_name_snake}(
57
+ entity_id: str,
58
+ delegate: ${entity_name_pascal}Del,
59
+ ) -> None:
60
+ """Delete a ${entity_name_snake} (proxied to ${target_name})."""
61
+ await delegate.remove(entity_id)
File without changes
File without changes