11from __future__ import annotations
22
33from dataclasses import dataclass , field , replace
4- from typing import Iterable
4+ from typing import Any , Iterable
55
66
77@dataclass
@@ -27,7 +27,12 @@ def are(self, *rows: Row):
2727 return replace (self , rows = rows )
2828
2929
30+ @dataclass
3031class Row :
32+ schema : str | None
33+ tablename : str
34+ column_values : dict [str , Any ]
35+
3136 def __init__ (self , tablename , ** column_values ):
3237 try :
3338 schema , table = tablename .split ("." , 1 )
@@ -38,5 +43,44 @@ def __init__(self, tablename, **column_values):
3843 self .schema = schema
3944 self .tablename = table
4045
41- self .qualified_name = tablename
4246 self .column_values = column_values
47+
48+ @property
49+ def qualified_name (self ):
50+ if self .schema :
51+ return f"{ self .schema } .{ self .tablename } "
52+ return self .tablename
53+
54+
55+ @dataclass
56+ class Table :
57+ """Convenience class for producing multiple rows against the same table.
58+
59+ Examples:
60+ Rows might be created directly, like so:
61+
62+ >>> [
63+ ... Row("users", id=1, name="John", active=True),
64+ ... Row("users", id=2, name="Bob", active=True),
65+ ... ]
66+ [Row(schema=None, tablename='users', column_values={'id': 1, 'name': 'John', 'active': True}), Row(schema=None, tablename='users', column_values={'id': 2, 'name': 'Bob', 'active': True})]
67+
68+ But use of `Table` can help elide repetition among those rows:
69+
70+ >>> users = Table("users", active=True)
71+ >>> [
72+ ... users.row(id=1, name="John"),
73+ ... users.row(id=2, name="Bob"),
74+ ... ]
75+ [Row(schema=None, tablename='users', column_values={'active': True, 'id': 1, 'name': 'John'}), Row(schema=None, tablename='users', column_values={'active': True, 'id': 2, 'name': 'Bob'})]
76+ """
77+ name : str
78+ column_values : dict [str , Any ]
79+
80+ def __init__ (self , name , ** column_values ):
81+ self .name = name
82+ self .column_values = column_values
83+
84+ def row (self , ** column_values ) -> Row :
85+ final_values = {** self .column_values , ** column_values }
86+ return Row (self .name , ** final_values )
0 commit comments