alembic 1.14.1__py3-none-any.whl → 1.15.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. alembic/__init__.py +1 -1
  2. alembic/autogenerate/compare.py +11 -23
  3. alembic/autogenerate/render.py +25 -19
  4. alembic/command.py +3 -1
  5. alembic/context.pyi +5 -2
  6. alembic/ddl/base.py +2 -2
  7. alembic/ddl/impl.py +8 -9
  8. alembic/ddl/mysql.py +1 -2
  9. alembic/ddl/postgresql.py +5 -5
  10. alembic/ddl/sqlite.py +2 -1
  11. alembic/op.pyi +1 -2
  12. alembic/operations/base.py +1 -2
  13. alembic/operations/batch.py +5 -4
  14. alembic/operations/ops.py +1 -2
  15. alembic/operations/toimpl.py +0 -13
  16. alembic/runtime/environment.py +2 -2
  17. alembic/runtime/migration.py +4 -4
  18. alembic/testing/assertions.py +2 -3
  19. alembic/testing/env.py +62 -78
  20. alembic/testing/fixtures.py +3 -15
  21. alembic/testing/requirements.py +1 -35
  22. alembic/testing/suite/test_autogen_computed.py +2 -62
  23. alembic/testing/warnings.py +0 -9
  24. alembic/util/__init__.py +0 -7
  25. alembic/util/exc.py +20 -1
  26. alembic/util/messaging.py +1 -4
  27. alembic/util/sqla_compat.py +72 -238
  28. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/METADATA +7 -11
  29. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/RECORD +33 -42
  30. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/WHEEL +1 -1
  31. alembic/templates/async/README +0 -1
  32. alembic/templates/async/alembic.ini.mako +0 -117
  33. alembic/templates/async/script.py.mako +0 -26
  34. alembic/templates/generic/README +0 -1
  35. alembic/templates/generic/alembic.ini.mako +0 -119
  36. alembic/templates/generic/script.py.mako +0 -26
  37. alembic/templates/multidb/README +0 -12
  38. alembic/templates/multidb/alembic.ini.mako +0 -124
  39. alembic/templates/multidb/script.py.mako +0 -47
  40. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/LICENSE +0 -0
  41. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/entry_points.txt +0 -0
  42. {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/top_level.txt +0 -0
@@ -10,7 +10,6 @@ from typing import Callable
10
10
  from typing import Dict
11
11
  from typing import Iterable
12
12
  from typing import Iterator
13
- from typing import Mapping
14
13
  from typing import Optional
15
14
  from typing import Protocol
16
15
  from typing import Set
@@ -20,11 +19,9 @@ from typing import TypeVar
20
19
  from typing import Union
21
20
 
22
21
  from sqlalchemy import __version__
23
- from sqlalchemy import inspect
24
22
  from sqlalchemy import schema
25
23
  from sqlalchemy import sql
26
24
  from sqlalchemy import types as sqltypes
27
- from sqlalchemy.engine import url
28
25
  from sqlalchemy.schema import CheckConstraint
29
26
  from sqlalchemy.schema import Column
30
27
  from sqlalchemy.schema import ForeignKeyConstraint
@@ -32,28 +29,27 @@ from sqlalchemy.sql import visitors
32
29
  from sqlalchemy.sql.base import DialectKWArgs
33
30
  from sqlalchemy.sql.elements import BindParameter
34
31
  from sqlalchemy.sql.elements import ColumnClause
35
- from sqlalchemy.sql.elements import quoted_name
36
32
  from sqlalchemy.sql.elements import TextClause
37
33
  from sqlalchemy.sql.elements import UnaryExpression
38
34
  from sqlalchemy.sql.visitors import traverse
39
35
  from typing_extensions import TypeGuard
40
36
 
37
+ if True:
38
+ from sqlalchemy.sql.naming import _NONE_NAME as _NONE_NAME # type: ignore[attr-defined] # noqa: E501
39
+
41
40
  if TYPE_CHECKING:
42
41
  from sqlalchemy import ClauseElement
42
+ from sqlalchemy import Identity
43
43
  from sqlalchemy import Index
44
44
  from sqlalchemy import Table
45
45
  from sqlalchemy.engine import Connection
46
46
  from sqlalchemy.engine import Dialect
47
47
  from sqlalchemy.engine import Transaction
48
- from sqlalchemy.engine.reflection import Inspector
49
48
  from sqlalchemy.sql.base import ColumnCollection
50
49
  from sqlalchemy.sql.compiler import SQLCompiler
51
- from sqlalchemy.sql.dml import Insert
52
50
  from sqlalchemy.sql.elements import ColumnElement
53
51
  from sqlalchemy.sql.schema import Constraint
54
52
  from sqlalchemy.sql.schema import SchemaItem
55
- from sqlalchemy.sql.selectable import Select
56
- from sqlalchemy.sql.selectable import TableClause
57
53
 
58
54
  _CE = TypeVar("_CE", bound=Union["ColumnElement[Any]", "SchemaItem"])
59
55
 
@@ -72,24 +68,12 @@ def _safe_int(value: str) -> Union[int, str]:
72
68
  _vers = tuple(
73
69
  [_safe_int(x) for x in re.findall(r"(\d+|[abc]\d)", __version__)]
74
70
  )
75
- sqla_13 = _vers >= (1, 3)
76
- sqla_14 = _vers >= (1, 4)
77
71
  # https://docs.sqlalchemy.org/en/latest/changelog/changelog_14.html#change-0c6e0cc67dfe6fac5164720e57ef307d
78
72
  sqla_14_18 = _vers >= (1, 4, 18)
79
73
  sqla_14_26 = _vers >= (1, 4, 26)
80
74
  sqla_2 = _vers >= (2,)
81
75
  sqlalchemy_version = __version__
82
76
 
83
- try:
84
- from sqlalchemy.sql.naming import _NONE_NAME as _NONE_NAME # type: ignore[attr-defined] # noqa: E501
85
- except ImportError:
86
- from sqlalchemy.sql.elements import _NONE_NAME as _NONE_NAME # type: ignore # noqa: E501
87
-
88
-
89
- class _Unsupported:
90
- "Placeholder for unsupported SQLAlchemy classes"
91
-
92
-
93
77
  if TYPE_CHECKING:
94
78
 
95
79
  def compiles(
@@ -99,72 +83,50 @@ if TYPE_CHECKING:
99
83
  else:
100
84
  from sqlalchemy.ext.compiler import compiles
101
85
 
102
- try:
103
- from sqlalchemy import Computed as Computed
104
- except ImportError:
105
- if not TYPE_CHECKING:
106
86
 
107
- class Computed(_Unsupported):
108
- pass
87
+ identity_has_dialect_kwargs = issubclass(schema.Identity, DialectKWArgs)
109
88
 
110
- has_computed = False
111
- has_computed_reflection = False
112
- else:
113
- has_computed = True
114
- has_computed_reflection = _vers >= (1, 3, 16)
115
-
116
- try:
117
- from sqlalchemy import Identity as Identity
118
- except ImportError:
119
- if not TYPE_CHECKING:
120
89
 
121
- class Identity(_Unsupported):
122
- pass
90
+ def _get_identity_options_dict(
91
+ identity: Union[Identity, schema.Sequence, None],
92
+ dialect_kwargs: bool = False,
93
+ ) -> Dict[str, Any]:
94
+ if identity is None:
95
+ return {}
96
+ elif identity_has_dialect_kwargs:
97
+ assert hasattr(identity, "_as_dict")
98
+ as_dict = identity._as_dict()
99
+ if dialect_kwargs:
100
+ assert isinstance(identity, DialectKWArgs)
101
+ as_dict.update(identity.dialect_kwargs)
102
+ else:
103
+ as_dict = {}
104
+ if isinstance(identity, schema.Identity):
105
+ # always=None means something different than always=False
106
+ as_dict["always"] = identity.always
107
+ if identity.on_null is not None:
108
+ as_dict["on_null"] = identity.on_null
109
+ # attributes common to Identity and Sequence
110
+ attrs = (
111
+ "start",
112
+ "increment",
113
+ "minvalue",
114
+ "maxvalue",
115
+ "nominvalue",
116
+ "nomaxvalue",
117
+ "cycle",
118
+ "cache",
119
+ "order",
120
+ )
121
+ as_dict.update(
122
+ {
123
+ key: getattr(identity, key, None)
124
+ for key in attrs
125
+ if getattr(identity, key, None) is not None
126
+ }
127
+ )
128
+ return as_dict
123
129
 
124
- has_identity = False
125
- else:
126
- identity_has_dialect_kwargs = issubclass(Identity, DialectKWArgs)
127
-
128
- def _get_identity_options_dict(
129
- identity: Union[Identity, schema.Sequence, None],
130
- dialect_kwargs: bool = False,
131
- ) -> Dict[str, Any]:
132
- if identity is None:
133
- return {}
134
- elif identity_has_dialect_kwargs:
135
- as_dict = identity._as_dict() # type: ignore
136
- if dialect_kwargs:
137
- assert isinstance(identity, DialectKWArgs)
138
- as_dict.update(identity.dialect_kwargs)
139
- else:
140
- as_dict = {}
141
- if isinstance(identity, Identity):
142
- # always=None means something different than always=False
143
- as_dict["always"] = identity.always
144
- if identity.on_null is not None:
145
- as_dict["on_null"] = identity.on_null
146
- # attributes common to Identity and Sequence
147
- attrs = (
148
- "start",
149
- "increment",
150
- "minvalue",
151
- "maxvalue",
152
- "nominvalue",
153
- "nomaxvalue",
154
- "cycle",
155
- "cache",
156
- "order",
157
- )
158
- as_dict.update(
159
- {
160
- key: getattr(identity, key, None)
161
- for key in attrs
162
- if getattr(identity, key, None) is not None
163
- }
164
- )
165
- return as_dict
166
-
167
- has_identity = True
168
130
 
169
131
  if sqla_2:
170
132
  from sqlalchemy.sql.base import _NoneName
@@ -173,7 +135,6 @@ else:
173
135
 
174
136
 
175
137
  _ConstraintName = Union[None, str, _NoneName]
176
-
177
138
  _ConstraintNameDefined = Union[str, _NoneName]
178
139
 
179
140
 
@@ -183,15 +144,11 @@ def constraint_name_defined(
183
144
  return name is _NONE_NAME or isinstance(name, (str, _NoneName))
184
145
 
185
146
 
186
- def constraint_name_string(
187
- name: _ConstraintName,
188
- ) -> TypeGuard[str]:
147
+ def constraint_name_string(name: _ConstraintName) -> TypeGuard[str]:
189
148
  return isinstance(name, str)
190
149
 
191
150
 
192
- def constraint_name_or_none(
193
- name: _ConstraintName,
194
- ) -> Optional[str]:
151
+ def constraint_name_or_none(name: _ConstraintName) -> Optional[str]:
195
152
  return name if constraint_name_string(name) else None
196
153
 
197
154
 
@@ -221,17 +178,10 @@ def _ensure_scope_for_ddl(
221
178
  yield
222
179
 
223
180
 
224
- def url_render_as_string(url, hide_password=True):
225
- if sqla_14:
226
- return url.render_as_string(hide_password=hide_password)
227
- else:
228
- return url.__to_string__(hide_password=hide_password)
229
-
230
-
231
181
  def _safe_begin_connection_transaction(
232
182
  connection: Connection,
233
183
  ) -> Transaction:
234
- transaction = _get_connection_transaction(connection)
184
+ transaction = connection.get_transaction()
235
185
  if transaction:
236
186
  return transaction
237
187
  else:
@@ -241,7 +191,7 @@ def _safe_begin_connection_transaction(
241
191
  def _safe_commit_connection_transaction(
242
192
  connection: Connection,
243
193
  ) -> None:
244
- transaction = _get_connection_transaction(connection)
194
+ transaction = connection.get_transaction()
245
195
  if transaction:
246
196
  transaction.commit()
247
197
 
@@ -249,7 +199,7 @@ def _safe_commit_connection_transaction(
249
199
  def _safe_rollback_connection_transaction(
250
200
  connection: Connection,
251
201
  ) -> None:
252
- transaction = _get_connection_transaction(connection)
202
+ transaction = connection.get_transaction()
253
203
  if transaction:
254
204
  transaction.rollback()
255
205
 
@@ -275,65 +225,29 @@ def _copy(schema_item: _CE, **kw) -> _CE:
275
225
  return schema_item.copy(**kw) # type: ignore[union-attr]
276
226
 
277
227
 
278
- def _get_connection_transaction(
279
- connection: Connection,
280
- ) -> Optional[Transaction]:
281
- if sqla_14:
282
- return connection.get_transaction()
283
- else:
284
- r = connection._root # type: ignore[attr-defined]
285
- return r._Connection__transaction
286
-
287
-
288
- def _create_url(*arg, **kw) -> url.URL:
289
- if hasattr(url.URL, "create"):
290
- return url.URL.create(*arg, **kw)
291
- else:
292
- return url.URL(*arg, **kw)
293
-
294
-
295
228
  def _connectable_has_table(
296
229
  connectable: Connection, tablename: str, schemaname: Union[str, None]
297
230
  ) -> bool:
298
- if sqla_14:
299
- return inspect(connectable).has_table(tablename, schemaname)
300
- else:
301
- return connectable.dialect.has_table(
302
- connectable, tablename, schemaname
303
- )
231
+ return connectable.dialect.has_table(connectable, tablename, schemaname)
304
232
 
305
233
 
306
234
  def _exec_on_inspector(inspector, statement, **params):
307
- if sqla_14:
308
- with inspector._operation_context() as conn:
309
- return conn.execute(statement, params)
310
- else:
311
- return inspector.bind.execute(statement, params)
235
+ with inspector._operation_context() as conn:
236
+ return conn.execute(statement, params)
312
237
 
313
238
 
314
239
  def _nullability_might_be_unset(metadata_column):
315
- if not sqla_14:
316
- return metadata_column.nullable
317
- else:
318
- from sqlalchemy.sql import schema
240
+ from sqlalchemy.sql import schema
319
241
 
320
- return (
321
- metadata_column._user_defined_nullable is schema.NULL_UNSPECIFIED
322
- )
242
+ return metadata_column._user_defined_nullable is schema.NULL_UNSPECIFIED
323
243
 
324
244
 
325
245
  def _server_default_is_computed(*server_default) -> bool:
326
- if not has_computed:
327
- return False
328
- else:
329
- return any(isinstance(sd, Computed) for sd in server_default)
246
+ return any(isinstance(sd, schema.Computed) for sd in server_default)
330
247
 
331
248
 
332
249
  def _server_default_is_identity(*server_default) -> bool:
333
- if not sqla_14:
334
- return False
335
- else:
336
- return any(isinstance(sd, Identity) for sd in server_default)
250
+ return any(isinstance(sd, schema.Identity) for sd in server_default)
337
251
 
338
252
 
339
253
  def _table_for_constraint(constraint: Constraint) -> Table:
@@ -354,15 +268,6 @@ def _columns_for_constraint(constraint):
354
268
  return list(constraint.columns)
355
269
 
356
270
 
357
- def _reflect_table(inspector: Inspector, table: Table) -> None:
358
- if sqla_14:
359
- return inspector.reflect_table(table, None)
360
- else:
361
- return inspector.reflecttable( # type: ignore[attr-defined]
362
- table, None
363
- )
364
-
365
-
366
271
  def _resolve_for_variant(type_, dialect):
367
272
  if _type_has_variants(type_):
368
273
  base_type, mapping = _get_variant_mapping(type_)
@@ -371,7 +276,7 @@ def _resolve_for_variant(type_, dialect):
371
276
  return type_
372
277
 
373
278
 
374
- if hasattr(sqltypes.TypeEngine, "_variant_mapping"):
279
+ if hasattr(sqltypes.TypeEngine, "_variant_mapping"): # 2.0
375
280
 
376
281
  def _type_has_variants(type_):
377
282
  return bool(type_._variant_mapping)
@@ -549,103 +454,32 @@ def _render_literal_bindparam(
549
454
  return compiler.render_literal_bindparam(element, **kw)
550
455
 
551
456
 
552
- def _column_kwargs(col: Column) -> Mapping:
553
- if sqla_13:
554
- return col.kwargs
555
- else:
556
- return {}
557
-
558
-
559
457
  def _get_constraint_final_name(
560
458
  constraint: Union[Index, Constraint], dialect: Optional[Dialect]
561
459
  ) -> Optional[str]:
562
460
  if constraint.name is None:
563
461
  return None
564
462
  assert dialect is not None
565
- if sqla_14:
566
- # for SQLAlchemy 1.4 we would like to have the option to expand
567
- # the use of "deferred" names for constraints as well as to have
568
- # some flexibility with "None" name and similar; make use of new
569
- # SQLAlchemy API to return what would be the final compiled form of
570
- # the name for this dialect.
571
- return dialect.identifier_preparer.format_constraint(
572
- constraint, _alembic_quote=False
573
- )
574
- else:
575
- # prior to SQLAlchemy 1.4, work around quoting logic to get at the
576
- # final compiled name without quotes.
577
- if hasattr(constraint.name, "quote"):
578
- # might be quoted_name, might be truncated_name, keep it the
579
- # same
580
- quoted_name_cls: type = type(constraint.name)
581
- else:
582
- quoted_name_cls = quoted_name
583
-
584
- new_name = quoted_name_cls(str(constraint.name), quote=False)
585
- constraint = constraint.__class__(name=new_name)
586
-
587
- if isinstance(constraint, schema.Index):
588
- # name should not be quoted.
589
- d = dialect.ddl_compiler(dialect, None) # type: ignore[arg-type]
590
- return d._prepared_index_name(constraint)
591
- else:
592
- # name should not be quoted.
593
- return dialect.identifier_preparer.format_constraint(constraint)
463
+ # for SQLAlchemy 1.4 we would like to have the option to expand
464
+ # the use of "deferred" names for constraints as well as to have
465
+ # some flexibility with "None" name and similar; make use of new
466
+ # SQLAlchemy API to return what would be the final compiled form of
467
+ # the name for this dialect.
468
+ return dialect.identifier_preparer.format_constraint(
469
+ constraint, _alembic_quote=False
470
+ )
594
471
 
595
472
 
596
473
  def _constraint_is_named(
597
474
  constraint: Union[Constraint, Index], dialect: Optional[Dialect]
598
475
  ) -> bool:
599
- if sqla_14:
600
- if constraint.name is None:
601
- return False
602
- assert dialect is not None
603
- name = dialect.identifier_preparer.format_constraint(
604
- constraint, _alembic_quote=False
605
- )
606
- return name is not None
607
- else:
608
- return constraint.name is not None
609
-
610
-
611
- def _is_mariadb(mysql_dialect: Dialect) -> bool:
612
- if sqla_14:
613
- return mysql_dialect.is_mariadb # type: ignore[attr-defined]
614
- else:
615
- return bool(
616
- mysql_dialect.server_version_info
617
- and mysql_dialect._is_mariadb # type: ignore[attr-defined]
618
- )
619
-
620
-
621
- def _mariadb_normalized_version_info(mysql_dialect):
622
- return mysql_dialect._mariadb_normalized_version_info
623
-
624
-
625
- def _insert_inline(table: Union[TableClause, Table]) -> Insert:
626
- if sqla_14:
627
- return table.insert().inline()
628
- else:
629
- return table.insert(inline=True) # type: ignore[call-arg]
630
-
631
-
632
- if sqla_14:
633
- from sqlalchemy import create_mock_engine
634
-
635
- # weird mypy workaround
636
- from sqlalchemy import select as _sa_select
637
-
638
- _select = _sa_select
639
- else:
640
- from sqlalchemy import create_engine
641
-
642
- def create_mock_engine(url, executor, **kw): # type: ignore[misc]
643
- return create_engine(
644
- "postgresql://", strategy="mock", executor=executor
645
- )
646
-
647
- def _select(*columns, **kw) -> Select:
648
- return sql.select(list(columns), **kw) # type: ignore[call-overload]
476
+ if constraint.name is None:
477
+ return False
478
+ assert dialect is not None
479
+ name = dialect.identifier_preparer.format_constraint(
480
+ constraint, _alembic_quote=False
481
+ )
482
+ return name is not None
649
483
 
650
484
 
651
485
  def is_expression_index(index: Index) -> bool:
@@ -1,11 +1,10 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: alembic
3
- Version: 1.14.1
3
+ Version: 1.15.0
4
4
  Summary: A database migration tool for SQLAlchemy.
5
- Home-page: https://alembic.sqlalchemy.org
6
- Author: Mike Bayer
7
- Author-email: mike_mp@zzzcomputing.com
5
+ Author-email: Mike Bayer <mike_mp@zzzcomputing.com>
8
6
  License: MIT
7
+ Project-URL: Homepage, https://alembic.sqlalchemy.org
9
8
  Project-URL: Documentation, https://alembic.sqlalchemy.org/en/latest/
10
9
  Project-URL: Changelog, https://alembic.sqlalchemy.org/en/latest/changelog.html
11
10
  Project-URL: Source, https://github.com/sqlalchemy/alembic/
@@ -17,24 +16,21 @@ Classifier: License :: OSI Approved :: MIT License
17
16
  Classifier: Operating System :: OS Independent
18
17
  Classifier: Programming Language :: Python
19
18
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.8
21
19
  Classifier: Programming Language :: Python :: 3.9
22
20
  Classifier: Programming Language :: Python :: 3.10
23
21
  Classifier: Programming Language :: Python :: 3.11
24
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
25
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
26
25
  Classifier: Programming Language :: Python :: Implementation :: PyPy
27
26
  Classifier: Topic :: Database :: Front-Ends
28
- Requires-Python: >=3.8
27
+ Requires-Python: >=3.9
29
28
  Description-Content-Type: text/x-rst
30
29
  License-File: LICENSE
31
- Requires-Dist: SQLAlchemy>=1.3.0
30
+ Requires-Dist: SQLAlchemy>=1.4.0
32
31
  Requires-Dist: Mako
33
- Requires-Dist: importlib-metadata; python_version < "3.9"
34
- Requires-Dist: importlib-resources; python_version < "3.9"
35
- Requires-Dist: typing-extensions>=4
32
+ Requires-Dist: typing-extensions>=4.12
36
33
  Provides-Extra: tz
37
- Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "tz"
38
34
  Requires-Dist: tzdata; extra == "tz"
39
35
 
40
36
  Alembic is a database migrations tool written by the author
@@ -1,83 +1,74 @@
1
- alembic/__init__.py,sha256=cdCZTWAIlk-sWQ6BPu9FEdV7AUyFJpTFU1bwmzWvqTo,63
1
+ alembic/__init__.py,sha256=U6xTcFJLMMVlT6XG5LhmoaEwQcFpNuAJx5iLHaYybuU,63
2
2
  alembic/__main__.py,sha256=373m7-TBh72JqrSMYviGrxCHZo-cnweM8AGF8A22PmY,78
3
- alembic/command.py,sha256=2tkKrIoEgPfXrGgvMRGrUXH4l-7z466DOxd7Q2XOfL8,22169
3
+ alembic/command.py,sha256=HIRFQFUG_A9ZgLBC-MG2WmE_eX0QxvvX2Os-_eL2zBQ,22242
4
4
  alembic/config.py,sha256=BZ7mwFRk2gq8GFNxxy9qvMUFx43YbDbQTC99OnjqiKY,22216
5
5
  alembic/context.py,sha256=hK1AJOQXJ29Bhn276GYcosxeG7pC5aZRT5E8c4bMJ4Q,195
6
- alembic/context.pyi,sha256=hUHbSnbSeEEMVkk0gDSXOq4_9edSjYzsjmmf-mL9Iao,31737
6
+ alembic/context.pyi,sha256=fdeFNTRc0bUgi7n2eZWVFh6NG-TzIv_0gAcapbfHnKY,31773
7
7
  alembic/environment.py,sha256=MM5lPayGT04H3aeng1H7GQ8HEAs3VGX5yy6mDLCPLT4,43
8
8
  alembic/migration.py,sha256=MV6Fju6rZtn2fTREKzXrCZM6aIBGII4OMZFix0X-GLs,41
9
9
  alembic/op.py,sha256=flHtcsVqOD-ZgZKK2pv-CJ5Cwh-KJ7puMUNXzishxLw,167
10
- alembic/op.pyi,sha256=QZ1ERetxIrpZNTyg48Btn5OJhhpMId-_MLMP36RauOw,50168
10
+ alembic/op.pyi,sha256=TDNBVs8GwfmJaNYYW0v32el0rD6nMlCl_Q4zl_WP1K8,50123
11
11
  alembic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  alembic/autogenerate/__init__.py,sha256=ntmUTXhjLm4_zmqIwyVaECdpPDn6_u1yM9vYk6-553E,543
13
13
  alembic/autogenerate/api.py,sha256=L4qkapSJO1Ypymx8HsjLl0vFFt202agwMYsQbIe6ZtI,22219
14
- alembic/autogenerate/compare.py,sha256=cdUBH6qsedaJsnToSOu4MfcJaI4bjUJ4VWqtBlqsSr8,44944
15
- alembic/autogenerate/render.py,sha256=JUjXpAmxhO-WPJGgvs0V_xtEC0Tpv0AngDepVfPIWUc,35482
14
+ alembic/autogenerate/compare.py,sha256=FKmfogZOLXp4EIx9eQ-q_DzlnI4-jZYqyxw2yOw_84A,44341
15
+ alembic/autogenerate/render.py,sha256=jt9AaIptES-PX7fsITRjXNNYiJ77nuuCt24IEyOmtaw,35758
16
16
  alembic/autogenerate/rewriter.py,sha256=uZWRkTYJoncoEJ5WY1QBRiozjyChqZDJPy4LtcRibjM,7846
17
17
  alembic/ddl/__init__.py,sha256=Df8fy4Vn_abP8B7q3x8gyFwEwnLw6hs2Ljt_bV3EZWE,152
18
18
  alembic/ddl/_autogen.py,sha256=Blv2RrHNyF4cE6znCQXNXG5T9aO-YmiwD4Fz-qfoaWA,9275
19
- alembic/ddl/base.py,sha256=gazpvtk_6XURcsa0libwcaIquL5HwJDP1ZWKJ6P7x0I,9788
20
- alembic/ddl/impl.py,sha256=7-oxMb7KeycaK96x-kXw4mR6NSE1tmN0UEZIZrPcuhY,30195
19
+ alembic/ddl/base.py,sha256=qXHSkROV3Z0CDGIg-6PY9q7PUQc39QTUEC_cNfCxEjg,9772
20
+ alembic/ddl/impl.py,sha256=Rf3LrJJvgaLA1r3psX_mKdQGuj0ZA7zbWcJAuAPuVJ4,30127
21
21
  alembic/ddl/mssql.py,sha256=ydvgBSaftKYjaBaMyqius66Ta4CICQSj79Og3Ed2atY,14219
22
- alembic/ddl/mysql.py,sha256=kXOGYmpnL_9WL3ijXNsG4aAwy3m1HWJOoLZSePzmJF0,17316
22
+ alembic/ddl/mysql.py,sha256=9OOAmtg4GpEqWSbATT6FCq0xLnU8PMjr0VlRB171-EI,17301
23
23
  alembic/ddl/oracle.py,sha256=669YlkcZihlXFbnXhH2krdrvDry8q5pcUGfoqkg_R6Y,6243
24
- alembic/ddl/postgresql.py,sha256=OR9ufFDr-uvzIBk38OBsLlfr_PXG9qBSDYIj0-oNnwc,29921
25
- alembic/ddl/sqlite.py,sha256=yR1ov010h3HIpJvZbCLTkR7HIkKQMfEAGJE7ZnLwmSU,7980
24
+ alembic/ddl/postgresql.py,sha256=D4oCA2xCrKV-82aAEmXgEe-llyDtL4xc9_tAZgznkuU,29931
25
+ alembic/ddl/sqlite.py,sha256=9p9dlXbGMZACqeFnSuhm7eSapFDGJNd6WhBhZrdpqFg,7995
26
26
  alembic/operations/__init__.py,sha256=e0KQSZAgLpTWvyvreB7DWg7RJV_MWSOPVDgCqsd2FzY,318
27
- alembic/operations/base.py,sha256=JRaOtPqyqfaPjzGHxuP9VMcO1KsJNmbbLOvwG82qxGA,74474
28
- alembic/operations/batch.py,sha256=YqtD4hJ3_RkFxvI7zbmBwxcLEyLHYyWQpsz4l5L85yI,26943
29
- alembic/operations/ops.py,sha256=guIpLQzlqgkdP2LGDW8vWg_DXeAouEldiVZDgRas7YI,94953
27
+ alembic/operations/base.py,sha256=C97XgIYquKovofHQfxZDI3O5kSKx5qqeOObV-WrMwpM,74429
28
+ alembic/operations/batch.py,sha256=1UmCFcsFWObinQWFRWoGZkjynl54HKpldbPs67aR4wg,26923
29
+ alembic/operations/ops.py,sha256=O_y5nds3I8JGdRrRz0yz_j5WKzcax-mgidWzUyGz9E0,94908
30
30
  alembic/operations/schemaobj.py,sha256=Wp-bBe4a8lXPTvIHJttBY0ejtpVR5Jvtb2kI-U2PztQ,9468
31
- alembic/operations/toimpl.py,sha256=Fx-UKcq6S8pVtsEwPFjTKtEcAVKjfptn-BfpE1k3_ck,7517
31
+ alembic/operations/toimpl.py,sha256=DhydxHxPlPejzFPHsN1VR2tHINUdlJw3eKOjjmJCyu0,7114
32
32
  alembic/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- alembic/runtime/environment.py,sha256=SkYB_am1h3FSG8IsExAQxGP_7WwzOVigqjlO747Aokc,41497
34
- alembic/runtime/migration.py,sha256=9GZ_bYZ6yMF7DUD1hgZdmB0YqvcdcNBBfxFaXKHeQoM,49857
33
+ alembic/runtime/environment.py,sha256=W9Y_9tiecmYq885xqMZOrxZs80tN0M_ovXOdCLjGI5A,41524
34
+ alembic/runtime/migration.py,sha256=X0O-sEuU54aNujyG_nxk1vs3BRBy2f-QwRJQmTucuVY,49874
35
35
  alembic/script/__init__.py,sha256=lSj06O391Iy5avWAiq8SPs6N8RBgxkSPjP8wpXcNDGg,100
36
36
  alembic/script/base.py,sha256=XLNpdsLnBBSz4ZKMFUArFUdtL1HcjtuUDHNbA-5VlZA,37809
37
37
  alembic/script/revision.py,sha256=NTu-eu5Y78u4NoVXpT0alpD2oL40SGATA2sEMEf1el4,62306
38
38
  alembic/script/write_hooks.py,sha256=NGB6NGgfdf7HK6XNNpSKqUCfzxazj-NRUePgFx7MJSM,5036
39
- alembic/templates/async/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
40
- alembic/templates/async/alembic.ini.mako,sha256=lYN5fP_fIX3FWtTcOy86Xznr6P5r1f0rlkdDhxLhVN4,3658
41
39
  alembic/templates/async/env.py,sha256=zbOCf3Y7w2lg92hxSwmG1MM_7y56i_oRH4AKp0pQBYo,2389
42
- alembic/templates/async/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
43
- alembic/templates/generic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38
44
- alembic/templates/generic/alembic.ini.mako,sha256=TPnqGqwg9QG8uCvBY5jaz32U2pqVqLK1dG1e8i2yDYM,3766
45
40
  alembic/templates/generic/env.py,sha256=TLRWOVW3Xpt_Tpf8JFzlnoPn_qoUu8UV77Y4o9XD6yI,2103
46
- alembic/templates/generic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
47
- alembic/templates/multidb/README,sha256=dWLDhnBgphA4Nzb7sNlMfCS3_06YqVbHhz-9O5JNqyI,606
48
- alembic/templates/multidb/alembic.ini.mako,sha256=cVrikS0KRB46GVcjSO8xKYm7rqUngqTnd06pCozm1Pw,3860
49
41
  alembic/templates/multidb/env.py,sha256=6zNjnW8mXGUk7erTsAvrfhvqoczJ-gagjVq1Ypg2YIQ,4230
50
- alembic/templates/multidb/script.py.mako,sha256=N06nMtNSwHkgl0EBXDyMt8njp9tlOesR583gfq21nbY,1090
51
42
  alembic/testing/__init__.py,sha256=kOxOh5nwmui9d-_CCq9WA4Udwy7ITjm453w74CTLZDo,1159
52
- alembic/testing/assertions.py,sha256=ScUb1sVopIl70BirfHUJDvwswC70Q93CiIWwkiZbhHg,5207
53
- alembic/testing/env.py,sha256=giHWVLhHkfNWrPEfrAqhpMOLL6FgWoBCVAzBVrVbSSA,10766
54
- alembic/testing/fixtures.py,sha256=nBntOynOmVCFc7IYiN3DIQ3TBNTfiGCvL_1-FyCry8o,9462
55
- alembic/testing/requirements.py,sha256=dKeAO1l5TwBqXarJN-IPORlCqCJv-41Dj6oXoEikxHQ,5133
43
+ alembic/testing/assertions.py,sha256=_zaiHj0RcmJs0u1EjrfELWUSi8aUu6xKvzdZ6hDuYUc,5196
44
+ alembic/testing/env.py,sha256=IkQnQmp6g5U82iZHkcndr7MndO3_UBn2TF_40TZ2ua0,10537
45
+ alembic/testing/fixtures.py,sha256=-0oudpWWZMGbwoeXSu1tlu5v8lLtl6eeKU8dMRUOWaU,9127
46
+ alembic/testing/requirements.py,sha256=gNnnvgPCuiqKeHmiNymdQuYIjQ0BrxiPxu_in4eHEsc,4180
56
47
  alembic/testing/schemacompare.py,sha256=N5UqSNCOJetIKC4vKhpYzQEpj08XkdgIoqBmEPQ3tlc,4838
57
48
  alembic/testing/util.py,sha256=CQrcQDA8fs_7ME85z5ydb-Bt70soIIID-qNY1vbR2dg,3350
58
- alembic/testing/warnings.py,sha256=RxA7x_8GseANgw07Us8JN_1iGbANxaw6_VitX2ZGQH4,1078
49
+ alembic/testing/warnings.py,sha256=cDDWzvxNZE6x9dME2ACTXSv01G81JcIbE1GIE_s1kvg,831
59
50
  alembic/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
51
  alembic/testing/plugin/bootstrap.py,sha256=9C6wtjGrIVztZ928w27hsQE0KcjDLIUtUN3dvZKsMVk,50
61
52
  alembic/testing/suite/__init__.py,sha256=MvE7-hwbaVN1q3NM-ztGxORU9dnIelUCINKqNxewn7Y,288
62
53
  alembic/testing/suite/_autogen_fixtures.py,sha256=cDq1pmzHe15S6dZPGNC6sqFaCQ3hLT_oPV2IDigUGQ0,9880
63
54
  alembic/testing/suite/test_autogen_comments.py,sha256=aEGqKUDw4kHjnDk298aoGcQvXJWmZXcIX_2FxH4cJK8,6283
64
- alembic/testing/suite/test_autogen_computed.py,sha256=CXAeF-5Wr2cmW8PB7ztHG_4ZQsn1gSWrHWfxi72grNU,6147
55
+ alembic/testing/suite/test_autogen_computed.py,sha256=-5wran56qXo3afAbSk8cuSDDpbQweyJ61RF-GaVuZbA,4126
65
56
  alembic/testing/suite/test_autogen_diffs.py,sha256=T4SR1n_kmcOKYhR4W1-dA0e5sddJ69DSVL2HW96kAkE,8394
66
57
  alembic/testing/suite/test_autogen_fks.py,sha256=AqFmb26Buex167HYa9dZWOk8x-JlB1OK3bwcvvjDFaU,32927
67
58
  alembic/testing/suite/test_autogen_identity.py,sha256=kcuqngG7qXAKPJDX4U8sRzPKHEJECHuZ0DtuaS6tVkk,5824
68
59
  alembic/testing/suite/test_environment.py,sha256=OwD-kpESdLoc4byBrGrXbZHvqtPbzhFCG4W9hJOJXPQ,11877
69
60
  alembic/testing/suite/test_op.py,sha256=2XQCdm_NmnPxHGuGj7hmxMzIhKxXNotUsKdACXzE1mM,1343
70
- alembic/util/__init__.py,sha256=KSZ7UT2YzH6CietgUtljVoE3QnGjoFKOi7RL5sgUxrk,1688
61
+ alembic/util/__init__.py,sha256=Afa20opZHVV6pH8HJDBOZpImPH9cWenrG-PaBnY_Xxc,1461
71
62
  alembic/util/compat.py,sha256=eoR9ReCTV_l0xGgGlr_OJmVvJecttBYXRKfDhoK8zKU,2630
72
63
  alembic/util/editor.py,sha256=JIz6_BdgV8_oKtnheR6DZoB7qnrHrlRgWjx09AsTsUw,2546
73
- alembic/util/exc.py,sha256=KQTru4zcgAmN4IxLMwLFS56XToUewaXB7oOLcPNjPwg,98
64
+ alembic/util/exc.py,sha256=ZBlTQ8g-Jkb1iYFhFHs9djilRz0SSQ0Foc5SSoENs5o,564
74
65
  alembic/util/langhelpers.py,sha256=LpOcovnhMnP45kTt8zNJ4BHpyQrlF40OL6yDXjqKtsE,10026
75
- alembic/util/messaging.py,sha256=BxAHiJsYHBPb2m8zv4yaueSRAlVuYXWkRCeN02JXhqw,3250
66
+ alembic/util/messaging.py,sha256=aLF6xbRiOCOEW1UY5vA9AAlfkGeNLqPPGSs-3c8-bfc,3166
76
67
  alembic/util/pyfiles.py,sha256=zltVdcwEJJCPS2gHsQvkHkQakuF6wXiZ6zfwHbGNT0g,3489
77
- alembic/util/sqla_compat.py,sha256=XMfZaLdbVbJoniNUyI3RUUXu4gCWljjVBbJ7db6vCgc,19526
78
- alembic-1.14.1.dist-info/LICENSE,sha256=NeqcNBmyYfrxvkSMT0fZJVKBv2s2tf_qVQUiJ9S6VN4,1059
79
- alembic-1.14.1.dist-info/METADATA,sha256=D5AHibKWuwgPf9ORQhNm0k_iTmpKrkDNF-MboIrflY8,7420
80
- alembic-1.14.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
81
- alembic-1.14.1.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48
82
- alembic-1.14.1.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8
83
- alembic-1.14.1.dist-info/RECORD,,
68
+ alembic/util/sqla_compat.py,sha256=SWAL4hJck4XLnUpe-oI3AGiH8w9kgDBe1_oakCfdT_Q,14785
69
+ alembic-1.15.0.dist-info/LICENSE,sha256=NeqcNBmyYfrxvkSMT0fZJVKBv2s2tf_qVQUiJ9S6VN4,1059
70
+ alembic-1.15.0.dist-info/METADATA,sha256=ZoH-DAa3CusjU3tdoyPMFeL74EariuOcdWArcts9YcY,7237
71
+ alembic-1.15.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
72
+ alembic-1.15.0.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48
73
+ alembic-1.15.0.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8
74
+ alembic-1.15.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1 +0,0 @@
1
- Generic single-database configuration with an async dbapi.