1212from sqlalchemy_declarative_extensions .sql import qualify_name
1313from sqlalchemy_declarative_extensions .sqlalchemy import HasMetaData
1414
15- T = TypeVar ("T" , HasMetaData , MetaData )
15+ T = TypeVar ("T" , bound = HasMetaData )
1616
1717
18- def view (base_or_metadata : T , materialized : bool = False ) -> Callable [[type ], T ]:
18+ def view (base : T , materialized : bool = False ) -> Callable [[type ], T ]:
1919 """Decorate a class or declarative base model in order to register a View.
2020
2121 Given some object with the attributes: `__tablename__`, (optionally for schema) `__table_args__`,
@@ -48,7 +48,7 @@ def decorator(cls):
4848 table_args = getattr (cls , "__table_args__" , None )
4949 view_def = cls .__view__
5050
51- mapper = instrument_sqlalchemy (base_or_metadata , cls )
51+ mapper = instrument_sqlalchemy (base , cls )
5252
5353 schema = find_schema (table_args )
5454 constraints = find_constraints (table_args )
@@ -60,17 +60,15 @@ def decorator(cls):
6060 constraints = constraints ,
6161 )
6262
63- register_view (base_or_metadata , instance )
63+ register_view (base , instance )
6464
6565 return mapper # noqa
6666
6767 return decorator
6868
6969
70- def instrument_sqlalchemy (base_or_metadata : T , cls ) -> T :
71- metadata = get_metadata (base_or_metadata )
72-
73- temp_metadata = MetaData (naming_convention = metadata .naming_convention )
70+ def instrument_sqlalchemy (base : T , cls ) -> T :
71+ temp_metadata = MetaData (naming_convention = base .metadata .naming_convention )
7472 try :
7573 try :
7674 from sqlalchemy import orm
@@ -87,15 +85,18 @@ def instrument_sqlalchemy(base_or_metadata: T, cls) -> T:
8785 return mapper
8886
8987
90- def register_view (base_or_metadata : HasMetaData , view : View ):
88+ def register_view (base_or_metadata : HasMetaData | MetaData , view : View ):
9189 """Register a view onto the given declarative base or `Metadata`.
9290
9391 This can be used instead of the [view](view) decorator, if you are constructing
9492 `View` objects directly. In this way, you can imperitively register views next
9593 to their corresponding table definitions, rather than at the root declarative
9694 base, like many of the other object types are documented to do.
9795 """
98- metadata = get_metadata (base_or_metadata )
96+ if isinstance (base_or_metadata , MetaData ):
97+ metadata = base_or_metadata
98+ else :
99+ metadata = base_or_metadata .metadata
99100
100101 if not metadata .info .get ("views" ):
101102 metadata .info ["views" ] = Views ()
@@ -128,7 +129,7 @@ def coerce_from_unknown(cls, unknown: Any) -> View:
128129
129130 try :
130131 import alembic_utils # noqa
131- except ImportError :
132+ except ImportError : # pragma: no cover
132133 pass
133134 else :
134135 from alembic_utils .pg_materialized_view import PGMaterializedView
@@ -155,7 +156,7 @@ def render_definition(self, dialect: Dialect):
155156 try :
156157 import sqlglot
157158 from sqlglot .optimizer .normalize import normalize
158- except ImportError :
159+ except ImportError : # pragma: no cover
159160 raise ImportError ("View autogeneration requires the 'parse' extra." )
160161
161162 if isinstance (self .definition , str ):
@@ -265,24 +266,22 @@ def append(self, view: View):
265266 self .views .append (view )
266267
267268 def __iter__ (self ):
268- for grant in self .grants :
269- yield grant
269+ for view in self .views :
270+ yield view
270271
271272 def are (self , * views : View ):
272273 return replace (self , views = [View .coerce_from_unknown (v ) for v in views ])
273274
274275
275276def find_schema (table_args = None ):
276- if table_args is None :
277- return None
278-
279277 if isinstance (table_args , dict ):
280278 return table_args .get ("schema" )
281279
282280 if isinstance (table_args , Iterable ):
283281 for table_arg in table_args :
284282 if isinstance (table_arg , dict ):
285283 return table_arg .get ("schema" )
284+
286285 return None
287286
288287
@@ -294,9 +293,3 @@ def find_constraints(table_args=None):
294293 return [table_arg for table_arg in table_args if isinstance (table_arg , Index )]
295294
296295 return None
297-
298-
299- def get_metadata (base_or_metadata : T ) -> MetaData :
300- if isinstance (base_or_metadata , MetaData ):
301- return base_or_metadata
302- return base_or_metadata .metadata
0 commit comments