Skip to content

Commit ec2d782

Browse files
committed
remove jinja, list parameters
1 parent 8bf0b58 commit ec2d782

File tree

7 files changed

+64
-43
lines changed

7 files changed

+64
-43
lines changed

pum/cli.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sys
66
from typing import Any
77
import importlib.metadata
8+
from pathlib import Path
89

910
import psycopg
1011

@@ -316,6 +317,13 @@ def create_parser() -> argparse.ArgumentParser:
316317

317318
# Parser for the "install" command
318319
parser_install = subparsers.add_parser("install", help="Installs the module.")
320+
parser_install.add_argument(
321+
"-p",
322+
"--parameter",
323+
nargs=2,
324+
help="Assign variable for running SQL deltas. Format is name value.",
325+
action="append",
326+
)
319327

320328
# Parser for the "check" command
321329
parser_check = subparsers.add_parser(
@@ -386,20 +394,13 @@ def create_parser() -> argparse.ArgumentParser:
386394

387395
# Parser for the "upgrade" command
388396
parser_upgrade = subparsers.add_parser("upgrade", help="upgrade db")
389-
parser_upgrade.add_argument("-t", "--table", help="Upgrades information table", required=True)
390-
parser_upgrade.add_argument(
391-
"-d",
392-
"--dir",
393-
nargs="+",
394-
help="Delta directories (space-separated)",
395-
required=True,
396-
)
397+
397398
parser_upgrade.add_argument("-u", "--max-version", help="upper bound limit version")
398399
parser_upgrade.add_argument(
399400
"-p",
400401
"--parameter",
401-
nargs=3,
402-
help="Assign variable for running SQL deltas. Format is: (string|float|int) name value.",
402+
nargs=2,
403+
help="Assign variable for running SQL deltas. Format is: name value.",
403404
action="append",
404405
)
405406

@@ -414,32 +415,37 @@ def cli() -> int:
414415
if args.config_file:
415416
config = PumConfig.from_yaml(args.config_file)
416417
else:
417-
args_dict = vars(args)
418-
config = PumConfig(**args_dict)
418+
config = PumConfig.from_yaml(Path(args.dir) / ".pum-config.yaml")
419419

420420
# if no command is passed, print the help and exit
421421
if not args.command:
422422
parser.print_help()
423423
parser.exit()
424424

425-
# Build variables dict for upgrade/test-and-upgrade commands
426-
variables: dict[str, Any] = {}
427-
if args.command in ("upgrade", "test-and-upgrade"):
428-
for v in args.var or ():
429-
if v[0] == "float":
430-
variables[v[1]] = float(v[2])
431-
elif v[0] == "int":
432-
variables[v[1]] = int(v[2])
425+
# Build parameters dict for install and upgrade commands
426+
parameters: dict[str, Any] = {}
427+
parameters_definition = {p["name"]: {k: v for k, v in p.items() if k != "name"} for p in config.parameters()}
428+
if args.command in ("install", "upgrade"):
429+
for p in args.parameter or ():
430+
if p[0] not in parameters_definition:
431+
print(f"Unknown parameter: {p[0]}")
432+
sys.exit(1)
433+
if parameters_definition[p[0]].get("type") == "float":
434+
parameters[p[0]] = float(p[1])
435+
elif parameters_definition[p[0]].get("type") == "int":
436+
parameters[p[0]] = int(p[1])
433437
else:
434-
variables[v[1]] = v[2]
438+
parameters[p[0]] = p[1]
439+
440+
logging.debug(f"Parameters: {parameters}")
435441

436442
pum = Pum(args.pg_service, config)
437443
exit_code = 0
438444

439445
if args.command == "info":
440446
run_info(args.pg_service, config)
441447
elif args.command == "install":
442-
Upgrader(args.pg_service, config=config, dir=args.dir).install()
448+
Upgrader(args.pg_service, config=config, dir=args.dir, parameters=parameters).install()
443449
elif args.command == "check":
444450
success = pum.run_check(
445451
args.pg_service1,
@@ -463,7 +469,7 @@ def cli() -> int:
463469
args.pg_service,
464470
args.table,
465471
args.dir,
466-
variables,
472+
parameters,
467473
args.max_version,
468474
args.verbose,
469475
)

pum/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def __init__(self, **kwargs):
2121
kwargs.get("schema_migrations_table") or "public.pum_migrations"
2222
)
2323
self.changelogs_directory: str = kwargs.get("changelogs_directory") or "changelogs"
24+
self.parameters_definition: dict = kwargs.get("parameters") or {}
2425

2526
def get(self, key, default=None):
2627
"""
@@ -34,6 +35,12 @@ def set(self, key, value):
3435
"""
3536
setattr(self, key, value)
3637

38+
def parameters(self):
39+
"""
40+
Get all changelogs parameters as a dictionary.
41+
"""
42+
return self.get("parameters_definition", {})
43+
3744
@classmethod
3845
def from_yaml(cls, file_path):
3946
"""

pum/upgrader.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(
3939
self,
4040
pg_service: str,
4141
config: PumConfig,
42-
variables=None,
42+
parameters=None,
4343
dir: str | Path = ".",
4444
max_version=None,
4545
):
@@ -55,8 +55,8 @@ def __init__(
5555
related to the db
5656
config: PumConfig
5757
The configuration object
58-
variables: dict
59-
dictionary for variables to be used in SQL deltas ( name => value )
58+
parameters: dict
59+
The parameters to pass to the SQL files.
6060
dir: str | Path
6161
The directory where the module is located.
6262
max_version: str
@@ -65,22 +65,18 @@ def __init__(
6565

6666
self.pg_service = pg_service
6767
self.config = config
68-
self.variables = variables
6968
self.max_version = parse_version(max_version) if max_version else None
7069
self.schema_migrations = SchemaMigrations(self.config)
7170
self.dir = dir
71+
self.parameters = parameters
7272

73-
def install(self, parameters: dict | None = None):
73+
def install(self):
7474
"""
7575
Installs the given module
7676
This will create the schema_migrations table if it does not exist.
7777
This will also apply all the changelogs that are after the current version.
7878
The changelogs are applied in the order they are found in the directory.
7979
It will also set the baseline version to the current version of the module.
80-
81-
args:
82-
parameters: dict
83-
The parameters to pass to the SQL files
8480
"""
8581

8682
with psycopg.connect(f"service={self.pg_service}") as conn:
@@ -91,7 +87,7 @@ def install(self, parameters: dict | None = None):
9187
self.schema_migrations.create(conn, commit=False)
9288
for changelog in self.changelogs(after_current_version=False):
9389
changelog_files = self.__apply_changelog(
94-
conn, changelog, commit=False, parameters=parameters
90+
conn, changelog, commit=False, parameters=self.parameters
9591
)
9692
changelog_files = [str(f) for f in changelog_files]
9793
self.schema_migrations.set_baseline(
@@ -100,7 +96,7 @@ def install(self, parameters: dict | None = None):
10096
beta_testing=False,
10197
commit=False,
10298
changelog_files=changelog_files,
103-
parameters=parameters,
99+
parameters=self.parameters,
104100
)
105101
logger
106102

@@ -272,8 +268,8 @@ def __run_sql_file(self, filepath):
272268

273269
with open(filepath) as delta_file:
274270
sql = delta_file.read()
275-
if self.variables:
276-
self.cursor.execute(sql, self.variables)
271+
if self.parameters:
272+
self.cursor.execute(sql, self.parameters)
277273
else:
278274
self.cursor.execute(sql)
279275
self.connection.commit()

pum/utils/execute_sql.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import logging
22
from pathlib import Path
33

4-
from jinja2 import Template
5-
64
from psycopg import Connection, Cursor
75
from psycopg.errors import SyntaxError
86

@@ -32,13 +30,16 @@ def execute_sql(
3230
try:
3331
if isinstance(sql, Path):
3432
logger.debug(
35-
f"Executing SQL from file: {sql}",
33+
f"Executing SQL from file: {sql} with parameters: {parameters}",
3634
)
3735
with open(sql) as file:
36+
sql_content = file.read()
3837
if parameters:
39-
sql_code = Template(file.read()).render(**parameters)
38+
for key, value in parameters.items():
39+
sql_content = sql_content.replace(f'{{{{ {key} }}}}', str(value))
40+
sql_code = sql_content
4041
else:
41-
sql_code = file.read()
42+
sql_code = sql_content
4243
sql_code = sql_code.split(";")
4344
else:
4445
sql_code = [sql]

requirements/base.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
jinja2
21
packaging
32
PyYAML
43
psycopg[binary]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
parameters:
3+
- name: SRID
4+
type: int
5+
default: 2056
6+
description: SRID for the geometry column

test/test_upgrader.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,13 @@ def test_install_single_changelog(self):
5858
)
5959

6060
def test_parameters(self):
61-
cfg = PumConfig()
61+
cfg = PumConfig.from_yaml(str(Path("test") / "data" / "parameters" / ".pum-config.yaml"))
62+
self.assertEqual(cfg.parameters(), [{
63+
"name": "SRID",
64+
"type": "int",
65+
"default": 2056,
66+
"description": "SRID for the geometry column",
67+
}])
6268
sm = SchemaMigrations(cfg)
6369
self.assertFalse(sm.exists(self.conn))
6470
upgrader = Upgrader(

0 commit comments

Comments
 (0)