csrd-utils 0.3.72__tar.gz → 0.3.74__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 (138) hide show
  1. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/PKG-INFO +1 -1
  2. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/pyproject.toml +1 -1
  3. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/__main__.py +7 -0
  4. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/cluster.py +4 -0
  5. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/cookiecutter.json +2 -0
  6. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/README.md +7 -0
  7. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +4 -0
  8. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/auth_delegate.py +11 -0
  9. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/delegates/identity_delegate.py +11 -0
  10. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +12 -0
  11. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_passthrough.py +25 -0
  12. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +25 -0
  13. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +3 -0
  14. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +71 -0
  15. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/requirements.txt +3 -0
  16. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/settings.py +2 -0
  17. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +2 -1
  18. csrd_utils-0.3.74/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/auth_service_view.py +28 -0
  19. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +15 -27
  20. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/cookiecutter.json +1 -0
  21. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/README.md +1 -1
  22. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/settings.py +1 -1
  23. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/cookiecutter.json +1 -0
  24. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/README.md +1 -1
  25. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/settings.py +1 -1
  26. csrd_utils-0.3.72/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -3
  27. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/.gitignore +0 -0
  28. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/README.md +0 -0
  29. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/__init__.py +0 -0
  30. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/audit.py +0 -0
  31. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/augmentor.py +0 -0
  32. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/doctor.py +0 -0
  33. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/conftest.fragment.py +0 -0
  34. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/docker-compose.fragment.yaml +0 -0
  35. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/manifest.yaml +0 -0
  36. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/requirements.fragment +0 -0
  37. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/settings.fragment.py +0 -0
  38. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/src/app/cache.py +0 -0
  39. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/caching/tests/test_cache.py +0 -0
  40. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/conftest.fragment.py +0 -0
  41. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/manifest.yaml +0 -0
  42. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/requirements.fragment +0 -0
  43. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/settings.fragment.py +0 -0
  44. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/src/app/middleware/logging.py +0 -0
  45. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/logging/tests/test_logging_middleware.py +0 -0
  46. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/conftest.fragment.py +0 -0
  47. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/docker-compose.fragment.yaml +0 -0
  48. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/manifest.yaml +0 -0
  49. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/requirements.fragment +0 -0
  50. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/settings.fragment.py +0 -0
  51. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/src/app/middleware/metrics.py +0 -0
  52. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/metrics/tests/test_metrics_middleware.py +0 -0
  53. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/conftest.fragment.py +0 -0
  54. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/manifest.yaml +0 -0
  55. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/requirements.fragment +0 -0
  56. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/settings.fragment.py +0 -0
  57. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/src/app/middleware/tracing.py +0 -0
  58. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/tracing/tests/test_tracing_middleware.py +0 -0
  59. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/conftest.fragment.py +0 -0
  60. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/docker-compose.fragment.yaml +0 -0
  61. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/manifest.yaml +0 -0
  62. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/requirements.fragment +0 -0
  63. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/settings.fragment.py +0 -0
  64. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/src/app/workers/__init__.py +0 -0
  65. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/src/app/workers/celery_app.py +0 -0
  66. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/src/app/workers/tasks.py +0 -0
  67. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/features/workers/tests/test_workers.py +0 -0
  68. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/fragments.py +0 -0
  69. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/generator.py +0 -0
  70. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/resources.py +0 -0
  71. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/README.md +0 -0
  72. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/cookiecutter.json +0 -0
  73. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/hooks/post_gen_project.py +0 -0
  74. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.cookiecutterignore +0 -0
  75. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  76. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  77. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  78. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  79. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/cache.py +0 -0
  80. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +0 -0
  81. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/upstreams.py +0 -0
  82. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  83. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_service.py +0 -0
  84. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/delegates.py +0 -0
  85. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +0 -0
  86. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/worker_broker.py +0 -0
  87. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/docker-compose.yml +0 -0
  88. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/__init__.py +0 -0
  89. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/logging.py +0 -0
  90. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  91. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +0 -0
  92. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  93. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  94. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/__init__.py +0 -0
  95. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/__init__.py +0 -0
  96. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/test_logging_middleware.py +0 -0
  97. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/conftest.py +0 -0
  98. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/test_items.py +0 -0
  99. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/__init__.py +0 -0
  100. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_cache.py +0 -0
  101. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_database_settings.py +0 -0
  102. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_delegates.py +0 -0
  103. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_settings_contracts.py +0 -0
  104. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_worker_broker.py +0 -0
  105. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  106. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  107. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  108. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +0 -0
  109. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/__init__.py +0 -0
  110. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/tasks.py +0 -0
  111. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  112. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  113. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  114. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/dependencies/auth_service.py +0 -0
  115. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  116. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-app-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  117. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  118. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  119. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  120. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  121. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  122. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/repositories/token_repository.py +0 -0
  123. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  124. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  125. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  126. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/auth_view.py +0 -0
  127. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-auth-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  128. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  129. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  130. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  131. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  132. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  133. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/repositories/user_repository.py +0 -0
  134. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  135. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  136. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  137. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  138. {csrd_utils-0.3.72 → csrd_utils-0.3.74}/src/csrd_utils/templates/platform-identity-service/{{cookiecutter.__service_name_snake}}/views/unversioned/users_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csrd-utils
3
- Version: 0.3.72
3
+ Version: 0.3.74
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.72"
3
+ version = "0.3.74"
4
4
  description = "CLI utilities for csrd service generation and feature augmentation"
5
5
  license = { text = "MIT" }
6
6
  requires-python = ">=3.12"
@@ -485,6 +485,8 @@ def _generate_services_from_cluster_spec(
485
485
  role = str(service.get("role", "custom")).strip()
486
486
  # Build extra_context for platform templates that have additional variables
487
487
  extra: dict[str, str] = {}
488
+ if role in {"app", "auth", "identity"}:
489
+ extra["db_path"] = "./platform.db"
488
490
  if role == "auth":
489
491
  # Resolve the identity-service URL from the port map if present
490
492
  identity_port = next(
@@ -499,7 +501,12 @@ def _generate_services_from_cluster_spec(
499
501
  elif role == "app":
500
502
  auth_port = next((port_map[n] for n in port_map if "auth" in n), 8081)
501
503
  auth_name = next((n for n in port_map if "auth" in n), "auth-service")
504
+ identity_port = next((port_map[n] for n in port_map if "identity" in n), 8082)
505
+ identity_name = next(
506
+ (n for n in port_map if "identity" in n), "identity-service"
507
+ )
502
508
  extra["auth_service_url"] = f"http://{auth_name}:{auth_port}"
509
+ extra["identity_service_url"] = f"http://{identity_name}:{identity_port}"
503
510
  result = generate_platform_service(
504
511
  name=name,
505
512
  output_dir=workspace_root,
@@ -292,6 +292,10 @@ def _service_environment(service: ServiceSpec, services: list[ServiceSpec]) -> d
292
292
  if auth_service and name != auth_service["name"]:
293
293
  env["AUTH_SERVICE_URL"] = f"http://{auth_service['name']}:{auth_service['port']}"
294
294
 
295
+ role = str(service.get("role", "")).strip()
296
+ if service["type"] == "platform" and role in {"app", "auth", "identity"}:
297
+ env["DB_PATH"] = "./platform.db"
298
+
295
299
  return env
296
300
 
297
301
 
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "service_name": "app-service",
3
3
  "port": "8080",
4
+ "db_path": "./platform.db",
4
5
  "auth_service_url": "http://auth-service:8081",
6
+ "identity_service_url": "http://identity-service:8082",
5
7
  "__service_name_snake": "{{ cookiecutter.service_name | replace('-', '_') }}"
6
8
  }
@@ -2,9 +2,14 @@
2
2
 
3
3
  Platform app service with auth-guarded item endpoints.
4
4
 
5
+ Items are persisted in SQLite so this service can share the same DB file
6
+ as platform auth and identity services.
7
+
5
8
  ## Endpoints
6
9
 
7
10
  - `GET /health` - liveness probe
11
+ - `POST /signup` - passthrough to identity signup (public)
12
+ - `POST /login` - passthrough to auth token issue (public)
8
13
  - `POST /api/items` - create item (bearer required)
9
14
  - `GET /api/items` - list items (bearer required)
10
15
  - `GET /api/items/{entity_id}` - get item (bearer required)
@@ -16,7 +21,9 @@ Platform app service with auth-guarded item endpoints.
16
21
 
17
22
  | Variable | Default | Description |
18
23
  |---|---|---|
24
+ | `DB_PATH` | `{{ cookiecutter.db_path }}` | Shared SQLite database file path |
19
25
  | `AUTH_SERVICE_URL` | `{{ cookiecutter.auth_service_url }}` | Auth service verify endpoint base URL |
26
+ | `IDENTITY_SERVICE_URL` | `{{ cookiecutter.identity_service_url }}` | Identity service base URL for signup passthrough |
20
27
 
21
28
  ## Run
22
29
 
@@ -0,0 +1,4 @@
1
+ from .auth_delegate import AuthDelegate
2
+ from .identity_delegate import IdentityDelegate
3
+
4
+ __all__ = ("AuthDelegate", "IdentityDelegate")
@@ -0,0 +1,11 @@
1
+ from csrd.delegate import BaseDelegate
2
+
3
+ from ..settings import settings
4
+
5
+
6
+ class AuthDelegate(BaseDelegate):
7
+ def __init__(self) -> None:
8
+ super().__init__(settings.auth_service_url)
9
+
10
+ async def login(self, username: str, password: str) -> dict[str, object]:
11
+ return await self.post("/api/token", json={"username": username, "password": password})
@@ -0,0 +1,11 @@
1
+ from csrd.delegate import BaseDelegate
2
+
3
+ from ..settings import settings
4
+
5
+
6
+ class IdentityDelegate(BaseDelegate):
7
+ def __init__(self) -> None:
8
+ super().__init__(settings.identity_service_url)
9
+
10
+ async def signup(self, username: str, password: str) -> dict[str, object]:
11
+ return await self.post("/api/signup", json={"username": username, "password": password})
@@ -0,0 +1,12 @@
1
+ from .auth_passthrough import AuthDelegateDep, IdentityDelegateDep
2
+ from .auth_service import VerifiedTokenDep, router_auth
3
+ from .item_repository import ItemRepositoryDep, item_repository_factory
4
+
5
+ __all__ = (
6
+ "AuthDelegateDep",
7
+ "IdentityDelegateDep",
8
+ "ItemRepositoryDep",
9
+ "VerifiedTokenDep",
10
+ "item_repository_factory",
11
+ "router_auth",
12
+ )
@@ -0,0 +1,25 @@
1
+ from typing import Annotated
2
+
3
+ from fastapi import Depends
4
+
5
+ from ..delegates import AuthDelegate, IdentityDelegate
6
+
7
+
8
+ def auth_delegate_factory() -> AuthDelegate:
9
+ return AuthDelegate()
10
+
11
+
12
+ def identity_delegate_factory() -> IdentityDelegate:
13
+ return IdentityDelegate()
14
+
15
+
16
+ AuthDelegateDep = Annotated[AuthDelegate, Depends(auth_delegate_factory)]
17
+ IdentityDelegateDep = Annotated[IdentityDelegate, Depends(identity_delegate_factory)]
18
+
19
+
20
+ __all__ = (
21
+ "AuthDelegateDep",
22
+ "IdentityDelegateDep",
23
+ "auth_delegate_factory",
24
+ "identity_delegate_factory",
25
+ )
@@ -0,0 +1,25 @@
1
+ from collections.abc import AsyncIterator
2
+ from typing import Annotated
3
+
4
+ from fastapi import Depends
5
+
6
+ from csrd.repository import SQLiteAdapter
7
+
8
+ from ..repositories import ItemRepository
9
+ from ..settings import settings
10
+
11
+
12
+ async def item_repository_factory() -> AsyncIterator[ItemRepository]:
13
+ adapter = SQLiteAdapter(settings.db_path)
14
+ await adapter.connect()
15
+ repo = ItemRepository(adapter)
16
+ await repo._init_schema()
17
+ try:
18
+ yield repo
19
+ finally:
20
+ await adapter.close()
21
+
22
+
23
+ ItemRepositoryDep = Annotated[ItemRepository, Depends(item_repository_factory)]
24
+
25
+ __all__ = ("ItemRepositoryDep", "item_repository_factory")
@@ -0,0 +1,3 @@
1
+ from .item_repository import ItemRepository
2
+
3
+ __all__ = ("ItemRepository",)
@@ -0,0 +1,71 @@
1
+ import uuid
2
+ from datetime import UTC, datetime
3
+
4
+ from csrd.repository import BaseRepository, DBProtocol
5
+
6
+
7
+ _CREATE_ITEMS_TABLE_SQL = """
8
+ CREATE TABLE IF NOT EXISTS items (
9
+ id TEXT PRIMARY KEY,
10
+ name TEXT NOT NULL,
11
+ created_at TEXT NOT NULL
12
+ )
13
+ """
14
+
15
+
16
+ class ItemRepository(BaseRepository):
17
+ def __init__(self, adapter: DBProtocol) -> None:
18
+ super().__init__(adapter)
19
+
20
+ async def _init_schema(self) -> None:
21
+ await self.execute(_CREATE_ITEMS_TABLE_SQL)
22
+
23
+ async def create_item(self, name: str) -> dict[str, str]:
24
+ item_id = str(uuid.uuid4())
25
+ created_at = datetime.now(UTC).isoformat()
26
+ await self._init_schema()
27
+ await self.insert("items", {"id": item_id, "name": name, "created_at": created_at})
28
+ return {"id": item_id, "name": name, "created_at": created_at}
29
+
30
+ async def list_items(self) -> list[dict[str, str]]:
31
+ await self._init_schema()
32
+ rows = await self.fetch_all("SELECT id, name, created_at FROM items ORDER BY created_at DESC")
33
+ return [
34
+ {
35
+ "id": str(row.get("id", "")),
36
+ "name": str(row.get("name", "")),
37
+ "created_at": str(row.get("created_at", "")),
38
+ }
39
+ for row in rows
40
+ ]
41
+
42
+ async def get_item(self, item_id: str) -> dict[str, str] | None:
43
+ await self._init_schema()
44
+ row = await self.fetch_one(
45
+ "SELECT id, name, created_at FROM items WHERE id = :id",
46
+ {"id": item_id},
47
+ )
48
+ if row is None:
49
+ return None
50
+ return {
51
+ "id": str(row.get("id", "")),
52
+ "name": str(row.get("name", "")),
53
+ "created_at": str(row.get("created_at", "")),
54
+ }
55
+
56
+ async def update_item(self, item_id: str, name: str) -> int:
57
+ await self._init_schema()
58
+ return await super().update("items", {"name": name}, {"id": item_id})
59
+
60
+ async def delete_item(self, item_id: str) -> int:
61
+ await self._init_schema()
62
+ return await super().delete("items", {"id": item_id})
63
+
64
+ async def upsert_item(self, item_id: str, name: str) -> int:
65
+ await self._init_schema()
66
+ created_at = datetime.now(UTC).isoformat()
67
+ return await super().upsert(
68
+ "items",
69
+ {"name": name, "created_at": created_at},
70
+ {"id": item_id},
71
+ )
@@ -2,5 +2,8 @@ fastapi>=0.115,<1
2
2
  uvicorn[standard]>=0.30,<1
3
3
  pydantic-settings>=2.6,<3
4
4
  httpx>=0.27,<1
5
+ aiosqlite>=0.21,<1
5
6
  csrd-auth>=0.1.0,<1
7
+ csrd-delegate>=0.1.0,<1
8
+ csrd-repository>=0.1.0,<1
6
9
  csrd-versioning>=0.1.0,<1
@@ -6,7 +6,9 @@ class Settings(BaseSettings):
6
6
 
7
7
  app_name: str = "{{ cookiecutter.service_name }}"
8
8
  port: int = {{ cookiecutter.port }}
9
+ db_path: str = "{{ cookiecutter.db_path }}"
9
10
  auth_service_url: str = "{{ cookiecutter.auth_service_url }}"
11
+ identity_service_url: str = "{{ cookiecutter.identity_service_url }}"
10
12
 
11
13
 
12
14
  settings = Settings()
@@ -1,10 +1,11 @@
1
1
  from fastapi import FastAPI
2
2
 
3
- from . import health_view, items_view
3
+ from . import auth_service_view, health_view, items_view
4
4
 
5
5
  unversioned_app = FastAPI(title="{{ cookiecutter.service_name }}")
6
6
 
7
7
  unversioned_app.include_router(health_view.router)
8
+ unversioned_app.include_router(auth_service_view.router)
8
9
  unversioned_app.include_router(items_view.router)
9
10
 
10
11
  __all__ = ("unversioned_app",)
@@ -0,0 +1,28 @@
1
+ from fastapi import APIRouter
2
+ from pydantic import BaseModel
3
+
4
+ from ...dependencies import AuthDelegateDep, IdentityDelegateDep
5
+
6
+ router = APIRouter(tags=["Auth Service"])
7
+
8
+
9
+ class SignupRequest(BaseModel):
10
+ username: str
11
+ password: str
12
+
13
+
14
+ class LoginRequest(BaseModel):
15
+ username: str
16
+ password: str
17
+
18
+
19
+ @router.post("/signup")
20
+ async def signup(payload: SignupRequest, delegate: IdentityDelegateDep) -> dict[str, object]:
21
+ async with delegate:
22
+ return await delegate.signup(payload.username, payload.password)
23
+
24
+
25
+ @router.post("/login")
26
+ async def login(payload: LoginRequest, delegate: AuthDelegateDep) -> dict[str, object]:
27
+ async with delegate:
28
+ return await delegate.login(payload.username, payload.password)
@@ -1,16 +1,10 @@
1
- import uuid
2
- from datetime import UTC, datetime
3
-
4
1
  from fastapi import APIRouter, HTTPException
5
2
  from pydantic import BaseModel
6
3
 
7
- from ...dependencies import router_auth
4
+ from ...dependencies import ItemRepositoryDep, router_auth
8
5
 
9
6
  router = APIRouter(prefix="/api", tags=["Items Endpoints"], dependencies=[router_auth])
10
7
 
11
- _ITEMS: dict[str, dict[str, str]] = {}
12
-
13
-
14
8
  class CreateItemRequest(BaseModel):
15
9
  name: str
16
10
 
@@ -49,22 +43,19 @@ class ItemDeleteResponse(BaseModel):
49
43
  @router.post("/items", response_model=ItemResponse)
50
44
  async def create_item(
51
45
  payload: CreateItemRequest,
46
+ repo: ItemRepositoryDep,
52
47
  ) -> ItemResponse:
53
- item_id = str(uuid.uuid4())
54
- created_at = datetime.now(UTC).isoformat()
55
- item = {"id": item_id, "name": payload.name, "created_at": created_at}
56
- _ITEMS[item_id] = item
57
- return item
48
+ return await repo.create_item(payload.name)
58
49
 
59
50
 
60
51
  @router.get("/items", response_model=ItemListResponse)
61
- async def list_items() -> ItemListResponse:
62
- return {"items": list(_ITEMS.values())}
52
+ async def list_items(repo: ItemRepositoryDep) -> ItemListResponse:
53
+ return {"items": await repo.list_items()}
63
54
 
64
55
 
65
56
  @router.get("/items/{entity_id}", response_model=ItemResponse)
66
- async def get_item(entity_id: str) -> ItemResponse:
67
- item = _ITEMS.get(entity_id)
57
+ async def get_item(entity_id: str, repo: ItemRepositoryDep) -> ItemResponse:
58
+ item = await repo.get_item(entity_id)
68
59
  if item is None:
69
60
  raise HTTPException(status_code=404, detail="item not found")
70
61
  return item
@@ -74,11 +65,11 @@ async def get_item(entity_id: str) -> ItemResponse:
74
65
  async def update_item(
75
66
  entity_id: str,
76
67
  payload: UpdateItemRequest,
68
+ repo: ItemRepositoryDep,
77
69
  ) -> ItemUpdateResponse:
78
- item = _ITEMS.get(entity_id)
79
- if item is None:
70
+ rows = await repo.update_item(entity_id, payload.name)
71
+ if rows == 0:
80
72
  raise HTTPException(status_code=404, detail="item not found")
81
- item["name"] = payload.name
82
73
  return {"id": entity_id, "name": payload.name, "updated": True}
83
74
 
84
75
 
@@ -86,21 +77,18 @@ async def update_item(
86
77
  async def upsert_item(
87
78
  entity_id: str,
88
79
  payload: UpdateItemRequest,
80
+ repo: ItemRepositoryDep,
89
81
  ) -> ItemUpsertResponse:
90
- existing = _ITEMS.get(entity_id)
91
- if existing is None:
92
- created_at = datetime.now(UTC).isoformat()
93
- _ITEMS[entity_id] = {"id": entity_id, "name": payload.name, "created_at": created_at}
94
- else:
95
- existing["name"] = payload.name
96
- return {"id": entity_id, "name": payload.name, "rows_affected": 1}
82
+ rows = await repo.upsert_item(entity_id, payload.name)
83
+ return {"id": entity_id, "name": payload.name, "rows_affected": rows}
97
84
 
98
85
 
99
86
  @router.delete("/items/{entity_id}", response_model=ItemDeleteResponse)
100
87
  async def delete_item(
101
88
  entity_id: str,
89
+ repo: ItemRepositoryDep,
102
90
  ) -> ItemDeleteResponse:
103
- rows = 1 if _ITEMS.pop(entity_id, None) is not None else 0
91
+ rows = await repo.delete_item(entity_id)
104
92
  if rows == 0:
105
93
  raise HTTPException(status_code=404, detail="item not found")
106
94
  return {"id": entity_id, "deleted": True}
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "service_name": "auth-service",
3
3
  "port": "8081",
4
+ "db_path": "./platform.db",
4
5
  "identity_service_url": "http://identity-service:8082",
5
6
  "__service_name_snake": "{{ cookiecutter.service_name | replace('-', '_') }}"
6
7
  }
@@ -17,7 +17,7 @@ Platform auth service — issues and verifies JWT tokens.
17
17
  | `JWT_ISSUER` | `{{ cookiecutter.service_name }}` | Token issuer |
18
18
  | `JWT_AUDIENCE` | `cluster` | Token audience |
19
19
  | `JWT_TTL_SECONDS` | `3600` | Token TTL |
20
- | `DB_PATH` | `./{{ cookiecutter.__service_name_snake }}.db` | SQLite database path |
20
+ | `DB_PATH` | `{{ cookiecutter.db_path }}` | SQLite database path |
21
21
  | `IDENTITY_SERVICE_URL` | `{{ cookiecutter.identity_service_url }}` | Identity service URL |
22
22
 
23
23
  ## Run
@@ -13,7 +13,7 @@ class Settings(BaseSettings):
13
13
  jwt_audience: str = "cluster"
14
14
  jwt_ttl_seconds: int = 3600
15
15
 
16
- db_path: str = "./{{ cookiecutter.__service_name_snake }}.db"
16
+ db_path: str = "{{ cookiecutter.db_path }}"
17
17
  identity_service_url: str = "{{ cookiecutter.identity_service_url }}"
18
18
 
19
19
 
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "service_name": "identity-service",
3
3
  "port": "8082",
4
+ "db_path": "./platform.db",
4
5
  "__service_name_snake": "{{ cookiecutter.service_name | replace('-', '_') }}"
5
6
  }
@@ -15,7 +15,7 @@ Platform identity service — manages users and credentials.
15
15
 
16
16
  | Variable | Default | Description |
17
17
  |---|---|---|
18
- | `DB_PATH` | `./{{ cookiecutter.__service_name_snake }}.db` | SQLite database path |
18
+ | `DB_PATH` | `{{ cookiecutter.db_path }}` | SQLite database path |
19
19
 
20
20
  ## Run
21
21
 
@@ -6,7 +6,7 @@ class Settings(BaseSettings):
6
6
 
7
7
  app_name: str = "{{ cookiecutter.service_name }}"
8
8
  port: int = {{ cookiecutter.port }}
9
- db_path: str = "./{{ cookiecutter.__service_name_snake }}.db"
9
+ db_path: str = "{{ cookiecutter.db_path }}"
10
10
 
11
11
 
12
12
  settings = Settings()
@@ -1,3 +0,0 @@
1
- from .auth_service import VerifiedTokenDep, router_auth
2
-
3
- __all__ = ("VerifiedTokenDep", "router_auth")
File without changes
File without changes