csrd-utils 0.3.38__tar.gz → 0.3.40__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.38 → csrd_utils-0.3.40}/PKG-INFO +1 -1
  2. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/pyproject.toml +1 -1
  3. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/__main__.py +3 -3
  4. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/generator.py +35 -3
  5. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/hooks/post_gen_project.py +12 -12
  6. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/Dockerfile +1 -2
  7. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/.gitignore +0 -0
  8. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/README.md +0 -0
  9. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/__init__.py +0 -0
  10. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/audit.py +0 -0
  11. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/augmentor.py +0 -0
  12. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/cluster.py +0 -0
  13. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/doctor.py +0 -0
  14. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/conftest.fragment.py +0 -0
  15. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/docker-compose.fragment.yaml +0 -0
  16. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/manifest.yaml +0 -0
  17. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/requirements.fragment +0 -0
  18. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/settings.fragment.py +0 -0
  19. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/src/app/cache.py +0 -0
  20. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/caching/tests/test_cache.py +0 -0
  21. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/conftest.fragment.py +0 -0
  22. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/manifest.yaml +0 -0
  23. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/requirements.fragment +0 -0
  24. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/settings.fragment.py +0 -0
  25. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/src/app/middleware/logging.py +0 -0
  26. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/logging/tests/test_logging_middleware.py +0 -0
  27. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/conftest.fragment.py +0 -0
  28. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/docker-compose.fragment.yaml +0 -0
  29. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/manifest.yaml +0 -0
  30. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/requirements.fragment +0 -0
  31. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/settings.fragment.py +0 -0
  32. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/src/app/middleware/metrics.py +0 -0
  33. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/metrics/tests/test_metrics_middleware.py +0 -0
  34. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/conftest.fragment.py +0 -0
  35. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/manifest.yaml +0 -0
  36. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/requirements.fragment +0 -0
  37. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/settings.fragment.py +0 -0
  38. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/src/app/middleware/tracing.py +0 -0
  39. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/tracing/tests/test_tracing_middleware.py +0 -0
  40. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/conftest.fragment.py +0 -0
  41. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/docker-compose.fragment.yaml +0 -0
  42. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/manifest.yaml +0 -0
  43. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/requirements.fragment +0 -0
  44. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/settings.fragment.py +0 -0
  45. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/src/app/workers/__init__.py +0 -0
  46. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/src/app/workers/celery_app.py +0 -0
  47. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/src/app/workers/tasks.py +0 -0
  48. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/features/workers/tests/test_workers.py +0 -0
  49. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/fragments.py +0 -0
  50. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/resources.py +0 -0
  51. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/README.md +0 -0
  52. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/cookiecutter.json +0 -0
  53. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.cookiecutterignore +0 -0
  54. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/.dockerignore +0 -0
  55. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/README.md +0 -0
  56. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/__init__.py +0 -0
  57. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/cache.py +0 -0
  58. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/delegates/__init__.py +0 -0
  59. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/delegates/upstreams.py +0 -0
  60. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/dependencies/__init__.py +0 -0
  61. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/dependencies/delegates.py +0 -0
  62. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/dependencies/item_repository.py +0 -0
  63. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/dependencies/worker_broker.py +0 -0
  64. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/docker-compose.yml +0 -0
  65. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/middleware/__init__.py +0 -0
  66. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/middleware/logging.py +0 -0
  67. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/py.typed +0 -0
  68. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/pyproject.toml +0 -0
  69. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/repositories/__init__.py +0 -0
  70. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/repositories/item_repository.py +0 -0
  71. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/requirements.txt +0 -0
  72. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/settings.py +0 -0
  73. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/__init__.py +0 -0
  74. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/acceptance/test_logging_middleware.py +0 -0
  75. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/conftest.py +0 -0
  76. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/test_items.py +0 -0
  77. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_cache.py +0 -0
  78. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_database_settings.py +0 -0
  79. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_delegates.py +0 -0
  80. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_settings_contracts.py +0 -0
  81. {csrd_utils-0.3.38 → csrd_utils-0.3.40}/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/tests/unit/test_worker_broker.py +0 -0
  82. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/views/__init__.py +0 -0
  83. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/views/unversioned/__init__.py +0 -0
  84. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/views/unversioned/health_view.py +0 -0
  85. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/views/unversioned/items_view.py +0 -0
  86. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/src/csrd_utils/templates/cookiecutter-service}/{{cookiecutter.__service_name_snake}}/workers/__init__.py +0 -0
  87. {csrd_utils-0.3.38/src/csrd_utils/templates/cookiecutter-service/{{cookiecutter.__service_name_snake}}/src → csrd_utils-0.3.40/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.38
3
+ Version: 0.3.40
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.38"
3
+ version = "0.3.40"
4
4
  description = "CLI utilities for csrd service generation and feature augmentation"
5
5
  license = { text = "MIT" }
6
6
  requires-python = ">=3.12"
@@ -1159,7 +1159,7 @@ def main() -> int:
1159
1159
  workspace_root = _ensure_workspace_for_output(
1160
1160
  service_config["output_dir"], allow_prompt=_service_is_interactive(args)
1161
1161
  )
1162
- service_config["output_dir"] = _workspace_services_dir(workspace_root)
1162
+ service_config["output_dir"] = workspace_root
1163
1163
  generated = generate_service(**service_config)
1164
1164
  generated_cluster = _maybe_update_workspace_cluster(
1165
1165
  workspace_root, service_config, generated
@@ -1205,9 +1205,9 @@ def main() -> int:
1205
1205
  generate_mode = workspace_config["generate"]
1206
1206
  if generate_mode == "service":
1207
1207
  service_config = _collect_new_service_config(
1208
- _default_service_namespace(_workspace_services_dir(workspace_root))
1208
+ _default_service_namespace(workspace_root)
1209
1209
  )
1210
- service_config["output_dir"] = _workspace_services_dir(workspace_root)
1210
+ service_config["output_dir"] = workspace_root
1211
1211
  generated_service = generate_service(**service_config)
1212
1212
  generated_cluster = _maybe_update_workspace_cluster(
1213
1213
  workspace_root, service_config, generated_service
@@ -66,8 +66,9 @@ def generate_service(
66
66
  ) -> Path:
67
67
  """Generate a service from the bundled cookiecutter-service template."""
68
68
  output_root = output_dir.resolve()
69
- output_root.mkdir(parents=True, exist_ok=True)
70
- target = output_root / name.replace("-", "_")
69
+ src_dir = output_root / "src"
70
+ src_dir.mkdir(parents=True, exist_ok=True)
71
+ target = src_dir / name.replace("-", "_")
71
72
 
72
73
  if target.exists() and any(target.iterdir()) and not overwrite_if_exists:
73
74
  raise FileExistsError(
@@ -104,7 +105,7 @@ def generate_service(
104
105
  str(template),
105
106
  no_input=True,
106
107
  extra_context=context,
107
- output_dir=str(output_root),
108
+ output_dir=str(src_dir),
108
109
  overwrite_if_exists=overwrite_if_exists,
109
110
  )
110
111
  finally:
@@ -118,4 +119,35 @@ def generate_service(
118
119
  for pycache_dir in generated_path.rglob("__pycache__"):
119
120
  shutil.rmtree(pycache_dir, ignore_errors=True)
120
121
 
122
+ # Move docker files to workspace root and update Dockerfile
123
+ _move_docker_files_to_workspace_root(generated_path, output_root, name)
124
+
121
125
  return generated_path
126
+
127
+
128
+ def _move_docker_files_to_workspace_root(
129
+ service_path: Path, workspace_root: Path, service_name: str
130
+ ) -> None:
131
+ """Move docker-compose.yml and Dockerfile to workspace root, updating paths in Dockerfile."""
132
+ service_name_snake = service_name.replace("-", "_")
133
+
134
+ # Move docker-compose.yml to workspace root (create if doesn't exist)
135
+ docker_compose_src = service_path / "docker-compose.yml"
136
+ docker_compose_dst = workspace_root / "docker-compose.yml"
137
+ if docker_compose_src.exists():
138
+ if not docker_compose_dst.exists():
139
+ shutil.copy2(docker_compose_src, docker_compose_dst)
140
+ docker_compose_src.unlink()
141
+
142
+ # Move Dockerfile to workspace root as Dockerfile.{service_name}
143
+ dockerfile_src = service_path / "Dockerfile"
144
+ dockerfile_dst = workspace_root / f"Dockerfile.{service_name}"
145
+ if dockerfile_src.exists():
146
+ # Read and update the Dockerfile to account for workspace root context
147
+ dockerfile_content = dockerfile_src.read_text()
148
+ # Update COPY . to COPY src/{service_name}/
149
+ dockerfile_content = dockerfile_content.replace(
150
+ "COPY . /app", f"COPY src/{service_name_snake} /app"
151
+ )
152
+ dockerfile_dst.write_text(dockerfile_content)
153
+ dockerfile_src.unlink()
@@ -31,32 +31,32 @@ def _prune_disabled_files() -> None:
31
31
  path.rmdir()
32
32
 
33
33
  if not HAS_DATABASE:
34
- _unlink(f"src/{PKG}/dependencies/item_repository.py")
35
- _unlink(f"src/{PKG}/repositories/item_repository.py")
34
+ _unlink("dependencies/item_repository.py")
35
+ _unlink("repositories/item_repository.py")
36
36
  _unlink("tests/unit/test_database_settings.py")
37
37
 
38
38
  if not HAS_DELEGATES:
39
- _unlink(f"src/{PKG}/dependencies/delegates.py")
40
- _unlink(f"src/{PKG}/delegates/upstreams.py")
39
+ _unlink("dependencies/delegates.py")
40
+ _unlink("delegates/upstreams.py")
41
41
  _unlink("tests/unit/test_delegates.py")
42
42
 
43
43
  if not HAS_WORKERS:
44
- _unlink(f"src/{PKG}/dependencies/worker_broker.py")
45
- _unlink(f"src/{PKG}/workers/tasks.py")
44
+ _unlink("dependencies/worker_broker.py")
45
+ _unlink("workers/tasks.py")
46
46
  _unlink("tests/unit/test_worker_broker.py")
47
47
 
48
48
  if not HAS_CACHING:
49
- _unlink(f"src/{PKG}/cache.py")
49
+ _unlink("cache.py")
50
50
  _unlink("tests/unit/test_cache.py")
51
51
 
52
52
  if not HAS_STRUCTURED_LOGGING:
53
- _unlink(f"src/{PKG}/middleware/logging.py")
53
+ _unlink("middleware/logging.py")
54
54
  _unlink("tests/acceptance/test_logging_middleware.py")
55
55
 
56
- _rmdir_if_empty(f"src/{PKG}/repositories")
57
- _rmdir_if_empty(f"src/{PKG}/delegates")
58
- _rmdir_if_empty(f"src/{PKG}/workers")
59
- _rmdir_if_empty(f"src/{PKG}/middleware")
56
+ _rmdir_if_empty("repositories")
57
+ _rmdir_if_empty("delegates")
58
+ _rmdir_if_empty("workers")
59
+ _rmdir_if_empty("middleware")
60
60
  _rmdir_if_empty("tests/unit")
61
61
  _rmdir_if_empty("tests/acceptance")
62
62
 
@@ -5,9 +5,8 @@ WORKDIR /app
5
5
  COPY requirements.txt /app/requirements.txt
6
6
  RUN pip install --no-cache-dir -r /app/requirements.txt
7
7
 
8
- COPY src /app/src
8
+ COPY . /app
9
9
 
10
- ENV PYTHONPATH=/app/src
11
10
  ENV PORT={{ cookiecutter.port }}
12
11
 
13
12
  CMD uvicorn {{cookiecutter.__service_name_snake}}:build_app --factory --host 0.0.0.0 --port ${PORT}
File without changes
File without changes