Skip to content

Commit ea83599

Browse files
authored
[Migrations] Filter to select migration scripts (#255)
Added a filter to run only specific migration scripts using a glob expression. This is especially useful for development purposes when testing a new script.
1 parent a0f2b4b commit ea83599

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

deployment/migrations/config_updater.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
import asyncio
1616
import importlib.util
1717
import logging
18-
import os
1918
import sys
19+
from pathlib import Path
2020
from types import ModuleType
21+
from typing import Iterable, Optional
2122

2223
from configmanager import Config
2324

@@ -61,6 +62,14 @@ def cli_parse() -> argparse.Namespace:
6162
type=str,
6263
help="Path to the private key file, if any. Only used to upgrade the key to the latest format.",
6364
)
65+
parser.add_argument(
66+
"--filter-scripts",
67+
action="store",
68+
required=False,
69+
type=str,
70+
help="A filter for migration scripts. If specified, only the files "
71+
"matching the provided glob expression will be run.",
72+
)
6473
parser.add_argument(
6574
"--verbose",
6675
"-v",
@@ -94,6 +103,18 @@ def import_module_from_path(path: str) -> ModuleType:
94103
return migration_module
95104

96105

106+
def list_migration_scripts(
107+
migrations_dir: Path, glob_expression: Optional[str]
108+
) -> Iterable[Path]:
109+
migration_scripts = set(migrations_dir.glob("*.py"))
110+
if glob_expression:
111+
migration_scripts = migration_scripts & set(
112+
migrations_dir.glob(glob_expression)
113+
)
114+
115+
return migration_scripts
116+
117+
97118
async def main(args: argparse.Namespace):
98119
log_level = logging.DEBUG if args.verbose else logging.INFO
99120
setup_logging(log_level)
@@ -102,16 +123,16 @@ async def main(args: argparse.Namespace):
102123
config = init_config(args.config)
103124
init_db_globals(config=config)
104125

105-
migration_scripts_dir = os.path.join(os.path.dirname(__file__), "scripts")
126+
migration_scripts_dir = Path(__file__).parent / "scripts"
106127
migration_scripts = sorted(
107-
f for f in os.listdir(migration_scripts_dir) if f.endswith(".py")
128+
list_migration_scripts(migration_scripts_dir, args.filter_scripts)
108129
)
109130

110131
command = args.command
111132

112133
for migration_script in migration_scripts:
113-
migration_script_path = os.path.join(migration_scripts_dir, migration_script)
114-
migration_module = import_module_from_path(migration_script_path)
134+
migration_script_path = migration_scripts_dir / migration_script
135+
migration_module = import_module_from_path(str(migration_script_path))
115136

116137
if args.verbose:
117138
LOGGER.info(f"%s: %s", migration_script, migration_module.__doc__)

0 commit comments

Comments
 (0)