csrd-utils 0.3.39__tar.gz → 0.3.41__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 (87) hide show
  1. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/PKG-INFO +1 -1
  2. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/pyproject.toml +1 -1
  3. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/__main__.py +20 -7
  4. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/cluster.py +2 -2
  5. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/.gitignore +0 -0
  6. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/README.md +0 -0
  7. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/__init__.py +0 -0
  8. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/audit.py +0 -0
  9. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/augmentor.py +0 -0
  10. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/doctor.py +0 -0
  11. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/conftest.fragment.py +0 -0
  12. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/docker-compose.fragment.yaml +0 -0
  13. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/manifest.yaml +0 -0
  14. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/requirements.fragment +0 -0
  15. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/settings.fragment.py +0 -0
  16. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/src/app/cache.py +0 -0
  17. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/caching/tests/test_cache.py +0 -0
  18. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/conftest.fragment.py +0 -0
  19. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/manifest.yaml +0 -0
  20. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/requirements.fragment +0 -0
  21. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/settings.fragment.py +0 -0
  22. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/src/app/middleware/logging.py +0 -0
  23. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/logging/tests/test_logging_middleware.py +0 -0
  24. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/conftest.fragment.py +0 -0
  25. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/docker-compose.fragment.yaml +0 -0
  26. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/manifest.yaml +0 -0
  27. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/requirements.fragment +0 -0
  28. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/settings.fragment.py +0 -0
  29. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/src/app/middleware/metrics.py +0 -0
  30. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/metrics/tests/test_metrics_middleware.py +0 -0
  31. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/conftest.fragment.py +0 -0
  32. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/manifest.yaml +0 -0
  33. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/requirements.fragment +0 -0
  34. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/settings.fragment.py +0 -0
  35. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/src/app/middleware/tracing.py +0 -0
  36. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/tracing/tests/test_tracing_middleware.py +0 -0
  37. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/conftest.fragment.py +0 -0
  38. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/docker-compose.fragment.yaml +0 -0
  39. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/manifest.yaml +0 -0
  40. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/requirements.fragment +0 -0
  41. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/settings.fragment.py +0 -0
  42. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/src/app/workers/__init__.py +0 -0
  43. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/src/app/workers/celery_app.py +0 -0
  44. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/src/app/workers/tasks.py +0 -0
  45. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/features/workers/tests/test_workers.py +0 -0
  46. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/fragments.py +0 -0
  47. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/generator.py +0 -0
  48. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/resources.py +0 -0
  49. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/README.md +0 -0
  50. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/cookiecutter.json +0 -0
  51. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/hooks/post_gen_project.py +0 -0
  52. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.cookiecutterignore +0 -0
  53. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  54. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/Dockerfile +0 -0
  55. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  56. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  57. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/cache.py +0 -0
  58. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +0 -0
  59. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/delegates/upstreams.py +0 -0
  60. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  61. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/delegates.py +0 -0
  62. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +0 -0
  63. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/dependencies/worker_broker.py +0 -0
  64. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/docker-compose.yml +0 -0
  65. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/__init__.py +0 -0
  66. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/middleware/logging.py +0 -0
  67. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/py.typed +0 -0
  68. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/pyproject.toml +0 -0
  69. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  70. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +0 -0
  71. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  72. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  73. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/__init__.py +0 -0
  74. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/test_logging_middleware.py +0 -0
  75. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/conftest.py +0 -0
  76. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/test_items.py +0 -0
  77. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_cache.py +0 -0
  78. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_database_settings.py +0 -0
  79. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_delegates.py +0 -0
  80. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_settings_contracts.py +0 -0
  81. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_worker_broker.py +0 -0
  82. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  83. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  84. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  85. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +0 -0
  86. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/__init__.py +0 -0
  87. {csrd_utils-0.3.39 → csrd_utils-0.3.41}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/workers/tasks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csrd-utils
3
- Version: 0.3.39
3
+ Version: 0.3.41
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.39"
3
+ version = "0.3.41"
4
4
  description = "CLI utilities for csrd service generation and feature augmentation"
5
5
  license = { text = "MIT" }
6
6
  requires-python = ">=3.12"
@@ -187,6 +187,14 @@ def _prompt_int(label: str, default: int) -> int:
187
187
  print("ERROR: Enter a valid integer")
188
188
 
189
189
 
190
+ def _normalize_service_name(name: str) -> str:
191
+ """Ensure service names consistently end with '-service'."""
192
+ normalized = name.strip()
193
+ if not normalized:
194
+ return normalized
195
+ return normalized if normalized.endswith("-service") else f"{normalized}-service"
196
+
197
+
190
198
  def _print_cancelled() -> None:
191
199
  # Avoid surfacing a traceback if a second Ctrl-C lands while printing.
192
200
  with suppress(KeyboardInterrupt):
@@ -204,9 +212,10 @@ def _collect_new_service_config(args: argparse.Namespace) -> GenerateServiceArgs
204
212
  if not interactive:
205
213
  has_database = args.database != "none"
206
214
  selected_database = "sqlite" if not has_database else args.database
215
+ normalized_name = _normalize_service_name(args.name)
207
216
  return GenerateServiceArgs(
208
217
  {
209
- "name": args.name,
218
+ "name": normalized_name,
210
219
  "output_dir": args.output,
211
220
  "description": args.description,
212
221
  "port": args.port,
@@ -227,8 +236,11 @@ def _collect_new_service_config(args: argparse.Namespace) -> GenerateServiceArgs
227
236
 
228
237
  print("Interactive mode: press Enter to accept defaults.")
229
238
 
230
- name = _prompt_text("Service name", args.name or "my-service")
231
- output_dir = Path(_prompt_text("Output directory", str(args.output)))
239
+ name = _normalize_service_name(_prompt_text("Service name", args.name or "my-service"))
240
+ if getattr(args, "output_locked", False):
241
+ output_dir = args.output
242
+ else:
243
+ output_dir = Path(_prompt_text("Output directory", str(args.output)))
232
244
  description = _prompt_text("Service description", args.description)
233
245
  port = _prompt_int("HTTP port", args.port)
234
246
  model_name = _prompt_text("Model name", args.model_name)
@@ -382,7 +394,7 @@ def _collect_new_workspace_config(args: argparse.Namespace) -> GenerateWorkspace
382
394
  else Path(_prompt_text("Output directory", str(args.output)))
383
395
  )
384
396
  generate = args.generate or _prompt_choice(
385
- "Generate in workspace now", ["none", "service", "cluster"], "none"
397
+ "Generate in workspace now", ["none", "service", "cluster"], "service"
386
398
  )
387
399
  return GenerateWorkspaceArgs(
388
400
  {
@@ -413,6 +425,7 @@ def _default_service_namespace(output_dir: Path) -> argparse.Namespace:
413
425
  return argparse.Namespace(
414
426
  interactive=True,
415
427
  name=None,
428
+ output_locked=True,
416
429
  output=output_dir,
417
430
  description="A microservice using the csrd library stack",
418
431
  port=8080,
@@ -1159,7 +1172,7 @@ def main() -> int:
1159
1172
  workspace_root = _ensure_workspace_for_output(
1160
1173
  service_config["output_dir"], allow_prompt=_service_is_interactive(args)
1161
1174
  )
1162
- service_config["output_dir"] = _workspace_services_dir(workspace_root)
1175
+ service_config["output_dir"] = workspace_root
1163
1176
  generated = generate_service(**service_config)
1164
1177
  generated_cluster = _maybe_update_workspace_cluster(
1165
1178
  workspace_root, service_config, generated
@@ -1205,9 +1218,9 @@ def main() -> int:
1205
1218
  generate_mode = workspace_config["generate"]
1206
1219
  if generate_mode == "service":
1207
1220
  service_config = _collect_new_service_config(
1208
- _default_service_namespace(_workspace_services_dir(workspace_root))
1221
+ _default_service_namespace(workspace_root)
1209
1222
  )
1210
- service_config["output_dir"] = _workspace_services_dir(workspace_root)
1223
+ service_config["output_dir"] = workspace_root
1211
1224
  generated_service = generate_service(**service_config)
1212
1225
  generated_cluster = _maybe_update_workspace_cluster(
1213
1226
  workspace_root, service_config, generated_service
@@ -319,8 +319,8 @@ def render_compose(spec: ClusterSpec) -> dict[str, Any]:
319
319
  app_service: dict[str, Any] = {
320
320
  "image": f"ghcr.io/csrd-api/{name}:latest",
321
321
  "build": {
322
- "context": f"./src/{name}",
323
- "dockerfile": "Dockerfile",
322
+ "context": ".",
323
+ "dockerfile": f"Dockerfile.{name}",
324
324
  },
325
325
  "ports": [f"{service['port']}:{service['port']}"],
326
326
  "environment": _service_environment(service, services),
File without changes
File without changes