Skip to content

Commit 06641a6

Browse files
committed
support multiple files for demo data
1 parent fa4e08b commit 06641a6

File tree

7 files changed

+64
-4
lines changed

7 files changed

+64
-4
lines changed

pum/config_model.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,22 @@ class DemoDataModel(PumCustomBaseModel):
132132
DemoDataModel represents a configuration for demo data.
133133
134134
Attributes:
135-
files: Optional list of named demo data files.
135+
name: Name of the demo data.
136+
file: Optional path to a single demo data file.
137+
files: Optional list of paths to multiple demo data files.
136138
"""
137139

138140
name: str = Field(..., description="Name of the demo data.")
139-
file: str = Field(..., description="Path to the demo data file.")
141+
142+
file: Optional[str] = None
143+
files: Optional[List[str]] = None
144+
145+
@model_validator(mode="after")
146+
def validate_args(self):
147+
file, files = self.file, self.files
148+
if (file and files) or (not file and not files):
149+
raise PumConfigError("Exactly one of 'file' or 'files' must be set in a demo data set.")
150+
return self
140151

141152

142153
class DependencyModel(PumCustomBaseModel):

pum/pum_config.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,12 @@ def post_hook_handlers(self) -> list[HookHandler]:
256256
else []
257257
)
258258

259-
def demo_data(self) -> dict[str, str]:
259+
def demo_data(self) -> dict[str, list[str]]:
260260
"""Return a dictionary of demo data files defined in the configuration."""
261-
return {dm.name: dm.file for dm in self.config.demo_data}
261+
demo_data_files = {}
262+
for dm in self.config.demo_data:
263+
demo_data_files[dm.name] = dm.files or [dm.file]
264+
return demo_data_files
262265

263266
def __del__(self):
264267
# Cleanup temporary directories and sys.path modifications
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
3+
demo_data:
4+
- name: some cool demo dataset
5+
files:
6+
- demo_data/demo_data_1.sql
7+
- demo_data/demo_data_2.sql
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE SCHEMA IF NOT EXISTS pum_test_data;
2+
3+
CREATE TABLE pum_test_data.some_table (
4+
id INT PRIMARY KEY,
5+
name VARCHAR(100) NOT NULL,
6+
created_date DATE DEFAULT CURRENT_DATE,
7+
is_active BOOLEAN DEFAULT TRUE,
8+
amount NUMERIC(10,2)
9+
);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
INSERT INTO pum_test_data.some_table (id, name, created_date, is_active, amount)
3+
VALUES
4+
(1, 'Test Item 1', '2023-01-01', TRUE, 100.00),
5+
(2, 'Test Item 2', '2023-01-02', FALSE, 200.00)
6+
;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
INSERT INTO pum_test_data.some_table (id, name, created_date, is_active, amount)
3+
VALUES
4+
(3, 'Test Item 3', '2023-01-03', TRUE, 300.00),
5+
(4, 'Test Item 4', '2023-01-04', TRUE, 400.00)
6+
;

test/test_upgrader.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,24 @@ def test_demo_data(self) -> None:
407407
count = cursor.fetchone()[0]
408408
self.assertEqual(count, 4)
409409

410+
def test_demo_data_multi(self) -> None:
411+
"""Test the installation of demo data."""
412+
test_dir = Path("test") / "data" / "demo_data_multi"
413+
cfg = PumConfig.from_yaml(test_dir / ".pum.yaml")
414+
sm = SchemaMigrations(cfg)
415+
with psycopg.connect(f"service={self.pg_service}") as conn:
416+
self.assertFalse(sm.exists(conn))
417+
upgrader = Upgrader(config=cfg)
418+
upgrader.install(connection=conn)
419+
with self.assertRaises(PumException):
420+
upgrader.install_demo_data(connection=conn, name="nope, nothing here fella")
421+
upgrader.install_demo_data(connection=conn, name="some cool demo dataset")
422+
self.assertTrue(sm.exists(conn))
423+
cursor = conn.cursor()
424+
cursor.execute("SELECT COUNT(*) FROM pum_test_data.some_table;")
425+
count = cursor.fetchone()[0]
426+
self.assertEqual(count, 4)
427+
410428
def test_dependencies(self) -> None:
411429
"""Test the installation of dependencies."""
412430
test_dir = Path("test") / "data" / "dependencies"

0 commit comments

Comments
 (0)