diff --git a/pgdevkit/fetch_missing.py b/pgdevkit/fetch_missing.py index bde49c3..9d014f3 100644 --- a/pgdevkit/fetch_missing.py +++ b/pgdevkit/fetch_missing.py @@ -9,7 +9,7 @@ from .diff import DiffKind, compute_diff from .introspect import introspect_db -from .parser import parse_directory +from .parser import IGNORED_DIR_NAMES, parse_directory _LAYER_PREFIX_RE = re.compile(r"^\d+_?") @@ -41,7 +41,7 @@ def layer_folder_for(scripts_dir: Path, schema: str) -> Path: if no existing folder matches.""" if scripts_dir.is_dir(): for entry in scripts_dir.iterdir(): - if not entry.is_dir() or entry.name in ("migrations", "_migration_scripts"): + if not entry.is_dir() or entry.name in ("migrations", "_migration_scripts") or entry.name in IGNORED_DIR_NAMES: continue if _LAYER_PREFIX_RE.sub("", entry.name).lower() == schema.lower(): return entry diff --git a/pgdevkit/parser.py b/pgdevkit/parser.py index e4251e4..5357150 100644 --- a/pgdevkit/parser.py +++ b/pgdevkit/parser.py @@ -15,6 +15,14 @@ logger = logging.getLogger(__name__) +# Tooling/scratch dirs that can end up inside a database/ tree (e.g. git +# worktrees checked out under database/.worktree for isolated test DBs) but +# never hold real schema content. +IGNORED_DIR_NAMES = { + ".worktree", ".worktrees", ".claude", ".vscode", "node_modules", + "__pycache__", ".pytest_cache", ".mypy_cache", ".ruff_cache", +} + # Regex to extract dollar-quoted body (Postgres-only construct) _DOLLAR_BODY = re.compile(r'\$(\w*)\$(.*?)\$\1\$', re.DOTALL | re.IGNORECASE) @@ -35,6 +43,8 @@ def parse_directory(scripts_dir: Path, *, dialect: str | Dialect = "postgres") - resolved = resolve_dialect(dialect) db_schema = DatabaseSchema() for sql_file in sorted(scripts_dir.rglob("*.sql")): + if IGNORED_DIR_NAMES.intersection(sql_file.relative_to(scripts_dir).parts[:-1]): + continue _parse_file(sql_file, db_schema, resolved) return db_schema diff --git a/pgdevkit/testdb/schema.py b/pgdevkit/testdb/schema.py index 45e2a59..581e08b 100644 --- a/pgdevkit/testdb/schema.py +++ b/pgdevkit/testdb/schema.py @@ -15,6 +15,7 @@ from ..db.complex_types import ComplexHelper from ..dialect import Dialect, POSTGRES +from ..parser import IGNORED_DIR_NAMES logger = logging.getLogger(__name__) logging.getLogger("sqlglot").setLevel(logging.ERROR) @@ -121,7 +122,8 @@ def _get_sql_deps(sql: str, dialect: Dialect = POSTGRES) -> set[str]: def _iter_sql_files(database_dir: Path, dialect: Dialect = POSTGRES): """Yield (Path, sql_content) pairs in dependency-safe execution order.""" files: list[Path] = [] - for root, _, dbfiles in os.walk(database_dir): + for root, dirs, dbfiles in os.walk(database_dir): + dirs[:] = [d for d in dirs if d not in IGNORED_DIR_NAMES] if "_migration_scripts" in root or "migrations" in root: continue for file in dbfiles: diff --git a/pyproject.toml b/pyproject.toml index f3ab061..781b0fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ packages = ["pgdevkit"] [project] name = "pgdevkit" -version = "0.3.6" +version = "0.3.8" description = "A helper for developing with Postgres" readme = "README.md" requires-python = ">=3.14"