|
7 | 7 | import importlib.util |
8 | 8 | import logging |
9 | 9 | import sys |
| 10 | +import warnings |
10 | 11 | from pathlib import Path |
11 | 12 | from typing import TYPE_CHECKING, Any, Literal |
12 | 13 |
|
@@ -232,7 +233,13 @@ def _load_resolver_with_dependencies( |
232 | 233 | _load_module(dep_file, dep_module_name) |
233 | 234 | logger.debug(f"Loaded dependent file: {dep_file}") |
234 | 235 | except Exception as e: |
235 | | - logger.warning(f"Failed to load dependent file {dep_file}: {e}") |
| 236 | + warnings.warn( |
| 237 | + f"Failed to load dependent file {dep_file}: {e}. " |
| 238 | + "If your handler module has side effects at import time " |
| 239 | + "(e.g. environment variable validation, database connections), " |
| 240 | + "consider deferring them to runtime.", |
| 241 | + stacklevel=2, |
| 242 | + ) |
236 | 243 |
|
237 | 244 | # Now get the resolver - it should already be loaded by the dependent files |
238 | 245 | # Try to get it from the module that was loaded by dependents |
@@ -409,9 +416,25 @@ def get_openapi_schema(self) -> dict[str, Any]: |
409 | 416 | if hasattr(resolver, "get_openapi_schema"): |
410 | 417 | self._schemas.append(_model_to_dict(resolver.get_openapi_schema())) |
411 | 418 | except (ImportError, AttributeError, FileNotFoundError) as e: |
412 | | - logger.warning(f"Failed to load resolver from {file_path}: {e}") |
| 419 | + warnings.warn( |
| 420 | + f"Failed to load resolver from {file_path}: {e}. " |
| 421 | + "If your handler module has side effects at import time " |
| 422 | + "(e.g. environment variable validation, database connections), " |
| 423 | + "consider deferring them to runtime.", |
| 424 | + stacklevel=1, |
| 425 | + ) |
413 | 426 |
|
414 | 427 | self._cached_schema = self._merge_schemas() |
| 428 | + |
| 429 | + if self._discovered_files and not self._cached_schema.get("paths"): |
| 430 | + warnings.warn( |
| 431 | + f"OpenAPIMerge discovered {len(self._discovered_files)} handler file(s) " |
| 432 | + "but the final schema has no paths. " |
| 433 | + "Check if your handler modules have side effects at import time " |
| 434 | + "that prevent route registration.", |
| 435 | + stacklevel=1, |
| 436 | + ) |
| 437 | + |
415 | 438 | return self._cached_schema |
416 | 439 |
|
417 | 440 | def get_openapi_json_schema(self) -> str: |
|
0 commit comments