From ce03fbf12fe850e8a94f39f313178398944e59a2 Mon Sep 17 00:00:00 2001 From: Kobe Date: Thu, 22 May 2025 20:25:38 +0200 Subject: [PATCH] lol --- Dockerfile | 5 +- app.py | 7 +- instance/site.db | Bin 81920 -> 90112 bytes migrations/README | 1 + migrations/alembic.ini | 50 ++ migrations/env.py | 113 ++++ migrations/script.py.mako | 24 + requirements.txt | 4 +- .../Flask_WTF-1.1.1.dist-info/INSTALLER | 1 - .../Flask_WTF-1.1.1.dist-info/LICENSE.rst | 28 - .../Flask_WTF-1.1.1.dist-info/METADATA | 50 -- .../Flask_WTF-1.1.1.dist-info/RECORD | 27 - .../Flask_WTF-1.1.1.dist-info/REQUESTED | 0 .../Flask_WTF-1.1.1.dist-info/WHEEL | 5 - .../Flask_WTF-1.1.1.dist-info/top_level.txt | 1 - .../SQLAlchemy-2.0.20.dist-info/INSTALLER | 1 - .../SQLAlchemy-2.0.20.dist-info/LICENSE | 19 - .../SQLAlchemy-2.0.20.dist-info/METADATA | 238 -------- .../SQLAlchemy-2.0.20.dist-info/RECORD | 524 ------------------ .../SQLAlchemy-2.0.20.dist-info/REQUESTED | 0 .../SQLAlchemy-2.0.20.dist-info/WHEEL | 5 - .../SQLAlchemy-2.0.20.dist-info/top_level.txt | 1 - .../INSTALLER | 1 - .../LICENSE.rst | 28 - .../flask_sqlalchemy-3.0.5.dist-info/METADATA | 104 ---- .../flask_sqlalchemy-3.0.5.dist-info/RECORD | 27 - .../REQUESTED | 0 .../flask_sqlalchemy-3.0.5.dist-info/WHEEL | 4 - .../flask_sqlalchemy/__init__.py | 34 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1393 -> 880 bytes .../__pycache__/cli.cpython-310.pyc | Bin 893 -> 893 bytes .../__pycache__/extension.cpython-310.pyc | Bin 32132 -> 31797 bytes .../__pycache__/model.cpython-310.pyc | Bin 6883 -> 9400 bytes .../__pycache__/pagination.cpython-310.pyc | Bin 10552 -> 10552 bytes .../__pycache__/query.cpython-310.pyc | Bin 4098 -> 4098 bytes .../record_queries.cpython-310.pyc | Bin 4635 -> 3858 bytes .../__pycache__/session.cpython-310.pyc | Bin 3357 -> 3471 bytes .../__pycache__/table.cpython-310.pyc | Bin 1331 -> 1331 bytes .../track_modifications.cpython-310.pyc | Bin 2276 -> 2276 bytes .../flask_sqlalchemy/extension.py | 268 ++++----- .../site-packages/flask_sqlalchemy/model.py | 138 ++++- .../flask_sqlalchemy/record_queries.py | 24 - .../site-packages/flask_sqlalchemy/session.py | 15 +- venv/Lib/site-packages/flask_wtf/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 420 -> 420 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 508 -> 508 bytes .../__pycache__/csrf.cpython-310.pyc | Bin 9325 -> 9337 bytes .../__pycache__/file.cpython-310.pyc | Bin 4035 -> 5326 bytes .../__pycache__/form.cpython-310.pyc | Bin 4928 -> 4928 bytes .../__pycache__/i18n.cpython-310.pyc | Bin 1373 -> 1373 bytes venv/Lib/site-packages/flask_wtf/csrf.py | 4 +- venv/Lib/site-packages/flask_wtf/file.py | 90 +-- .../__pycache__/__init__.cpython-310.pyc | Bin 317 -> 317 bytes .../__pycache__/fields.cpython-310.pyc | Bin 789 -> 789 bytes .../__pycache__/validators.cpython-310.pyc | Bin 2314 -> 2312 bytes .../__pycache__/widgets.cpython-310.pyc | Bin 1768 -> 1778 bytes .../flask_wtf/recaptcha/validators.py | 4 +- .../flask_wtf/recaptcha/widgets.py | 9 +- venv/Lib/site-packages/sqlalchemy/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 9018 -> 9018 bytes .../__pycache__/events.cpython-310.pyc | Bin 533 -> 533 bytes .../__pycache__/exc.cpython-310.pyc | Bin 24475 -> 24475 bytes .../__pycache__/inspection.cpython-310.pyc | Bin 5860 -> 5860 bytes .../__pycache__/log.cpython-310.pyc | Bin 8329 -> 8329 bytes .../__pycache__/schema.cpython-310.pyc | Bin 2254 -> 2254 bytes .../__pycache__/types.cpython-310.pyc | Bin 2202 -> 2202 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 559 -> 559 bytes .../__pycache__/pyodbc.cpython-310.pyc | Bin 6749 -> 6749 bytes .../sqlalchemy/connectors/pyodbc.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 184 bytes .../collections.cp310-win_amd64.pyd | Bin 173568 -> 174080 bytes .../immutabledict.cp310-win_amd64.pyd | Bin 72192 -> 72192 bytes .../processors.cp310-win_amd64.pyd | Bin 58880 -> 58880 bytes .../resultproxy.cp310-win_amd64.pyd | Bin 60416 -> 60928 bytes .../cyextension/util.cp310-win_amd64.pyd | Bin 72704 -> 72704 bytes .../sqlalchemy/dialects/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1390 -> 1390 bytes .../__pycache__/_typing.cpython-310.pyc | Bin 776 -> 776 bytes .../sqlalchemy/dialects/mssql/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 1533 -> 1563 bytes .../mssql/__pycache__/base.cpython-310.pyc | Bin 109916 -> 110209 bytes .../information_schema.cpython-310.pyc | Bin 5709 -> 5735 bytes .../mssql/__pycache__/json.cpython-310.pyc | Bin 4673 -> 4673 bytes .../__pycache__/provision.cpython-310.pyc | Bin 4292 -> 4303 bytes .../mssql/__pycache__/pymssql.cpython-310.pyc | Bin 4447 -> 4447 bytes .../mssql/__pycache__/pyodbc.cpython-310.pyc | Bin 25404 -> 25537 bytes .../sqlalchemy/dialects/mssql/base.py | 27 +- .../dialects/mssql/information_schema.py | 2 +- .../sqlalchemy/dialects/mssql/provision.py | 2 +- .../sqlalchemy/dialects/mssql/pyodbc.py | 13 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1847 -> 1847 bytes .../__pycache__/aiomysql.cpython-310.pyc | Bin 11195 -> 11195 bytes .../mysql/__pycache__/asyncmy.cpython-310.pyc | Bin 11070 -> 11070 bytes .../mysql/__pycache__/base.cpython-310.pyc | Bin 99399 -> 100623 bytes .../mysql/__pycache__/cymysql.cpython-310.pyc | Bin 2586 -> 2586 bytes .../mysql/__pycache__/dml.cpython-310.pyc | Bin 7418 -> 7418 bytes .../__pycache__/enumerated.cpython-310.pyc | Bin 7969 -> 7969 bytes .../__pycache__/expression.cpython-310.pyc | Bin 3885 -> 3885 bytes .../mysql/__pycache__/json.cpython-310.pyc | Bin 2833 -> 2833 bytes .../mysql/__pycache__/mariadb.cpython-310.pyc | Bin 843 -> 843 bytes .../mariadbconnector.cpython-310.pyc | Bin 7384 -> 8506 bytes .../mysqlconnector.cpython-310.pyc | Bin 6365 -> 6365 bytes .../mysql/__pycache__/mysqldb.cpython-310.pyc | Bin 8969 -> 8966 bytes .../__pycache__/provision.cpython-310.pyc | Bin 2566 -> 2566 bytes .../mysql/__pycache__/pymysql.cpython-310.pyc | Bin 3185 -> 4109 bytes .../mysql/__pycache__/pyodbc.cpython-310.pyc | Bin 4265 -> 4265 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 15446 -> 15476 bytes .../reserved_words.cpython-310.pyc | Bin 4311 -> 4311 bytes .../mysql/__pycache__/types.cpython-310.pyc | Bin 25343 -> 25343 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 8 + .../sqlalchemy/dialects/mysql/asyncmy.py | 6 + .../sqlalchemy/dialects/mysql/base.py | 49 +- .../dialects/mysql/mariadbconnector.py | 45 ++ .../sqlalchemy/dialects/mysql/mysqldb.py | 2 +- .../sqlalchemy/dialects/mysql/pymysql.py | 34 ++ .../sqlalchemy/dialects/mysql/reflection.py | 2 +- .../sqlalchemy/dialects/oracle/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 1084 -> 1089 bytes .../oracle/__pycache__/base.cpython-310.pyc | Bin 81180 -> 81401 bytes .../__pycache__/cx_oracle.cpython-310.pyc | Bin 45456 -> 45459 bytes .../__pycache__/dictionary.cpython-310.pyc | Bin 12167 -> 12167 bytes .../__pycache__/oracledb.cpython-310.pyc | Bin 3674 -> 3674 bytes .../__pycache__/provision.cpython-310.pyc | Bin 6724 -> 6724 bytes .../oracle/__pycache__/types.cpython-310.pyc | Bin 8690 -> 9805 bytes .../sqlalchemy/dialects/oracle/base.py | 8 +- .../sqlalchemy/dialects/oracle/cx_oracle.py | 10 +- .../sqlalchemy/dialects/oracle/types.py | 81 ++- .../__pycache__/__init__.cpython-310.pyc | Bin 3136 -> 3136 bytes .../_psycopg_common.cpython-310.pyc | Bin 5670 -> 5670 bytes .../__pycache__/array.cpython-310.pyc | Bin 13374 -> 13374 bytes .../__pycache__/asyncpg.cpython-310.pyc | Bin 39479 -> 39961 bytes .../__pycache__/base.cpython-310.pyc | Bin 132436 -> 132703 bytes .../__pycache__/dml.cpython-310.pyc | Bin 9937 -> 9937 bytes .../__pycache__/ext.cpython-310.pyc | Bin 15860 -> 15860 bytes .../__pycache__/hstore.cpython-310.pyc | Bin 11960 -> 11960 bytes .../__pycache__/json.cpython-310.pyc | Bin 11356 -> 11356 bytes .../__pycache__/named_types.cpython-310.pyc | Bin 17372 -> 17372 bytes .../__pycache__/operators.cpython-310.pyc | Bin 1226 -> 1226 bytes .../__pycache__/pg8000.cpython-310.pyc | Bin 20875 -> 20875 bytes .../__pycache__/pg_catalog.cpython-310.pyc | Bin 6776 -> 6776 bytes .../__pycache__/provision.cpython-310.pyc | Bin 4972 -> 4972 bytes .../__pycache__/psycopg.cpython-310.pyc | Bin 24837 -> 24837 bytes .../__pycache__/psycopg2.cpython-310.pyc | Bin 30581 -> 30570 bytes .../__pycache__/psycopg2cffi.cpython-310.pyc | Bin 1822 -> 1822 bytes .../__pycache__/ranges.cpython-310.pyc | Bin 21468 -> 21468 bytes .../__pycache__/types.cpython-310.pyc | Bin 8579 -> 9143 bytes .../sqlalchemy/dialects/postgresql/asyncpg.py | 22 +- .../sqlalchemy/dialects/postgresql/base.py | 15 +- .../dialects/postgresql/psycopg2.py | 2 +- .../sqlalchemy/dialects/postgresql/ranges.py | 2 +- .../sqlalchemy/dialects/postgresql/types.py | 10 + .../__pycache__/__init__.cpython-310.pyc | Bin 973 -> 973 bytes .../__pycache__/aiosqlite.cpython-310.pyc | Bin 11206 -> 12486 bytes .../sqlite/__pycache__/base.cpython-310.pyc | Bin 76630 -> 76922 bytes .../sqlite/__pycache__/dml.cpython-310.pyc | Bin 8302 -> 8302 bytes .../sqlite/__pycache__/json.cpython-310.pyc | Bin 3164 -> 3164 bytes .../__pycache__/provision.cpython-310.pyc | Bin 4724 -> 4724 bytes .../__pycache__/pysqlcipher.cpython-310.pyc | Bin 5445 -> 5445 bytes .../__pycache__/pysqlite.cpython-310.pyc | Bin 27989 -> 27989 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 35 ++ .../sqlalchemy/dialects/sqlite/base.py | 20 +- .../__pycache__/__init__.cpython-310.pyc | Bin 2211 -> 2211 bytes .../_py_processors.cpython-310.pyc | Bin 3410 -> 3410 bytes .../__pycache__/_py_row.cpython-310.pyc | Bin 4245 -> 4245 bytes .../__pycache__/_py_util.cpython-310.pyc | Bin 1518 -> 1518 bytes .../engine/__pycache__/base.cpython-310.pyc | Bin 97223 -> 97229 bytes .../characteristics.cpython-310.pyc | Bin 3170 -> 3170 bytes .../engine/__pycache__/create.cpython-310.pyc | Bin 29349 -> 29349 bytes .../engine/__pycache__/cursor.cpython-310.pyc | Bin 58899 -> 58908 bytes .../__pycache__/default.cpython-310.pyc | Bin 58414 -> 58478 bytes .../engine/__pycache__/events.cpython-310.pyc | Bin 37508 -> 37508 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 91397 -> 91397 bytes .../engine/__pycache__/mock.cpython-310.pyc | Bin 4933 -> 4933 bytes .../__pycache__/processors.cpython-310.pyc | Bin 1147 -> 1147 bytes .../__pycache__/reflection.cpython-310.pyc | Bin 61284 -> 61280 bytes .../engine/__pycache__/result.cpython-310.pyc | Bin 75170 -> 75170 bytes .../engine/__pycache__/row.cpython-310.pyc | Bin 14873 -> 14873 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 519 -> 519 bytes .../engine/__pycache__/url.cpython-310.pyc | Bin 27084 -> 27084 bytes .../engine/__pycache__/util.cpython-310.pyc | Bin 5057 -> 5057 bytes .../site-packages/sqlalchemy/engine/base.py | 8 +- .../site-packages/sqlalchemy/engine/cursor.py | 2 +- .../sqlalchemy/engine/default.py | 21 +- .../site-packages/sqlalchemy/engine/events.py | 4 +- .../sqlalchemy/engine/interfaces.py | 2 +- .../site-packages/sqlalchemy/engine/mock.py | 2 +- .../sqlalchemy/engine/reflection.py | 10 +- .../site-packages/sqlalchemy/engine/result.py | 4 +- .../site-packages/sqlalchemy/engine/util.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 805 -> 805 bytes .../event/__pycache__/api.cpython-310.pyc | Bin 8554 -> 8554 bytes .../event/__pycache__/attr.cpython-310.pyc | Bin 22800 -> 22800 bytes .../event/__pycache__/base.cpython-310.pyc | Bin 14792 -> 14792 bytes .../event/__pycache__/legacy.cpython-310.pyc | Bin 6979 -> 6979 bytes .../__pycache__/registry.cpython-310.pyc | Bin 8229 -> 8229 bytes .../site-packages/sqlalchemy/event/base.py | 4 +- .../sqlalchemy/event/registry.py | 2 +- .../ext/__pycache__/__init__.cpython-310.pyc | Bin 271 -> 271 bytes .../associationproxy.cpython-310.pyc | Bin 63468 -> 63468 bytes .../ext/__pycache__/automap.cpython-310.pyc | Bin 50572 -> 50572 bytes .../ext/__pycache__/baked.cpython-310.pyc | Bin 17074 -> 17074 bytes .../ext/__pycache__/compiler.cpython-310.pyc | Bin 19471 -> 19471 bytes .../horizontal_shard.cpython-310.pyc | Bin 14333 -> 14333 bytes .../ext/__pycache__/hybrid.cpython-310.pyc | Bin 54717 -> 54760 bytes .../ext/__pycache__/indexable.cpython-310.pyc | Bin 10737 -> 10737 bytes .../instrumentation.cpython-310.pyc | Bin 14570 -> 14570 bytes .../ext/__pycache__/mutable.cpython-310.pyc | Bin 38645 -> 38645 bytes .../__pycache__/orderinglist.cpython-310.pyc | Bin 14771 -> 14771 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 5303 -> 5303 bytes .../sqlalchemy/ext/associationproxy.py | 4 +- .../sqlalchemy/ext/asyncio/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 898 -> 939 bytes .../asyncio/__pycache__/base.cpython-310.pyc | Bin 8336 -> 8332 bytes .../__pycache__/engine.cpython-310.pyc | Bin 45300 -> 45304 bytes .../asyncio/__pycache__/exc.cpython-310.pyc | Bin 849 -> 849 bytes .../__pycache__/result.cpython-310.pyc | Bin 31257 -> 31257 bytes .../__pycache__/scoping.cpython-310.pyc | Bin 46935 -> 48513 bytes .../__pycache__/session.cpython-310.pyc | Bin 57720 -> 59178 bytes .../sqlalchemy/ext/asyncio/base.py | 8 +- .../sqlalchemy/ext/asyncio/engine.py | 12 +- .../sqlalchemy/ext/asyncio/result.py | 2 +- .../sqlalchemy/ext/asyncio/scoping.py | 195 ++++--- .../sqlalchemy/ext/asyncio/session.py | 135 ++++- .../__pycache__/__init__.cpython-310.pyc | Bin 1595 -> 1595 bytes .../__pycache__/extensions.cpython-310.pyc | Bin 17147 -> 17147 bytes .../site-packages/sqlalchemy/ext/hybrid.py | 8 +- .../mypy/__pycache__/__init__.cpython-310.pyc | Bin 181 -> 181 bytes .../mypy/__pycache__/apply.cpython-310.pyc | Bin 6232 -> 6232 bytes .../__pycache__/decl_class.cpython-310.pyc | Bin 8257 -> 8257 bytes .../mypy/__pycache__/infer.cpython-310.pyc | Bin 9291 -> 9291 bytes .../mypy/__pycache__/names.cpython-310.pyc | Bin 7088 -> 7068 bytes .../mypy/__pycache__/plugin.cpython-310.pyc | Bin 7857 -> 7857 bytes .../ext/mypy/__pycache__/util.cpython-310.pyc | Bin 9455 -> 9455 bytes .../sqlalchemy/ext/mypy/names.py | 35 +- .../site-packages/sqlalchemy/ext/mypy/util.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 438 -> 438 bytes .../future/__pycache__/engine.cpython-310.pyc | Bin 372 -> 372 bytes venv/Lib/site-packages/sqlalchemy/log.py | 4 +- .../orm/__pycache__/__init__.cpython-310.pyc | Bin 6029 -> 6029 bytes .../_orm_constructors.cpython-310.pyc | Bin 95166 -> 95183 bytes .../orm/__pycache__/_typing.cpython-310.pyc | Bin 5681 -> 5705 bytes .../__pycache__/attributes.cpython-310.pyc | Bin 67576 -> 67743 bytes .../orm/__pycache__/base.cpython-310.pyc | Bin 25015 -> 25118 bytes .../bulk_persistence.cpython-310.pyc | Bin 41832 -> 41794 bytes .../__pycache__/clsregistry.cpython-310.pyc | Bin 16456 -> 16456 bytes .../__pycache__/collections.cpython-310.pyc | Bin 45880 -> 45880 bytes .../orm/__pycache__/context.cpython-310.pyc | Bin 61704 -> 61704 bytes .../orm/__pycache__/decl_api.cpython-310.pyc | Bin 56396 -> 56396 bytes .../orm/__pycache__/decl_base.cpython-310.pyc | Bin 44551 -> 44574 bytes .../__pycache__/dependency.cpython-310.pyc | Bin 23702 -> 23702 bytes .../descriptor_props.cpython-310.pyc | Bin 33810 -> 33810 bytes .../orm/__pycache__/dynamic.cpython-310.pyc | Bin 8137 -> 9451 bytes .../orm/__pycache__/evaluator.cpython-310.pyc | Bin 11938 -> 11938 bytes .../orm/__pycache__/events.cpython-310.pyc | Bin 126615 -> 126615 bytes .../orm/__pycache__/exc.cpython-310.pyc | Bin 7662 -> 7662 bytes .../orm/__pycache__/identity.cpython-310.pyc | Bin 9207 -> 9207 bytes .../instrumentation.cpython-310.pyc | Bin 22661 -> 22661 bytes .../__pycache__/interfaces.cpython-310.pyc | Bin 45585 -> 45627 bytes .../orm/__pycache__/loading.cpython-310.pyc | Bin 29231 -> 29502 bytes .../mapped_collection.cpython-310.pyc | Bin 18163 -> 18163 bytes .../orm/__pycache__/mapper.cpython-310.pyc | Bin 118777 -> 118784 bytes .../__pycache__/path_registry.cpython-310.pyc | Bin 21928 -> 22117 bytes .../__pycache__/persistence.cpython-310.pyc | Bin 27520 -> 27530 bytes .../__pycache__/properties.cpython-310.pyc | Bin 21044 -> 22011 bytes .../orm/__pycache__/query.cpython-310.pyc | Bin 105498 -> 105570 bytes .../__pycache__/relationships.cpython-310.pyc | Bin 85155 -> 85160 bytes .../orm/__pycache__/scoping.cpython-310.pyc | Bin 72739 -> 75697 bytes .../orm/__pycache__/session.cpython-310.pyc | Bin 150629 -> 154695 bytes .../orm/__pycache__/state.cpython-310.pyc | Bin 33345 -> 33345 bytes .../__pycache__/state_changes.cpython-310.pyc | Bin 4964 -> 4964 bytes .../__pycache__/strategies.cpython-310.pyc | Bin 59224 -> 59174 bytes .../strategy_options.cpython-310.pyc | Bin 62756 -> 64362 bytes .../orm/__pycache__/sync.cpython-310.pyc | Bin 3948 -> 3948 bytes .../__pycache__/unitofwork.cpython-310.pyc | Bin 21114 -> 21114 bytes .../orm/__pycache__/util.cpython-310.pyc | Bin 61201 -> 61443 bytes .../orm/__pycache__/writeonly.cpython-310.pyc | Bin 17481 -> 19614 bytes .../sqlalchemy/orm/_orm_constructors.py | 4 +- .../site-packages/sqlalchemy/orm/_typing.py | 3 +- .../sqlalchemy/orm/attributes.py | 41 +- venv/Lib/site-packages/sqlalchemy/orm/base.py | 65 ++- .../sqlalchemy/orm/bulk_persistence.py | 8 +- .../site-packages/sqlalchemy/orm/decl_api.py | 22 +- .../site-packages/sqlalchemy/orm/decl_base.py | 20 +- .../sqlalchemy/orm/descriptor_props.py | 16 +- .../site-packages/sqlalchemy/orm/dynamic.py | 95 ++-- .../sqlalchemy/orm/instrumentation.py | 10 +- .../sqlalchemy/orm/interfaces.py | 13 +- .../site-packages/sqlalchemy/orm/loading.py | 99 ++-- .../site-packages/sqlalchemy/orm/mapper.py | 14 +- .../sqlalchemy/orm/path_registry.py | 29 +- .../sqlalchemy/orm/persistence.py | 2 +- .../sqlalchemy/orm/properties.py | 118 +++- .../Lib/site-packages/sqlalchemy/orm/query.py | 15 +- .../sqlalchemy/orm/relationships.py | 23 +- .../site-packages/sqlalchemy/orm/scoping.py | 104 +++- .../site-packages/sqlalchemy/orm/session.py | 155 +++++- .../Lib/site-packages/sqlalchemy/orm/state.py | 4 +- .../sqlalchemy/orm/strategies.py | 9 +- .../sqlalchemy/orm/strategy_options.py | 134 +++-- venv/Lib/site-packages/sqlalchemy/orm/util.py | 95 ++-- .../site-packages/sqlalchemy/orm/writeonly.py | 228 +++++--- .../pool/__pycache__/__init__.cpython-310.pyc | Bin 1466 -> 1466 bytes .../pool/__pycache__/base.cpython-310.pyc | Bin 41095 -> 41109 bytes .../pool/__pycache__/events.cpython-310.pyc | Bin 13061 -> 13061 bytes .../pool/__pycache__/impl.cpython-310.pyc | Bin 17555 -> 17555 bytes .../Lib/site-packages/sqlalchemy/pool/base.py | 12 +- .../site-packages/sqlalchemy/pool/events.py | 2 +- .../Lib/site-packages/sqlalchemy/pool/impl.py | 2 +- .../sql/__pycache__/__init__.cpython-310.pyc | Bin 4249 -> 4249 bytes .../_dml_constructors.cpython-310.pyc | Bin 4004 -> 4004 bytes .../_elements_constructors.cpython-310.pyc | Bin 63290 -> 63290 bytes .../__pycache__/_orm_types.cpython-310.pyc | Bin 580 -> 580 bytes .../sql/__pycache__/_py_util.cpython-310.pyc | Bin 2467 -> 2467 bytes .../_selectable_constructors.cpython-310.pyc | Bin 19044 -> 19044 bytes .../sql/__pycache__/_typing.cpython-310.pyc | Bin 11282 -> 11282 bytes .../__pycache__/annotation.cpython-310.pyc | Bin 15029 -> 15029 bytes .../sql/__pycache__/base.cpython-310.pyc | Bin 76034 -> 76072 bytes .../sql/__pycache__/cache_key.cpython-310.pyc | Bin 25404 -> 25433 bytes .../sql/__pycache__/coercions.cpython-310.pyc | Bin 33915 -> 33915 bytes .../sql/__pycache__/compiler.cpython-310.pyc | Bin 170637 -> 170684 bytes .../sql/__pycache__/crud.cpython-310.pyc | Bin 26228 -> 26247 bytes .../sql/__pycache__/ddl.cpython-310.pyc | Bin 43572 -> 43424 bytes .../default_comparator.cpython-310.pyc | Bin 10344 -> 10344 bytes .../sql/__pycache__/dml.cpython-310.pyc | Bin 60322 -> 60434 bytes .../sql/__pycache__/elements.cpython-310.pyc | Bin 151309 -> 151398 bytes .../sql/__pycache__/events.cpython-310.pyc | Bin 18834 -> 18834 bytes .../__pycache__/expression.cpython-310.pyc | Bin 4973 -> 4973 bytes .../sql/__pycache__/functions.cpython-310.pyc | Bin 56894 -> 57953 bytes .../sql/__pycache__/lambdas.cpython-310.pyc | Bin 38735 -> 38735 bytes .../sql/__pycache__/naming.cpython-310.pyc | Bin 5257 -> 5257 bytes .../sql/__pycache__/operators.cpython-310.pyc | Bin 74805 -> 74935 bytes .../sql/__pycache__/roles.cpython-310.pyc | Bin 10084 -> 10131 bytes .../sql/__pycache__/schema.cpython-310.pyc | Bin 194115 -> 194246 bytes .../__pycache__/selectable.cpython-310.pyc | Bin 205098 -> 205144 bytes .../sql/__pycache__/sqltypes.cpython-310.pyc | Bin 116058 -> 116862 bytes .../__pycache__/traversals.cpython-310.pyc | Bin 31084 -> 31084 bytes .../sql/__pycache__/type_api.cpython-310.pyc | Bin 72239 -> 71103 bytes .../sql/__pycache__/util.cpython-310.pyc | Bin 36939 -> 36935 bytes .../sql/__pycache__/visitors.cpython-310.pyc | Bin 29645 -> 29718 bytes .../site-packages/sqlalchemy/sql/_typing.py | 2 +- .../sqlalchemy/sql/annotation.py | 2 +- venv/Lib/site-packages/sqlalchemy/sql/base.py | 7 +- .../site-packages/sqlalchemy/sql/cache_key.py | 3 + .../site-packages/sqlalchemy/sql/compiler.py | 31 +- venv/Lib/site-packages/sqlalchemy/sql/crud.py | 31 +- venv/Lib/site-packages/sqlalchemy/sql/ddl.py | 17 +- venv/Lib/site-packages/sqlalchemy/sql/dml.py | 9 +- .../site-packages/sqlalchemy/sql/elements.py | 52 +- .../site-packages/sqlalchemy/sql/functions.py | 31 ++ .../site-packages/sqlalchemy/sql/lambdas.py | 2 +- .../site-packages/sqlalchemy/sql/operators.py | 16 +- .../Lib/site-packages/sqlalchemy/sql/roles.py | 5 +- .../site-packages/sqlalchemy/sql/schema.py | 70 +-- .../sqlalchemy/sql/selectable.py | 30 +- .../site-packages/sqlalchemy/sql/sqltypes.py | 59 +- .../sqlalchemy/sql/traversals.py | 10 +- .../site-packages/sqlalchemy/sql/type_api.py | 35 +- venv/Lib/site-packages/sqlalchemy/sql/util.py | 10 +- .../site-packages/sqlalchemy/sql/visitors.py | 15 +- .../__pycache__/__init__.cpython-310.pyc | Bin 3137 -> 3137 bytes .../__pycache__/assertions.cpython-310.pyc | Bin 29006 -> 29006 bytes .../__pycache__/assertsql.cpython-310.pyc | Bin 13019 -> 13027 bytes .../__pycache__/asyncio.cpython-310.pyc | Bin 3091 -> 3091 bytes .../__pycache__/config.cpython-310.pyc | Bin 12360 -> 14015 bytes .../__pycache__/engines.cpython-310.pyc | Bin 13792 -> 13792 bytes .../__pycache__/entities.cpython-310.pyc | Bin 2928 -> 2928 bytes .../__pycache__/exclusions.cpython-310.pyc | Bin 13799 -> 13799 bytes .../__pycache__/pickleable.cpython-310.pyc | Bin 5130 -> 5130 bytes .../__pycache__/profiling.cpython-310.pyc | Bin 8195 -> 8195 bytes .../__pycache__/provision.cpython-310.pyc | Bin 13485 -> 13485 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 65705 -> 66203 bytes .../__pycache__/schema.cpython-310.pyc | Bin 6337 -> 6337 bytes .../testing/__pycache__/util.cpython-310.pyc | Bin 14569 -> 14569 bytes .../__pycache__/warnings.cpython-310.pyc | Bin 1665 -> 1665 bytes .../sqlalchemy/testing/assertsql.py | 1 + .../sqlalchemy/testing/config.py | 49 +- .../__pycache__/__init__.cpython-310.pyc | Bin 868 -> 868 bytes .../fixtures/__pycache__/base.cpython-310.pyc | Bin 7765 -> 7765 bytes .../fixtures/__pycache__/mypy.cpython-310.pyc | Bin 7588 -> 7588 bytes .../fixtures/__pycache__/orm.cpython-310.pyc | Bin 7757 -> 7757 bytes .../fixtures/__pycache__/sql.cpython-310.pyc | Bin 13037 -> 13037 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 187 -> 187 bytes .../__pycache__/bootstrap.cpython-310.pyc | Bin 1531 -> 1531 bytes .../__pycache__/plugin_base.cpython-310.pyc | Bin 18358 -> 18645 bytes .../__pycache__/pytestplugin.cpython-310.pyc | Bin 20574 -> 20574 bytes .../sqlalchemy/testing/plugin/plugin_base.py | 22 +- .../sqlalchemy/testing/requirements.py | 21 +- .../__pycache__/__init__.cpython-310.pyc | Bin 511 -> 511 bytes .../__pycache__/test_cte.cpython-310.pyc | Bin 4538 -> 4538 bytes .../__pycache__/test_ddl.cpython-310.pyc | Bin 11063 -> 11063 bytes .../test_deprecations.cpython-310.pyc | Bin 4417 -> 4417 bytes .../__pycache__/test_dialect.cpython-310.pyc | Bin 19677 -> 19677 bytes .../__pycache__/test_insert.cpython-310.pyc | Bin 12738 -> 13259 bytes .../test_reflection.cpython-310.pyc | Bin 74656 -> 75763 bytes .../__pycache__/test_results.cpython-310.pyc | Bin 12006 -> 12026 bytes .../__pycache__/test_rowcount.cpython-310.pyc | Bin 5126 -> 5870 bytes .../__pycache__/test_select.cpython-310.pyc | Bin 54064 -> 54064 bytes .../__pycache__/test_sequence.cpython-310.pyc | Bin 8589 -> 8589 bytes .../__pycache__/test_types.cpython-310.pyc | Bin 51436 -> 54488 bytes .../test_unicode_ddl.cpython-310.pyc | Bin 3714 -> 3714 bytes .../test_update_delete.cpython-310.pyc | Bin 2048 -> 3528 bytes .../sqlalchemy/testing/suite/test_insert.py | 40 +- .../testing/suite/test_reflection.py | 60 ++ .../sqlalchemy/testing/suite/test_results.py | 4 +- .../sqlalchemy/testing/suite/test_rowcount.py | 43 ++ .../sqlalchemy/testing/suite/test_types.py | 110 +++- .../testing/suite/test_update_delete.py | 67 +++ .../util/__pycache__/__init__.cpython-310.pyc | Bin 5457 -> 5457 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 24664 -> 24654 bytes .../_concurrency_py3k.cpython-310.pyc | Bin 6788 -> 6788 bytes .../util/__pycache__/_has_cy.cpython-310.pyc | Bin 875 -> 875 bytes .../_py_collections.cpython-310.pyc | Bin 20659 -> 20659 bytes .../util/__pycache__/compat.cpython-310.pyc | Bin 8540 -> 8831 bytes .../__pycache__/concurrency.cpython-310.pyc | Bin 1721 -> 1721 bytes .../__pycache__/deprecations.cpython-310.pyc | Bin 9695 -> 9695 bytes .../__pycache__/langhelpers.cpython-310.pyc | Bin 60690 -> 60918 bytes .../__pycache__/preloaded.cpython-310.pyc | Bin 5140 -> 5140 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 10397 -> 10397 bytes .../__pycache__/tool_support.cpython-310.pyc | Bin 5464 -> 5464 bytes .../__pycache__/topological.cpython-310.pyc | Bin 2950 -> 2950 bytes .../util/__pycache__/typing.cpython-310.pyc | Bin 14861 -> 14940 bytes .../sqlalchemy/util/_collections.py | 16 +- .../sqlalchemy/util/_concurrency_py3k.py | 4 +- .../sqlalchemy/util/_py_collections.py | 6 +- .../site-packages/sqlalchemy/util/compat.py | 13 + .../sqlalchemy/util/deprecations.py | 14 +- .../sqlalchemy/util/langhelpers.py | 40 +- .../site-packages/sqlalchemy/util/typing.py | 7 + .../wtforms-3.2.1.dist-info/INSTALLER | 1 - .../wtforms-3.2.1.dist-info/METADATA | 119 ---- .../wtforms-3.2.1.dist-info/RECORD | 109 ---- .../wtforms-3.2.1.dist-info/WHEEL | 4 - .../licenses/LICENSE.rst | 28 - venv/Lib/site-packages/wtforms/__init__.py | 76 +-- .../__pycache__/__init__.cpython-310.pyc | Bin 1858 -> 397 bytes .../wtforms/__pycache__/form.cpython-310.pyc | Bin 12339 -> 12302 bytes .../wtforms/__pycache__/i18n.cpython-310.pyc | Bin 2761 -> 2761 bytes .../wtforms/__pycache__/meta.cpython-310.pyc | Bin 4212 -> 4212 bytes .../wtforms/__pycache__/utils.cpython-310.pyc | Bin 3397 -> 3320 bytes .../__pycache__/validators.cpython-310.pyc | Bin 21316 -> 20968 bytes .../csrf/__pycache__/__init__.cpython-310.pyc | Bin 174 -> 174 bytes .../csrf/__pycache__/core.cpython-310.pyc | Bin 3985 -> 3985 bytes .../csrf/__pycache__/session.cpython-310.pyc | Bin 3332 -> 3332 bytes .../Lib/site-packages/wtforms/csrf/session.py | 1 - .../site-packages/wtforms/fields/__init__.py | 72 +-- .../__pycache__/__init__.cpython-310.pyc | Bin 1716 -> 585 bytes .../__pycache__/choices.cpython-310.pyc | Bin 7560 -> 7609 bytes .../fields/__pycache__/core.cpython-310.pyc | Bin 14431 -> 14840 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 4915 -> 4904 bytes .../fields/__pycache__/form.cpython-310.pyc | Bin 3183 -> 3183 bytes .../fields/__pycache__/list.cpython-310.pyc | Bin 6370 -> 6370 bytes .../__pycache__/numeric.cpython-310.pyc | Bin 6314 -> 6314 bytes .../fields/__pycache__/simple.cpython-310.pyc | Bin 5650 -> 5650 bytes .../site-packages/wtforms/fields/choices.py | 15 +- venv/Lib/site-packages/wtforms/fields/core.py | 29 +- .../site-packages/wtforms/fields/datetime.py | 3 +- venv/Lib/site-packages/wtforms/fields/form.py | 3 +- venv/Lib/site-packages/wtforms/fields/list.py | 3 +- venv/Lib/site-packages/wtforms/form.py | 5 +- .../wtforms/locale/ar/LC_MESSAGES/wtforms.mo | Bin 4393 -> 4393 bytes .../wtforms/locale/ar/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/bg/LC_MESSAGES/wtforms.mo | Bin 3932 -> 3932 bytes .../wtforms/locale/bg/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/ca/LC_MESSAGES/wtforms.mo | Bin 3177 -> 3177 bytes .../wtforms/locale/ca/LC_MESSAGES/wtforms.po | 16 +- .../locale/cs_CZ/LC_MESSAGES/wtforms.mo | Bin 3398 -> 3398 bytes .../locale/cs_CZ/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/cy/LC_MESSAGES/wtforms.mo | Bin 3142 -> 3142 bytes .../wtforms/locale/cy/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/de/LC_MESSAGES/wtforms.mo | Bin 3175 -> 3175 bytes .../wtforms/locale/de/LC_MESSAGES/wtforms.po | 16 +- .../locale/de_CH/LC_MESSAGES/wtforms.mo | Bin 3169 -> 3169 bytes .../locale/de_CH/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/el/LC_MESSAGES/wtforms.mo | Bin 3951 -> 3951 bytes .../wtforms/locale/el/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/en/LC_MESSAGES/wtforms.mo | Bin 3323 -> 3323 bytes .../wtforms/locale/es/LC_MESSAGES/wtforms.mo | Bin 3882 -> 3880 bytes .../wtforms/locale/es/LC_MESSAGES/wtforms.po | 24 +- .../wtforms/locale/et/LC_MESSAGES/wtforms.mo | Bin 3202 -> 3202 bytes .../wtforms/locale/et/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/fa/LC_MESSAGES/wtforms.mo | Bin 3796 -> 3796 bytes .../wtforms/locale/fa/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/fi/LC_MESSAGES/wtforms.mo | Bin 3152 -> 3152 bytes .../wtforms/locale/fi/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/fr/LC_MESSAGES/wtforms.mo | Bin 3961 -> 3957 bytes .../wtforms/locale/fr/LC_MESSAGES/wtforms.po | 24 +- .../wtforms/locale/he/LC_MESSAGES/wtforms.mo | Bin 3265 -> 3265 bytes .../wtforms/locale/he/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/hu/LC_MESSAGES/wtforms.mo | Bin 3275 -> 3275 bytes .../wtforms/locale/hu/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/it/LC_MESSAGES/wtforms.mo | Bin 3248 -> 3248 bytes .../wtforms/locale/it/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/ja/LC_MESSAGES/wtforms.mo | Bin 3481 -> 3481 bytes .../wtforms/locale/ja/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/kk/LC_MESSAGES/wtforms.mo | Bin 4921 -> 0 bytes .../wtforms/locale/kk/LC_MESSAGES/wtforms.po | 187 ------- .../wtforms/locale/ko/LC_MESSAGES/wtforms.mo | Bin 4291 -> 3671 bytes .../wtforms/locale/ko/LC_MESSAGES/wtforms.po | 48 +- .../wtforms/locale/nb/LC_MESSAGES/wtforms.mo | Bin 3080 -> 3080 bytes .../wtforms/locale/nb/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/nl/LC_MESSAGES/wtforms.mo | Bin 3732 -> 3237 bytes .../wtforms/locale/nl/LC_MESSAGES/wtforms.po | 43 +- .../wtforms/locale/pl/LC_MESSAGES/wtforms.mo | Bin 3428 -> 3428 bytes .../wtforms/locale/pl/LC_MESSAGES/wtforms.po | 16 +- .../wtforms/locale/pt/LC_MESSAGES/wtforms.mo | Bin 3892 -> 3187 bytes .../wtforms/locale/pt/LC_MESSAGES/wtforms.po | 55 +- .../wtforms/locale/ro/LC_MESSAGES/wtforms.mo | Bin 4066 -> 4263 bytes .../wtforms/locale/ro/LC_MESSAGES/wtforms.po | 24 +- .../wtforms/locale/ru/LC_MESSAGES/wtforms.mo | Bin 4712 -> 4418 bytes .../wtforms/locale/ru/LC_MESSAGES/wtforms.po | 36 +- .../wtforms/locale/sk/LC_MESSAGES/wtforms.mo | Bin 4054 -> 4048 bytes .../wtforms/locale/sk/LC_MESSAGES/wtforms.po | 26 +- .../wtforms/locale/sv/LC_MESSAGES/wtforms.mo | Bin 3818 -> 3314 bytes .../wtforms/locale/sv/LC_MESSAGES/wtforms.po | 41 +- .../wtforms/locale/tr/LC_MESSAGES/wtforms.mo | Bin 3885 -> 3145 bytes .../wtforms/locale/tr/LC_MESSAGES/wtforms.po | 77 +-- .../wtforms/locale/uk/LC_MESSAGES/wtforms.mo | Bin 5187 -> 4244 bytes .../wtforms/locale/uk/LC_MESSAGES/wtforms.po | 79 +-- .../site-packages/wtforms/locale/wtforms.pot | 22 +- .../wtforms/locale/zh/LC_MESSAGES/wtforms.mo | Bin 3296 -> 3296 bytes .../wtforms/locale/zh/LC_MESSAGES/wtforms.po | 16 +- .../locale/zh_TW/LC_MESSAGES/wtforms.mo | Bin 3653 -> 3099 bytes .../locale/zh_TW/LC_MESSAGES/wtforms.po | 73 +-- venv/Lib/site-packages/wtforms/utils.py | 6 +- venv/Lib/site-packages/wtforms/validators.py | 10 +- .../site-packages/wtforms/widgets/__init__.py | 56 +- .../__pycache__/__init__.cpython-310.pyc | Bin 1245 -> 276 bytes .../widgets/__pycache__/core.cpython-310.pyc | Bin 15415 -> 15490 bytes .../Lib/site-packages/wtforms/widgets/core.py | 56 +- 529 files changed, 3353 insertions(+), 3312 deletions(-) create mode 100644 migrations/README create mode 100644 migrations/alembic.ini create mode 100644 migrations/env.py create mode 100644 migrations/script.py.mako delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/LICENSE.rst delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/LICENSE delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/LICENSE.rst delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/wtforms-3.2.1.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/wtforms-3.2.1.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/wtforms-3.2.1.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/wtforms-3.2.1.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/wtforms-3.2.1.dist-info/licenses/LICENSE.rst delete mode 100644 venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.mo delete mode 100644 venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.po diff --git a/Dockerfile b/Dockerfile index 96ee7e7..0ad2359 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,7 @@ WORKDIR /app # Install dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt +RUN pip install gunicorn # Copy project files COPY . . @@ -22,5 +23,5 @@ EXPOSE 5000 ENV FLASK_APP=app.py ENV FLASK_ENV=production -# Run the application -CMD ["flask", "run", "--host=0.0.0.0"] \ No newline at end of file +# Run the application with gunicorn +CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"] \ No newline at end of file diff --git a/app.py b/app.py index 426dc7e..7d2517e 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,6 @@ from flask import Flask, render_template, request, redirect, url_for, flash, session from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate from datetime import datetime from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.utils import secure_filename @@ -16,6 +17,7 @@ app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024 # 2MB max file size os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) db = SQLAlchemy(app) +migrate = Migrate(app, db) # Database Models class User(db.Model): @@ -1142,4 +1144,7 @@ def seed_db(): description=plant['description'], care_guide=plant['care_guide'] )) - db.session.commit() \ No newline at end of file + db.session.commit() + +if __name__ == "__main__": + app.run(debug=True) \ No newline at end of file diff --git a/instance/site.db b/instance/site.db index 8f44f576e40e058c166d0f81f5aa327ab8acf7fa..6af897811a3ceaed94153a48f3af9909745b21f3 100644 GIT binary patch delta 330 zcmZo@U~M?SIzd`cih+Sa42WTXd!mjpj}(JmG9xel4+c@@s}r-;S(vY~G;UmI&s^WA zDZ(zUt5nwylF9AB1NRGgWghsG6k4svx2aa9O$bn;&k@+3l0f#^z;h>nt*Cud_i`yLO_tG zuVYZ8g12j=f(DX-np~Q;qHN-U+KddDc`2zC#f3SUC8_a=r6u`bemt6c;tkOR#F`JV dY(K!l=wQvp3kn>8&4LQg_$O`=3 + return current_app.extensions['migrate'].db.engine + + +def get_engine_url(): + try: + return get_engine().url.render_as_string(hide_password=False).replace( + '%', '%%') + except AttributeError: + return str(get_engine().url).replace('%', '%%') + + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option('sqlalchemy.url', get_engine_url()) +target_db = current_app.extensions['migrate'].db + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def get_metadata(): + if hasattr(target_db, 'metadatas'): + return target_db.metadatas[None] + return target_db.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=get_metadata(), literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + conf_args = current_app.extensions['migrate'].configure_args + if conf_args.get("process_revision_directives") is None: + conf_args["process_revision_directives"] = process_revision_directives + + connectable = get_engine() + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=get_metadata(), + **conf_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/migrations/script.py.mako b/migrations/script.py.mako new file mode 100644 index 0000000..2c01563 --- /dev/null +++ b/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/requirements.txt b/requirements.txt index f368d53..f2c7974 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,6 @@ Flask-WTF==1.2.1 SQLAlchemy==2.0.23 Werkzeug==2.3.7 WTForms==3.1.1 -python-dotenv==1.0.0 \ No newline at end of file +python-dotenv==1.0.0 +psycopg2-binary==2.9.9 +gunicorn==21.2.0 \ No newline at end of file diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/LICENSE.rst b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/LICENSE.rst deleted file mode 100644 index 63c3617..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 WTForms - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/METADATA b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/METADATA deleted file mode 100644 index 1cf1363..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/METADATA +++ /dev/null @@ -1,50 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-WTF -Version: 1.1.1 -Summary: Form rendering, validation, and CSRF protection for Flask with WTForms. -Home-page: https://github.com/wtforms/flask-wtf/ -Author: Dan Jacob -Author-email: danjac354@gmail.com -Maintainer: Hsiaoming Yang -Maintainer-email: me@lepture.com -License: BSD-3-Clause -Project-URL: Documentation, https://flask-wtf.readthedocs.io/ -Project-URL: Changes, https://flask-wtf.readthedocs.io/changes/ -Project-URL: Source Code, https://github.com/wtforms/flask-wtf/ -Project-URL: Issue Tracker, https://github.com/wtforms/flask-wtf/issues/ -Project-URL: Chat, https://discord.gg/pallets -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst -Requires-Dist: Flask -Requires-Dist: WTForms -Requires-Dist: itsdangerous -Provides-Extra: email -Requires-Dist: email-validator ; extra == 'email' - -Flask-WTF -========= - -Simple integration of Flask and WTForms, including CSRF, file upload, -and reCAPTCHA. - -Links ------ - -- Documentation: https://flask-wtf.readthedocs.io/ -- Changes: https://flask-wtf.readthedocs.io/changes/ -- PyPI Releases: https://pypi.org/project/Flask-WTF/ -- Source Code: https://github.com/wtforms/flask-wtf/ -- Issue Tracker: https://github.com/wtforms/flask-wtf/issues/ -- Chat: https://discord.gg/pallets diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/RECORD b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/RECORD deleted file mode 100644 index 3653ab8..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -Flask_WTF-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_WTF-1.1.1.dist-info/LICENSE.rst,sha256=1fGQNkUVeMs27u8EyZ6_fXyi5w3PBDY2UZvEIOFafGI,1475 -Flask_WTF-1.1.1.dist-info/METADATA,sha256=YR-t2rpU1ZnLGjB4H_LEm3ns3EPcs8VbAxASuoaWrgE,1868 -Flask_WTF-1.1.1.dist-info/RECORD,, -Flask_WTF-1.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_WTF-1.1.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 -Flask_WTF-1.1.1.dist-info/top_level.txt,sha256=zK3flQPSjYTkAMjB0V6Jhu3jyotC0biL1mMhzitYoog,10 -flask_wtf/__init__.py,sha256=9N5z_8Nkzsla9cgqGKxlLmkgdHGuU3UI49_O2M1odr8,214 -flask_wtf/__pycache__/__init__.cpython-310.pyc,, -flask_wtf/__pycache__/_compat.cpython-310.pyc,, -flask_wtf/__pycache__/csrf.cpython-310.pyc,, -flask_wtf/__pycache__/file.cpython-310.pyc,, -flask_wtf/__pycache__/form.cpython-310.pyc,, -flask_wtf/__pycache__/i18n.cpython-310.pyc,, -flask_wtf/_compat.py,sha256=N3sqC9yzFWY-3MZ7QazX1sidvkO3d5yy4NR6lkp0s94,248 -flask_wtf/csrf.py,sha256=Z407bCLwNpqjmdh6vK162hG1dHxdrZ2kly4n-Hrbyhs,10156 -flask_wtf/file.py,sha256=SKm-Tjk9mYrP94cMnIdEOab1vvQEjfKZ1PwPzXNhH6o,3644 -flask_wtf/form.py,sha256=TmR7xCrxin2LHp6thn7fq1OeU8aLB7xsZzvv52nH7Ss,4049 -flask_wtf/i18n.py,sha256=TyO8gqt9DocHMSaNhj0KKgxoUrPYs-G1nVW-jns0SOw,1166 -flask_wtf/recaptcha/__init__.py,sha256=m4eNGoU3Q0Wnt_wP8VvOlA0mwWuoMtAcK9pYT7sPFp8,106 -flask_wtf/recaptcha/__pycache__/__init__.cpython-310.pyc,, -flask_wtf/recaptcha/__pycache__/fields.cpython-310.pyc,, -flask_wtf/recaptcha/__pycache__/validators.cpython-310.pyc,, -flask_wtf/recaptcha/__pycache__/widgets.cpython-310.pyc,, -flask_wtf/recaptcha/fields.py,sha256=M1-RFuUKOsJAzsLm3xaaxuhX2bB9oRqS-HVSN-NpkmI,433 -flask_wtf/recaptcha/validators.py,sha256=K4e_pvPoq0JBcSFXEB2XRzWbvi9LZef3ioNbS2jdNgU,2437 -flask_wtf/recaptcha/widgets.py,sha256=OWSFCZDWaLBLkNJvzyqcIbRQVBD5tUyEOijfTv0Dpjo,1503 diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/REQUESTED b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/WHEEL b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/WHEEL deleted file mode 100644 index 57e3d84..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.38.4) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/top_level.txt deleted file mode 100644 index 716f422..0000000 --- a/venv/Lib/site-packages/Flask_WTF-1.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask_wtf diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/INSTALLER b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/LICENSE b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/LICENSE deleted file mode 100644 index 7bf9bbe..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2005-2023 SQLAlchemy authors and contributors . - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/METADATA b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/METADATA deleted file mode 100644 index eab2ace..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/METADATA +++ /dev/null @@ -1,238 +0,0 @@ -Metadata-Version: 2.1 -Name: SQLAlchemy -Version: 2.0.20 -Summary: Database Abstraction Library -Home-page: https://www.sqlalchemy.org -Author: Mike Bayer -Author-email: mike_mp@zzzcomputing.com -License: MIT -Project-URL: Documentation, https://docs.sqlalchemy.org -Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Database :: Front-Ends -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: typing-extensions >=4.2.0 -Requires-Dist: greenlet !=0.4.17 ; platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))) -Requires-Dist: importlib-metadata ; python_version < "3.8" -Provides-Extra: aiomysql -Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql' -Requires-Dist: aiomysql >=0.2.0 ; extra == 'aiomysql' -Provides-Extra: aiosqlite -Requires-Dist: greenlet !=0.4.17 ; extra == 'aiosqlite' -Requires-Dist: aiosqlite ; extra == 'aiosqlite' -Requires-Dist: typing-extensions !=3.10.0.1 ; extra == 'aiosqlite' -Provides-Extra: asyncio -Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncio' -Provides-Extra: asyncmy -Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncmy' -Requires-Dist: asyncmy !=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy' -Provides-Extra: mariadb_connector -Requires-Dist: mariadb !=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector' -Provides-Extra: mssql -Requires-Dist: pyodbc ; extra == 'mssql' -Provides-Extra: mssql_pymssql -Requires-Dist: pymssql ; extra == 'mssql_pymssql' -Provides-Extra: mssql_pyodbc -Requires-Dist: pyodbc ; extra == 'mssql_pyodbc' -Provides-Extra: mypy -Requires-Dist: mypy >=0.910 ; extra == 'mypy' -Provides-Extra: mysql -Requires-Dist: mysqlclient >=1.4.0 ; extra == 'mysql' -Provides-Extra: mysql_connector -Requires-Dist: mysql-connector-python ; extra == 'mysql_connector' -Provides-Extra: oracle -Requires-Dist: cx-oracle >=7 ; extra == 'oracle' -Provides-Extra: oracle_oracledb -Requires-Dist: oracledb >=1.0.1 ; extra == 'oracle_oracledb' -Provides-Extra: postgresql -Requires-Dist: psycopg2 >=2.7 ; extra == 'postgresql' -Provides-Extra: postgresql_asyncpg -Requires-Dist: greenlet !=0.4.17 ; extra == 'postgresql_asyncpg' -Requires-Dist: asyncpg ; extra == 'postgresql_asyncpg' -Provides-Extra: postgresql_pg8000 -Requires-Dist: pg8000 >=1.29.1 ; extra == 'postgresql_pg8000' -Provides-Extra: postgresql_psycopg -Requires-Dist: psycopg >=3.0.7 ; extra == 'postgresql_psycopg' -Provides-Extra: postgresql_psycopg2binary -Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary' -Provides-Extra: postgresql_psycopg2cffi -Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi' -Provides-Extra: postgresql_psycopgbinary -Requires-Dist: psycopg[binary] >=3.0.7 ; extra == 'postgresql_psycopgbinary' -Provides-Extra: pymysql -Requires-Dist: pymysql ; extra == 'pymysql' -Provides-Extra: sqlcipher -Requires-Dist: sqlcipher3-binary ; extra == 'sqlcipher' - -SQLAlchemy -========== - -|PyPI| |Python| |Downloads| - -.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy - :target: https://pypi.org/project/sqlalchemy - :alt: PyPI - -.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy - :target: https://pypi.org/project/sqlalchemy - :alt: PyPI - Python Version - -.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month - :target: https://pepy.tech/project/sqlalchemy - :alt: PyPI - Downloads - - -The Python SQL Toolkit and Object Relational Mapper - -Introduction -------------- - -SQLAlchemy is the Python SQL toolkit and Object Relational Mapper -that gives application developers the full power and -flexibility of SQL. SQLAlchemy provides a full suite -of well known enterprise-level persistence patterns, -designed for efficient and high-performing database -access, adapted into a simple and Pythonic domain -language. - -Major SQLAlchemy features include: - -* An industrial strength ORM, built - from the core on the identity map, unit of work, - and data mapper patterns. These patterns - allow transparent persistence of objects - using a declarative configuration system. - Domain models - can be constructed and manipulated naturally, - and changes are synchronized with the - current transaction automatically. -* A relationally-oriented query system, exposing - the full range of SQL's capabilities - explicitly, including joins, subqueries, - correlation, and most everything else, - in terms of the object model. - Writing queries with the ORM uses the same - techniques of relational composition you use - when writing SQL. While you can drop into - literal SQL at any time, it's virtually never - needed. -* A comprehensive and flexible system - of eager loading for related collections and objects. - Collections are cached within a session, - and can be loaded on individual access, all - at once using joins, or by query per collection - across the full result set. -* A Core SQL construction system and DBAPI - interaction layer. The SQLAlchemy Core is - separate from the ORM and is a full database - abstraction layer in its own right, and includes - an extensible Python-based SQL expression - language, schema metadata, connection pooling, - type coercion, and custom types. -* All primary and foreign key constraints are - assumed to be composite and natural. Surrogate - integer primary keys are of course still the - norm, but SQLAlchemy never assumes or hardcodes - to this model. -* Database introspection and generation. Database - schemas can be "reflected" in one step into - Python structures representing database metadata; - those same structures can then generate - CREATE statements right back out - all within - the Core, independent of the ORM. - -SQLAlchemy's philosophy: - -* SQL databases behave less and less like object - collections the more size and performance start to - matter; object collections behave less and less like - tables and rows the more abstraction starts to matter. - SQLAlchemy aims to accommodate both of these - principles. -* An ORM doesn't need to hide the "R". A relational - database provides rich, set-based functionality - that should be fully exposed. SQLAlchemy's - ORM provides an open-ended set of patterns - that allow a developer to construct a custom - mediation layer between a domain model and - a relational schema, turning the so-called - "object relational impedance" issue into - a distant memory. -* The developer, in all cases, makes all decisions - regarding the design, structure, and naming conventions - of both the object model as well as the relational - schema. SQLAlchemy only provides the means - to automate the execution of these decisions. -* With SQLAlchemy, there's no such thing as - "the ORM generated a bad query" - you - retain full control over the structure of - queries, including how joins are organized, - how subqueries and correlation is used, what - columns are requested. Everything SQLAlchemy - does is ultimately the result of a developer-initiated - decision. -* Don't use an ORM if the problem doesn't need one. - SQLAlchemy consists of a Core and separate ORM - component. The Core offers a full SQL expression - language that allows Pythonic construction - of SQL constructs that render directly to SQL - strings for a target database, returning - result sets that are essentially enhanced DBAPI - cursors. -* Transactions should be the norm. With SQLAlchemy's - ORM, nothing goes to permanent storage until - commit() is called. SQLAlchemy encourages applications - to create a consistent means of delineating - the start and end of a series of operations. -* Never render a literal value in a SQL statement. - Bound parameters are used to the greatest degree - possible, allowing query optimizers to cache - query plans effectively and making SQL injection - attacks a non-issue. - -Documentation -------------- - -Latest documentation is at: - -https://www.sqlalchemy.org/docs/ - -Installation / Requirements ---------------------------- - -Full documentation for installation is at -`Installation `_. - -Getting Help / Development / Bug reporting ------------------------------------------- - -Please refer to the `SQLAlchemy Community Guide `_. - -Code of Conduct ---------------- - -Above all, SQLAlchemy places great emphasis on polite, thoughtful, and -constructive communication between users and developers. -Please see our current Code of Conduct at -`Code of Conduct `_. - -License -------- - -SQLAlchemy is distributed under the `MIT license -`_. - diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/RECORD b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/RECORD deleted file mode 100644 index c9b532e..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/RECORD +++ /dev/null @@ -1,524 +0,0 @@ -SQLAlchemy-2.0.20.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -SQLAlchemy-2.0.20.dist-info/LICENSE,sha256=ZbcQGZNtpoLy8YjvH-nyoobTdOwtEgtXopPVzxy6pCo,1119 -SQLAlchemy-2.0.20.dist-info/METADATA,sha256=nEFiWWNkJBol1Lb751ILyjQAvlSImwjdLuqoWTJ621A,9667 -SQLAlchemy-2.0.20.dist-info/RECORD,, -SQLAlchemy-2.0.20.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -SQLAlchemy-2.0.20.dist-info/WHEEL,sha256=Wb1el1iP4ORW7FiLElw7HfxLpDiHzwvd2B382b2Idl0,102 -SQLAlchemy-2.0.20.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 -sqlalchemy/__init__.py,sha256=mnL2g2e81Pw9K-IxeLNmqYYpQ6ZMc4_0dOUVB3lpAyk,12993 -sqlalchemy/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/__pycache__/events.cpython-310.pyc,, -sqlalchemy/__pycache__/exc.cpython-310.pyc,, -sqlalchemy/__pycache__/inspection.cpython-310.pyc,, -sqlalchemy/__pycache__/log.cpython-310.pyc,, -sqlalchemy/__pycache__/schema.cpython-310.pyc,, -sqlalchemy/__pycache__/types.cpython-310.pyc,, -sqlalchemy/connectors/__init__.py,sha256=sjPX1Mb2nWgRHLZY0mF350mGiqpi2CYBs2A1b8dh_wE,494 -sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc,, -sqlalchemy/connectors/pyodbc.py,sha256=GFZ_OqBAwQpEprwEmVVCm0imUEqw36PGv1YFOsH2Lag,8730 -sqlalchemy/cyextension/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/cyextension/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/cyextension/collections.cp310-win_amd64.pyd,sha256=7-Q6dQbt5KmaO6gtS17XhtPGx0yNiDFixx2G_Ovh9_g,173568 -sqlalchemy/cyextension/collections.pyx,sha256=UY81HxvMAD4MOFR52SjzUbLHCGGcHZDSfK6gw6AYB8A,12726 -sqlalchemy/cyextension/immutabledict.cp310-win_amd64.pyd,sha256=BLlAQZ1KNSPut7J14edvsMXDkbwSaGuNGei24P5ZfNM,72192 -sqlalchemy/cyextension/immutabledict.pxd,sha256=JsNJYZIekkbtQQ2Tz6Bn1bO1g07yXztY9bb3rvH1e0Y,43 -sqlalchemy/cyextension/immutabledict.pyx,sha256=VmhtF8aDXjEVVdA80LRY1iP85lNMwcz7vB6hZkAOGB0,3412 -sqlalchemy/cyextension/processors.cp310-win_amd64.pyd,sha256=8IJwIPDE7K7JKHp5FshSv4X-w9fv4HMO9o8nPTJqrK0,58880 -sqlalchemy/cyextension/processors.pyx,sha256=ZXuoi-hPRI9pVSbp6QbfJwy6S5kVCUZ8qj_h5-NvAFA,1607 -sqlalchemy/cyextension/resultproxy.cp310-win_amd64.pyd,sha256=3HcHkSMTU4dksuzq0v2MD7Q_BJ-c9KidQIlTwyBO28E,60416 -sqlalchemy/cyextension/resultproxy.pyx,sha256=qlk8eBpFo3UYbwQChdIWa3RqWXczuUL8ahulcLCL1bI,2573 -sqlalchemy/cyextension/util.cp310-win_amd64.pyd,sha256=5PWlHJDSaHyempijzTE4GTrYKAGOqsQOZzZjoCz1fSg,72704 -sqlalchemy/cyextension/util.pyx,sha256=H2FEg9uAAWO9UcNFyrfVuPhOznTq3h9UdjfmJ2BRD1Y,2374 -sqlalchemy/dialects/__init__.py,sha256=vUDqtIsKolzjds0KK763SAnVCCF1SGQ64zY4WNIxbwM,1847 -sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/__pycache__/_typing.cpython-310.pyc,, -sqlalchemy/dialects/_typing.py,sha256=hA9jNttJjmVWDHKybSMSFWIlmRv2r5kuQPp8IeViifY,667 -sqlalchemy/dialects/mssql/__init__.py,sha256=dvJCLhXDMkDvtAXT_26kBllhR7-geM9nrZOUxr2IG6Q,1928 -sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-310.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-310.pyc,, -sqlalchemy/dialects/mssql/base.py,sha256=D8kqfvgGhZX98rfPlpluJmJBO72wx9QM3oirzj2CqO8,137310 -sqlalchemy/dialects/mssql/information_schema.py,sha256=ufbEeGAFsciot3MmKPmFFhW95r57F_ORHULBS_UuUSw,8320 -sqlalchemy/dialects/mssql/json.py,sha256=VOrBSxJWh7Fj-zIBA5aYZwx37DJq1OrWpJqc0xtWPhQ,4700 -sqlalchemy/dialects/mssql/provision.py,sha256=hlKU-pYiCAMlLtEOjEhPr7ESgvQ4iLCAywtDXNQqZus,5142 -sqlalchemy/dialects/mssql/pymssql.py,sha256=yA5NnGBs0YSzzjnGlqMrtHKdo4XHyJ6zKcySOvAw2ZA,4154 -sqlalchemy/dialects/mssql/pyodbc.py,sha256=y4yayQokx8NWPvmod_JVI8BshoNpohfhclLxQlEhTIE,27444 -sqlalchemy/dialects/mysql/__init__.py,sha256=060B9NtuQqUb8vNXDm8bdOGUUi6SUi_757-19DDhOQM,2245 -sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/base.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/dml.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-310.pyc,, -sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc,, -sqlalchemy/dialects/mysql/aiomysql.py,sha256=xXvFyEjL613scXbU490iwK4fTegDGDojMUO565qo0iE,9831 -sqlalchemy/dialects/mysql/asyncmy.py,sha256=Ilpd6rTcXFr40iepVerDuZmni8db4tGLiK2j0B9pnII,9966 -sqlalchemy/dialects/mysql/base.py,sha256=JSYsIrsTQABPCE78llB7bYJyecJsAUlHkLBkPq4gUKw,122488 -sqlalchemy/dialects/mysql/cymysql.py,sha256=RdwzBclxwN3uXWTT34YySR0rQfTjVzZDSadhzlOqhag,2375 -sqlalchemy/dialects/mysql/dml.py,sha256=dDUvRalIG5l6_Iawkj0n-6p0NRfYfdP1wRl121qOYek,7855 -sqlalchemy/dialects/mysql/enumerated.py,sha256=whCwVR5DmKh455d4EVg2XHItfvLtuzxA5bWOWzK6Cnw,8683 -sqlalchemy/dialects/mysql/expression.py,sha256=-RmnmFCjWn16L_Nn82541wr6I3bUvvMk_6L7WhmeAK4,4206 -sqlalchemy/dialects/mysql/json.py,sha256=hZr1MD4W6BaItKT5LRStDRQbr7wcer4YdWbkh47-RTA,2341 -sqlalchemy/dialects/mysql/mariadb.py,sha256=SdFqsWMjIFwoC0bhlqksN4ju0Mnq3-iUDCKq7_idWk0,876 -sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=yajW-43yKl94IxjCCFTzJ1Amr5RRDq0wkvBm_9IGBXU,7703 -sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=8a2BZ_ChVR5HvTzonq0DtYoInD3iV4ihbA_9EbgtUxY,5845 -sqlalchemy/dialects/mysql/mysqldb.py,sha256=4ZLfGACIMD5icglEqx6jTj3W4adT_ANCV1xo5kvAHYw,9962 -sqlalchemy/dialects/mysql/provision.py,sha256=jdtfrsATv7hoMcepkMxHVG5QV2YkA92bg01CnOR9VMs,3327 -sqlalchemy/dialects/mysql/pymysql.py,sha256=f09IxnUy9HFCEnNrW-RqxvByVUREYWRpbHsa1yIPDGk,3045 -sqlalchemy/dialects/mysql/pyodbc.py,sha256=dfz0mekJDsOIvjs5utBRNltUr9YyhYuUH1rsUPb4NjI,4426 -sqlalchemy/dialects/mysql/reflection.py,sha256=4-lXatfmSjcmv7YocofW3WUvLeQV8f0qrn73H40evpg,23198 -sqlalchemy/dialects/mysql/reserved_words.py,sha256=KOR71_hBCzivGutG54Yq_K5t7dT6lgRBey0TcztWI3I,9712 -sqlalchemy/dialects/mysql/types.py,sha256=vOi0kn2OLaWTjPKTNz5xPcS-jiHRLv_l1no_oA_jdYQ,25031 -sqlalchemy/dialects/oracle/__init__.py,sha256=IghimaBtnKRrtkYdO5eFjJ5OUUGPJpYSZZJX0DIJb38,1368 -sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/dialects/oracle/__pycache__/types.cpython-310.pyc,, -sqlalchemy/dialects/oracle/base.py,sha256=Ouc583EpWEzQ25yOTeaNCXNgvwM78PDSxoP6ETT82Zw,121073 -sqlalchemy/dialects/oracle/cx_oracle.py,sha256=8HYHDRepG0X2sm2F_8VObomiaoRQzf8lnhlKNktruu8,56585 -sqlalchemy/dialects/oracle/dictionary.py,sha256=yRmt5b218G1Q5pZR5kF1ocsusT4XAgl3v_t9WhKqlko,19993 -sqlalchemy/dialects/oracle/oracledb.py,sha256=ZweQdl0ZKR3jaXowa14JBlWg1KXcabm_FWhOR4vqPsk,3566 -sqlalchemy/dialects/oracle/provision.py,sha256=i4Ja1rCJLs0jIcpzt0PfcANHHoDOSWEpxqBvWYAdOcs,8269 -sqlalchemy/dialects/oracle/types.py,sha256=vF5neW-vxJcl9nLL9x74zn05gmU-_wkCTNmF0diqqaw,7738 -sqlalchemy/dialects/postgresql/__init__.py,sha256=kx5Iwob5j2_gYXMVF2qM6qIH5DCXxw1UYXVjuCgpvys,3897 -sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/types.cpython-310.pyc,, -sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=_DTODxy9UrjvqDk20-ZjEUAYhrzRFiosaH4GHp4mnNM,5841 -sqlalchemy/dialects/postgresql/array.py,sha256=3C-g6RRWgB4Th_MV4UWpbxXo8UT2-GDRxmXowyyml5A,14108 -sqlalchemy/dialects/postgresql/asyncpg.py,sha256=ooMOPDZEF4AnOJW9Mqz4zBpkXCUzZQGJwpxQGYXgvyA,40591 -sqlalchemy/dialects/postgresql/base.py,sha256=3Zi_VZU801kJBsgrEzJC-GHG_rmCIp-v95S87uzBp48,180277 -sqlalchemy/dialects/postgresql/dml.py,sha256=jESBXHjBdT-xzHSVADNz-2ljH-4I-rjjGuhKzrkGJII,11513 -sqlalchemy/dialects/postgresql/ext.py,sha256=MdYxZshShFutBq657bDNyq68kzczovktkJeuGq-WqmM,16749 -sqlalchemy/dialects/postgresql/hstore.py,sha256=x9kAVfXLHYDQfqg6IHPUhr4dvFSsBPoMKoBhqyaF_Vo,11929 -sqlalchemy/dialects/postgresql/json.py,sha256=vrSiTBejjt54B9JSOixbh-oR8fg2OGIJLW2gOsmb0gI,11528 -sqlalchemy/dialects/postgresql/named_types.py,sha256=fsAflctGz5teUyM7h2s0Z2Na14Dtt4vEj0rzf2VtRwU,17588 -sqlalchemy/dialects/postgresql/operators.py,sha256=oe7NQRjOkJM46ISEnNIGxV4qOm2ANrqn3PLKHqj6bmY,2928 -sqlalchemy/dialects/postgresql/pg8000.py,sha256=F6P7YT5iXWq3sYDIyiP1Qxoq3PrE7zFaUnivwMdRJSQ,19284 -sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=8imUP46LsmtnVozUZa2qEtDcDHwjrYg4c2tSJsbCpfo,9169 -sqlalchemy/dialects/postgresql/provision.py,sha256=_sD_42mkypvAwDxwT6xeCGnHD5EMRVubIN5eonZ8MsQ,5678 -sqlalchemy/dialects/postgresql/psycopg.py,sha256=vcqBE7Nr9mfSRGUeg9rSz94kfWDiCco_xabLu16qQyM,22984 -sqlalchemy/dialects/postgresql/psycopg2.py,sha256=z2oVzGAfKnEIvJqEiJjb1nrsb84NaMjcHw6cWPC1PyU,32479 -sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=gITk63w4Gi4wXQxBW22a0VGVUg-oBMyfg_YgIHc5kww,1800 -sqlalchemy/dialects/postgresql/ranges.py,sha256=qrrFd9KWkaR83B69QhNQadnkQJe1u5hUf3nnCzQnf94,31206 -sqlalchemy/dialects/postgresql/types.py,sha256=HuXQ2XabYNmWRkClpHTXCaB8vbI6tzwQI7y1aNZKNEo,7240 -sqlalchemy/dialects/sqlite/__init__.py,sha256=CHJgBNgr7eufrgF-0l27xohu4N317u1IOy7Hyyrxx0o,1230 -sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/base.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/json.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc,, -sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=PiO8heyB6GXeTC4lxsptX6eKQlKvyy0s9UGeBEAdxog,11258 -sqlalchemy/dialects/sqlite/base.py,sha256=ukLGX5LR8G6GlbmzG7bGDp8QmQ5-SzUzwAN9hTBWJl8,98978 -sqlalchemy/dialects/sqlite/dml.py,sha256=KRBENBnUuZrraGSMmg2ohgQgPPcgCMCmEoKkuhn6Yq8,8674 -sqlalchemy/dialects/sqlite/json.py,sha256=IZR_pBgC9sWLtP5SXm-o5FR6SScGLi4DEMGbLJzWN8E,2619 -sqlalchemy/dialects/sqlite/provision.py,sha256=2LNwUT3zftd3WeGBJ9UsVKtwXn38KEdDxwZaJ2WXNjM,5575 -sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=F8y3R0dILJcmqUzHotYF4tLUppe3PSU_C7Xdqm4YV0o,5502 -sqlalchemy/dialects/sqlite/pysqlite.py,sha256=fKhH8ZGMW5XK1F_H9mqz7ofmR4nrsGrGdAgNMPizAEI,28644 -sqlalchemy/dialects/type_migration_guidelines.txt,sha256=gyh3JCauAIFi_9XEfqm3vYv_jb2Eqcz2HjpmC9ZEPMM,8384 -sqlalchemy/engine/__init__.py,sha256=ZlB1LVIV2GjvwyvKm2W0qVYQf51g8AiQvTkHGb1C8A0,2880 -sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/_py_processors.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/_py_row.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/_py_util.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/base.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/characteristics.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/create.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/cursor.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/default.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/events.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/interfaces.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/mock.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/processors.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/reflection.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/result.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/row.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/url.cpython-310.pyc,, -sqlalchemy/engine/__pycache__/util.cpython-310.pyc,, -sqlalchemy/engine/_py_processors.py,sha256=XuNIr2kzSay7mAWy14Aq1q2H3ZcineWY-ERfy0yvWpw,3880 -sqlalchemy/engine/_py_row.py,sha256=WASkBfwldq9LApfe1ILn93amhSc0ReihKic2lLO0gxI,3671 -sqlalchemy/engine/_py_util.py,sha256=HB-18ta-qhMrA1oNIDeobt4TtyqLUTzbfRlkN6elRb0,2313 -sqlalchemy/engine/base.py,sha256=3jNhTGA_esLDFLZOIkYWOovsyu1_yfmV-HiqKI8DoaQ,125509 -sqlalchemy/engine/characteristics.py,sha256=P7JlS02X1DKRSpgqpQPwt2sFsatm1L1hVxdvvw3u95s,2419 -sqlalchemy/engine/create.py,sha256=B1K2S_kTzfXrlOcOaPxJlxmKJWo9pbCpyAnODlJOul8,33489 -sqlalchemy/engine/cursor.py,sha256=mNuHRp9SUS-_a_99y1Gj6Bx5jWnFbPf5mn0pa9EpjgQ,76545 -sqlalchemy/engine/default.py,sha256=C0ooBrV9Tv1rsJgR3shVB1416-iL1Lg8ZlZ_GV15RAs,86235 -sqlalchemy/engine/events.py,sha256=1ujDzJrUoanwgk5nlgldti-YukWleLS3wqmt4NFW68c,38375 -sqlalchemy/engine/interfaces.py,sha256=-h2-AdHja9NLAUU7vynDBLa7HxgN6SCRMvl1XmviuOg,116234 -sqlalchemy/engine/mock.py,sha256=y6-Magp0YKkuS0SsSihT8eYxDrt7aMgpY44rbhbxEDw,4326 -sqlalchemy/engine/processors.py,sha256=GvY0nS06PrGMwgwk4HHYX8QGvIUA0vEaNAmuov08BiY,2444 -sqlalchemy/engine/reflection.py,sha256=Ob-mKkHcKHtmxwIdYV3gjPHxaO_HGSyjg_3baOgoqTc,77365 -sqlalchemy/engine/result.py,sha256=I-XjIh-TUcoN4AWk3qBpIN9fa6Tmn22lJUw2CFm26k8,80278 -sqlalchemy/engine/row.py,sha256=dM3rJY3ASx_PzFKzu7CUGErJA_aIQYx1DibLAWnzY8M,12360 -sqlalchemy/engine/strategies.py,sha256=Ryy15JovfbIMsF2sM23z0HYJ_7lXRBQlzpLacbn0mLg,461 -sqlalchemy/engine/url.py,sha256=Lxdv29vz0l-FuWuZS7Gn5uLOxR75OPW1wxQpE58OEg4,31607 -sqlalchemy/engine/util.py,sha256=YSuXV8ngYMaQy7mouAFJiin-rrtD6Pm04KZiIfM-sTs,5849 -sqlalchemy/event/__init__.py,sha256=2QcWKXnqGRkl0lroK7ei8jT2Qbt8SRn_jqlTuYXGLu0,1022 -sqlalchemy/event/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/event/__pycache__/api.cpython-310.pyc,, -sqlalchemy/event/__pycache__/attr.cpython-310.pyc,, -sqlalchemy/event/__pycache__/base.cpython-310.pyc,, -sqlalchemy/event/__pycache__/legacy.cpython-310.pyc,, -sqlalchemy/event/__pycache__/registry.cpython-310.pyc,, -sqlalchemy/event/api.py,sha256=_TjSW28so8R84M_s7gV6oMlgpvZ0MuM0fNxWEMj4BGM,8452 -sqlalchemy/event/attr.py,sha256=o-Vr3RAGxE2mCXIvlMAGWmdb4My6q-JPkNTQdCW3IpI,21079 -sqlalchemy/event/base.py,sha256=7R8MtAATdP9EybWyvlQDsnoHg5Biauxf13INBlEuLmg,15491 -sqlalchemy/event/legacy.py,sha256=e_NtSjva3NmKLhM8kaUwLk2D705gjym2lYwrgQS0r9I,8457 -sqlalchemy/event/registry.py,sha256=s7MlVn2cOPndD9pm4F7_NFE4sIP5fTGhDdSaRQV4xAU,11247 -sqlalchemy/events.py,sha256=T8_TlVzRzd0Af9AAKUPXPxROwxeux7KuNhHTG0Cxamg,553 -sqlalchemy/exc.py,sha256=qAEWjEGvoPvEdzLalZfqWSCr7D1OUh1LikZPie0Ld3s,24844 -sqlalchemy/ext/__init__.py,sha256=2ow4CHEH4B_6wyAWKh1wqEbAUXG5ia2z2zASTa0Oqdk,333 -sqlalchemy/ext/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/automap.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/baked.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/compiler.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/horizontal_shard.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/hybrid.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc,, -sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc,, -sqlalchemy/ext/associationproxy.py,sha256=Bgp1WjYLRhr8zTBv_1eHEj6eKZlTEiinqXofuzreH1A,68020 -sqlalchemy/ext/asyncio/__init__.py,sha256=Qh5SCnlKUSkm1Ko5mzlNZ3_BUuU-aFg0vnlkhEOJdOE,1279 -sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/engine.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc,, -sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc,, -sqlalchemy/ext/asyncio/base.py,sha256=BRHwuXUqxmJDYBTgaOjRzvwwzG1qn9b3JOs_6opUs-g,9300 -sqlalchemy/ext/asyncio/engine.py,sha256=lWn-w4VrZPJNvtMXOJnwKjPev6RTqygsn0sb5NBqktU,49188 -sqlalchemy/ext/asyncio/exc.py,sha256=AeGYi7BtwZGHv4ZWaJl7wzE4u8dRlzi_06V_ipNPdfU,660 -sqlalchemy/ext/asyncio/result.py,sha256=DrGcMICQThnvVH3YabnERYWONrQ3-E1oM-oVrSFT66E,31546 -sqlalchemy/ext/asyncio/scoping.py,sha256=yVbP-AqxpYASySb5SerYIYMXj97jlauonMIYWr1idGA,52440 -sqlalchemy/ext/asyncio/session.py,sha256=mdrkOinsEgiwFvyfYwad49aG_0iQTrtPMY1_V9bfUqk,63005 -sqlalchemy/ext/automap.py,sha256=VC9p8sDu_EgWfqZ6aGAfVNBuUbnq4O2MjhUfgpY7keA,63089 -sqlalchemy/ext/baked.py,sha256=vHWGGYyceArr5v-nGxgDfwVgnvUjcuGOllAZ5zb_PXI,18392 -sqlalchemy/ext/compiler.py,sha256=pno-btbT4t16LEHUkRyVX5K6ct-MsPfixO41jhUI6R4,20946 -sqlalchemy/ext/declarative/__init__.py,sha256=4a8Wl2P_BqYVYmx-HsPtt_U-NvwpVsAKtfWUSNbA2uY,1883 -sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc,, -sqlalchemy/ext/declarative/extensions.py,sha256=GcAzNVSWKg6XXFbOIG6U4vXf0e__QB_Y7XWC8d23WhY,20095 -sqlalchemy/ext/horizontal_shard.py,sha256=I8-KZiCgbtSbGww_vOD6OPzMXXRNUg9X4n1fF8EZTRo,17249 -sqlalchemy/ext/hybrid.py,sha256=u7oR4DuriIuA2vNvde31fmtgMsRkBL667L7pqdzwGaE,54039 -sqlalchemy/ext/indexable.py,sha256=F3NC4VaUkhrx4jDmaEuJLQ2AXatk9l4l_aVI5Uzazbs,11369 -sqlalchemy/ext/instrumentation.py,sha256=biLs17X8UIGzisx-jC6JOphtldi-mlfR2bfumnlar70,16175 -sqlalchemy/ext/mutable.py,sha256=3s_qKPt6It7A-7gdQxjL5p7kFE72raf0lgjimK__lFk,38471 -sqlalchemy/ext/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc,, -sqlalchemy/ext/mypy/__pycache__/util.cpython-310.pyc,, -sqlalchemy/ext/mypy/apply.py,sha256=O3Rh-FCWiWJPeUT0dVsFD_fcL5oEJbrAkB0bAJ5I7Sg,10821 -sqlalchemy/ext/mypy/decl_class.py,sha256=hfTpozOGwxeX9Vbkm12i8SawR91ngs1nfsiPC_f0PSg,17892 -sqlalchemy/ext/mypy/infer.py,sha256=BsiKdH1IvbgRGpqGzDPt1bkDXCcBjzEhQcyHdaToohs,19954 -sqlalchemy/ext/mypy/names.py,sha256=syJhY2UYcodS_NjuNdg-7ay_ZW8kf6xXMbTpMjHrdLQ,11310 -sqlalchemy/ext/mypy/plugin.py,sha256=XF1E_XqZJA-RnI_d0_FWvwFIBTyBRA95sFUP0uqUygk,10053 -sqlalchemy/ext/mypy/util.py,sha256=daH6X26-zYEBR1dnX3K5MJ946HHtgcYSH848LGT_uko,9762 -sqlalchemy/ext/orderinglist.py,sha256=xeonIRL-m5Y4vB2n_1Nab8B61geRLHR0kyC_KnXTS7k,14800 -sqlalchemy/ext/serializer.py,sha256=BhyC7ydKcKKz4vlxyU_8ranVigiGSO1hw_LieCxLCgM,6363 -sqlalchemy/future/__init__.py,sha256=Iio4lD-SrIcuBq0gP7MRgVnU4v36gIMLHiQrSKy-sPM,532 -sqlalchemy/future/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/future/__pycache__/engine.cpython-310.pyc,, -sqlalchemy/future/engine.py,sha256=4iO5THuQWIy3UGpOOMml23daun4wHdRZ6JVSwWykjJI,514 -sqlalchemy/inspection.py,sha256=tJc_KriMGJ6kSRkKn5MvhxooFbPEAq3W5l-ggFw2sdE,5326 -sqlalchemy/log.py,sha256=_31kfcLRj9dtaQs-VRMHqjPq2sGVYUeSUyO-OiafdlQ,8918 -sqlalchemy/orm/__init__.py,sha256=M1pqaRU6NQuDcycnrbkKHcKjNAo3ZbGne3MOFPK0n1o,8633 -sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/_orm_constructors.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/_typing.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/attributes.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/base.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/bulk_persistence.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/collections.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/context.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/dependency.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/events.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/exc.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/identity.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/loading.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/mapped_collection.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/properties.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/query.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/session.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/state.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/state_changes.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/strategies.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/sync.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/util.cpython-310.pyc,, -sqlalchemy/orm/__pycache__/writeonly.cpython-310.pyc,, -sqlalchemy/orm/_orm_constructors.py,sha256=5CbxrInx1FYY40QxUNytbWfHRh3X0WH7WeUYXeYOiwQ,102250 -sqlalchemy/orm/_typing.py,sha256=BmW1g-19ze_sbqF9uKlAqrPyp4jxVkmv-jjJmFpYhdg,5192 -sqlalchemy/orm/attributes.py,sha256=sjCxIVm8nVjQnPt_MDgI3-DKZz4WYOsMuLKbEeIDJLk,95458 -sqlalchemy/orm/base.py,sha256=KP34QXa9bLKPOMKHQ2Jf9bpEhTqqrbRG7uMxh7_2TLI,28459 -sqlalchemy/orm/bulk_persistence.py,sha256=_OqUjW9yi3l7VYj1564CYvc8p4CjEXsFYGDt6wR0M0I,72044 -sqlalchemy/orm/clsregistry.py,sha256=dgGogYd-ED3EUIgQkdUesequKBiGTs7csAB6Z5ROjrU,18521 -sqlalchemy/orm/collections.py,sha256=HhJOKqeaDdeYFVyFyU4blvoD6tRsXF4X7TG1xUyhbdk,53778 -sqlalchemy/orm/context.py,sha256=dmqih2qp7EkiIjp6ATihNOBTtAduYdjv8kLp2vah5EY,114925 -sqlalchemy/orm/decl_api.py,sha256=w2FWGSAgq2_T7r3g1DaaLLX9Y_AQw6UCwrTxU23EcVo,65649 -sqlalchemy/orm/decl_base.py,sha256=gGasl-rchnQxz9YcQESMe0zn201d5sFhx39Yph1trWc,83425 -sqlalchemy/orm/dependency.py,sha256=vXDcvgrY8_9x5lLWIpoLvzwuN0b-2-DwhXux1nNf0E8,48885 -sqlalchemy/orm/descriptor_props.py,sha256=fwsr88pQytZLQ8r0u-nXjgk1evU9MYtxmvgHs42gl_I,38502 -sqlalchemy/orm/dynamic.py,sha256=MWkalEIrgW0p_CRr5Uclt6Ak-jUvcpyYHaTWidIuXdc,8898 -sqlalchemy/orm/evaluator.py,sha256=lQ_uAoUBKJtQAyvhyFfHOf8gvxk0_-r4KpqQR53-COE,12293 -sqlalchemy/orm/events.py,sha256=UguRQ343Q-rGxKjPQTgqOs5uVUkW1rcLBWoOSZUHirI,130506 -sqlalchemy/orm/exc.py,sha256=k9K4M3zZvE7877TiTOI5gG4MOgnBEbKqvAsP43JU2Dk,7583 -sqlalchemy/orm/identity.py,sha256=mVaoHHtniM1-wSqJ0VPu2v6LaSJfer4_vLsxFVw8aXc,9551 -sqlalchemy/orm/instrumentation.py,sha256=VIWeAsEMveE2N-9W6mS5Lw40wwldHL_fGhln0EowEsY,25207 -sqlalchemy/orm/interfaces.py,sha256=smpV-eYelH0Eswfav_kxOFRB4VE9_Nm0BPUNDMSqYSI,49878 -sqlalchemy/orm/loading.py,sha256=qqr6wMPgP5qChbiaz4s4ea-fRNiqyc8Fu9_wj_UjfhQ,58032 -sqlalchemy/orm/mapped_collection.py,sha256=kxy8_wQPjbjEMxCEe-l5lgH9wza_JedWzcksXXjLK9E,20260 -sqlalchemy/orm/mapper.py,sha256=NGoiIjmTIK28MyvDnxgWkWdYv2e7fSUroqvoj0dPpOg,175446 -sqlalchemy/orm/path_registry.py,sha256=hvTSOojMC31-nUJFHz2DynIh4_x85QQzemn7RFTdddc,26436 -sqlalchemy/orm/persistence.py,sha256=flpr9E1BjytqAeijNJu13DiYcVf7rYUXCQce9-o4WCg,62271 -sqlalchemy/orm/properties.py,sha256=unDpqioAz2DGH-ftJrJ_V9G0QcqVeD-PzTvqbTY6bj4,27622 -sqlalchemy/orm/query.py,sha256=fp5Oe5J7_RMHBcw74ScgOLmrfEm-zkZFDiFJRTJVfP0,121046 -sqlalchemy/orm/relationships.py,sha256=1ZN1WTkSCEICtl0cRpUyIRfeF0VxvAjtjiRfQ_lMrPE,131317 -sqlalchemy/orm/scoping.py,sha256=O1-yguXL3W9Vtq8_wtC2B9Nc_0LtPB50NeOe8H6FrhA,77441 -sqlalchemy/orm/session.py,sha256=FivieQ2V4UjKP08zJij8RbiwHDqao9fbfqoO7XdIb6U,193191 -sqlalchemy/orm/state.py,sha256=UrAw3nTX9wlFoJbzKL1DXvD_KGvgfcD8xMnqzM5qO5U,38719 -sqlalchemy/orm/state_changes.py,sha256=9jHui0oF4V7xIoL8hSUiFDhHrJVPmq3doX5zxY5dR3g,7013 -sqlalchemy/orm/strategies.py,sha256=dUNlfzmWDzRb1JOG_xFisMtlmDTxeQLn4GkmBsN9b3o,117432 -sqlalchemy/orm/strategy_options.py,sha256=cBic_Tm6rwmOiHncwUC8eM3SWPcVJkHM5T4YFwSto4U,84304 -sqlalchemy/orm/sync.py,sha256=jLZWFRsn2iobdX23gQlthxhnFHQum3mWQHHcx8uj0t4,5912 -sqlalchemy/orm/unitofwork.py,sha256=Jyri2dH5VmkX7oN-XWRzzKMCjQAzvBPWWem5XQL5SYY,27829 -sqlalchemy/orm/util.py,sha256=4Mk2QOA-XjVybwEbdExpQ-9w9PKCPffYh1blvNl4CWU,82375 -sqlalchemy/orm/writeonly.py,sha256=AKgGFWiOSAvYoqvAaKA9wiOJkZ6pvCR3AM-K1I51crY,20154 -sqlalchemy/pool/__init__.py,sha256=rvWJtziqz1Yp_9NU7r-cKH1WKi8MwcjZX6kuBYu_s6s,1859 -sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/pool/__pycache__/base.cpython-310.pyc,, -sqlalchemy/pool/__pycache__/events.cpython-310.pyc,, -sqlalchemy/pool/__pycache__/impl.cpython-310.pyc,, -sqlalchemy/pool/base.py,sha256=3-o9EcxLi_D6lrd5SDR6dhBv9oiMf-JX5SD-BekG7FE,53869 -sqlalchemy/pool/events.py,sha256=dQDxP7Rwz3nDv2xkxQvkq3Eyj-00sBYIoF02lrKUHLM,13571 -sqlalchemy/pool/impl.py,sha256=FpgcyklqBciEorQq5M0XxsbZG6HD-tqrXuqxA3wEkO8,18292 -sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/schema.py,sha256=Liwt9G2PyOZZGfQkTGx7fFjTNH2o8t9kPcCAIHF9etw,3264 -sqlalchemy/sql/__init__.py,sha256=9ffSt_Gl2TJYE4_PyWxtRNfBF8yGmIV2J_CaoAyx2QQ,5965 -sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_dml_constructors.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_elements_constructors.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_orm_types.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_py_util.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/_typing.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/annotation.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/base.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/cache_key.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/coercions.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/crud.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/default_comparator.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/dml.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/elements.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/events.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/expression.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/functions.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/lambdas.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/naming.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/operators.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/roles.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/schema.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/util.cpython-310.pyc,, -sqlalchemy/sql/__pycache__/visitors.cpython-310.pyc,, -sqlalchemy/sql/_dml_constructors.py,sha256=CRI_cxOwcSBPUhouMuNoxBVb3EB0b6zQo6YSjI1d2Vo,4007 -sqlalchemy/sql/_elements_constructors.py,sha256=gSshp_t_TteDk4mvekbPBDABWDW-umShMPmjCrUrLBs,64764 -sqlalchemy/sql/_orm_types.py,sha256=WIdXTDALHCd3PuzpAPot2psv505T817wnQ3oXuGH7CU,640 -sqlalchemy/sql/_py_util.py,sha256=YCkagVa5Ov1OjCfMhUbNa527zX2NsUGPuCLEWmbQQMA,2248 -sqlalchemy/sql/_selectable_constructors.py,sha256=kHsJViBwydt3l-aiqtI2yLK4BgjEsVB9lpKPuWSWv60,19454 -sqlalchemy/sql/_typing.py,sha256=WSEwGys86fVA_WAY6Nbu1Qn3Zam25Togi-OxM7Nlu2E,12724 -sqlalchemy/sql/annotation.py,sha256=2c7wyGxH2gk9TIZELK3x8OSbQBKE4MGAFEWv3hefIbI,18881 -sqlalchemy/sql/base.py,sha256=d7sIYp0XUH6FPqbehP5VC_8o31PuamwQgBILiotwE3o,76137 -sqlalchemy/sql/cache_key.py,sha256=AaPpvFDwYMfGixEmEto02flVKyf4UifGdNbu2Z4rfMc,33773 -sqlalchemy/sql/coercions.py,sha256=YXSGtgtUIJeDPPjtBpFA2PuZ0bP-x8E6N01OIDWJvxw,41959 -sqlalchemy/sql/compiler.py,sha256=G1Vv0zq1RSjJe0fKE0ih8UXUMCKIljBHqbw-BSoBLqg,276204 -sqlalchemy/sql/crud.py,sha256=rJ9U55a0oVH5cl4Su5mwCpS6UogZsz1ue6bNvEShrMc,57295 -sqlalchemy/sql/ddl.py,sha256=J9wtcvAfh2E08Fg-bjr_TWQGmYWWn4vSr5VFJPxThk4,47069 -sqlalchemy/sql/default_comparator.py,sha256=-sSDLcxHfL4jgIh5f_g2-8wOGazDHhTPyB0pA9Gr_Uk,17212 -sqlalchemy/sql/dml.py,sha256=vzOpq8TqhdYN7jfla27c4pQITdO0IPcKdV5y92vjONM,67380 -sqlalchemy/sql/elements.py,sha256=90qmYcYRdwEI_E4dREe98AXIUO7pAoyZ3D4pSq5KEko,176494 -sqlalchemy/sql/events.py,sha256=ELMw8mkKUvVVeb354hfD_9Fk-KSX28hCfNdnMgnv2zI,18756 -sqlalchemy/sql/expression.py,sha256=bD-nG9OxLmhgvKkCKFpMtycxq8szzUsxhDeH3E9WmkQ,7748 -sqlalchemy/sql/functions.py,sha256=YMkPdiSBZnrA4ZrcolA58w1nsoEQbwrL38kMKwiLZP0,56289 -sqlalchemy/sql/lambdas.py,sha256=lKggh8EyKJThwop8ulclAcMzJh4gydSTwEL8cyMCN10,50759 -sqlalchemy/sql/naming.py,sha256=3J_KScJBe7dPY4Stj5veIzGfSnaWG9-f7IGbxhc7luE,7077 -sqlalchemy/sql/operators.py,sha256=nqVC7ggPHfwF4QFMZz7uk0WvPUdxw7s92jjTGkgLJzs,78483 -sqlalchemy/sql/roles.py,sha256=Rkbx36tMWkq6uu6bl1DMDkLQY8VFpKZtqfmYxooE8MQ,7952 -sqlalchemy/sql/schema.py,sha256=5oaelPn8oUFB9b7XYJ4OjNqPhWQXvKie3UoReB0KfgY,233840 -sqlalchemy/sql/selectable.py,sha256=QCeqrL6dU1-ZncSO3z0G5KksghMZyanAm6Egtj_5Xak,239710 -sqlalchemy/sql/sqltypes.py,sha256=HsFU48oRsD-bLDSHim6LVcyZUpkPxK2eB-MUllRBZyg,129894 -sqlalchemy/sql/traversals.py,sha256=3s9dNBNwsrpg57x0vxF5J-bdeZpzURGEbfpUhaCt1wU,34622 -sqlalchemy/sql/type_api.py,sha256=QcUD2j49soLl07LQVHdDilZ1kUkRC_USwJx8xI6Qcyg,87359 -sqlalchemy/sql/util.py,sha256=5UCudam-vT7lMoYKv2juS483vjdiY2kcFejfjk17KlI,49770 -sqlalchemy/sql/visitors.py,sha256=1jPX8S1C6pFovW0HWkliVsI0BD0tmEUN8GYZ0F5Di6o,37534 -sqlalchemy/testing/__init__.py,sha256=I_4C9vgF-GRODJ_IRNxIXXSQHgUDNVggGFFv6v0BJBQ,3221 -sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/assertsql.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/config.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/engines.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/entities.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/pickleable.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/profiling.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/provision.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/requirements.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/schema.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/util.cpython-310.pyc,, -sqlalchemy/testing/__pycache__/warnings.cpython-310.pyc,, -sqlalchemy/testing/assertions.py,sha256=K_wIe570kI6xbtZmWMnLiuhBaCFyoQx-iaau9CR1PLI,32428 -sqlalchemy/testing/assertsql.py,sha256=F8R_LgsUiZ31sgkCigFbxFcVOzt57EI1tRSHgk88CjQ,17290 -sqlalchemy/testing/asyncio.py,sha256=7LatmcAk09IVuOMWcAdpVltLyhDWVG1cV7iOaR6soz0,3858 -sqlalchemy/testing/config.py,sha256=L5Z7Inl6th23xpuVDo6Fhn3ItMca0yBT6YofkYRZiKI,11397 -sqlalchemy/testing/engines.py,sha256=mTwCxPdb6K8S2y-O7dcJwO5kEE4qIAU8Kp6qawiP2TM,13824 -sqlalchemy/testing/entities.py,sha256=E7IkhsQaziZSOZkKkFnfUvB0165SH5MP1q4QkGKdf98,3471 -sqlalchemy/testing/exclusions.py,sha256=rWyo1SZpZ-EjNkvr-O085A3XSAqxSL5uqgOE4L5mzM0,12879 -sqlalchemy/testing/fixtures/__init__.py,sha256=SHlEUIlUaqU2xjziZeBDL1Yd_URWou6dnZqG8s-Ay0g,1226 -sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/testing/fixtures/__pycache__/base.cpython-310.pyc,, -sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-310.pyc,, -sqlalchemy/testing/fixtures/__pycache__/orm.cpython-310.pyc,, -sqlalchemy/testing/fixtures/__pycache__/sql.cpython-310.pyc,, -sqlalchemy/testing/fixtures/base.py,sha256=HQPgUuOnBVNUm9l7dcoT4AuggG0jXW4a23dVZhbSA9k,12622 -sqlalchemy/testing/fixtures/mypy.py,sha256=TGTo8x02m9Qt10-iRjic_F66-uA2T82QbKYmpUyVzCw,12153 -sqlalchemy/testing/fixtures/orm.py,sha256=VZBnFHHfQpVdLqV-F9myH886uq3clDIzixMwEe5TjMc,6322 -sqlalchemy/testing/fixtures/sql.py,sha256=1c2omUuUSRlWNYtKr3ADJFaQeFnq1EnQtKTKn67B-2Q,16196 -sqlalchemy/testing/pickleable.py,sha256=_E141_vPqtE-H_6cNBnWRDuMtvjeeBKovOI2_P9KJGQ,2988 -sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/testing/plugin/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-310.pyc,, -sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-310.pyc,, -sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc,, -sqlalchemy/testing/plugin/bootstrap.py,sha256=3WkvZXQad0oyxg6nJyLEthN30zBuueB33LFxWeMBdKc,1482 -sqlalchemy/testing/plugin/plugin_base.py,sha256=300KMijfgPiKFbjj1F_6Dj6HAH8T-EuHuX3CQ6Z1m00,22110 -sqlalchemy/testing/plugin/pytestplugin.py,sha256=IYmAr-FaAODCInWpnKJCNGw03cyRJK5YcZ07hrmtSNg,28151 -sqlalchemy/testing/profiling.py,sha256=BLknvjemW8oDl0aCSUXQw_ESgoFfx0RoeQYclzhNv0Q,10472 -sqlalchemy/testing/provision.py,sha256=fnmlxUacztdUcZOPTiSJ-rYe-tpIwyl8O97YRI24FLk,14686 -sqlalchemy/testing/requirements.py,sha256=qc5zgxUJGmpZjKO4pVSDlKOYs_f8_W7KienkLgoJJZ4,52702 -sqlalchemy/testing/schema.py,sha256=O76C-woOcc6qjk1csf9yljor-6wjRZzKQNrXdmLLtw8,6737 -sqlalchemy/testing/suite/__init__.py,sha256=u3lEc0j47s7Dad_2SVWOZ6EU2aOMRWqE_WrQ17HmBsA,489 -sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_insert.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_types.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc,, -sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc,, -sqlalchemy/testing/suite/test_cte.py,sha256=RFvWCSmmy3-JEIXIcZEkYpjt_bJQTe7SvfnpXeUFl9o,6410 -sqlalchemy/testing/suite/test_ddl.py,sha256=VQuejaNUMN484DxwkYL57ZEnPY5UhNGWkQVgquPrWHA,12168 -sqlalchemy/testing/suite/test_deprecations.py,sha256=8mhjZyrECXiVyE88BJLbyj4Jz_niXOs6ZOXd9rFAWsk,5229 -sqlalchemy/testing/suite/test_dialect.py,sha256=C3aUUd16iS19WJrqZLGkG4DPhWMAADTCfTDkYYlUz5U,23407 -sqlalchemy/testing/suite/test_insert.py,sha256=NVPw5lMxNSY99E7p_YZ2bBJG2C4SBCGv2nPyQtrxQnk,17948 -sqlalchemy/testing/suite/test_reflection.py,sha256=si5nXSHcBWJRrcFC-0sto1m9jXf6hYwlYuQ43YqXiJo,107540 -sqlalchemy/testing/suite/test_results.py,sha256=fl8qv9YdcEqSQFe1fDf7vrFk7Cam_MzJiETLzx5KYuU,16127 -sqlalchemy/testing/suite/test_rowcount.py,sha256=ID2Y1jDZ1MjQyZldWQPt40qD2eu0haTaYB2AdWQ1Nnk,6356 -sqlalchemy/testing/suite/test_select.py,sha256=3SCpfuy-D0q0l4elRNgMc0KlIjo3Nh1nGHo0uEZKAUo,60207 -sqlalchemy/testing/suite/test_sequence.py,sha256=WqriMWJTPnmCBydP5vehSD2zXxwSyFGug_K2IyEIRSY,9983 -sqlalchemy/testing/suite/test_types.py,sha256=NObEx25I9LQdMaW470ACm4w9fWRVYf9B0i1VafrOhGQ,63791 -sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=1n0xf7EyGuLYIMiwc5lANGWvCrmoXf3gtQM93sMcd3c,6070 -sqlalchemy/testing/suite/test_update_delete.py,sha256=cj9C7U8MFxMSfdckAdODQHsnqwOtU112zqk5U8iyCTM,1710 -sqlalchemy/testing/util.py,sha256=QH355pEJeqUn4h2LPTleNGinD50hE40R1HRW2LEXF6U,14599 -sqlalchemy/testing/warnings.py,sha256=ymXClxi_YtysQJZZQzgjT-d3tW63z4pOfKJsTqaBLMQ,1598 -sqlalchemy/types.py,sha256=bV5WvXIjsG-bWRcwCVACJ6m3tlSMS5XNdtXVXGTMeI8,3244 -sqlalchemy/util/__init__.py,sha256=NILyXDswLeG8lpxsPh2iIOs4BweaFz7tbn3wQ0-hK5c,8404 -sqlalchemy/util/__pycache__/__init__.cpython-310.pyc,, -sqlalchemy/util/__pycache__/_collections.cpython-310.pyc,, -sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-310.pyc,, -sqlalchemy/util/__pycache__/_has_cy.cpython-310.pyc,, -sqlalchemy/util/__pycache__/_py_collections.cpython-310.pyc,, -sqlalchemy/util/__pycache__/compat.cpython-310.pyc,, -sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc,, -sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc,, -sqlalchemy/util/__pycache__/langhelpers.cpython-310.pyc,, -sqlalchemy/util/__pycache__/preloaded.cpython-310.pyc,, -sqlalchemy/util/__pycache__/queue.cpython-310.pyc,, -sqlalchemy/util/__pycache__/tool_support.cpython-310.pyc,, -sqlalchemy/util/__pycache__/topological.cpython-310.pyc,, -sqlalchemy/util/__pycache__/typing.cpython-310.pyc,, -sqlalchemy/util/_collections.py,sha256=yUsrZu5aQh0lK_ht3540KXsoaM-lz4nqK1gHXx29lBc,21124 -sqlalchemy/util/_concurrency_py3k.py,sha256=LhS5ppk9UGJ2P36rbHaauV3hl57p1Zw_b3SzLkkOiTE,8544 -sqlalchemy/util/_has_cy.py,sha256=7V8ZfMrlED0bIc6DWsBC_lTEP1JEihWKPdjyLJtxfaE,1268 -sqlalchemy/util/_py_collections.py,sha256=lwf6V7hnvqP_88eVKZa6GqshDxyBkhPczaIhpfrXE-Y,17217 -sqlalchemy/util/compat.py,sha256=xwPQl5QoV9Nrje-ZD_csX0penWXrhFi667v5WMdloB8,9416 -sqlalchemy/util/concurrency.py,sha256=rLb4LbPSTnGaSb381_e3VwHbEjqiF10lkarFjihywTY,2353 -sqlalchemy/util/deprecations.py,sha256=JMG1QpXb_HhCssZBkm0_vvCSWiCMIbAwIlULtP4DNgs,12514 -sqlalchemy/util/langhelpers.py,sha256=iJO7hWDKfeAndgu6iDcWRx3tMmbNquzSnxDruMK6130,67147 -sqlalchemy/util/preloaded.py,sha256=tMuj_6GELLQj1I8YRAKu--VLnxI9kH8Si_IwlDfre4M,6055 -sqlalchemy/util/queue.py,sha256=-DPCfkQgtqP9znBvm3bRdYjAWs4dysflpL805IMf22A,10529 -sqlalchemy/util/tool_support.py,sha256=SOfhWXzZXqx5RYX9WM_CeBJGGgV0eaxpv96VFb5KEKs,6167 -sqlalchemy/util/topological.py,sha256=-i2pX8AD9hjaqpLDu5P3R5w6D8_t5nDWlwLI6xXYyyc,3578 -sqlalchemy/util/typing.py,sha256=yFUquXzDGUuoyn4idoBkIsqjF_2noHM34DDInh2uERs,16207 diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/REQUESTED b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/WHEEL b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/WHEEL deleted file mode 100644 index ec555de..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.1) -Root-Is-Purelib: false -Tag: cp310-cp310-win_amd64 - diff --git a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/top_level.txt b/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/top_level.txt deleted file mode 100644 index 39fb2be..0000000 --- a/venv/Lib/site-packages/SQLAlchemy-2.0.20.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -sqlalchemy diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/INSTALLER b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/LICENSE.rst b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/METADATA b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/METADATA deleted file mode 100644 index f0cb56c..0000000 --- a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/METADATA +++ /dev/null @@ -1,104 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-SQLAlchemy -Version: 3.0.5 -Summary: Add SQLAlchemy support to your Flask application. -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Dist: flask>=2.2.5 -Requires-Dist: sqlalchemy>=1.4.18 -Project-URL: Changes, https://flask-sqlalchemy.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-sqlalchemy/issues/ -Project-URL: Source Code, https://github.com/pallets-eco/flask-sqlalchemy/ - -Flask-SQLAlchemy -================ - -Flask-SQLAlchemy is an extension for `Flask`_ that adds support for -`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy -with Flask by providing useful defaults and extra helpers that make it -easier to accomplish common tasks. - -.. _Flask: https://palletsprojects.com/p/flask/ -.. _SQLAlchemy: https://www.sqlalchemy.org - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Flask-SQLAlchemy - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -.. code-block:: python - - from flask import Flask - from flask_sqlalchemy import SQLAlchemy - - app = Flask(__name__) - app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" - db = SQLAlchemy(app) - - class User(db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String, unique=True, nullable=False) - - with app.app_context(): - db.create_all() - - db.session.add(User(username="example")) - db.session.commit() - - users = db.session.execute(db.select(User)).scalars() - - -Contributing ------------- - -For guidance on setting up a development environment and how to make a -contribution to Flask-SQLAlchemy, see the `contributing guidelines`_. - -.. _contributing guidelines: https://github.com/pallets-eco/flask-sqlalchemy/blob/main/CONTRIBUTING.rst - - -Donate ------- - -The Pallets organization develops and supports Flask-SQLAlchemy and -other popular packages. In order to grow the community of contributors -and users, and allow the maintainers to devote more time to the -projects, `please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://flask-sqlalchemy.palletsprojects.com/ -- Changes: https://flask-sqlalchemy.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Flask-SQLAlchemy/ -- Source Code: https://github.com/pallets-eco/flask-sqlalchemy/ -- Issue Tracker: https://github.com/pallets-eco/flask-sqlalchemy/issues/ -- Website: https://palletsprojects.com/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/RECORD b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/RECORD deleted file mode 100644 index de77aad..0000000 --- a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -flask_sqlalchemy-3.0.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask_sqlalchemy-3.0.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask_sqlalchemy-3.0.5.dist-info/METADATA,sha256=TP2sMyz9YuKRrcMbnrPjSC0A3NWysepDoNhKaPc_efI,3264 -flask_sqlalchemy-3.0.5.dist-info/RECORD,, -flask_sqlalchemy-3.0.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy-3.0.5.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask_sqlalchemy/__init__.py,sha256=7toyeeZoZtSxWWqUTZGMiwIgyzTPhyDaCSMGSkUd-Vs,1250 -flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/cli.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/extension.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/model.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/pagination.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/query.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/record_queries.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/session.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/table.cpython-310.pyc,, -flask_sqlalchemy/__pycache__/track_modifications.cpython-310.pyc,, -flask_sqlalchemy/cli.py,sha256=pg3QDxP36GW2qnwe_CpPtkRhPchyVSGM6zlBNWuNCFE,484 -flask_sqlalchemy/extension.py,sha256=K_PMP0TlxSptgJqsK7Owq2DB20R0KkjgVolbZUbzwhA,38293 -flask_sqlalchemy/model.py,sha256=LvR7sWR_9I5EYkKFs9U7r00W57hzg7wbXF-CXrYA9tw,7112 -flask_sqlalchemy/pagination.py,sha256=JFpllrqkRkwacb8DAmQWaz9wsvQa0dypfSkhUDSC2ws,11119 -flask_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy/query.py,sha256=Uls9qbmnpb9Vba43EDfsRP17eHJ0X4VG7SE22tH5R3g,3748 -flask_sqlalchemy/record_queries.py,sha256=DhEhgKRdTzT63Ti399BG_tzy9tLlyx9efA00FgPLFxc,4306 -flask_sqlalchemy/session.py,sha256=e3oOf2gClNJrXJ5o5kHsTjTO5MQsah_uNFMtQHi_LjI,3189 -flask_sqlalchemy/table.py,sha256=wAPOy8qwyAxpMwOIUJY4iMOultzz2W0D6xvBkQ7U2CE,859 -flask_sqlalchemy/track_modifications.py,sha256=yieyozj7IiVzwnAGZ-ZrgqrzjrUfG0kPrXBfW_hStSU,2755 diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/REQUESTED b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/WHEEL b/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/venv/Lib/site-packages/flask_sqlalchemy-3.0.5.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__init__.py b/venv/Lib/site-packages/flask_sqlalchemy/__init__.py index 5d530cf..c2fa059 100644 --- a/venv/Lib/site-packages/flask_sqlalchemy/__init__.py +++ b/venv/Lib/site-packages/flask_sqlalchemy/__init__.py @@ -4,43 +4,23 @@ import typing as t from .extension import SQLAlchemy -__version__ = "3.0.5" - __all__ = [ "SQLAlchemy", ] -_deprecated_map = { - "Model": ".model.Model", - "DefaultMeta": ".model.DefaultMeta", - "Pagination": ".pagination.Pagination", - "BaseQuery": ".query.Query", - "get_debug_queries": ".record_queries.get_recorded_queries", - "SignallingSession": ".session.Session", - "before_models_committed": ".track_modifications.before_models_committed", - "models_committed": ".track_modifications.models_committed", -} - def __getattr__(name: str) -> t.Any: - import importlib - import warnings - - if name in _deprecated_map: - path = _deprecated_map[name] - import_path, _, new_name = path.rpartition(".") - action = "moved and renamed" - - if new_name == name: - action = "moved" + if name == "__version__": + import importlib.metadata + import warnings warnings.warn( - f"'{name}' has been {action} to '{path[1:]}'. The top-level import is" - " deprecated and will be removed in Flask-SQLAlchemy 3.1.", + "The '__version__' attribute is deprecated and will be removed in" + " Flask-SQLAlchemy 3.2. Use feature detection or" + " 'importlib.metadata.version(\"flask-sqlalchemy\")' instead.", DeprecationWarning, stacklevel=2, ) - mod = importlib.import_module(import_path, __name__) - return getattr(mod, new_name) + return importlib.metadata.version("flask-sqlalchemy") raise AttributeError(name) diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-310.pyc index 7ad8a8ec6301f62945dfd510df816bd7c63314a2..5f20b5659d45e788ffa8a819a996ea2859222d78 100644 GIT binary patch literal 880 zcmZWnO>Yx15VgIZO%sGF;J|6sOV~rV5^zElqH5s)RV7pkQnZrg#M5*e?+3P%k}ACb z*Zv1M_Qe13l~eyhIe?wCv;wcz9*^yr_ufq1>9mj?KSt|^X9S_2ZgYEhcJl%ute#qf zBaQ_saSvl>6G3_&_qZ?oGUx@?7YuPPY2WwqcE#g*GDc zAtxLObc*LIJ|#19M7XCdNFJPd7|rmJ|1IF*cf5ymI746XXPid6W|`6nNM*56DqW_N z^LK}kbZ@!43Da5@{jr9mPzi@d!hmVu39EQ=TnLf$A(2ql6YDFgCx)JJeK+>*g~w;v};o+4UA_O zws211meOo65-CaaAK0^gKTR38g^=(PoSFQ zJ4HWNg@(1p@?b+y`J4s4p}kINQ5BlfteLu+4XscX38ihDN4aD%cArlOCLY1zuXYp@ z`M@5e{v4wWtt}%r#m*a>7NrMcR}Ncwr=$t>w6T&Htj!X9(ong!SafGZDHFn8bP?y| eZcX>y<9MU2`B=bn*F?&}YNMF63Gw{jcY;5bzx!|i literal 1393 zcmZ`(OOG5i5VqZq>3Qrcf<${D^Z~RQDcd26azO~OWZ?jt6=4ZTt&uFx*fY~?zhZl4 znO4t*zy*n407%J^zvLsF_8*`X5|q1llT`$6O}YHZuKLRLd5VpV9)d9@cjte&2>odn z*GCr?A0dR*F*qD?oT3cJ7+asDBzCyN-PFyz*aOUqeeTb2+~FM_@GkH1J|FN6zR9)d7j2E*j?(xn^GRs+-Ci(1=XMF2_D8<{a zXE$!nGGQF0rSYZE3z=VdIy%T#6WfccVWnVy53L-20*7OcQnbd+jMt<_nkNf#IwdmXF8JhImwPq(1#!RbfbG-{$OipLb}iQZt)o3F zp`RU$YW&=)`1S{p!T1Egmkw?&+zwnI5?J;s=-mUlNC$BLzeSU3R@UAUISg= zy{f+#&Y23wLgZoPg}Mm$qyq=5FZZJGtGNKA+)u?)q+ybkh16l9LM}?s1%q}rQO}Yz zg$NM6&6MQfrzumX`>zBW-jD7@=L7Ru*rC##V1l0 za@ds~kdm9$Y=JRu$@Dz#Uk0)ZgQ*E}an{5#KASWo9LVuIl5fG8izg4?A3ae*s?q1g zSd0#ZI)!T+eJx~J=+DGap+`%RFGokoc%%|7_DiUr&4e0F?LATTG-d6>zDsG6Cz{fz zT$w(lm$WI}g*++*6JYpAfVZ&=vx{AF8xumX|M$S}0V3aqO+&XW%LiX}tO+dIGd)VD z3(zy%iL~7?zFw7Z;|6Qf72j!*+o#?9uh{fUs0r5g0x5;p1gExbG@GL-{hGOL!v!C- dSO1|EU&D8R0x}>jA&&bG@d&>D`G0K={soPNq0ayS diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-310.pyc b/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-310.pyc index 45c402a8cac7d280278a3fe8a9f6354e8217f075..e5454dc5bec44f817fc85bf8e0589167c2269a06 100644 GIT binary patch delta 19 Zcmey%_Lq$-pO=@50SMM-Z{#Xw1^_n71n&R< delta 19 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 Uk4i$Fe)Yc*y51bqwO0NA0PjMu`v3p{ delta 8798 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 diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/model.cpython-310.pyc b/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/model.cpython-310.pyc index f21b73d25569b01f2e38f05d2c9cba50008c0ce8..6afbfbedc200d9cbbc9723b1e0567bb074d3d3f5 100644 GIT binary patch delta 4075 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 D{BdeF delta 2171 zcmah~O>7%Q6rPz~uh$#Lb!^9p^V2vaZQrbn;YLl6!NuAi8 z-4qf91>vBI3L(l|5kJQW4nQtFfasA6NQm2t0}>Y`jul8Cq43_gPD1&!G@swRH~W6R zH$S(>ems<_G&eg0ev@q9m9IK)rMl?tTYGN|idJ>%8Mem%PC2MqijjS1w8Hn;_83(OQ zAfz;?HyK~K%Rn~SQr>%ZLCD1kS*Z#cE)II$veI5{=Jeh&{ksT6~hLovLS#OOH$KF(v+dzHfCZn z2l~&<_b6>w@5j1n+xi!=ETu*Dt(Du46_pH`hQBBlgnlR@R=v6{4%Qyoo+m|BdfupN zjSsaI@gqlSHab9-od{j(QoLiV4Mj{z_8{y>(7A4brW2FuhY=vJ4rFcHj3#4@rc4;N z%&p&vzlAA3ljwz9uO&{zqzy~e=ZV$yK@g&Z=Y{@cS$LkSCY=6!J1E_hH|Jj!-kb=1 z?uWiSsNQh8CJuo~4kJ8*fVFF4>~y ze+p3L%nj=){A5J^mKi#uyRYX*Q8|k6xHbcnV)Y}s<$aTQsf+n5p;En+ZZcfA>+I$25*3=rZqX;R!HI!_end zchIt_O;aqBmQ84^*D|1f>fEz(6XwfgmV7`tqy#VWWx7ljNcAXM8!@U!aW$-q z*IHPTBng9y@+{#t+|-HnAG)SlLf@5eZ%nB1p042%i`d})h)!;+S2LU#nHKZn<*Gb# z8w;k~$kpyWh#?)F(ZK6^R`@2c+tD;^u~)%`eL5K#~&(7XaL5F5omu!970= zrMw8b601}7JTBUzS|5~?p!*m`uoEDkOj3KpG#utoMl;N!Hr$VFBgyPPQl=$was4C| z)rHf@ja)zY0VXX32mk;8 diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-310.pyc b/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-310.pyc index 76330f28157b516f8f63cac880d0e7780d767538..293fe3cf89ca9e6a6eff3a0317122f2211eefc32 100644 GIT binary patch delta 409 zcmbQOGD(gvpO=@50SMM->t`I`-N?6>jnQNB88#b1{uG`R-WHZ-#wfNFzF-DTfz5{O za!mYwnoLFPK=nmJKthv!auko>GX<2`Zn5Mg=B7@bARx`E4wMX=yg|U)8N`D5o&&^YDN+DZMT#H- z941O2Q8tJ{S|Cxddj$~kll25u7>yN&kgb?*at=GlP?OovPy8V^05N| DmtIE^ delta 1151 zcmb7C&1=*^6wgeu*=;r(%i2#r>Qr0T1x@|_KtZG;Sfn7e2)(S?ooTz>G^vwR?XqP- ziw8jw=U4>2D1sO9?AePa4%)lPkG!hMgzzNrUZI!gh0^u~KT<6APooFp>L5CcfNr~ajMyVDCvA7qPSUqA= z1m2?HEDl-84{Kgr4}+4+Zp;f7`kbK=-MCniq77zn^#acB)_tE<1%xk#cR*JU*cIQ4 z8b_wCU%TYj=EdR)JK-L4zhjkeNMc2?S8MpXqfRH;TUss>lJzQG-%KVVgfqvstWMUlwxZYA_qR8?K4o5G#pZ z58}iOs|%tQ*RZP1Wq`27<8k=e;E{6LB7@qh-lD*#-qP1KZag2-f!GW;k=R&oX)XN$ z1#+_;a^I*&_O5nwHLU?inGKOVk8uy$2Y#Z%EC^#z#LG**aM`smY%DLa>I(RBac_(1 z|0kMFM}n2`Mz`IxV6;IL3y-^U7jz_d1C)&pkN8yNK7b@UCt@#-C0J6LhtYyuCkD

R3M-pi^WQ18Wd3vK#srw2n>LjzdA#(Cd_8vwkd3jnuLL7F=-KCQ|?9C zkm=?7(U^K1Ky8=0(lu!^RF>4!uHijcrllD)XT!beN2yJyZWAZ3K6ZU2u6kkZ?yrJd zgmW#DJ|a(JJOfZ)totqs@+`vN?a7m%n}Z#h046brP31}TF#m%bQn&2^Do4~y`)%pAsc-{I$N|DiVUlF1Wv*eaVJu@TvMFI-z>xyviOgn5 zVVTRkkgT<7bslJ u1SEKvicEl%CL2Vj7LX0mt_@;=!mvmOB+mq48%?(0S;A;C`7Vz=qYMDNC{6nS delta 246 zcmeB|o-4(d&&$ij00c=)`WdA>8~Fk_S&Kx0{K@5jJhEAa6E93iDj%g^W#% zHH?0%R650SO+aA|oKB$p%pfa&M6oh|mHNApaC;0|`wg2-{%tDxM{bMw9({ H?HPpu|IjV~ diff --git a/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-310.pyc b/venv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-310.pyc index e69a303bd480b4997ab657a23156625596bcd68a..4408fb2ba52fc140190bb400a7716361b8c5915e 100644 GIT binary patch delta 19 ZcmdnYwV8`6pO=@50SMM-Z{*Ts1pq8q1RDSV delta 19 ZcmdnYwV8`6pO=@50SJ list[t.Type[t.Union[sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta]]]: + return [ + b + for b in model_class.__bases__ + if issubclass(b, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + ] + + class SQLAlchemy: """Integrates SQLAlchemy with Flask. This handles setting up one or more engines, associating tables and models with specific engines, and cleaning up connections and @@ -66,6 +98,18 @@ class SQLAlchemy: :param add_models_to_shell: Add the ``db`` instance and all model classes to ``flask shell``. + .. versionchanged:: 3.1.0 + The ``metadata`` parameter can still be used with SQLAlchemy 1.x classes, + but is ignored when using SQLAlchemy 2.x style of declarative classes. + Instead, specify metadata on your Base class. + + .. versionchanged:: 3.1.0 + Added the ``disable_autonaming`` parameter. + + .. versionchanged:: 3.1.0 + Changed ``model_class`` parameter to accepta SQLAlchemy 2.x + declarative base subclass. + .. versionchanged:: 3.0 An active Flask application context is always required to access ``session`` and ``engine``. @@ -100,11 +144,6 @@ class SQLAlchemy: .. versionchanged:: 3.0 Removed the ``use_native_unicode`` parameter and config. - .. versionchanged:: 3.0 - The ``COMMIT_ON_TEARDOWN`` configuration is deprecated and will - be removed in Flask-SQLAlchemy 3.1. Call ``db.session.commit()`` - directly instead. - .. versionchanged:: 2.4 Added the ``engine_options`` parameter. @@ -129,9 +168,10 @@ class SQLAlchemy: metadata: sa.MetaData | None = None, session_options: dict[str, t.Any] | None = None, query_class: type[Query] = Query, - model_class: type[Model] | sa_orm.DeclarativeMeta = Model, + model_class: _FSA_MCT = Model, # type: ignore[assignment] engine_options: dict[str, t.Any] | None = None, add_models_to_shell: bool = True, + disable_autonaming: bool = False, ): if session_options is None: session_options = {} @@ -173,8 +213,17 @@ class SQLAlchemy: """ if metadata is not None: - metadata.info["bind_key"] = None - self.metadatas[None] = metadata + if len(_get_2x_declarative_bases(model_class)) > 0: + warnings.warn( + "When using SQLAlchemy 2.x style of declarative classes," + " the `metadata` should be an attribute of the base class." + "The metadata passed into SQLAlchemy() is ignored.", + DeprecationWarning, + stacklevel=2, + ) + else: + metadata.info["bind_key"] = None + self.metadatas[None] = metadata self.Table = self._make_table_class() """A :class:`sqlalchemy.schema.Table` class that chooses a metadata @@ -192,7 +241,9 @@ class SQLAlchemy: This is a subclass of SQLAlchemy's ``Table`` rather than a function. """ - self.Model = self._make_declarative_base(model_class) + self.Model = self._make_declarative_base( + model_class, disable_autonaming=disable_autonaming + ) """A SQLAlchemy declarative model class. Subclass this to define database models. @@ -204,9 +255,15 @@ class SQLAlchemy: database engine. Otherwise, it will use the default :attr:`metadata` and :attr:`engine`. This is ignored if the model sets ``metadata`` or ``__table__``. - Customize this by subclassing :class:`.Model` and passing the ``model_class`` - parameter to the extension. A fully created declarative model class can be + For code using the SQLAlchemy 1.x API, customize this model by subclassing + :class:`.Model` and passing the ``model_class`` parameter to the extension. + A fully created declarative model class can be passed as well, to use a custom metaclass. + + For code using the SQLAlchemy 2.x API, customize this model by subclassing + :class:`sqlalchemy.orm.DeclarativeBase` or + :class:`sqlalchemy.orm.DeclarativeBaseNoMeta` + and passing the ``model_class`` parameter to the extension. """ if engine_options is None: @@ -258,25 +315,13 @@ class SQLAlchemy: ) app.extensions["sqlalchemy"] = self + app.teardown_appcontext(self._teardown_session) if self._add_models_to_shell: from .cli import add_models_to_shell app.shell_context_processor(add_models_to_shell) - if app.config.get("SQLALCHEMY_COMMIT_ON_TEARDOWN", False): - import warnings - - warnings.warn( - "'SQLALCHEMY_COMMIT_ON_TEARDOWN' is deprecated and will be removed in" - " Flask-SQAlchemy 3.1. Call 'db.session.commit()'` directly instead.", - DeprecationWarning, - stacklevel=2, - ) - app.teardown_appcontext(self._teardown_commit) - else: - app.teardown_appcontext(self._teardown_session) - basic_uri: str | sa.engine.URL | None = app.config.setdefault( "SQLALCHEMY_DATABASE_URI", None ) @@ -393,20 +438,6 @@ class SQLAlchemy: options.setdefault("query_cls", self.Query) return sa_orm.sessionmaker(db=self, **options) - def _teardown_commit(self, exc: BaseException | None) -> None: - """Commit the session at the end of the request if there was not an unhandled - exception during the request. - - :meta private: - - .. deprecated:: 3.0 - Will be removed in 3.1. Use ``db.session.commit()`` directly instead. - """ - if exc is None: - self.session.commit() - - self.session.remove() - def _teardown_session(self, exc: BaseException | None) -> None: """Remove the current session at the end of the request. @@ -464,29 +495,16 @@ class SQLAlchemy: if not args or (len(args) >= 2 and isinstance(args[1], sa.MetaData)): return super().__new__(cls, *args, **kwargs) - if ( - bind_key is None - and "info" in kwargs - and "bind_key" in kwargs["info"] - ): - import warnings - - warnings.warn( - "'table.info['bind_key'] is deprecated and will not be used in" - " Flask-SQLAlchemy 3.1. Pass the 'bind_key' parameter instead.", - DeprecationWarning, - stacklevel=2, - ) - bind_key = kwargs["info"].get("bind_key") - metadata = self._make_metadata(bind_key) return super().__new__(cls, *[args[0], metadata, *args[1:]], **kwargs) return Table def _make_declarative_base( - self, model: type[Model] | sa_orm.DeclarativeMeta - ) -> type[t.Any]: + self, + model_class: _FSA_MCT, + disable_autonaming: bool = False, + ) -> t.Type[_FSAModel]: """Create a SQLAlchemy declarative model class. The result is available as :attr:`Model`. @@ -498,7 +516,14 @@ class SQLAlchemy: :meta private: - :param model: A model base class, or an already created declarative model class. + :param model_class: A model base class, or an already created declarative model + class. + + :param disable_autonaming: Turns off automatic tablename generation in models. + + .. versionchanged:: 3.1.0 + Added support for passing SQLAlchemy 2.x base class as model class. + Added optional ``disable_autonaming`` parameter. .. versionchanged:: 3.0 Renamed with a leading underscore, this method is internal. @@ -506,22 +531,45 @@ class SQLAlchemy: .. versionchanged:: 2.3 ``model`` can be an already created declarative model class. """ - if not isinstance(model, sa_orm.DeclarativeMeta): - metadata = self._make_metadata(None) - model = sa_orm.declarative_base( - metadata=metadata, cls=model, name="Model", metaclass=DefaultMeta + model: t.Type[_FSAModel] + declarative_bases = _get_2x_declarative_bases(model_class) + if len(declarative_bases) > 1: + # raise error if more than one declarative base is found + raise ValueError( + "Only one declarative base can be passed to SQLAlchemy." + " Got: {}".format(model_class.__bases__) ) + elif len(declarative_bases) == 1: + body = dict(model_class.__dict__) + body["__fsa__"] = self + mixin_classes = [BindMixin, NameMixin, Model] + if disable_autonaming: + mixin_classes.remove(NameMixin) + model = types.new_class( + "FlaskSQLAlchemyBase", + (*mixin_classes, *model_class.__bases__), + {"metaclass": type(declarative_bases[0])}, + lambda ns: ns.update(body), + ) + elif not isinstance(model_class, sa_orm.DeclarativeMeta): + metadata = self._make_metadata(None) + metaclass = DefaultMetaNoName if disable_autonaming else DefaultMeta + model = sa_orm.declarative_base( + metadata=metadata, cls=model_class, name="Model", metaclass=metaclass + ) + else: + model = model_class # type: ignore[assignment] if None not in self.metadatas: # Use the model's metadata as the default metadata. - model.metadata.info["bind_key"] = None # type: ignore[union-attr] - self.metadatas[None] = model.metadata # type: ignore[union-attr] + model.metadata.info["bind_key"] = None + self.metadatas[None] = model.metadata else: # Use the passed in default metadata as the model's metadata. - model.metadata = self.metadatas[None] # type: ignore[union-attr] + model.metadata = self.metadatas[None] model.query_class = self.Query - model.query = _QueryProperty() + model.query = _QueryProperty() # type: ignore[assignment] model.__fsa__ = self return model @@ -660,80 +708,41 @@ class SQLAlchemy: """ return self.engines[None] - def get_engine(self, bind_key: str | None = None) -> sa.engine.Engine: + def get_engine( + self, bind_key: str | None = None, **kwargs: t.Any + ) -> sa.engine.Engine: """Get the engine for the given bind key for the current application. - This requires that a Flask application context is active. :param bind_key: The name of the engine. .. deprecated:: 3.0 - Will be removed in Flask-SQLAlchemy 3.1. Use ``engines[key]`` instead. + Will be removed in Flask-SQLAlchemy 3.2. Use ``engines[key]`` instead. .. versionchanged:: 3.0 Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` parameter. """ - import warnings - warnings.warn( - "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy 3.1." - " Use 'engine' or 'engines[key]' instead.", + "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy" + " 3.2. Use 'engine' or 'engines[key]' instead. If you're using" + " Flask-Migrate or Alembic, you'll need to update your 'env.py' file.", DeprecationWarning, stacklevel=2, ) + + if "bind" in kwargs: + bind_key = kwargs.pop("bind") + return self.engines[bind_key] - def get_tables_for_bind(self, bind_key: str | None = None) -> list[sa.Table]: - """Get all tables in the metadata for the given bind key. - - :param bind_key: The bind key to get. - - .. deprecated:: 3.0 - Will be removed in Flask-SQLAlchemy 3.1. Use ``metadata.tables`` instead. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. - """ - import warnings - - warnings.warn( - "'get_tables_for_bind' is deprecated and will be removed in" - " Flask-SQLAlchemy 3.1. Use 'metadata.tables' instead.", - DeprecationWarning, - stacklevel=2, - ) - return list(self.metadatas[bind_key].tables.values()) - - def get_binds(self) -> dict[sa.Table, sa.engine.Engine]: - """Map all tables to their engine based on their bind key, which can be used to - create a session with ``Session(binds=db.get_binds(app))``. - - This requires that a Flask application context is active. - - .. deprecated:: 3.0 - Will be removed in Flask-SQLAlchemy 3.1. ``db.session`` supports multiple - binds directly. - - .. versionchanged:: 3.0 - Removed the ``app`` parameter. - """ - import warnings - - warnings.warn( - "'get_binds' is deprecated and will be removed in Flask-SQLAlchemy 3.1." - " 'db.session' supports multiple binds directly.", - DeprecationWarning, - stacklevel=2, - ) - return { - table: engine - for bind_key, engine in self.engines.items() - for table in self.metadatas[bind_key].tables.values() - } - def get_or_404( - self, entity: type[_O], ident: t.Any, *, description: str | None = None + self, + entity: type[_O], + ident: t.Any, + *, + description: str | None = None, + **kwargs: t.Any, ) -> _O: """Like :meth:`session.get() ` but aborts with a ``404 Not Found`` error instead of returning ``None``. @@ -741,10 +750,14 @@ class SQLAlchemy: :param entity: The model class to query. :param ident: The primary key to query. :param description: A custom message to show on the error page. + :param kwargs: Extra arguments passed to ``session.get()``. + + .. versionchanged:: 3.1 + Pass extra keyword arguments to ``session.get()``. .. versionadded:: 3.0 """ - value = self.session.get(entity, ident) + value = self.session.get(entity, ident, **kwargs) if value is None: abort(404, description=description) @@ -974,24 +987,11 @@ class SQLAlchemy: .. versionchanged:: 3.0 The :attr:`Query` class is set on ``backref``. """ - # Deprecated, removed in SQLAlchemy 2.0. Accessed through ``__getattr__``. self._set_rel_query(kwargs) f = sa_orm.relationship return f(*args, **kwargs) def __getattr__(self, name: str) -> t.Any: - if name == "db": - import warnings - - warnings.warn( - "The 'db' attribute is deprecated and will be removed in" - " Flask-SQLAlchemy 3.1. The extension is registered directly as" - " 'app.extensions[\"sqlalchemy\"]'.", - DeprecationWarning, - stacklevel=2, - ) - return self - if name == "relation": return self._relation diff --git a/venv/Lib/site-packages/flask_sqlalchemy/model.py b/venv/Lib/site-packages/flask_sqlalchemy/model.py index 4b202a5..c6f9e5a 100644 --- a/venv/Lib/site-packages/flask_sqlalchemy/model.py +++ b/venv/Lib/site-packages/flask_sqlalchemy/model.py @@ -18,14 +18,6 @@ class _QueryProperty: :meta private: """ - @t.overload - def __get__(self, obj: None, cls: type[Model]) -> Query: - ... - - @t.overload - def __get__(self, obj: Model, cls: type[Model]) -> Query: - ... - def __get__(self, obj: Model | None, cls: type[Model]) -> Query: return cls.query_class( cls, session=cls.__fsa__.session() # type: ignore[arg-type] @@ -100,6 +92,38 @@ class BindMetaMixin(type): super().__init__(name, bases, d, **kwargs) +class BindMixin: + """DeclarativeBase mixin to set a model's ``metadata`` based on ``__bind_key__``. + + If no ``__bind_key__`` is specified, the model will use the default metadata + provided by ``DeclarativeBase`` or ``DeclarativeBaseNoMeta``. + If the model doesn't set ``metadata`` or ``__table__`` directly + and does set ``__bind_key__``, the model will use the metadata + for the specified bind key. + If the ``metadata`` is the same as the parent model, it will not be set + directly on the child model. + + .. versionchanged:: 3.1.0 + """ + + __fsa__: SQLAlchemy + metadata: sa.MetaData + + @classmethod + def __init_subclass__(cls: t.Type[BindMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__) and hasattr( + cls, "__bind_key__" + ): + bind_key = getattr(cls, "__bind_key__", None) + parent_metadata = getattr(cls, "metadata", None) + metadata = cls.__fsa__._make_metadata(bind_key) + + if metadata is not parent_metadata: + cls.metadata = metadata + + super().__init_subclass__(**kwargs) + + class NameMetaMixin(type): """Metaclass mixin that sets a model's ``__tablename__`` by converting the ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models @@ -169,6 +193,77 @@ class NameMetaMixin(type): return None +class NameMixin: + """DeclarativeBase mixin that sets a model's ``__tablename__`` by converting the + ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models + that do not otherwise define ``__tablename__``. If a model does not define a primary + key, it will not generate a name or ``__table__``, for single-table inheritance. + + .. versionchanged:: 3.1.0 + """ + + metadata: sa.MetaData + __tablename__: str + __table__: sa.Table + + @classmethod + def __init_subclass__(cls: t.Type[NameMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if should_set_tablename(cls): + cls.__tablename__ = camel_to_snake_case(cls.__name__) + + super().__init_subclass__(**kwargs) + + # __table_cls__ has run. If no table was created, use the parent table. + if ( + "__tablename__" not in cls.__dict__ + and "__table__" in cls.__dict__ + and cls.__dict__["__table__"] is None + ): + del cls.__table__ + + @classmethod + def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: + """This is called by SQLAlchemy during mapper setup. It determines the final + table object that the model will use. + + If no primary key is found, that indicates single-table inheritance, so no table + will be created and ``__tablename__`` will be unset. + """ + schema = kwargs.get("schema") + + if schema is None: + key = args[0] + else: + key = f"{schema}.{args[0]}" + + # Check if a table with this name already exists. Allows reflected tables to be + # applied to models by name. + if key in cls.metadata.tables: + return sa.Table(*args, **kwargs) + + # If a primary key is found, create a table for joined-table inheritance. + for arg in args: + if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( + arg, sa.PrimaryKeyConstraint + ): + return sa.Table(*args, **kwargs) + + # If no base classes define a table, return one that's missing a primary key + # so SQLAlchemy shows the correct error. + for base in cls.__mro__[1:-1]: + if "__table__" in base.__dict__: + break + else: + return sa.Table(*args, **kwargs) + + # Single-table inheritance, use the parent table name. __init__ will unset + # __table__ based on this. + if "__tablename__" in cls.__dict__: + del cls.__tablename__ + + return None + + def should_set_tablename(cls: type) -> bool: """Determine whether ``__tablename__`` should be generated for a model. @@ -181,8 +276,16 @@ def should_set_tablename(cls: type) -> bool: Later, ``__table_cls__`` will determine if the model looks like single or joined-table inheritance. If no primary key is found, the name will be unset. """ - if cls.__dict__.get("__abstract__", False) or not any( - isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:] + if ( + cls.__dict__.get("__abstract__", False) + or ( + not issubclass(cls, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + and not any(isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:]) + ) + or any( + (b is sa_orm.DeclarativeBase or b is sa_orm.DeclarativeBaseNoMeta) + for b in cls.__bases__ + ) ): return False @@ -196,7 +299,14 @@ def should_set_tablename(cls: type) -> bool: return not ( base is cls or base.__dict__.get("__abstract__", False) - or not isinstance(base, sa_orm.DeclarativeMeta) + or not ( + # SQLAlchemy 1.x + isinstance(base, sa_orm.DeclarativeMeta) + # 2.x: DeclarativeBas uses this as metaclass + or isinstance(base, sa_orm.decl_api.DeclarativeAttributeIntercept) + # 2.x: DeclarativeBaseNoMeta doesn't use a metaclass + or issubclass(base, sa_orm.DeclarativeBaseNoMeta) + ) ) return True @@ -212,3 +322,9 @@ class DefaultMeta(BindMetaMixin, NameMetaMixin, sa_orm.DeclarativeMeta): """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and ``__tablename__`` support. """ + + +class DefaultMetaNoName(BindMetaMixin, sa_orm.DeclarativeMeta): + """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and + ``__tablename__`` support. + """ diff --git a/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py b/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py index 42278ba..e8273be 100644 --- a/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py +++ b/venv/Lib/site-packages/flask_sqlalchemy/record_queries.py @@ -70,30 +70,6 @@ class _QueryInfo: def duration(self) -> float: return self.end_time - self.start_time - @property - def context(self) -> str: - import warnings - - warnings.warn( - "'context' is renamed to 'location'. The old name is deprecated and will be" - " removed in Flask-SQLAlchemy 3.1.", - DeprecationWarning, - stacklevel=2, - ) - return self.location - - def __getitem__(self, key: int) -> object: - import warnings - - name = ("statement", "parameters", "start_time", "end_time", "location")[key] - warnings.warn( - "Query info is a dataclass, not a tuple. Lookup by index is deprecated and" - f" will be removed in Flask-SQLAlchemy 3.1. Use 'info.{name}' instead.", - DeprecationWarning, - stacklevel=2, - ) - return getattr(self, name) - def _listen(engine: sa.engine.Engine) -> None: sa_event.listen(engine, "before_cursor_execute", _record_start, named=True) diff --git a/venv/Lib/site-packages/flask_sqlalchemy/session.py b/venv/Lib/site-packages/flask_sqlalchemy/session.py index b0ae871..631fffa 100644 --- a/venv/Lib/site-packages/flask_sqlalchemy/session.py +++ b/venv/Lib/site-packages/flask_sqlalchemy/session.py @@ -79,13 +79,22 @@ class Session(sa_orm.Session): def _clause_to_engine( - clause: t.Any | None, engines: t.Mapping[str | None, sa.engine.Engine] + clause: sa.ClauseElement | None, + engines: t.Mapping[str | None, sa.engine.Engine], ) -> sa.engine.Engine | None: """If the clause is a table, return the engine associated with the table's metadata's bind key. """ - if isinstance(clause, sa.Table) and "bind_key" in clause.metadata.info: - key = clause.metadata.info["bind_key"] + table = None + + if clause is not None: + if isinstance(clause, sa.Table): + table = clause + elif isinstance(clause, sa.UpdateBase) and isinstance(clause.table, sa.Table): + table = clause.table + + if table is not None and "bind_key" in table.metadata.info: + key = table.metadata.info["bind_key"] if key not in engines: raise sa_exc.UnboundExecutionError( diff --git a/venv/Lib/site-packages/flask_wtf/__init__.py b/venv/Lib/site-packages/flask_wtf/__init__.py index 59bc895..be2649e 100644 --- a/venv/Lib/site-packages/flask_wtf/__init__.py +++ b/venv/Lib/site-packages/flask_wtf/__init__.py @@ -5,4 +5,4 @@ from .recaptcha import Recaptcha from .recaptcha import RecaptchaField from .recaptcha import RecaptchaWidget -__version__ = "1.1.1" +__version__ = "1.2.1" diff --git a/venv/Lib/site-packages/flask_wtf/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/flask_wtf/__pycache__/__init__.cpython-310.pyc index ba58382e41995570882be1612cb7cf9400bbdcb7..f164b1ab0dd6d1242b772f7378dc3f886b482ecc 100644 GIT binary patch delta 23 dcmZ3&yo8x6pO=@50SMM-PvpAFXf*M`5dc8_2HpSw delta 23 dcmZ3&yo8x6pO=@50SJu2oV$h%gYv1jsbaa*qrhAfr^tR;+DYzrAX7_->R7>YDg z7=jsq;v8Uc=7o&43^fc{oU<8HSb#LwY=*hawTv|&)!abU4q(-c3wS15NystsPL7n2 z72rzBDNQXX%FHV%E>Z(pI=NIraq?`5Bu0_V|0L$IxcC6YN*HPwOBkD(ig}gCu=P&_vaBO}gYtG2XIax|xX0nZZ z7$eW*$?`WC%O~e3lrUCoeyE_p$XGR*Nl8_-0%(~TBLhP*8<4@lz{1GEUR1H!M(H#o R8%V0CXmX)~_+%9oPXI>sOjQ5? delta 309 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 HurB=5&P0 zmwB-FxC8qVFGW7sO3VkF-=k5$gD3<`z(TNuU@7x*RAJ>0wR&ai_tTGRq)LcXZ_+xc zt0g*0LiH7m%n(wO>JNGz_M`gA*Xw#_NS-W4?(H~PSpF&X(s#w{@H3%aJK&Q$8pkx zU|iPHTX714*D$vF#QJGYhZ}hRGA#KLh*aC4Et1k66)tLWDAhN#meC#9pxY)RJETYM z5~e{1=z{vo9@(@6LQ&L%;e-Vuv)fQdyu>qmiKi)FOLuiKj0XnRmYIu9p0LC9JB`N8 zI7u3f8hA&FgOHT{q0!aH?SJOiHMSro@noIp`SvEQj&!zPOn5a=s0 zPe(I|?}(9y#<03t9#J*-1#(ecaVH)n?sam>1(!O_ywz^fiCIJPRGdUpQHvM{JvSWq zP!1#%(p+h#jmE30@6BvtTTEE^E58TvpDvfMquB43zHRJi_t8UZnW@#X0g3ae^R>1} z7-96DgZ8(z9^fEO;jPpKi`Sh6d`e8;AuXR7+W~s*5N19Azp1+fx7#6p;2Uj+%K5!Z z@8*}R1EAUq>O^pDx&%q?lFV5ICauJ6zE4t7fupxzN#qUvvZ}35sz3cPXNj-ywXT>` z-v+lYmJgF+5}Y$L>D=L>Xd6X?^IpnDd?VqR90o>Xi~EaDK*`|HDy(#2G`@c%E;l$Ie+5m&eJaoH9R_KPB@yW%SHxH&+_6xz0h0*K)0(j**Xncp1NT z4h0hG5Pt;b(ook2rZ=(4Hmu9AWDCU6)PW%dY>_%W@Qk5*xX3CxBF-W8$uKQYHW1f7?IX_W{!n#x21D+L z*dO<^aPSevIRKm~(7I3`P`?e$Z$^W6Qhb!;G`!CEQg(zCIIaaB^E&X+h=M#>vG=eF vq=cA8fziY)iX$?}oD1y^TTS>J0S}3he9ebiivLQWR|2CF>c(WKI}?8c(L!cs diff --git a/venv/Lib/site-packages/flask_wtf/__pycache__/form.cpython-310.pyc b/venv/Lib/site-packages/flask_wtf/__pycache__/form.cpython-310.pyc index 2044a29a84798433675a6f2c6bd1cb3268931b95..17d41bc337b546f2aa251482c95ffd28acdfdcc8 100644 GIT binary patch delta 50 zcmX@0c0i3QpO=@50SMM-Z{#|}D9IcU8gh%x#ns0(#Pt?SfPZkvE!F_X5ND6gPZ^^H E0cZvfA^-pY delta 50 zcmX@0c0i3QpO=@50SJ self.max_size): - # the file is too small or too big => validation failure - raise ValidationError( - self.message - or field.gettext( - "File must be between {min_size} and {max_size} bytes.".format( - min_size=self.min_size, max_size=self.max_size + if (file_size < self.min_size) or (file_size > self.max_size): + # the file is too small or too big => validation failure + raise ValidationError( + self.message + or field.gettext( + "File must be between {min_size} and {max_size} bytes.".format( + min_size=self.min_size, max_size=self.max_size + ) ) ) - ) file_size = FileSize diff --git a/venv/Lib/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-310.pyc index 55aa85dda00c0b763ccafeb2ad2d716b0376adf2..ad6c9252256e677338de7cda57392b1bd241b507 100644 GIT binary patch delta 19 ZcmdnXw3mr1pO=@50SMM-Z{#v&1OP0+1SJ3f delta 19 ZcmdnXw3mr1pO=@50SJJZ}1=jG*M0D|?|`Wa0Vd0m8Aa@ca&qu3c4QW#R0fNZ8Hrim$jlANVQIjMQc z`6;QIjJLRxON)w9^Gf0q3ko)#sbOYh+3d-Z$Hd4oc?X*pBlBiv_BuwXTRcE5Ihjd% t1&Kw)sYT2{OQKlQauSQPC(q#s7iZ*Q;$h@rWMKjVMi6BC!^R=R3;>ZiB{={9 delta 151 zcmeAW>JsA3=jG*M0D>eY{fyR$ye`5_IV`zMQA~^sDGVtrIc&M?QS1{_{G_;(ON)w9 z^Gf0q3kozDZ*i3t<;17vCFiH4ZaiJX%*edigC&oNk$LiVHZMk&%}nfdjM7o8X*r3- t*+tAiu0=}$ZO=yl*=5&%*c?!kiwk9lFJ&!3S_fHv8Av^v8S*_ zaip-PGe&W`Go%1nEet8_%}h~TDV)I!np`hI#%MC$;w&x7NzF^nPf49vE4gvWJ|;%l z$;r&&!puPFTWrbsd1;yHx0usYONv+~pJkR~WSabjc{-!u^3W+k6Y5(3+ZtQU|e7JDz? z0la}HNF!J&cJ_jkS3KT>$B*~Rzc{Zr_mR~CN2`w~KD$Q+78sC3lH{bIg4#@lBOSpc z6Rvbq5Z*bGo^&6PbT?Q` None: diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/__init__.cpython-310.pyc index 7abd6a282e95e952f056f47f15dedfe427127b9b..0c61a0bbeb742f684ebadd19e4d43c1e5083a4fc 100644 GIT binary patch delta 26 gcmdnxw#$txpO=@50SH!SZ{+$Y$!NU!kE9(Z0A`;DyZ`_I delta 26 gcmdnxw#$txpO=@50SMxmHgbKGWHi|PN79ZH0A0lg1ONa4 diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/events.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/events.cpython-310.pyc index 94c0c9c0d26202f7b48b65bfab776e84b9717763..53dd1b7c9343cc091d090c12c62b344036de0289 100644 GIT binary patch delta 19 ZcmbQrGL?lZpO=@50SH!SZ{*@;0stoc1Fir7 delta 19 ZcmbQrGL?lZpO=@50SMxmHga(@0RST?0{H*{ diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/exc.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/exc.cpython-310.pyc index 23d0534477db0657366fa341f76c485fae18109a..6fdfe710869be8b81c7e60129639e81e390383e2 100644 GIT binary patch delta 21 bcmbQepKb8Se?C*YhpYAMn?t} delta 21 bcmbQepKb8h-cc!H8CClLUILQ diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/inspection.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/inspection.cpython-310.pyc index a87efff4c51f29cd94b13f126e3720c28de905c4..8728d7755187d896c61b3fc414b1ed9f31da8bf2 100644 GIT binary patch delta 19 ZcmaE&`$U&3pO=@50SH!SZ{)fq1^_ud1%Utn delta 19 ZcmaE&`$U&3pO=@50SMxmHgeq(0{}H>1k3;c diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/log.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/log.cpython-310.pyc index 0f3d3fab6ede51b374cdacb2ea0fccc4c463f600..dfed63659939ccf0fef1767994e2ac896eaf0ed9 100644 GIT binary patch delta 22 ccmeBl>~!SK=jG*M0D{%o`WbgN^42H-06>EV7ytkO delta 22 bcmeBl>~!SK=jG*M0D^cX{fuiHd218^I&lSE diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/schema.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/schema.cpython-310.pyc index b659238ab222e71c1575813fd049be782c7b5b0b..9c3342581ede1059f062ae3bf4cb7487f4b48879 100644 GIT binary patch delta 19 ZcmX>ncutTjpO=@50SH!SZ{#|{0RS>H1o;2} delta 19 ZcmX>ncutTjpO=@50SMxmHgX-|001st1VjJ; diff --git a/venv/Lib/site-packages/sqlalchemy/__pycache__/types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/__pycache__/types.cpython-310.pyc index ccebcb90e4e21273e73ac1434be21187755ef2a1..6c92684456bfb019271221de900011a18381b8f4 100644 GIT binary patch delta 19 ZcmbOwI7^T#pO=@50SH!SZ{(W50RSp{1YH0C delta 19 ZcmbOwI7^T#pO=@50SMxmHgZki001VY1E>H1 diff --git a/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-310.pyc index 46d3df8f70807d5ee0902ad125e5da174c98998d..227d19d78ae3f7a9f17d83989b78dc2b247c2e55 100644 GIT binary patch delta 19 ZcmZ3_vYv%2pO=@50SH!SZ{$*C0st!61N;C0 delta 19 ZcmZ3_vYv%2pO=@50SMxmHgc&l0RSfi14jS= diff --git a/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-310.pyc index ded9ca801343842788e25b828bc22d58d417d0a3..965368854b26ad9678775ea5ab31df6417dafa24 100644 GIT binary patch delta 23 dcmca>a@T|}pO=@50SH!S>u3B?+{ouI1prd22DShI delta 23 dcmca>a@T|}pO=@50SMxm^fRQCHuCvP0RTq21t0(b diff --git a/venv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py b/venv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py index 669a839..49712a5 100644 --- a/venv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py +++ b/venv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py @@ -227,7 +227,7 @@ class PyODBCConnector(Connector): def get_isolation_level_values( self, dbapi_connection: interfaces.DBAPIConnection ) -> List[IsolationLevel]: - return super().get_isolation_level_values(dbapi_connection) + [ # type: ignore # noqa: E501 + return super().get_isolation_level_values(dbapi_connection) + [ "AUTOCOMMIT" ] diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-310.pyc index 855d78e8669f16b75b8befad936ee64fc9df45cd..3c284c2c5c532bf97a1c79786ac4a913c798e59c 100644 GIT binary patch delta 18 YcmdnNxPy@^pO=@50SH!SPvlw$04LZ4ZvX%Q delta 18 YcmdnNxPy@^pO=@50SMxmCUUI<03^5rx&QzG diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/collections.cp310-win_amd64.pyd b/venv/Lib/site-packages/sqlalchemy/cyextension/collections.cp310-win_amd64.pyd index 3bc7cb23d3f421b6db9a1b9594e6353357c1b723..ad60322b5b6c906c8aecc94f4f2fd84af3461a7f 100644 GIT binary patch literal 174080 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 literal 173568 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

WZZN<%L$Oa1N-GQASsOj+K1QE7sMLgwJG!(uZJ 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 diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.cp310-win_amd64.pyd b/venv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.cp310-win_amd64.pyd index 9d96029239421839023716687b7e1b7acdc28f62..edba81b4b2045c0db06703e1fac2d5f48f1f41e2 100644 GIT binary patch delta 29002 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 diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/processors.cp310-win_amd64.pyd b/venv/Lib/site-packages/sqlalchemy/cyextension/processors.cp310-win_amd64.pyd index 7bf67160eef207b886f2ad11cd8cb878c58748ab..e85606b12840b009e39219a5a1d0d18fa4b5cbcc 100644 GIT binary patch delta 19192 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 Ck%F}V delta 19257 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 KT3-33$$tSeI{C2x diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.cp310-win_amd64.pyd b/venv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.cp310-win_amd64.pyd index 27dcb811be9c2888c7a42481237ee21dc1d22734..67a81bf69155f7a695b2e4efce81cb3cd5e85752 100644 GIT binary patch delta 26461 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 nUf%{&6Qr{`VURH_92sybK6aPRB8H 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 diff --git a/venv/Lib/site-packages/sqlalchemy/cyextension/util.cp310-win_amd64.pyd b/venv/Lib/site-packages/sqlalchemy/cyextension/util.cp310-win_amd64.pyd index 0bb4ba7706d6288643062527420c56fe00cdec22..e33f3908155a85525b321717abd6291ca4414115 100644 GIT binary patch delta 31249 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 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/__init__.py b/venv/Lib/site-packages/sqlalchemy/dialects/__init__.py index 76b2263..055d087 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/__init__.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/__init__.py @@ -51,7 +51,7 @@ def _auto_fn(name: str) -> Optional[Callable[[], Type[Dialect]]]: if hasattr(module, driver): module = getattr(module, driver) - return lambda: module.dialect # type: ignore + return lambda: module.dialect else: return None diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-310.pyc index b5a5178a4d06eea21301ab433b51ca46712e296b..40d85a88f3706f1bbf63eba754a53f94fdd06299 100644 GIT binary patch delta 22 ccmaFI^^S`-pO=@50SH!S>u0EMtN%`=jG*M0D{%o8@c{50RSgc1d9Lw delta 19 YcmeBR>tN%`=jG*M0D^d?ja>hj03&__)&Kwi diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py index 3f70847..6bbb934 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py @@ -6,6 +6,7 @@ # the MIT License: https://www.opensource.org/licenses/mit-license.php # mypy: ignore-errors +from . import aioodbc # noqa from . import base # noqa from . import pymssql # noqa from . import pyodbc # noqa diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-310.pyc index afbe60f69b4f507f7e35ae1bf55916a1ad509bb5..ff1c2e53d569fc40cb1c7f94fc1814bfd52db529 100644 GIT binary patch delta 730 zcmXBSOK#I(6o%p7i5)w!o%=m;?l%`IW=QOSQH8|pn^GT zRBV7nAn~1p2d|#BuoEygq HieB*_$vlR9 delta 707 zcmW;KyKd8P7{+1$oA{8}&iNcWiF0xyA|V!TfvpQ-c^9j~kpMYDH7rb7S*wh_fiffY zI@+~&(2GFg{XP#rJ+BY)VBZJ-{P24i)-4{{)!Q$>@50zT-Mu-S&8dp2v2rW73v;qz zs~y^bqjqT*uG*tLc!_=J+J~LZpuA7_oXr&oEQZ={e@=1--yRozMvq^^#sWqCN+QWp5=%DBi<^JFDUP3imMPcuet-E@ seN0{|KW+;>Q||PpEW0U+Ec;`X2YK>v`DB;QH5qu9XZwR~f{Iu956m}y$^ZZW diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-310.pyc index 7787a215e0665bdfeecf122eae5aa8acbc0c7377..07701b36392ffbec2f4b106b7f521a5c87701014 100644 GIT binary patch delta 10825 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 delta 10536 zcma)C34Bvk*3ZfElBP|YwsfJirL-)DvahnQg|f9ki^y{@qmvhcN+dc2T zta(p*SC>-5E|=4U|9Q>*>#xjxICb5hTI8faD5kQg>W|6Jctr8V)R?*q+qHpUu-4~~ zg_)krRDU>B8>ovjRkue}=2t^8-PWYCI#o`N`D%h{)YlXVs=9SaKwYX^L-Alxw}iqm z8J9+a0lzO62#0j5x=i)!5>sPw7Lsjs%ol2j$qwQd4K%B=wJsbB%SjOy_Nxl#Bem=kIE@6Q8gMx-|&)xbSv3fceE2DR}mYqqwGyS)Pyw>^o4Lg zA)Hkk5BY^#nbGLBKqy266c&!?j%a;6ri7P^>SC~93DtzRl6Rl;%fX%r`pXi<@yC90wp&Jc&t9m0?kG=;g%J38E!d_j%E(j%E{5?=$lQ3DlLuba^1GH9(@Y^D;P!3 zBG*{f6qGN-0|t8w_Q#^?;qs>?ArO;9}@v zMrdIcK#8N6E-211f>nQj%qrWL`T{X@X<4G2fI`}9)YwuL33MXUNGKK z#^-O0M_48f={A2bj8Z%5!$Adg+o)R`F(Z-fm!lJhm)6At3fa!)XW?iRT~iG$r=Sc5 zi3%ztDmyT-s4V0Q%I0vbY^{k08+CiQwieZogCSC53y$g*63{^&8$g%R%@{j2BXvj$ zW*D@pJsvWQE}L;&mGzh)i9-$bOG|vgI0kMKMkU4z!`y5qmY6bh zJ0(|&Wm}C}7eFud1u4x~!x%x@;te}seQTFn4+H)=tyM}n>ruySH^IXQ9t&%w_WITZ zcRKAZ8r*TAE3$QAc1m~bT4_>DabRxkKqA|E6+UX8B}ODkIO2d@uxdT_Ov%sdn3t@; zN>hXBE|UTqEn@nLJ(r}V;QXkuCKarpy>@3-dX>op(Mvj3W@xYM$ul^7x@UNHCt5-W zmjld@0ghj+7B(2P$mSev$`cvMHp%QTTWt=D)!yoV;&w9()XqJ19SqafJiQDGv>%?n z266Q>Kf*+9<+JOdyw&;KNr0K!kAGha;GC;ZO-enlg|HY=JT&tCI3P_D~MTv_WJ&8ZRmkLX0u)U`oJHP z9d;bLf`*EP92?$HAXz*6#-AZwyZOy9RV8G<}5^wxe<<(Px(p+wtvFbF-dr>i#q z&=oEZQiz(-L~cuSXF=nwL$jeDuIs8zK71LPwypGkLnh&tv zR0G?LE#20t@gwI+V~H1wL3msD6Jt?U8$Y>u$$ElPK#Fb(JpvG+y7C_TxH@u zALQ6D986DZi$1;&wrfeBEQEh*b)TGv1Df*bBjDF^J{!|{6|s1XU>8Ax;3?v$HGOsm z3S&JspkM;=DZ~+{$%=tS{~Q=74!dKZ<5F$TF%LYetvI$W<2q98cd1 zHEG$OPi#@0icbs;QU@oQ6#e*&jk`Y;tHVUtXPTai9`>oHgqj|rRwBu(};Zp6~*~#v&h~r+` zhwzE7`SbOVo91V6#aoXxoR@0oQ8+VSyXCv-a6)_MyF8?O;I>TLaa=i8OZ|SGG?tcs zs%`wf_vlkZ?gYUX1g8lE;SP`c9Q!8Y#-b^>%n2!wVs)A^M}Mzb&P8CZ7CU#So#N~t zmX=_(5cJ`>8D%tIPni^MiePzCM(0=?6QQqjKXie4tyw=_1_i`{{YY@0fCOznm!_Ju zD^KTWo6l!Jz4plYlgTSCs5qZgoYne|pC+5FZ{QNXH2|Gp!|h#Ri`#}t$^+~=+UVT& zv6+9PT~PYUGkJ2^G2(TIX8c4gAw)H`ge2cn>l^`z!@fn3le~2*)}L6VF*ENE(Cd=> zXp6R>uSN|rD^k|+JP!DxOhoQfqFqI+H}O>f1%0VQPWOsq-&?cX+pehZh`7rrS=u_8 zjlT>q3f3g7W|#`Oexl_h4pJaW)@Em@$IjE|L8dJk2Oi@qED&@gVH3}J6aU%*1!lWh zTf8;LmWrLv^WIkY8vH!Z23;V953@mkxQ^G_phOblrtzC?(9@QIb6?_5+Tb~tooJbj zNbw6FO2M8Ze3JxEbUA`TdyFumsst-Te~dj!LS^&xRgjtHGGeA}=or7v4*!BL_yPy+ zr!(K`fFdam$+0eCI@cYLFMUJSEl8YqKqf#XcRL~1c^Db#W_2;!#s@i}!d8Tf&L*yL z!qWihd}0cWcBd1aVuEf2tN2YRFcXUTJ1MYi@DJubMV@4Q1CF-6wuq+jn!Zz4fP;n8M&Cd3w&w;HC*PX~AEtRxJ!T%0Re%)eL@ zBhz6Mm_25GzAtp)XEI=L|AELzPNIEM=89JA067B{E7Aq?Vxb=K;p^xQGdn^YGkJL? zy5~V;+{B}qP!5Oq)0r^PJ%+R_*b8-x=09aZKKXekcybi+U@oyEUzFIek@(<|gjMnV zRTTc-Xsjv5#?jRA1cKN^V=u*7m{b@ao&^hF7~hZu%s!mvwC!XtyOf?r5D;ZHieNNB zM+POCuSRvSvDn`{f}hNWo_tj{bSgbWYBYpllW0+g5dUXe&tyX}tl&qo;V!tIugrlv zE;@dAX)YAPpZN4#n4dHiDS6Bl%{}>v9O!lNtmC;*ENviBrtzji=$t6+43b4M&P6^v zA33b&az0!Fhxyg{a0PJwK|VY!%_Z61;adw}fa_IUej1-mouIk5IOg~%>~~kuoV{eK zYB8JKl9v@C!`F%7WyG)oBme0_nCE&EyNpT_nnfb-#0Pc7s(%k5_7iDMe?)$%T? zhaDyOh~Q%aIv&|cf^P^!b{4stvZ#@}f1wtT5Do&$j*LHGvRb zBYea^Du(LfE0B}NT2al!suU_BDyx695{r`ePT8~Zf({d32ZiHgjfIJIC6H&fEkZiq z@cVkeqLe?7@K+Kn5H%LU(*lII0~Xg{4f1rXCJ|Y4puyzjv#5>f~4`dUrT&D!tO(S4DfJ&xD(F_ z=Kv@y4&&=3`-o<3LYPv`;>fSrUNpbFY;IYRCmoN?={QfCLsOb~XaID@L~_#r$cA!$ z?*Q0Dz;(s3uLz0(M zzc>%)cIb`soFOn*S|P@GcnF@fP1G*u8-_q1w~we^BtCz22n>L06F(1ukYHxq0iAWQAA z8J1ssL2GpX$TZ`;cySbThF20tMnMm#5`@!!OIWz?Z>Sr>5sO<03W;K0f(vX}fCg?g zxHOJIE{7A>jDb8DCb&3%50{IH@rOo14*y~-QaHx#;{abQ`9H_O6u0nb;SGNwj&~X* z=3Ur6%Lk5!7rWJBv)v>j=sR4eEvBjd!xtiZdixzO)k}CM`jeASngEp}!bEr#K?}jP z1lJM#iQqPZI|w+zp9zRPyIbTXn-AMo{>20+0bc?WQ6WGQ?>`BAu$ga|ghg{Ye{~Yf z$lZeTJeCT!mDX-17)0@MkD{DRwch|K8(vrn_D)!Y(n*fi8ITJ=9W#E z+?+~S#5c}|Vz*ng=T%IqoHc7&b#)nke?H8C18q)vIo9QM+pkqdmtW!u%UOU$W9>Bo z(UVi!XN$=l;VKRbkukp@j$iUrym{rNb&v|5@{x7;if-Y(>tS5g2^to2#P%-8!M>yc z;qG5iiv;i_8E2B%$$#NR7fSr!^~mpgeykq0!Z-Ye0F+8j7ZN+gp9;XJk%AcsAUlkl zi0`-JCPPFE-EHX`G5u(1UBw(fW7W-XyUunFY?p3!s^Zsv7?K@Y(XOo z%_Khb22CHB4O33#TN^Q=Ht|FwbRW>c?!WEw2jcf7PYz=F;^L!&_@eP0c448cTQ8ed zHXqY*-v1+1A48~5f-tD`9IgAE{3bR*KdF!woA{C@__^grT-=<3U+E%BO+Te3-0uqG z{P~{b1I+ALYCcWvi4=;$XNA8DlZ#FK#^glMF!_0G;YTFqWj|BjPXr>+zs438F|DLr z*5T1RXo7IJHszqZ<=Q^S-u}Ea4BH$O+E{mf&JTs5IQ!QNb*V|kkC6)Ahi37T2$rFh ziD41wX)R7CvINFuiui8MB;<|JD8}aSRWT@WH_;S__=f2XC|FZJ9D_?CHE}!!CqPO@ zRWK)iX9>E@cAmNvdSnS_a7_x+&kyE>0{$?5A}i(POCf(z7V&(R;IHITlzNz*C}iWK zZWm0{s3+s1P`D_lX?92KxpAFtW)YS{1Rf$Y+{pj66l;jf5YuyqT+?;04F?7&{xvY@PrJ;6_110!43)7C49yJWc1KI&-14)Haa1*vrljhor^ z)Luu>Ab@64c`EXaXQ~loJ%}$^O3rPHMi&S1j=U-2ZC4l7rBPN&!*05K;`d(*-Lojn zjEpCgC&KJg{_(X?nn}4)Pc{l#<0QC~7hea@l}NZoPd0w7;-zaX{B;NY2!wvGV(dib z*6X3SN91mi)zV2cq0MY;=`Ot66%{C*8BvzS=U)#Ed9Rafj*59RXI3wmUBym6 z1C4ygIv6yx7tJgs=tE#sSu~xj!M-Nti#L6nU%{{A?JxNBGT=(a+tId{fM~bGfE!@9 z8TRm_H$o?S9@4624u1Yd$n&`H!DG=gFZ?P+Roa&sDx`$s$!90{xb;w+WhchJ$(6nN zlJzjEMQlshjqK8qJee@4(0)JK#jj0ZF!{AIWmlvTg=qhoj3@0s>z24&2r{|I7Qx?U zL}hdJBsP-xbZB@CJ?8P*H$iVWm{@TW%yvs6QSIOdHbLiPF)k$kk)PQFH%P(|qxdzO zp$4z#j%|jrbn0qOs;DfQFsXW4Wd)na$8Le#mhnWILX3^0)+mAr2%b!%pc0u&=<7G> zi~Qes>&&7xRLarqXss_Ej0s~3C%uwPER-XXuSmled`?cOCa(#HgRDRI{S_XBkGT6@*dvM0IiK?V_hJ#}<7e+hHE-nIw!m;Pp0 S9eo@bj!Z{7eipZ6kNjUE0m{q( diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-310.pyc index 6e6135b529983e0cf31ec1b3186b872ff7ed008d..efc499280cb4d0cd0ffae0a94d9aae99f6cba6f4 100644 GIT binary patch delta 202 zcmX@B^IV5FpO=@50SH!S>u0oYB35yy6MT$h>gcyirH2I~F38OJcpHz`KP~T^~IU(uE2L-HHi{yaZ$xMO)jE0+o z1*;f!iu8d3MFK!Vlc|Ua#O4MO1|UKdPKbe6hLf3vO(q8kN-~;F4ipw=G~1jhoXW^; Q0+KTW5$2n3iu5r80J2pZGynhq diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-310.pyc index a768849b816fa73028aa7a956991292d6fd1b997..47fc0e3bcef7f58313d54bf51fd145b49d112fad 100644 GIT binary patch delta 19 ZcmX@8a!`dUpO=@50SH!SZ{#u;0st}91cCqn delta 19 ZcmX@8a!`dUpO=@50SMxmHgcH@0RS!l1I+*c diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-310.pyc index 94147c749a2d136cc2b97ab31d1eff450fab6981..7130233ef29a52d8c14720c8747c8cf9d2a3b0b1 100644 GIT binary patch delta 50 zcmX@2cwUh=pO=@50SH!S>u0EM^0yxE{j2q~!@jWFb#wO=p){v38 z8dasKT9oc|Q`)RuvJYj^v`!n-CQa40YSN-@nzZ)ED%~IZ+rOE%AN{ead*5S&6ECC< z%H#Ka-t&H(_ndpqdH+x3gZsptDlK(M@b9OW+An@P@rK(gyW}@oth9be_awaQRjQ9j zOVQJ88Sx2vn_J2UH!cqopvY37C4l0hk70ih%J0 z)2KHA(*&h7@7UB+!1(oMV47(m=q;e1(px}pp-#|SL2uRDKyRaEptphEt_MI5&?BI? zgWjQc_5#sKJwOD2=+e7E@1`Z7cYxlbqrI0_(qbs0lXj|Ix*V4Lr+3@r<0X&s@IRc{A>ZI5{ny%k&}pksk4Fy`6VlDeaTS2-fvv&Bgh>`Ce0Qxoo zzYe}U7$m3o_XitVA9ZHE`>{lB1y%IBoAHBuZF%_)booifr9W7k{*p<4COjaUzkqdP z<~D>b1koy6f+qd;Tz@RP25q(+j2fGX{C2ZS@Vf;OjVAuj;H&3wxkLwr!79xzX^bWk zu&lXGH{v)2!2@7m0Q~%%l3gw-be5MDG7rBI^6;}$PX6bi=H4?nv>)MFgj}Fp1A}1r zB?S7n9RvtOSTGx+C^!fdY??#bOn5AjikjNSR!U!q&9WgdJT}@07=8`W*f5S5fk@un z9}fSG5HG(x`jn?(-%mlQ8sI*^IXVL0FYF4(P&^rBTdW>!qQVK36a?(h2V5TO8_Jv0 zz@GK7^^Ah`w@{Da00C!L;$Wkqs+(hT#BmIr+xUa=u14I`s!KOh8hk17J5Z0e-BK@N?7J0<>j#A~?sE(45y-%v1yc*$W_C^=b3Tcr2y!>hl#% z+M~mBMMS~iM4uONL^NAK>r8j+egSL+O$Q}BEE4kTGyd8GljsnjOeEnypRIujel|1V zi#;i71&_`853ZVmZ~1=JG+XsYv%%UijQY}(Li>1csPo{^tKeI;A9^(#`n^z3>qU(E z#qn#=InK+@Hy@m24MNrICs~6e9{#WS0 z#~qLsrKJ01X`2}JIqtG;o9J?dbWKi@%XYJHTSje%Y)hKcELwBHZ?P`*h9$FPN4i~# zVRQ*z9JbjAgRe;PyIBf;*i!(i^CfD=E=Cgx)_~kNzaFVeTZJ0FNm5L8YqKG3cz!M% zn$t#Rrq!bvUK3t;c*4=Ny2Wb1*DBgb8Ky?B(3syQj#JCdQZE~p4UpxvX%ieqpwor| zf`iC*nYe97;J^Hty}<2~W#S|(y33drrcK7x9cZe6q`(2p{I5oJ%<0f3f>*zbqM;7Wy9ba2Gb4naFxQJ{E zz;bLvS#;gVpVcC3(edZKH^tixRDO@g##UGL7*=X=)#|Hpi?cFSd0V$YC%UJ(9;bh`~rzX zvLjF95TG-*K*aB0;vF!KsV)Op_9$C5G8>>YZfJVk$Tm4!q(vyh$tvQ5vFvbm)BGae z0sF`Nu6Fu}Sj<-T(01hyv_W!-cf5Em9mISE;&sLF@x&Ymc)eN9y-S|qRn7_#@Iq$z zRb#Da|~aEJs*8To~R~YGLL|p$xALwK%Iq=oORU8PAFlC>$mdD?xD;p%ej6 zJj*_s++1h4dD$xnVjJNqGHgD>$sPQKT>)#9N223il>FUn0Ed4U;W$DF;Z6RVs8QC8 z;vs}Ggxma?6(y}YXmT~4q@ugbL<2r|*&PII82bT&Xcs>4*c5_jlIRb%MzoOq2qo-? zXhUY^cq3(|i!&9+0mC{oryXou<>7Nf0gL7AUr*_q2|7SPGa~$xm3Hol)fPM>rJb(- E0a`L6%>V!Z delta 3637 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 dsk#NUvg76%D%o8BR}5-yEukAUHQQ_Q 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 VR9X(h1*xN5uCXFgWpby delta 19 Zcmexm`OA_kpO=@50SMxmHgbKC0RTEm1uOsn diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-310.pyc index 6a0e8ef1de73ef3ae11b2cfedc7cd654ac70f230..fd83eeb7a5a77693c9f67e19244c8e28de9e3482 100644 GIT binary patch delta 19 ZcmZ2zx6qC&pO=@50SH!SZ{!k}2LLdZ1Y-aI delta 19 ZcmZ2zx6qC&pO=@50SMxmHgbu}0{|?+1Fir7 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-310.pyc index 2fcceff7f8a6fe76c222f038031279dcad53bc38..7d120f6e50c7a13822bb75a5f221fd1b06ca0adc 100644 GIT binary patch delta 19 ZcmZ20w^oiTpO=@50SH!SZ{$+u2LLV(1UCQx delta 19 ZcmZ20w^oiTpO=@50SMxmHgYNR0{|*H1A+hm diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-310.pyc index 6a2017a43362df8c0ddad1491f543c487d513294..9eeb11568e584a10fe358d5346cb61ef9f86524d 100644 GIT binary patch delta 19 ZcmbOzHc^Z#pO=@50SH!SZ{%X<1^_711J3{e delta 19 ZcmbOzHc^Z#pO=@50SMxmHgd6Z0{|rb0~!DT diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-310.pyc index b6c478d9be391e3e5da727b947460ae0bb9fb812..9a7186c5738bced2c03b05d4b5dd2f4681346a44 100644 GIT binary patch delta 19 ZcmX@jcAAYVpO=@50SH!SZ{%`h1^_Qc1XTb4 delta 19 ZcmX@jcAAYVpO=@50SMxmHgY*K0{|;=1E2r^ diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-310.pyc index cbd90017d80b417a73b39e0fff199fcb1ca485fb..49f0970d6e5c702fd35ab09d0fe56ad427d05566 100644 GIT binary patch delta 3453 zcmaJ^O>7)V74DkuneO@Zj6MDv+p)7wvYBMp4%sD}L|zly@rERhv-oF)nn0`FRknN5 zGd-#9iGT3oLyU4*goH}mc2Od6u~xfc`MCsX1(%h$074wthP{Betpw6?0zr7M#(z6R zv{m1{dR6u6y;twmEC1orlgVvAn@uV3y?b|bb#z!!{(_yOUmQADpank#po*zbLSr5= z3H+*Ftg4zCQK&}aUc8zx6Ov8E9fjstrlLa2^(qfkvkmxdG!OhdGoYV`eu1__znvwZUx0oGEkeJ@bm+IU zcC&-V=9O}%{b@{5QmK)VA?n&5bHdA)hpHRFJ@4!Xzy2g-Ai%?W}kGTOjO5lE(h@roHkN9-u3N>$iHi!#v(lg;&Ss#~z0swk^Tm$g~(i+JbuJWf9?r&FatczXy7DR~g%xh>@pZ2p+M zsf4jDxa!v|RC1R@@%y&d zV7m(MfYE<0PhGyV7%(2(x#=&7|7c&ksn@yhupsy%>Vkn{kQDqGL?fFcM-3j~ENFP4 zwKw1ABV(TL*j_L`vd22K=>?DjmY_|=XWJC2Xw|-5JOc~L8gGN2rWtAg2Ia9^KtSc2 zfak+I0loz7h{73AxJ=A#-43iq!=-RuTEM*JNZ*SHQ+IrM>T-39#33?%NNo;Ho&I4W4q zt-z(savD7F`3wwyhQXU7n^%Obof1E4H^lq#7ltvA%j)a`9|VFQM;Jypw5%xp9WNzr zBlDyfNW8I)ng{HrKxSlcf6eh5wJ=Ir`=n{Ofm;K!!pLyMj}!g3%%o>S^!RHojZ)SD zEp>;4NLrQy%)qjmhRA~{gZMer9WwypKbDK-i1BpuoOH+)y-y6~l6QJw5Y%o4HmF_! z#Q{kL?jZg=48nbK7Jj6*{0vg94nrOen9za*Kq`g-wmFI$B}ewH5;yddqf#Q_FXEbK z$ceHmEIhQ&7C+D@w$r?X)B6zm5#;I27tN_Ex^1q6bS67`GQ%G&l^G!$f!qCNmV(OazT^&k#$zOShq_a$IK!tRC;KfCS*eN%0z(#fkY{>KANN{$?uo^ zG|d2ipjmm$W6erq4mK-{In=By=5aZ{8y0vgO7R5%+MP&VG#=vlt8uQ#Bbo^?4{4McOs=D|p za5+Lb5yk0}U3cYG7{$Xz-D6RVvq)cdYt;5U{tC{0RygD=xzd9C4qU(XP<$u-gj^8U zGT%D87fD^X^b&$R2?_FcNRF+r8e6aP@pr`EGhaR}jW9TtrpT}?x8{bHWv1#jx2r+8 z;W0jrQYOVxcKkSAH&Np5n$1@NE~Di@FrS98?~7k$zguqEG2>S2J`bBJKZ02SUO|uu zXT&d)1LB?B_sD56+BP_g8%6PH&V9~N|0wSHYmArU@|ueXi&BnXt3k;Jn`Ppeamap) zwW@Lp7XR=kZ@0Zo$fCGZc!eazy+W}MFRMsf@_jE-A)lIt-2f&piAM#Kbc=r#UL0No zhMAd~xjsF+V7)doac#cUg&pF9_73u%u-boiQFFBe|CtWgTF7k&t~WHz z!jk?wG1F1KfQ4AjF2|ZTIo?aH%iAo`?q>rRU@}#jRQ4nqP-!4Et1k-1X!J&RyU> z;AY!bCx%|1n|^&_ZhGkQx=VQ-z0XCX^bPWL@%z&4Uc7D10+z;xJRm1rhq4y% zm&91#h3zDcrW6dXnTK}+N0+C^8I;D**4Dq7n;Wsga7~l delta 2224 zcmZuy&2JM&6yNc#y}SO39e*ToVmpB%VL?Nn6jBrdAqrnj10@k3Tbjl3OcE#StTnqK z5kgH7t~gXel}0_a*H(&zL{U`<Ed zZ+7dKWvW<#nrz5K0y+q^ zVkkZx0y<~}fmW$zg=(sy`m_$TW@tc%4gH)%BlPWPL!wa@ye}JJ5X5L4_&Ae+j{x66 z6Tl~!0(_K3jTj9~OQqzKmwyGs3wb6c^8iG}2|_?zR`O&>JXDKW8lq}LGD1|NI_xSX zpcWQCtBtUyILw;glz38H3tFPC<;bA;RGZ(AWhlv0GdzOUVh9}w$!+Ka%FBpbdM0!j zg=ukAzj|aGNaqcJyV8=x-5t3<1Q6u)^oW^+@_q7T6Nu-LUPd9a~^-%fYbtA~Hra zQB?Px_f=A;mqF-3$RV^6_bJSt>i`E}IZ*&jQivANWKE7LT!-?f#d7r2v0gmbhmc3u z%?vb}Gy==P?m{!XAnIzKJQsgQPi`!A(jW~rr2E83J&@)Jc2Pq!(kw%D8usN`Uml@R zkasoP#^`Rgi_t@qv=eSUM^iKnd#`^sL$h$Uk9N^+kmYF)&B0#Kduc!Iqxl9giauSS z$s#cQ41qO#avc4lhzd^zyR@HGUcC9`- zD_+KHH}-=PM<|87Ae}4MtDd@8cFL~Hy`Z~Vx0n~;%v0y9E3|A`d=H-At@YxjuWjCD z+^O0thWNT;iwuZz;-dr2>-S`6CXT(>9+W<^z*g9LosZTlXSL3__%PWO zDxub(xRV?$C4lro%WGx6;A|34H_ZyPrem5-t9~QA1!oq;ugQn`*8TeFN2|5E&E00G zj%ajlkt5<%syKxXyx;`qHs?b=ZP{y#mxA2)N0=9`*effn;zDlC=?FqPCga0!dWY+i zz^;A!DD@>F6XHVVIP~$oOuBb3+EnIj+wx>+cJ3#10#$p(HyMK@L?rv>-U$#G(ecR( z6H_zh*~zhU)9s~7i662l^0Bb9-wpeb>1@5i>KGN=Q{{ihVI*B%uE1zwYG%cz>??7z zt9Gm(efx!m=K$$5uLZ4SybhBx7jiZ$i)HRG_mTLgYnogW)7@9K*Sg|KcQ(;h=A6j& zTcWpT@nWild(N~$D1fVDa?}h#LL2^9v!S0Nqo{*{R^tN>o95#Jcg6SW6;)*i(MB7 z(GyOa7xAaC#@t1la(q2GP6B@);VQy)gbxt#2KhXKpT-hW%OV*~6OA%G5C*#Hd3?cs>Md}3+~`oN71!xG?0#x=ARNs$cbb^kv6o!e*tHP_2U2l diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-310.pyc index c86be1eec1999fa57169518b9a15119e3afa0c91..f30a7f221bff0aa51d3f8c0a410848f678d9b087 100644 GIT binary patch delta 81 zcmca>c-N3CpO=@50SH!SZ{&&><~aNN`g(?hxVqfpatsae bhj6R-gIoh#9YY+Qd|VZP$~JEi)no<$c-9s{ delta 81 zcmca>c-N3CpO=@50SMxmHgd&_D)R@q2DmzgI6C>bDg?PYy4>P&3=Q#j_V@Mm45{J+ ai6~4i6qOJV05e1VATlAYo41H+G6Mio4HavZGI=jG*M0D^cX{ft)|c^3-HGXr_fKwQiRBx)EJFr+XpWMpJWVG3r@WcG8L Pd`j4vk!v%b$PYdMu_O(x diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-310.pyc index 3140495b7429e50b479386f50b867db6dbf94d88..6aa03466d37efaf31ffddaef25a2aca9b7ddefe4 100644 GIT binary patch delta 19 ZcmZn@X%pef=jG*M0D{%o8@c{)0stuL1gHQ2 delta 19 YcmZn@X%pef=jG*M0D^d?ja+{?0VNd!^8f$< diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-310.pyc index 4889d35e76442c287e39866f4555b48ba2585ed4..649d667b5e63b42a1d3860a8b27ce0204485dc5a 100644 GIT binary patch delta 1090 zcmZuv&u`N(6t=$_{{xUX@DBjbSt%T_<>&Y8?|uIK>>rcQY1YeR2!i%@ z%cxz?y~{p{VK;mcTfV~M^#s#dau+?tW{MG(+C^rXjqjlfW@(n$O`4g=&$6*y-OREa z%L8I;4{6BEZJ<)&{rA{urH>{1uxT(SVXVUNx50E10b=+muHzki54mX#1xlb+luiL7 z+3zE!Y@kOd&|bxQxE|lfJ4!dvQ$U(Jg?3cPA&{eYPK@xH#P?Jd+fuxhp3<);)2Ibb zJ;~xzh-qyM+7ebCbTJ-q(R5r+oeFJrnjQaPgVrpcGTsv0wgS!;s9m$%DrYpPaagZd z?M6Vo$^xOo<_Riz)7u_G<{{B@U2X^S)DqQpzsX&hK!>Z2=PtG!w|cy^NJbnRoYT4G zr85^#QOjkck&Fmo8j9zdT~Dfa*=l-l__(?XrKAbPK~ez-iGfB z0;U039YKYBT_Hb|kZ)}kt9>4nZL86+HXFPQ1@T+l9%!-x15Jhla>Hf(@l_!_G0=wv z_Dh;bNs@6%qB*YLGBcyYC5=eS?Z{-n8x+bucUie&HGEzUys|uC4L1DQX|PHvi*q=R zm0xL9!C9P+d|fTVO80nZkVF5=57)`zn-tP}s1BFv;a8a9eT<_&DWiS(q4Iy0)Z5qY zmJ~4oSWy52zLam~*rwHT$_J$kKat{0f*ok9!nQB#6vqT>n*LK$y3#Y5`H6>a6X(* zJv$UBoRr&=G)ff<;m6dBL1ipUDPmw&VED3fI?^z7MNv=B%3VLM!az%5+Ff@v=opVGI`LzMepkSw$cnMQR{Lyiog+Q*&})c7ja?+X1$n6{yY%h>Jm5 bIT%m diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-310.pyc index 080a61c724b8b76e038a899ce72a4bed5d5deffb..ddc09711296aa05c59118719f872193925abba99 100644 GIT binary patch delta 19 ZcmZ3fxKfcTpO=@50SH!SZ{(UU001uC1hN1C delta 19 ZcmZ3fxKfcTpO=@50SMxmHge4u001ip1N{I1 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-310.pyc index 5525517e87f7060d4cc5f39d6ef00c1589e34a9d..61f6c3aa96c66991a53b2fa6671faeb605f5c6f7 100644 GIT binary patch delta 51 zcmcas@uh+{pO=@50SH!S>u2oQ$ZM*@=r!3{=K!;Yz18IXI+C0US~?0^n)aI7o4Is- F_yLii4fOy3 delta 41 vcmexTajk+kpO=@50SMxm^fTsdxeb$CHxcV& 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 ZS!$eUKE5;8{7>WB=5>t|jS~wy{tHBQzPSJZ diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-310.pyc index a4e5f5f8c6c6c3317296482042c8dfb5aa7c567a..73bcca9c970cc317c56eeb6774af508010cfd281 100644 GIT binary patch delta 21 bcmex=l=1&jMy`BbUM>b8Se?C*>uVAKS1bom delta 21 bcmex=l=1&jMy`BbUM>b8h-cc!^)(3qQ&$F? diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py index 97be625..2a0c6ba 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py @@ -37,6 +37,8 @@ from ...util.concurrency import await_only class AsyncAdapt_aiomysql_cursor: + # TODO: base on connectors/asyncio.py + # see #10415 server_side = False __slots__ = ( "_adapt_connection", @@ -139,6 +141,8 @@ class AsyncAdapt_aiomysql_cursor: class AsyncAdapt_aiomysql_ss_cursor(AsyncAdapt_aiomysql_cursor): + # TODO: base on connectors/asyncio.py + # see #10415 __slots__ = () server_side = True @@ -167,6 +171,8 @@ class AsyncAdapt_aiomysql_ss_cursor(AsyncAdapt_aiomysql_cursor): class AsyncAdapt_aiomysql_connection(AdaptedConnection): + # TODO: base on connectors/asyncio.py + # see #10415 await_ = staticmethod(await_only) __slots__ = ("dbapi", "_execute_mutex") @@ -202,6 +208,8 @@ class AsyncAdapt_aiomysql_connection(AdaptedConnection): class AsyncAdaptFallback_aiomysql_connection(AsyncAdapt_aiomysql_connection): + # TODO: base on connectors/asyncio.py + # see #10415 __slots__ = () await_ = staticmethod(await_fallback) diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py index 7ef942c..92058d6 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py @@ -37,6 +37,8 @@ from ...util.concurrency import await_only class AsyncAdapt_asyncmy_cursor: + # TODO: base on connectors/asyncio.py + # see #10415 server_side = False __slots__ = ( "_adapt_connection", @@ -141,6 +143,8 @@ class AsyncAdapt_asyncmy_cursor: class AsyncAdapt_asyncmy_ss_cursor(AsyncAdapt_asyncmy_cursor): + # TODO: base on connectors/asyncio.py + # see #10415 __slots__ = () server_side = True @@ -171,6 +175,8 @@ class AsyncAdapt_asyncmy_ss_cursor(AsyncAdapt_asyncmy_cursor): class AsyncAdapt_asyncmy_connection(AdaptedConnection): + # TODO: base on connectors/asyncio.py + # see #10415 await_ = staticmethod(await_only) __slots__ = ("dbapi", "_execute_mutex") diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py index 8b0e129..92f9077 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py @@ -999,14 +999,14 @@ output:: ) """ # noqa +from __future__ import annotations from array import array as _array from collections import defaultdict from itertools import compress import re +from typing import cast -from sqlalchemy import literal_column -from sqlalchemy.sql import visitors from . import reflection as _reflection from .enumerated import ENUM from .enumerated import SET @@ -1047,10 +1047,12 @@ from .types import TINYTEXT from .types import VARCHAR from .types import YEAR from ... import exc +from ... import literal_column from ... import log from ... import schema as sa_schema from ... import sql from ... import util +from ...engine import cursor as _cursor from ...engine import default from ...engine import reflection from ...engine.reflection import ReflectionDefaults @@ -1062,7 +1064,10 @@ from ...sql import operators from ...sql import roles from ...sql import sqltypes from ...sql import util as sql_util +from ...sql import visitors from ...sql.compiler import InsertmanyvaluesSentinelOpts +from ...sql.compiler import SQLCompiler +from ...sql.schema import SchemaConst from ...types import BINARY from ...types import BLOB from ...types import BOOLEAN @@ -1071,6 +1076,7 @@ from ...types import UUID from ...types import VARBINARY from ...util import topological + SET_RE = re.compile( r"\s*SET\s+(?:(?:GLOBAL|SESSION)\s+)?\w", re.I | re.UNICODE ) @@ -1164,6 +1170,32 @@ ischema_names = { class MySQLExecutionContext(default.DefaultExecutionContext): + def post_exec(self): + if ( + self.isdelete + and cast(SQLCompiler, self.compiled).effective_returning + and not self.cursor.description + ): + # All MySQL/mariadb drivers appear to not include + # cursor.description for DELETE..RETURNING with no rows if the + # WHERE criteria is a straight "false" condition such as our EMPTY + # IN condition. manufacture an empty result in this case (issue + # #10505) + # + # taken from cx_Oracle implementation + self.cursor_fetch_strategy = ( + _cursor.FullyBufferedCursorFetchStrategy( + self.cursor, + [ + (entry.keyname, None) + for entry in cast( + SQLCompiler, self.compiled + )._result_columns + ], + [], + ) + ) + def create_server_side_cursor(self): if self.dialect.supports_server_side_cursors: return self._dbapi_connection.cursor(self.dialect._sscursor) @@ -1208,6 +1240,12 @@ class MySQLCompiler(compiler.SQLCompiler): ) return f"{clause} WITH ROLLUP" + def visit_aggregate_strings_func(self, fn, **kw): + expr, delimeter = ( + elem._compiler_dispatch(self, **kw) for elem in fn.clauses + ) + return f"group_concat({expr} SEPARATOR {delimeter})" + def visit_sequence(self, seq, **kw): return "nextval(%s)" % self.preparer.format_sequence(seq) @@ -1760,7 +1798,12 @@ class MySQLCompiler(compiler.SQLCompiler): class MySQLDDLCompiler(compiler.DDLCompiler): def get_column_specification(self, column, **kw): """Builds column DDL.""" - + if ( + self.dialect.is_mariadb is True + and column.computed is not None + and column._user_defined_nullable is SchemaConst.NULL_UNSPECIFIED + ): + column.nullable = True colspec = [ self.preparer.format_column(column), self.dialect.type_compiler_instance.process( diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py index 896b332..9730c9b 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py @@ -30,16 +30,46 @@ be ``mysqldb``. ``mariadb+mariadbconnector://`` is required to use this driver. """ # noqa import re +from uuid import UUID as _python_UUID from .base import MySQLCompiler from .base import MySQLDialect from .base import MySQLExecutionContext from ... import sql from ... import util +from ...sql import sqltypes + mariadb_cpy_minimum_version = (1, 0, 1) +class _MariaDBUUID(sqltypes.UUID[sqltypes._UUID_RETURN]): + # work around JIRA issue + # https://jira.mariadb.org/browse/CONPY-270. When that issue is fixed, + # this type can be removed. + def result_processor(self, dialect, coltype): + if self.as_uuid: + + def process(value): + if value is not None: + if hasattr(value, "decode"): + value = value.decode("ascii") + value = _python_UUID(value) + return value + + return process + else: + + def process(value): + if value is not None: + if hasattr(value, "decode"): + value = value.decode("ascii") + value = str(_python_UUID(value)) + return value + + return process + + class MySQLExecutionContext_mariadbconnector(MySQLExecutionContext): _lastrowid = None @@ -50,9 +80,20 @@ class MySQLExecutionContext_mariadbconnector(MySQLExecutionContext): return self._dbapi_connection.cursor(buffered=True) def post_exec(self): + super().post_exec() + + self._rowcount = self.cursor.rowcount + if self.isinsert and self.compiled.postfetch_lastrowid: self._lastrowid = self.cursor.lastrowid + @property + def rowcount(self): + if self._rowcount is not None: + return self._rowcount + else: + return self.cursor.rowcount + def get_lastrowid(self): return self._lastrowid @@ -87,6 +128,10 @@ class MySQLDialect_mariadbconnector(MySQLDialect): supports_server_side_cursors = True + colspecs = util.update_copy( + MySQLDialect.colspecs, {sqltypes.Uuid: _MariaDBUUID} + ) + @util.memoized_property def _dbapi_version(self): if self.dbapi and hasattr(self.dbapi, "__version__"): diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py index 0868401..d1cf835 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py @@ -168,7 +168,7 @@ class MySQLDialect_mysqldb(MySQLDialect): return on_connect def do_ping(self, dbapi_connection): - dbapi_connection.ping(False) + dbapi_connection.ping() return True def do_executemany(self, cursor, statement, parameters, context=None): diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py index 67ccb17..6567202 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py @@ -74,6 +74,40 @@ class MySQLDialect_pymysql(MySQLDialect_mysqldb): def import_dbapi(cls): return __import__("pymysql") + @langhelpers.memoized_property + def _send_false_to_ping(self): + """determine if pymysql has deprecated, changed the default of, + or removed the 'reconnect' argument of connection.ping(). + + See #10492 and + https://github.com/PyMySQL/mysqlclient/discussions/651#discussioncomment-7308971 + for background. + + """ # noqa: E501 + + try: + Connection = __import__("pymysql.connections").Connection + except (ImportError, AttributeError): + return True + else: + insp = langhelpers.get_callable_argspec(Connection.ping) + try: + reconnect_arg = insp.args[1] + except IndexError: + return False + else: + return reconnect_arg == "reconnect" and ( + not insp.defaults or insp.defaults[0] is not False + ) + + def do_ping(self, dbapi_connection): + if self._send_false_to_ping: + dbapi_connection.ping(False) + else: + dbapi_connection.ping() + + return True + def create_connect_args(self, url, _translate_args=None): if _translate_args is None: _translate_args = dict(username="user") diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py index ce1b926..c4909fe 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py @@ -509,7 +509,7 @@ class MySQLTableDefinitionParser: r"\((?P[^\)]+?)\) REFERENCES +" r"(?P%(iq)s[^%(fq)s]+%(fq)s" r"(?:\.%(iq)s[^%(fq)s]+%(fq)s)?) +" - r"\((?P[^\)]+?)\)" + r"\((?P(?:%(iq)s[^%(fq)s]+%(fq)s(?: *, *)?)+)\)" r"(?: +(?PMATCH \w+))?" r"(?: +ON DELETE (?P%(on)s))?" r"(?: +ON UPDATE (?P%(on)s))?" % kw diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py index 71aacd4..46a5d0a 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py @@ -59,4 +59,5 @@ __all__ = ( "VARCHAR2", "NVARCHAR2", "ROWID", + "REAL", ) diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-310.pyc index b34e4391c63dafa35463a92b2e4383b7a648b19c..e69eb6448abc8ee68b77f652e3956fefed454dad 100644 GIT binary patch delta 36 qcmdnPagc*IpO=@50SH!S>u02HJfLjPn diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-310.pyc index 9a1db7775b9db70ceb36fded66f0fa42b5b733e5..1cd5569d061780c81c2f25e120e6b39f2a68bcf7 100644 GIT binary patch delta 11200 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 UvLm^Da?(>nD9aGmkT&@L07Dp~r~m)} delta 11107 zcmbVS34D`Pw(m)kv~+>)Ezm;C9)wbMS+zi`xDE+dE=i!hEb$~*t_rA_I>_j4ZnINasjbI(2dyTX#8_jTJtxLEibLII_KYP* z=&ImuvMi4=R>V_!sA%>Mi{ATKjzvA9ThG}}_4@vW>GYC5G-p$!-4J?tZZAvzi@e2Y zORs!KYjq_z!|}5M9+%r6@Twl%RUvJ;y(D`Bnu{4YY^oUT)c~9H4Y%jfme6gte@wJh zPpa!jtMr1pjULbb6?hH?Ve4fzUccIgKBzfjO&V`tj&7>AsOK@Y1z-n2 ziFEb0J8BY}h^Sq9_?=y7w|3uon%0J{yQ@FZGokzDosFee^?mmYVt6u>ZW=RJa(981$4_&^(M?UpG!&vXGjO(bReA%p zKKC5gG*wd_a80XGt^o5<5mYY&X%B<2?dB?v@~H2yAjehZ4!Bg!%`Ts}ZM8S(^-p(I z_}r{qbr=f{0eq|fvSbc@uj6%pI;Mx~?ra*Bx|Dv?WNs!W$LRR=_`XB^)ru*GAD{K5sFD#HvtVtEl=rv1w=x24$BpJMdBPkq1Wy<|lpeX6&vFf#UGGKsCE+8uNS-BW!YwL$y-I+BisR{wQgL}TfC z^i#eLuxa%Kz(#;(`rJx|SU4~KQ8yJmZociJ46*I((mB|>zczTxTqiS5DnDy&|u zmp$Dp1-q+y0HL-~A9y;KPU%xmpK#hg^EvT^z2CX6YW;EXF9Ck;oeeq~i|$DX`FqbyUrl^%c48=T{+ zsSSErt}IawnmN50r@$5y6G-A+lc@2pRTtIQQ%4=HUqtzO`m>j?^Q?Q;!GZYWXWJ3= z)+blz+aZK-oW65qw(k2}77fyuJ~z2bJ0_@d0lEY90>CD!FTjNWSvqxnPRDF+9%O3> zq%fKIn0Sg$i?_w+CZ)v3rzERv{kKqtPFeFR2d6!2@~Kq+u%?FFH>}NRJAzkU!aS>y zpvM1Vjv$#RhhDtaprN|^y0LVTp1H1+F4r5@-AxWX^7#q2%NVg-KluFQ&ZD^%wkfxN zx+iR#>5BE6li%arB7#-#>)tPPBd0EZ zVF&fpZ9^SsqrNbdOH=jLp-bb&f!YKzwhX7NELFz6$q=?Za^$3VRTlbN=rJqhY5#^% zX+3~mz`$Wq9i$!FwqX<55hhiPp7%=O2n0Asyy^SqFz~Kr;LJpJ^H)^4m4r|}Sw&5y zM@<33bpVSH*K7-z!sFV$=||eEPj4Dvm#M>gz^mPCF2>rVU9aw<8+4D&e{4GptHjLD z^_+wHjm-?g9Qr+2uxVeyMMI&6!e+!8n{CU`~JVTA#$j z&|i@Ia~*oc>)rH#*Yh%Gao1rfbI_5*X4unSFS36t*m~LP*V{oivc)ZobyR0>9ouYW zTCU+0d*9<4K8P2a;d)R+AsrTA8g%2}-TW`xRHr=qzljh~Ej&xvT2dSCZ zcDh97;_Z1v+O>T*CF-6#{y=rQeutl0>zp^X(|G;K8@E#r?R>MW?NvCAHJlI#x>Yc6 zvo~0!`e5gsdh44RywmbNtFrXOX*aO=h?SIy0St}uj~Wgzjt_*j9_7JSUd*kgRsjAT>+ zjl^!$C*OV}(bq^OqN|VIX-h$U{GBzlR4?Dt%?1W;)w}mxP78F_-j~wrxnHW5GjyaX zOmao}>E8Y$p@DExV2;1WKd0K|cUOBvCgDVpw8?llu5v0DApRMqLKgGtaIDwwVmBN2 zZo5GuNZ}ouG!vvCrhxZpULTiOLO!4t0&Bir{;q@Oh2DDiWulk$9s9D|z683hkm_c8 zJvRqb0Ibnuj^EGk%j3#s@4gOWM7W@<3NRa6TsAqJSTpq|E}>k(Ikg_O4s$O9AjO1J zuPiPvnJ~8aim}d;F|J8tORiBb>7w_BUm(2M0u?p9W)RR{U=S8TM>!A;Y!+L4_Pumk zuD84wux|(UAU*i~9laX3S*{*t=tztR6_d{b6!7*6M^alDgxl-azidBMy@3JPK{zf@ z;r6*zK&|JVqm3EoqM|f+0rq)>D$JU4+yNBup@i9xFx&7!Dt!`q>w{RLSiR@N35o9j zK_c7Ry665bWC@Mi|2U;i;^9)$?95&CuODSkiEg+T%hm#{0T5?-j$7=GQCkJNqm@~} zP6b*8z>5H}P=U45%k}M3=s%}x4`gvbxaUBApAZi?TUSnnT?I@#3xs32)Kw__!|s@mC$!2|~gsg?GD zLW^4I1n+#I9vPlAR@?%YCO-vC4{#pF=5c0GAL-hILmU!@#EIqF&=io= zeOTK(sJ?g5amoD{Tnzx-Da2T{NycEJT>*MRx>M@Hu!CGx`FpXwVgT zA$+M_01~<)C7PTos_r*2e_oGhJe%6dD9f0mKnK0}%kBT4^K5Q9Pm!McRW2VTvof)z zK9_(KIgCc@w+>U^TtCrsoc9QN#8)}=yq@%xv-KgS$#l!2A!vMDL@ zqfo|?wv;G1k)(RzH(f4x6>AEx<~wfHHxILtfJ8TFmv#`S+pQD@%u%Tc8sS=l{g3ZIA|JgNoJReznSg<`06^p?YzwnelI_3*xKe`w@>y_Dh#uFmM`e#M+4uiYQC5Y_vflx zoq$fW6M-B-yMasXKo%3W+Kqxd%G9aHUl_3wl%?>B4O@L)emoJ$JdeE+n+ZVpmlMma z0P||&k`wv-L{z}g9~yPyYwCGD51*!94szN&KE7J2LLMj&x2g0@b2G;-e(3Pe^7%^n zI#zzNG+!=%5>d#)^l)(sTPxgLEQo=Are8VP&JGePR)t{}lCiBMg%c<5}GbjCPQY_cQTssVD@>cad zQ)%>7AJlLjU;Tz*N09I zBD>BzUvWkGOjMrgn%N##z&n>~RXi6<&3&&<`K54x9cRzS zf^4)z#1N3vRv}m|BJ&xZdMBiQ$+HxNZR}Ux+K5$!skWu3qh5BlVxoATnmfc8Nz_$; zaW*qI20QUsjOxcwWpbCP^hbLDKREko!-IE`T1pwHJIvvRbpC^nxe@Z!Zwy@ zFd&KzThR{N&F4MyIv{6=Mxb0KRBqUbZnpmb!bgpHL|szO7ix^%L}`gZ9O5LS&h4n{ z{*lvgmS`6Zm0&M%R!o``UF1-I0Z}o|0LGv;M<>(1%rypCDZegSh{J}Xm4`E)D?`3e z&+s@C%xkt>UBxhPS#+l1U7;GWRUTN`!UIYwF{$0xVNV1dC6&F@>EEN<2|$tJZk`Fy%ITCwb0smV8nqm(>ZWLqrVvIIRWyU|PRA3j&yV6LsQ9qj3Fw#cJ z6nBg$rsuL1+V=?zh5h~_O}PMkq3pf`v~B64tRlhG=kDt;>y$s;(w+=%4PXC9f7i6UrU zG+K#HIiAt*NjzOZw9$x9pn~isRdbk>hjn>Lu^JaAkb_PcHziQtsRtno5qL%3B>&e+-+0dtiI7Jfg*@Fde^ ziBU}sG+s%j4wDc@`8l8%hmGn|Qm`0cRD&(_HVm7Bd^pvG^dAvAzJ3L|H59g{n=Ew9 zcqE0o)4z?aDbzVp*c8|7XB$#`sh!h%3gZ)e`wAW;JvwU6hGb5w_2E`(}9p^^wwezi~K~ zI*5JWXC$Q2{P+(U3$w=3H0n|Z!(WoX&$Ik5#&U->#$ri2n{bv3m1qij7u<}%j%Ibo zm}aIx&fuq2PcTx9s4kc)WlTqAODUf(e~gal#rPune!M6g=keo1Ql+yM=kthA#3)Q@ z8s2p3Oivj1rc+K^>|*+2F*X(57xLI;#+Gzimu$vX=8wy}Y@=g)%Fg<2PcmM~pfvl# zECO}1;k^vnL5X0B-;HU48f>h{qRvClVi&w-INKlsM!$;j+bX6+*Mq>+g#c1xNJw04 z{L1T7qRs`sQprZ&Z0a*mZsy``ay>t{<}w|~8gU?INKFLka^t~l>Pjn(P1$s~q74sm z2@D9;H&JhU`3=5j#+1HHjH2H6=C~)SLJyQ&*!u3E&!lYXRmN4f%8{ z-DvbLputz;p5sh(DbKXVN2y96UC&@{EB@G6Ji2`BxH9uPl!KGsi0Nqn%h8osy#}r4 z7}Q(J%9N)mUZko~Kor%CMytg5wt#XIppBQHjZ2KwPBf|RcPg-k<#kY8OpYW%Y&w^jch-SI(eRLh_$_R6Dvu3rnAn93a8ne4oX6K>ULA(-KwPh4Q68_Ry+nvUD690Ds zr^%Y->}6b4$u(%Ck>7)|EF=FfTdV9rog_}!jfFiZFyVKaS#lC@D{-P#^Ed$ojQ~ec zyL!_Y@1QQjewUKrX3@GRpiCtj>m1b1ZiaG$zXtVa!~j4=v?VY zj*|!!t;g4bJ+W627<{u#$%9w6`CUT3Mo8T(*%j|v&7yhq{d@@~#1Bx=nuf1I$aHn7 zx8-qEY8NTV#U-kNl8YtZa;veH7SU)-iCr~?O=o=Mds{>hqEm6a`NoP~TvetUdwS9C zE;u)*ooMt$Fb=aID}1vm`R83epBiLr>P-5`C}*MmyIjW$Njd88D*z{iVzjWUB}%rR*RgW z55Gxd7zg^$C{9%Ei>QYf;5_5fB2vFM&i%Q`03+p54mNBH5DNiI){ROdCGN*=&76@NiJ&#TOXII+CS^fB(}PwkCw`ca?3VufPZ zVqv>LDe|*D(W_`|K97cN@(In{aHBE4KZl|FjH>=LG-)zVmzx=Ay0NxDRnlQ2eE=P@ zyLm#jGtLg6+i03`+d#^rY-8y_>X|qMGxE!yGUMHWR73|J8bo92To|6oARJ$-@Xa(h zN8O0A*#Nf)z^U;o1a&LAw*mYC;0}Ph0B{m#YBh&#eyFH)HBov9lbx}&3-tUrx=#W; z4Zu0h*glB*)QJ~cfrihh&ZNp(7yqP)KSc8fU^7_l0Y1J1sxZKp0AB&%TZ8%<;0VBX z0P@uOBU(QJ;Mr3B2LM+XB~M0Y(8>i*JuNZU^N)Pc#I;iO0T>7%VG&iangAfBq1Y!^ zHvBOZ0C_}J10bxaT7UomOh?@eAU_qdP2~MSSiV(Fy^>cWg34TO2a9~*g2Hu&;g@( z7}b!)SU-%$UgHG^H8|_#059;0aNH>V!Gy={SCu>zjvwO=ddj{0Db$LVG7X5AInyuk z@NXNu73KW(eKbG7;o(e;UWK_b2#O7 yEW?&g0G!^LJX(I=Si--~#LM3HhRws-pyMu2t4hmAOEo?pL0QJp5oEVy4gVj}Ut`n& diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-310.pyc index 288f38c2adadc69a4258a07ed74dc5ef8d4ff34e..e63f77a8d3a3bed45baa461a0e08c0064a0416db 100644 GIT binary patch delta 459 zcmW-cIZpyn6ouyjQ34^+fS@AcuDF1>;)06%hN3YlqsADxD1#BiEfz#86FZX^dnl}2 zzz_?6f|aEfcE;L&V7&KD@tyCS+(~9`zE%8NWr!OLIticqm}{@-+3=atnW#zXgsmvv!bso(5ysNZEX$_JoWNTzGvID|CVTHCh*%{%KAoGvh>pwR&dxro3 delta 453 zcmW-cIZpyn6ouyv1`#s_5y1s<#T7x^a6`o%QG*(zjwHl{i!vB7t`)%wTa(vVLSd(Z zq0ygUV{M2Xm6bn1?|oC8?>i@RlNnx?@5{21R1~9xPegVfSG_7pMZm|!5M=&x7LqdjOL~s}qIR!rasA-tNoCQDT9L(ds0E?JQ zupBo$vK(U)tf+ygPF;myb}c8V>kup&(y>Zb$&(o?^A_(i9}bfq|Ni_Nqolt&iymG= zG4XW7ST+BA{$YCl_7c|pRoJ;Tf6GGrAs=&XGdwWS)drb|EKC*<8^tEo5ZM-Y7Tj!~ khYNn+F0FA|RWglik1RoUN^wH5LtB#UhT@vyfR_sI|9Q7~^Z)<= diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-310.pyc index f0d8d81eec75d82394967d539ec5c3bfd6ec68fe..7e1720447b50038aa05deb5b31a1eca2de39edbe 100644 GIT binary patch delta 19 YcmZpVZ;$87=jG*M0D{%o8@X!r0WvHE=Kufz delta 19 YcmZpVZ;$87=jG*M0D^d?ja;?*04`SqG5`Po diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-310.pyc index f861a4b0e1cbcd1435d1735391323f0b07e4ab58..e5d0a23ad9bfac59273d9ac256961bcf14d348fc 100644 GIT binary patch delta 19 Zcmca5b4!LRpO=@50SH!SZ{!N#0{}F41i1hJ delta 19 Zcmca5b4!LRpO=@50SMxmHgW~<0RS+f1Oxy8 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-310.pyc index 7b8d9a2e504b64ccc6304cd7d2d7ab65b4490791..b031a2b53619cf7e8626361867dc89f44fff566e 100644 GIT binary patch delta 19 ZcmX?Na>RrypO=@50SH!SZ{)I)0su5`1hW7D delta 19 ZcmX?Na>RrypO=@50SMxmHgZ`>0RS+X1O5O2 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-310.pyc index 22c8f1dba0b611316a6e4f5292f97ce6ea66ac08..c0f1d0dfa6fa99e89943c97c80812bdfd5a04487 100644 GIT binary patch literal 9805 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 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py index 2215998..d993ef2 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py @@ -1241,6 +1241,9 @@ class OracleCompiler(compiler.SQLCompiler): self.render_literal_value(flags, sqltypes.STRINGTYPE), ) + def visit_aggregate_strings_func(self, fn, **kw): + return "LISTAGG%s" % self.function_argspec(fn, **kw) + class OracleDDLCompiler(compiler.DDLCompiler): def define_constraint_cascades(self, constraint): @@ -1315,8 +1318,9 @@ class OracleDDLCompiler(compiler.DDLCompiler): text = text.replace("NO MINVALUE", "NOMINVALUE") text = text.replace("NO MAXVALUE", "NOMAXVALUE") text = text.replace("NO CYCLE", "NOCYCLE") - text = text.replace("NO ORDER", "NOORDER") - return text + if identity_options.order is not None: + text += " ORDER" if identity_options.order else " NOORDER" + return text.strip() def visit_computed_column(self, generated, **kw): text = "GENERATED ALWAYS AS (%s)" % self.sql_compiler.process( diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py index da51f35..c595b56 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py @@ -978,8 +978,8 @@ class OracleDialect_cx_oracle(OracleDialect): driver = "cx_oracle" - colspecs = OracleDialect.colspecs - colspecs.update( + colspecs = util.update_copy( + OracleDialect.colspecs, { sqltypes.TIMESTAMP: _CXOracleTIMESTAMP, sqltypes.Numeric: _OracleNumeric, @@ -1006,7 +1006,7 @@ class OracleDialect_cx_oracle(OracleDialect): sqltypes.Uuid: _OracleUUID, oracle.NCLOB: _OracleUnicodeTextNCLOB, oracle.ROWID: _OracleRowid, - } + }, ) execute_sequence_format = list @@ -1088,9 +1088,9 @@ class OracleDialect_cx_oracle(OracleDialect): int(x) for x in m.group(1, 2, 3) if x is not None ) self.cx_oracle_ver = version - if self.cx_oracle_ver < (7,) and self.cx_oracle_ver > (0, 0, 0): + if self.cx_oracle_ver < (8,) and self.cx_oracle_ver > (0, 0, 0): raise exc.InvalidRequestError( - "cx_Oracle version 7 and above are supported" + "cx_Oracle version 8 and above are supported" ) @classmethod diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py index 62028c7..4f82c43 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py @@ -4,12 +4,22 @@ # This module is part of SQLAlchemy and is released under # the MIT License: https://www.opensource.org/licenses/mit-license.php # mypy: ignore-errors +from __future__ import annotations + +import datetime as dt +from typing import Optional +from typing import Type +from typing import TYPE_CHECKING from ... import exc from ...sql import sqltypes from ...types import NVARCHAR from ...types import VARCHAR +if TYPE_CHECKING: + from ...engine.interfaces import Dialect + from ...sql.type_api import _LiteralProcessorType + class RAW(sqltypes._Binary): __visit_name__ = "RAW" @@ -116,38 +126,36 @@ class LONG(sqltypes.Text): class _OracleDateLiteralRender: def _literal_processor_datetime(self, dialect): def process(value): - if value is not None: - if getattr(value, "microsecond", None): - value = ( - f"""TO_TIMESTAMP""" - f"""('{value.isoformat().replace("T", " ")}', """ - """'YYYY-MM-DD HH24:MI:SS.FF')""" - ) - else: - value = ( - f"""TO_DATE""" - f"""('{value.isoformat().replace("T", " ")}', """ - """'YYYY-MM-DD HH24:MI:SS')""" - ) + if getattr(value, "microsecond", None): + value = ( + f"""TO_TIMESTAMP""" + f"""('{value.isoformat().replace("T", " ")}', """ + """'YYYY-MM-DD HH24:MI:SS.FF')""" + ) + else: + value = ( + f"""TO_DATE""" + f"""('{value.isoformat().replace("T", " ")}', """ + """'YYYY-MM-DD HH24:MI:SS')""" + ) return value return process def _literal_processor_date(self, dialect): def process(value): - if value is not None: - if getattr(value, "microsecond", None): - value = ( - f"""TO_TIMESTAMP""" - f"""('{value.isoformat().split("T")[0]}', """ - """'YYYY-MM-DD')""" - ) - else: - value = ( - f"""TO_DATE""" - f"""('{value.isoformat().split("T")[0]}', """ - """'YYYY-MM-DD')""" - ) + if getattr(value, "microsecond", None): + value = ( + f"""TO_TIMESTAMP""" + f"""('{value.isoformat().split("T")[0]}', """ + """'YYYY-MM-DD')""" + ) + else: + value = ( + f"""TO_DATE""" + f"""('{value.isoformat().split("T")[0]}', """ + """'YYYY-MM-DD')""" + ) return value return process @@ -203,6 +211,15 @@ class INTERVAL(sqltypes.NativeForEmulated, sqltypes._AbstractInterval): second_precision=interval.second_precision, ) + @classmethod + def adapt_emulated_to_native( + cls, interval: sqltypes.Interval, **kw # type: ignore[override] + ): + return INTERVAL( + day_precision=interval.day_precision, + second_precision=interval.second_precision, + ) + @property def _type_affinity(self): return sqltypes.Interval @@ -214,6 +231,18 @@ class INTERVAL(sqltypes.NativeForEmulated, sqltypes._AbstractInterval): day_precision=self.day_precision, ) + @property + def python_type(self) -> Type[dt.timedelta]: + return dt.timedelta + + def literal_processor( + self, dialect: Dialect + ) -> Optional[_LiteralProcessorType[dt.timedelta]]: + def process(value: dt.timedelta) -> str: + return f"NUMTODSINTERVAL({value.total_seconds()}, 'SECOND')" + + return process + class TIMESTAMP(sqltypes.TIMESTAMP): """Oracle implementation of ``TIMESTAMP``, which supports additional diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-310.pyc index 3bb386724601ecc2ba4f18801f8fb75bd0732071..b57abadd31c6484e0e143b18f2ae94e9ee043e9c 100644 GIT binary patch delta 19 ZcmX>gaX^AApO=@50SH!SZ{#xL0RS)&1YrOG delta 19 ZcmX>gaX^AApO=@50SMxmHgcKq001mJ1FQf5 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-310.pyc index da5a9edf77ff233b89f5d63811e9ec69fafd104c..d9167e33be4a6bc001f6da2081e5bb118884cd5b 100644 GIT binary patch delta 19 ZcmZ3cvrLC8pO=@50SH!SZ{(5@0{|}P1VsP< delta 19 ZcmZ3cvrLC8pO=@50SMxmHgd^`0RSr!1CRg! diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-310.pyc index 84dd94a980009f7806c23064b570509750679b74..57a0f22526fedfe8fc3f1e411481dbb01a9e6d8e 100644 GIT binary patch delta 19 Zcmdm&u`h!wpO=@50SH!SZ{#vD0RTFU1tS0e delta 19 Zcmdm&u`h!wpO=@50SMxmHgcJm001_)1a1HT diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-310.pyc index bb8e79f0708ec51f95d02926b73be4244714d7a5..5376593be0b7fe766b7e0c017cc11714693d9195 100644 GIT binary patch delta 12853 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 delta 12380 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 O=Q;BaVhR&3`~L$38X$uJ diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-310.pyc index dfc595ddffbcdb6d255b4842c211217c8d6e61dc..69efa59e2c54524b9d52bc39995c40a9c3b2429f 100644 GIT binary patch delta 18900 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 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-310.pyc index cb637053952be3fc034de8a1650a6acf647c5f7e..858860bfbd82705d219f1ecbfe6ca4dab2647917 100644 GIT binary patch delta 19 ZcmccUd(oFGpO=@50SH!SZ{#|z1^_y{1(*N; delta 19 ZcmccUd(oFGpO=@50SMxmHgX+T0{}MW1mgez diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-310.pyc index d68a33b32da02156646697edbadbc78a1cc289c4..da8207667b5850d964ebf5d8faf73ef1e9018794 100644 GIT binary patch delta 19 ZcmexT{iT{KpO=@50SH!SZ{&Jq3jjtS26O-b delta 19 ZcmexT{iT{KpO=@50SMxmHgdhP1pq=z1-}3Q diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-310.pyc index 26877cc8ef15641ad74531125c1a329b1f183559..4d14cb7ea16ebe698d6d213a85fba5243ccfca27 100644 GIT binary patch delta 19 ZcmdlHyCaq>pO=@50SH!SZ{%912LL%O1$6)b delta 19 ZcmdlHyCaq>pO=@50SMxmHgc`g0{}Hx1i%0Q diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-310.pyc index 859dd8efdf9fbdbb0b35b3a669cde5d955d53576..29cfdb4aa1dacb8afda4b6a3cba46efdf2a485ab 100644 GIT binary patch delta 19 ZcmcZ;aVLT+pO=@50SH!SZ{!Nn0RTMN1yuk5 delta 19 ZcmcZ;aVLT+pO=@50SMxmHgW~&0021z1fT!_ diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-310.pyc index 59dde89f7d5dfe06cf061eb604724f8d9a931d72..2761fbb740590714a972801d082a654f1d232685 100644 GIT binary patch delta 21 bcmcc9&UmMtkt?5pO=@50SH!SZ{$i61^_sG1qc8D delta 19 ZcmaE(_C}2>pO=@50SMxmHgY8i0{}Fq1XBP2 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-310.pyc index 4ad616c358f8bfb02079843e21222680699ab4a0..4db2abd12a2fa33f0e1b5e18c9a74c39456019ba 100644 GIT binary patch delta 21 bcmZoY#MpX>kt?5kt?5b8Se>n(ab+X#GDb$$&083Msb8h-cEzxWAEi86%^><}Hjr)kKR@(^89yQd1O4^2-y8Qi>H4 Ri@6jg^J^P#ex=di2LPD26>9(h diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-310.pyc index 428c2239814eaf3e3db4fdab65f7002be6647444..a657b563d56756234c23fe12287878f7c9e11bec 100644 GIT binary patch delta 19 ZcmbQoH;<1ipO=@50SH!SZ{!kT2LLIo1L6Px delta 19 ZcmbQoH;<1ipO=@50SMxmHgbuu0{|u011$gm diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-310.pyc index 35098aafa205f3b9df2a5a4438f6c27e752b5e6e..0d5419923d41d4a95df7b2b3fc84367f1c23d284 100644 GIT binary patch delta 24 ecmcb!obk?bM&5j0UM>b8Se>n(v2P>q`CtHJ2nX~4 delta 24 ecmcb!obk?bM&5j0UM>b8h-cEzc(#%Ed@ulA+y`d> diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-310.pyc index 116fd8673cf91178a81837d0bfe62f05082b8ad0..a1f3467e72e16a4680126858196a43b2e620828d 100644 GIT binary patch delta 3759 zcma)8T}&I<750pO`LTguV*@re0Rw}(D7rJJfTd;*OwfNWQ<$`3gL)i zj%!kxly893IGF%uf-~lV-30VHnFMqa&?yLhi-->$(hc@V{4nL6FXmOHpi6?$e1Bh| zdA&^65BC*lhjJ@L9T0VmmJ5oez5KiQhS1sp=|CeWdbnU|S6N81AGsb3MG=TuRNT_I zWdfVMAW|&i9tji6SXcB-5_fGRg3RC%M0t03myFq z+FxhbU)&o#IJWAfEG>ar2t=GMdE!EdJ@-c0vFB=25{Us6gX{}WaL`-~Y}Y3%L30AW z6Bh`d!zWM){9`wUpec!lYdO2Ho~6Uky0F_(AZ{W#f@1WH>)i7EgV(sG!DGg9O{43r zYOmha*}2*I*LvfcFIe6g^uAs7_Eo*7Ueoy)xUN|4W8fZrDf>3ui?%fb+VJLbq+H15 zXbO!lTEKB29>S-2K=>d9d?`AP!x65r&Okbii+iEtBoH6j97Uf9SUisjO&|Ng!X|9N$zSkgDEdCs=lqinqGAB)pqoqgdn+}Z&gU4FRe9l%~V z%~OKB2?$0*E>}?Vng;7#&rnSHFW5J)3|6=)KM@#!^5n5j)eA2@yLa?D8u5L@5Qe`R zyr8IRtpnc6JlZ8tyaD28@SR{mfxQ%6qUemg;&{Qqe&B6sbOQrFf!=1l?a8johXe}{ z6YjF_wEwwu4;->|79^cR!8<%V!9OCt2;#`UzP!4S&gF`wq7K7cLgFhZmQir8bEC#Q z{w94K}(!y$8e8w%N~P!FNR2-QdJZK^jTZGq>zfyriGBlD22AV?p*Q4J1k0 zNszZ1u}JWu=9Zg)86w>z%9&;&@fzfk{lp2k^Dw&}8XC0r!tiVt6_seVgwS+qONb!b z>~47ZS?I2i;Z9i?q*P4<3$RTw0X$EbFIgab;6oEhq^sl0u7xe*=BOZgnnK-a$iiM21Loqd_n3DMV5AJpK9w zF`D)d^~dEBAJu=5-vDtGT+Xg9Ja~I{C2gY(FEMK)^@GjnsC5+Wb+H14(X5yoL{D3N zZ*CT_Xw`mBQ1F8k6|?{-#7o@7^UU>u_&(NRU)FHL8XhR8&Gsn#yc4H!T1^=jH zG+02PqP2oXg!dhvIey~!)Ir1_V){6(X4!v*Tn@xh%33AWd>G{RX@x%x$}~N#mJ4}Rn@LyQpv>~9JLt}D zlE<}9YI#Wz*sY;v{|RUsZT0xo@c#u^!-Lo8bUBZ@>I11*BdJT3 z@1wBpGvIlSe-%-l=(wCFzX}?h1aA8_>cS#Sg{Nb`WrU8VQN=;Gu;HS7Hkc`*h6QTDs8 zZcnoiaKdSZ>x!Lp-RYbG#_&GP)5BtE=gh-rs~vBSsmwk`egdMlITm2+FM&ol<|g)s z?j+$R7@9lU!vZF`&(GZ|7q*CeE(r`#2H}Iu)_kZytrwlGuV}eiN_V5DmsfiYJi5@; zD%#Cd<8%LM?2~3Q4b2T^*`AvNcvS}|Y8o>HU+Wsh3q@{5%)D#&i?juMX=ShC)0GgiO)Gi2qr6!xK?+cOmr{Nj zN0IZaEiIQ6ou;dexgwzy-+*$%+R|#iFiW64hV4eHJw@?tW;kJFbP_a*4=0MxAc_wg zUezfUPnrEXF|dZ&iQcth!FOABuPwb<)G2PC>{?%Vcb%`mMGI#5ruWL^Kvia7(Hz=3 W8|#g;w|X-T*E*c8mJVk}+y4N!V*Dcj delta 3244 zcma)8OK)366!yJ-#7S(&spG^+?7WV#o3^)B<~DV4>@dEm zl(KN8RIoy#jD&;)tmy^`6@i3!EZD#b!LIiQAkhs%K`gqUd}r)jyH!$QYmR2V@0^)4 zXU>_qUoULU1&V%ulLJ3poxJv9^iCkEjNeJVQ%zRlfex@Z(0HA00_Y$s4*?#kgU0|5vk{;pb!ZakC`$lM03F9p$AOHoB#yV`m!T2BTV&HgYW#h!L#PQUgvX4unkAb+et*F5Z7HrB`z%2h0!hox@{_E_oQYI z4SOLHBI6z_|4-!!7?e~9my%8>sf3412f{R&^rC}$5fYscJA5AjlJBQpjaM=W7ZH93 zAE+^+$+LWne5-EC?n$RZ7}91+G@%!s;IGmz@JMwBl%Uh~HxG#~0#WgUXW&$vj0Z^! zL0AD@zmY5DOudj@Gjx5|1xBE_A8p$O;dOWwK7#3DhlVjssFrInJ)cSQQH*vqPl7l| zi>F|E z+BQ$YJbLd#@3Q;J5H{#KE3P1R2~w`4o!yfsG=osc)lr^p>;QoIsKr6{<& z8cu__g|=g;dR0DMHT)%TWpBe77`=k1qkFD+2u2^Ead~2gswT1E z^4=zgq5g?&au_CU;>+NsG9Xf|J)TN#i;qK5QD}W|>RBkJ?>a4aX#-U&3ywbr?5?v? zImA~0#cI^`m3+2T+DS{hL_Zgw?i(pfRaqr80hf7VSJK@E{&=SI1EeI6h$_kQS0`UF z^7)+wA})o7y7qPn0f;Hj zi*G_d7mmRo&5uL!SrT$VxwO5(9|=DRanqk!JU5@x^;`ips`GgwPLWt3QA@U(*Oao~ z5xGd>wD_wnrd$*);jV=ko`@#aeA}&gj0V=rf~@tnYfI6*MkAhy5Nng8Cf1MVf!-#! z)(j@jx>-~*KIX)wJ1B03M@Q_CTb`>qBhN|?{pZ)sT(OYNFPBVysd}f0%dyzK-^0h1 zNojBvE+wibZ3A_?umf;kWI8syq>@ni8S!gJY&uQbSt3!}HR)TCEX%H&y0NyA&zc6) z%_1%{Gk3%IL-a@9RJz4`k&Z!mEk9ux(9O+tL(g8lO3~f?Q~VS;h^+lL^1>`tD;%YR z=dY5ex+1612zX+yrff-HH3|mLt!#rXiE`&+`4v*^hQKYUGSg}_b87}O@@AI5w#yvN z>zn4aVnKTK5Akn6+-zG+XXY=wI(s%%M<>*D8jp#L;Zahh$ntX}>=H{aPND36&69I{sHjuRe8gH+xt<#a^J}2Hw<1mR*~&H zJWSapo!HrIj(|6J(29RO;`_cXB`NOrjh7{V-Bzk)NFEqcEKbxQ3Hn~ByG7S%C^uOX zGK$wg^pnrk?W!(MK;?uc4qHvSes#m#;PkDb0`gg2hN`8);Frbw{d(MAdMlrzY{{BM zUgCZzX+FX##k!v30Wmpnv`n8pTJzZ~Uo}qT3OIXC-zk<8w-2XJ4$ZT)uvjomP9G68 zn9DKF>6<`nTv|AnU72MV(<84n+2bRe-fGL4E0~-fUrrAxr$>>~GbgWpPB*M39t;dG zQL2*lV!<>x&VtiXYwo3m6FHO9*=erK{OcLH`Q2h=d5^9Y*+$+thIlzjOX5nrS8T`. The psycopg2 dialect retains the ability to use the psycopg2-specific diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py index 2cd1552..f1c2989 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py @@ -293,7 +293,7 @@ class Range(Generic[_T]): else: return 0 - def __eq__(self, other: Any) -> bool: # type: ignore[override] # noqa: E501 + def __eq__(self, other: Any) -> bool: """Compare this range to the `other` taking into account bounds inclusivity, returning ``True`` if they are equal. """ diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py index 2f49ff1..2cac5d8 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py @@ -18,7 +18,9 @@ from ...sql import type_api from ...util.typing import Literal if TYPE_CHECKING: + from ...engine.interfaces import Dialect from ...sql.operators import OperatorType + from ...sql.type_api import _LiteralProcessorType from ...sql.type_api import TypeEngine _DECIMAL_TYPES = (1231, 1700) @@ -247,6 +249,14 @@ class INTERVAL(type_api.NativeForEmulated, sqltypes._AbstractInterval): def python_type(self) -> Type[dt.timedelta]: return dt.timedelta + def literal_processor( + self, dialect: Dialect + ) -> Optional[_LiteralProcessorType[dt.timedelta]]: + def process(value: dt.timedelta) -> str: + return f"make_interval(secs=>{value.total_seconds()})" + + return process + PGInterval = INTERVAL diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-310.pyc index 41b390dabc7f9cc0bb5b8745eb6aa12b92171ef6..a52209ba1d485002c5698330b5685dd17929d27c 100644 GIT binary patch delta 19 ZcmX@hewLjppO=@50SH!SZ{#}63;-~+1l<4t delta 19 ZcmX@hewLjppO=@50SMxmHgX+i1^_JI1SkLi diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-310.pyc index ea451f68f658ee95d66c66ac6411c99c03c37ae7..1b6324e37a3036d220220ea0818e2d6761110682 100644 GIT binary patch delta 1556 zcmb7EQD_`R818>fLVD?4uSsgsChDKWnv0|xf`YJGP}?YhB(3IZ1f_R#yK}w4y`9U> z-ldn9Q&138gifIkB2p1ctuM0mrQ$-Em^7-k{(;WcGs1IK5Y+4rPnUHGP6Cuwl9th@%RaW%4 zolGv?^NK=AkA*_|IE9O>&Z|=Rp`w>uzLy6T!i~1zCt3X$Bg}w|?)v8q)gt++hi!&!r%r4}x#93GixRp%i z${dw!dbPMDp-{D84X7RPl3mz>-lj^y!d#hl)1NtI!Ry?`A~7K}diF!~gbKM&b))bx z*1;wvk*-o8D@bga=ahM+fud5C1H{e=h!oFr|BUeYWD7>W)bXU&9gjCFjgs)Vx~*TiJL3*oDaAo z19!qUflU*PW9SNHJaJd#afQ4h!ch2UP?qBQpP6}Xb^%pL#Z-(Ebc=v{4J&5Q!eO40 zv_)1)p0K4z8|K)F`T5x#7CF^KnfwNMDKmFBIwq|vgF{U`iVM=`|4)!2Cw;fe5l>}J z>8)xvi#3c;)&i6(KE_qGD=>SlCO^xayc-Czcb*!W9gR1c4$*O1VS!Jo*fuVexsNqv zBr^VBMOo)a>WV70nNk=Jxpkq)LS#B)*qY*It4U{9S->i>5v^mbUQ%-`le!suHZQBj zy2@%F%)Ce5@CvB-W?%dm$nls`c45;R_ka~hWEbsH&39;7F>9L>3nq9)gyoq0;`4L# zfxx)v7lKK%#uTkk4JJN5MC3QF6bl3$%@yH!7VLE6C)yPprD1iP zQXSBzdy{&jU!<-Xh)fG&ca%F|1N^MtyYF0T!z>tf-HFvHy*z|^Vc;M5Q_m0n2EXd* zgTKIS-FN6R+|gehx|B$OE)CsGbb_84zL4kvy)pcEVn68b?!TQF0sZv@H{gbT|G^*O zNaSHZz+=(tBNqVd=-}8gz`TC@p*P@BojH69xW03^4sN6#9t2SOo$+;O=*8?!cuh}F qd;o9hA0}>r&|g0C*T}PbVQ+%&_Ak9Vb2>AeSxR?hrZb)0WB&pI-t^-D delta 396 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%0DIP$Ick6p3=$J>` zo_O{tu@1yFqW~E&OoWGR(bF8z`QnAs2Rh&{(mLY&MSsu%UE!L>c@8MEq_^fY`-G?> z=l1Kz;-O=b$Qa2?ko|g=3ynRb-{XS6ChRBHe-k)l9%zjV98jl!>Vl_xH4~l=K^2lL zvQ$>%(SK|~n-61Ge?K;R8ukZHZhR~OW`SLy_N(V7fw$OQQd~T!FaB3B`o4lOr3DX- zR=U;q=ytt#OsNNHgZg%Lmv{zwO7+P}@Xx#}&ajbo68Ey6RuAj_lVM0h4Xw)%cwE9; zhO-izF}{Nt`;JJIDl8s>k>Vu^K16~V-d?X3sA3us|3yR>&K@kHO$bEBvab-~NtRtV z-|8JXc+{w&x0jpQ{5^4#kK}e@NW(eHt6xZlj+KW9nH&z8?fl}@(rOtyjAX+e30LF$ z_E%DJ6anU%xM)8RLL`UyWg)&6D?R=~Q>{(KoY3w^Pg^EA!Dg{I^+|2uj|P!Uq|wus zEhX851TIycr|47U&30NfqXOool}M;I^eLKj1+HjVjo_4PmMbfAd9wcBawWTH>QBN8 zhsMcP1guoIq(IMm==kg>1aeBXTBms{>d3odm{i#*!rLo}z*;@Xej^d#7b^vVCS5bR ztY$`;uF;=MfetW4pPK?>V6bjag>^SjR^V$?obWhlX$^DB4`ZhZd$sy=0tvr1N@>s& z;7H?j?cff`7wV*|sS{blPUs8Mp<9ViCtUvvnfeE9@jpR}j?I;|zc@pj1&QZ{0I|`|a*D_gN@INF;5#dH z@wX{qk;tG7eQG9Tz=_7*nQ%Mg(RCN2QN8`Xf`P2Z2J>sZZ?Ovvm`F;vzhgYJSc`|^I#8+ijL!J73pt!ftS{BqQW=Q7HCW<$^bn8SpN+MQKlkh!S6ULF^0Ld*!;JA2` z_3B(`-;xo}HCw28^)42qx2X2#!|S@w4F@C_d2gZqw|uy8$ECB=5lu^1(JGOc zQV6WUPi$V|`d%#=+7OdzISFC1TpTl$(1{2mUJC`fo0>G%lj(Jqn>s z?ldxO9RZOsm(qsn?M8h}A>5XC*#m$q5|fnZvhR@GTzzXH6lG8qkdw7&Ek0Kxnpgag z!Jg3LJHtKFEE0QCAKMuoke(x%XY{7d;D%@Q)19$Eh4j)Q=+W*ZX-M?@FZ%&4PY)MC zW`c)gnn+2L{$de~ltkeV>xWUSVJZ<{B=9nUR|upcFTO|d2LqM8P6&Ffn9qz4X!S9H zB?KrD*$M(H39Kiug#Zn3YzG0+bk5LNm6eU1(FX6p3(ve7~5|<>IRvYwq53KByN~DQ|c!)p)fk_0Kgc-DY z6oH&DWXSNFT7GRjssHJL_8sz&MNS>&$Dbzxl>wEF#Am&NKPxhi-n|5J66m4KCKHH~ dy_tGV2^2tu{z3_?NT`o%NbQwclvSdb+EstLy6O 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 diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-310.pyc index afedc0ae05e5ad9bcc1f9ec2f249a2395eb70a3e..439e983c0b625e9f737a9baad9251f919e1b3f65 100644 GIT binary patch delta 21 bcmcb5i}C6$My`BbUM>b8Se?C*%R3hUQicYH delta 21 bcmcb5i}C6$My`BbUM>b8h-cc!<(&%vPO$~j diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py index b8011a5..d9438d1 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py @@ -44,6 +44,36 @@ User-Defined Functions aiosqlite extends pysqlite to support async, so we can create our own user-defined functions (UDFs) in Python and use them directly in SQLite queries as described here: :ref:`pysqlite_udfs`. +.. _aiosqlite_serializable: + +Serializable isolation / Savepoints / Transactional DDL (asyncio version) +------------------------------------------------------------------------- + +Similarly to pysqlite, aiosqlite does not support SAVEPOINT feature. + +The solution is similar to :ref:`pysqlite_serializable`. This is achieved by the event listeners in async:: + + from sqlalchemy import create_engine, event + from sqlalchemy.ext.asyncio import create_async_engine + + engine = create_async_engine("sqlite+aiosqlite:///myfile.db") + + @event.listens_for(engine.sync_engine, "connect") + def do_connect(dbapi_connection, connection_record): + # disable aiosqlite's emitting of the BEGIN statement entirely. + # also stops it from emitting COMMIT before any DDL. + dbapi_connection.isolation_level = None + + @event.listens_for(engine.sync_engine, "begin") + def do_begin(conn): + # emit our own BEGIN + conn.exec_driver_sql("BEGIN") + +.. warning:: When using the above recipe, it is advised to not use the + :paramref:`.Connection.execution_options.isolation_level` setting on + :class:`_engine.Connection` and :func:`_sa.create_engine` + with the SQLite driver, + as this function necessarily will also alter the ".isolation_level" setting. """ # noqa @@ -60,6 +90,9 @@ from ...util.concurrency import await_only class AsyncAdapt_aiosqlite_cursor: + # TODO: base on connectors/asyncio.py + # see #10415 + __slots__ = ( "_adapt_connection", "_connection", @@ -151,6 +184,8 @@ class AsyncAdapt_aiosqlite_cursor: class AsyncAdapt_aiosqlite_ss_cursor(AsyncAdapt_aiosqlite_cursor): + # TODO: base on connectors/asyncio.py + # see #10415 __slots__ = "_cursor" server_side = True diff --git a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py index bd6c1df..d4eb3bc 100644 --- a/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py +++ b/venv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py @@ -215,7 +215,7 @@ by *not even emitting BEGIN* until the first write operation. SQLite's transactional scope is impacted by unresolved issues in the pysqlite driver, which defers BEGIN statements to a greater degree than is often feasible. See the section :ref:`pysqlite_serializable` - for techniques to work around this behavior. + or :ref:`aiosqlite_serializable` for techniques to work around this behavior. .. seealso:: @@ -273,8 +273,9 @@ won't work at all with pysqlite unless workarounds are taken. .. warning:: SQLite's SAVEPOINT feature is impacted by unresolved - issues in the pysqlite driver, which defers BEGIN statements to a greater - degree than is often feasible. See the section :ref:`pysqlite_serializable` + issues in the pysqlite and aiosqlite drivers, which defer BEGIN statements + to a greater degree than is often feasible. See the sections + :ref:`pysqlite_serializable` and :ref:`aiosqlite_serializable` for techniques to work around this behavior. Transactional DDL @@ -843,7 +844,7 @@ Reflecting internal schema tables ---------------------------------- Reflection methods that return lists of tables will omit so-called -"SQLite internal schema object" names, which are referred towards by SQLite +"SQLite internal schema object" names, which are considered by SQLite as any object name that is prefixed with ``sqlite_``. An example of such an object is the ``sqlite_sequence`` table that's generated when the ``AUTOINCREMENT`` column parameter is used. In order to return @@ -1318,6 +1319,9 @@ class SQLiteCompiler(compiler.SQLCompiler): def visit_char_length_func(self, fn, **kw): return "length%s" % self.function_argspec(fn) + def visit_aggregate_strings_func(self, fn, **kw): + return "group_concat%s" % self.function_argspec(fn) + def visit_cast(self, cast, **kwargs): if self.dialect.supports_cast: return super().visit_cast(cast, **kwargs) @@ -2444,10 +2448,16 @@ class SQLiteDialect(default.DefaultDialect): if table_data is None: # system tables, etc. return + + # note that we already have the FKs from PRAGMA above. This whole + # regexp thing is trying to locate additional detail about the + # FKs, namely the name of the constraint and other options. + # so parsing the columns is really about matching it up to what + # we already have. FK_PATTERN = ( r"(?:CONSTRAINT (\w+) +)?" r"FOREIGN KEY *\( *(.+?) *\) +" - r'REFERENCES +(?:(?:"(.+?)")|([a-z0-9_]+)) *\((.+?)\) *' + r'REFERENCES +(?:(?:"(.+?)")|([a-z0-9_]+)) *\( *((?:(?:"[^"]+"|[a-z0-9_]+) *(?:, *)?)+)\) *' # noqa: E501 r"((?:ON (?:DELETE|UPDATE) " r"(?:SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION) *)*)" r"((?:NOT +)?DEFERRABLE)?" diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-310.pyc index 9fd29a655132e501ff967418ec5f1b69d19f91d0..55b251d0fda0d82bf3d25a77030cce06260cb9a4 100644 GIT binary patch delta 19 ZcmZ21xLA-YpO=@50SH!SZ{(WE0RSt}1b6@d delta 19 ZcmZ21xLA-YpO=@50SMxmHge76001Za1H%9S diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-310.pyc index 0669d64165bcf9013a6b84aebfe6b8c3434ded30..baa3b8e8ead18879fd74208cbe0074870626f03a 100644 GIT binary patch delta 19 Zcmca4bxDdVpO=@50SH!SZ{+ge1pqSw1e^c> delta 19 Zcmca4bxDdVpO=@50SMxmHgb9J0st>91Lpt$ diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-310.pyc index 61cba88cfceeb9f7c5422f18f1413539875420cd..6b87d22819f78692ffea5e3f8f0bc89d9c59fef4 100644 GIT binary patch delta 19 ZcmbQLI8~7=pO=@50SH!SZ{+G0001lH1a<%b delta 19 ZcmbQLI8~7=pO=@50SMxmHga_f001Zu1Hk|Q diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-310.pyc index 9e703d5fc61e180bd1573b0a1b9740943ae0486c..bd7893f9178565a4ed3d3046c28284e357da4dd3 100644 GIT binary patch delta 19 ZcmaFI{f?U}pO=@50SH!SZ{&Ky3IH}F1xf$_ delta 19 ZcmaFI{f?U}pO=@50SMxmHgY{-1pqQn1eE{) diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/base.cpython-310.pyc index d9c4a017de8f211feef347e36091fd9294079396..4900c3e61c29cd22b06ad72030324cb20b6d9f13 100644 GIT binary patch delta 10100 zcmbVSd3;n=vQBlnJ4v3N zVUvi+(rOfRSY#O%ac~{Ou;?hbfDYi3H=_9JtDB@l#P|F?{`ja{Ri{o>ojP^Sy`2-c zZSUN+1s4Pd2m0{8osVTq+POFQ%X)fOU-D1x>ElC15zL?KGudYo6@2dY&?(0b?Td>=3SS8oWS68h(E?EFeU@U#=XO0fF={T{KK zz^pM@ZiWc0%E-_%mJ#{*+_ErXwdhTKDc%#^;9$CHcqGzpKy33|ACyYL#2TVy515^- zGE$Ruw^0}{t~7vM<#+DdHK_`r{v{k7rS%gJ?{_Q zYM~6z%n=9uBKASa!{GEaqkK)B-5hH-Dwx&JGhytDR@;6iOSVL3lYI}Ahv;)L6sKB_ zkERu>-*`{z%iv}L-U18-WB~>Mk^p=4jZliS?Phwd>YVckz2SK-=M>RqkIVh6f8t-5 z@ANao&@S&FP&-vnej*)IFArs>4l`$ur%(P{zVsJmH8LEvlvNj_5plGYk+!#4?He`E zn9ND}(r81WszK2lTI+ef=slb5vHXG=`JQ>R=2#uaYoE6v zbfkAYcULU2+TLZxKh-ilhTZx~_ots#tJPEJeO0zP&3+Qoy)QNMYf|ZBwRc;TnzJUoy<^;BL}PhWFA#i_WmAnNFO zu&ju}kOpHXU_9VcwPSO#qh^@#ia2s*b0`h<{IK~^av+b@s@YrX|4McJ)?ms}JGXYB zCAut)Yya-neYAwr)sTwShufBMwsW>SX{TDYy&-+4_HNIh`Rdc{OPN3Qg`VKN@DMHZ zTzH{5+0S6ElPa=2rPegxh)2W9qiLy{RQ?%{8}MSg7Fc^T1CgA8Lc?8{ZMa>hl+Gv6a8?Y|>it@I6e)2C6Y?d<0%iR?4mB=9Dt|K`ae= zDUPlzKlSmG>AiZc8BLyJBdM=g_W$R#Ixgz5zDHTKm=C_O+!l%9nZHqkyfR zv9ENtIBMJ5`dTX+P?DchoL7+l zjHmyRy+pg!Pj5F5lNP=g#?0bUosOnE;%bd9Ir?DOkC0<`SNi4@&oo|DFCKMr|NP+S zJPNA^-4RfbMjx-Tk2~8WFf%K_m6y+_ZEo%qqc7x%%&a~;AMnlqQ4${Ot3$^dQnD=U z?c>4pp~rUOE_Fsb;=>>pdX1si1W@K3#*dYj3HfzX63={xr`t(Q!8oa%c8S1Pr9MB^ zE2*y6uwgGMFu0=|O;zvHkJwY0WhAJw)Ab$}$HQuQU?!H0W(D%*cDbj!^NWkBf`BFK zWA0f+Mj9+2Yvv7Lm7+7L_0z#j2Gm)>Xy&z6J@MegFf{KAsrqP*GeBI8x~*-x#x z?4)Mu?aLXqEp8zUFjCq7th{cGS%TLU1-3Ht6h2xf@CmYD4;)J z7+^SqGr}wkSwM+$1Vl31A3;ege?&cgwMqC$e$EQWn>yV!KD#()67Tv0SL2<{YPdzk z*^RwAyh!jrvKy`09EjtyDi>Z)2BL*{9ln+m6P0jBl@4;v^$7Wly+~ z$R+ivo%q7h}HHtp{IT?xZo*c}pA#=^B7g z=y%2j0Q#Uwt*fCHf_f6LQGNGgG;LJ2JN@Z(HRMiWFfLSFiw7Y+q-Nbo>3JNSDsNAi zQn}@wf{Mg|OJTLf-}y#46+(az*td_qCyDSX`kUSBXNaV!`~s>B;Da?2O}ymtYDn$3{a-Z^ShXf> zmYPN#FjdEB(0z^GPcx*JW*97qqxaJcucaxDmj0${gsCbQuqYS}05nE)Wq>q*L|>&T zm#r?~{-$PC^m1wHAeyEBhtbB6OEt)C$vgc+HPbs;g;Oe;64P%^U*)LWCfb{hma=)T z(K<0%GBc~!N{UKy)e0V!VYGMs#c-I}q0%9eL%uCEr6$^elF{vJMoR!4)Q!7wr7}FQ z)^O>Xu`qPM;ohWIT?J)I?-;K<&}_m{HI}?#GzCw_{KshcB!j9pOg}JWke3@`UK8Y; z6Q>r#fW+j6x{R3s$}|dUoci>agqG$(25o7g;;eMiSuFt^uwCz6JaXa074?a0~EXfd2;k z8=wGqQ#9Y+@GfM;0#X2t0C*V~V&IN#^n!LvP^|%ShsMp#z_rD20p$3e0%|hA!y_sk zIa9KWil(}YCl%xx<6vWf9y*ia^ph59M}8G=S?G^Mg*wto{j+3MWx27^l@SF-9)B{* zp2AnY9CsmJ!pvjOVDpvX=DQ~|T~(J?b9H55<*+=6>7;~8bcK}~(=2_-O3rrP;;Bx}XD-Z*0|TJ=99;z3u^6}n zuvGi|QIj~_c~%7Y_!RlGn!k^gtd@{4qmcADUy7_4<41)yx~R_t(I04;{w0Vy&^6s5 zn7WeIvx8}=Wi{#Uu@tN8hftFJJ2qr|rMrjFz#xrDuoOnM%AODkwBLrx^ZHN-wYrZ= zY$yfWe>7E^hEm&KtHcDl_%l>a!PKdF#XpN8&oetlXSSpmy(g41B4qh}jf}KgCenV3W^6Cslp3)T20O_8z8ANi1ash}UGS zlXN!m%b8M8(jez=Trmg zN5wiSnWl05J(WzUHUu(P?@p$P<}K4=uJSc=F<)Tm0^KczT&y3PLJjrXDU{%N0;ztF zEzfr9fhm-zZ4Xdm`^%VqnckE_srr!zD9-Uzjap+gh3k89Vb{AFQV=cH`x{br$O^Erw&i4aNTuY&24W4?V4jt_e<}_4+Y2kN zh)j1&C2Qz92zN1ecH*#tf?}N!N=|({l|D)L*0khw4@Sxdg?*sJ9XZdEFl*Jfek}Ax zozRH-lx~NX6p)nCQ~b!6WSL*uMIMI9nIC@N+LE%80+X_m`MkA-%p1D_;+F^1J@uxC z&!iaJah_y|zSD@i{c)W=jgoY?#x#dcRJ_@k_Mmj8HlxOt*GPA+PmT1O&1ldtsiVMO z)e$C;4K7FNYj~6dNk%I0_*><5S&vDhHnc;pNTc!$QB6kdJ9tp_T7s_omWGJG)|1o8 zWq%RkW%}K8N)1Fs-o&Eq)IX=w{BZF?vLmMV$=cemMn6>S$RIyzClgf_lY}7aDYpTM zLk1&`>aXf=V7mRJpUt2c`bFPuPET9Rnvr^nbg+1r-qC^v`ypGk>&YHt3LE@^jyb&* zB)5)xCo?ZYb&IE-ZrYMMIZ!<1gbxfm^t6@~>1{`RxQKgFL;Ep%ooWibZ#79Fd7D(7 zYLbfnbq#r!M30+ELADc|qc?R_E8gc1G^TobNGtxq^>oFnt*8mnNqw<3#qxhYw5Gnn zud`?D{hM&`q#n?Q5?L~-4K<+7dQls?>3o$XBQm*RNs`Popekg6nKz~b!CD0b=2=tBcHBMs(M^*IdK&^c3>ye%2dVXi(U;cDuXByB1ABc<= z%&+tp@+pwS5B&l<7rX=pXSi@&tyexxtL_>7FYGhFnl26!#W@9p6T|14I|!i3c^J5FyJ$QOJ3l&(XHDL7~o3|3i%n-0m?c|^FS zVtrpezv#GXaD;!6hN(+BaU^Gco9;f6J_y{-oD6=|GG5RPM)B3@4LxQQJkmg$rsYJ{#j#Ts1teucu#(5j4(*-Kb>U8Tx%ihx z!{r)bDE!))R8g8m{p~bfpL&!tt>pLb^K5dcj?JbCLvKdZeS}ApN??CVlcvAFe!`$)S1LJ)iT0rssXbt67V+I8a%nVyo*P< zxyZZMM|i{rt^4T!RcxSejRs6*1-o-5;V1BdLbp*o%Upp%l^EVPt_EUzrIBnJyPJDj^@`mZOghS7(99&l%{0IzbD&fpmWS2EA6Y8lO3C61&7$QPVwN)~i1-u2 zA{H8p0ZSON;$21AE?qI5VjbQK&pG|cbV{&G8IIRKPNxTLpRw{KojQYGu0E5Ot3+Kg zgWs#M&3Mmp!W*if1_Ao$3`(ee`4R8Wd2^qF939aiGpSjugkr7Zjd4!C?{t9CWTeB& zKKuKGkhz<4jHN8740O3BloXfnpL)0q93RGI_%I1@Rd1O|%jke^F^hf61nWyZViuqJ zC-k0K6wgii^eo!V2j-mFl+d~m3V3ZazuM!*W}Ifo3hbB5zc1%as3~NGFHRW8;bN@* PY&QLs2I-x1DDi&)=rpB& delta 10406 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 delta 21 bcmZ4blyT`(My`BbUM>b8h-cc!HMb8Se>n(!L^Z>{TO5WX3=AkENnTMiAgz?o3&59kOlx5qz(}P delta 36 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 delta 22 ccmX@Ac2tcwpO=@50SMxm^fR7qn_kvq;!T0Rf(~k=efr0Z6k^n_mvqacP0Rf=1joH5n0ZOw?` diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/result.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/result.cpython-310.pyc index d06526d0f65f00255f07373538ae0809f07b5a1e..abda2108aa5982e1e9ca57cc56bbf8d791b293f4 100644 GIT binary patch delta 27 hcmZ2x7T$bbUM>b8Se>n(QP#-2m6vgx7T$bbUM>b8h-cEznAXU0RS@C1RVeX diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-310.pyc index c1171638c4b3fb5627e2662297eb16f1bee02f69..6b1abed8228277b5a5996cd6367c96a6fe4365f5 100644 GIT binary patch delta 19 ZcmZo?X=mZe=jG*M0D{%o8@c{60stoH1cLwo delta 19 YcmZo?X=mZe=jG*M0D^d?ja+{j0V5Lw&Hw-a diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/url.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/url.cpython-310.pyc index 553ac327f192058dff6bc51da222bac442ee147e..2d2b7d266e5581355cc6519e96d8d22e053dca19 100644 GIT binary patch delta 21 bcmX?eneohJMy`BbUM>b8Se?C*>rf^DQ4R*$ delta 21 bcmX?eneohJMy`BbUM>b8h-cc!btn@6O*sZ7 diff --git a/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/util.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/engine/__pycache__/util.cpython-310.pyc index c582510840212f230e19692f1273fad8d34ce508..4ee81f122e898a2e076d18e6c5497f9f5dac30b6 100644 GIT binary patch delta 22 ccmX@8eo&n^pO=@50SH!S>t~$Y$h$=t07a(;YybcN delta 22 ccmX@8eo&n^pO=@50SMxm^fPX5 Optional[SchemaTranslateMapType]: - return self._execution_options.get("schema_translate_map", None) + schema_translate_map: Optional[ + SchemaTranslateMapType + ] = self._execution_options.get("schema_translate_map", None) + + return schema_translate_map def schema_for_object(self, obj: HasSchemaAttr) -> Optional[str]: """Return the schema name for the given schema item taking into @@ -814,7 +818,7 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]): The above code is not fundamentally any different in its behavior than the following code which does not use - :meth:`_engine.Connection.begin`; the below style is referred towards + :meth:`_engine.Connection.begin`; the below style is known as "commit as you go" style:: with engine.connect() as conn: diff --git a/venv/Lib/site-packages/sqlalchemy/engine/cursor.py b/venv/Lib/site-packages/sqlalchemy/engine/cursor.py index 246cf6f..45af49a 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/cursor.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/cursor.py @@ -1995,7 +1995,7 @@ class CursorResult(Result[_T]): * :attr:`_engine.CursorResult.rowcount` is *only* useful in conjunction with an UPDATE or DELETE statement. Contrary to what the Python - DBAPI says, it does *not* return the + DBAPI says, it does *not* reliably return the number of rows available from the results of a SELECT statement as DBAPIs cannot support this functionality when rows are unbuffered. diff --git a/venv/Lib/site-packages/sqlalchemy/engine/default.py b/venv/Lib/site-packages/sqlalchemy/engine/default.py index 4b8dd87..553d8f0 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/default.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/default.py @@ -71,6 +71,7 @@ if typing.TYPE_CHECKING: from types import ModuleType from .base import Engine + from .cursor import ResultFetchStrategy from .interfaces import _CoreMultiExecuteParams from .interfaces import _CoreSingleExecuteParams from .interfaces import _DBAPICursorDescription @@ -135,7 +136,7 @@ class DefaultDialect(Dialect): # most DBAPIs happy with this for execute(). # not cx_oracle. - execute_sequence_format = tuple # type: ignore + execute_sequence_format = tuple supports_schemas = True supports_views = True @@ -1853,7 +1854,7 @@ class DefaultExecutionContext(ExecutionContext): def _setup_dml_or_text_result(self): compiled = cast(SQLCompiler, self.compiled) - strategy = self.cursor_fetch_strategy + strategy: ResultFetchStrategy = self.cursor_fetch_strategy if self.isinsert: if ( @@ -1882,9 +1883,15 @@ class DefaultExecutionContext(ExecutionContext): strategy = _cursor.BufferedRowCursorFetchStrategy( self.cursor, self.execution_options ) - cursor_description = ( - strategy.alternate_cursor_description or self.cursor.description - ) + + if strategy is _cursor._NO_CURSOR_DML: + cursor_description = None + else: + cursor_description = ( + strategy.alternate_cursor_description + or self.cursor.description + ) + if cursor_description is None: strategy = _cursor._NO_CURSOR_DML elif self._num_sentinel_cols: @@ -2232,7 +2239,7 @@ class DefaultExecutionContext(ExecutionContext): and compile_state._has_multi_parameters ): if column._is_multiparam_column: - index = column.index + 1 # type: ignore + index = column.index + 1 d = {column.original.key: parameters[column.key]} else: d = {column.key: parameters[column.key]} @@ -2304,7 +2311,7 @@ class DefaultExecutionContext(ExecutionContext): param[param_key] = arg elif is_callable: self.current_column = c - param[param_key] = arg(self) # type: ignore + param[param_key] = arg(self) else: val = fallback(c) if val is not None: diff --git a/venv/Lib/site-packages/sqlalchemy/engine/events.py b/venv/Lib/site-packages/sqlalchemy/engine/events.py index 848f397..aac756d 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/events.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/events.py @@ -131,7 +131,7 @@ class ConnectionEvents(event.Events[ConnectionEventsTarget]): if default_dispatch is None and hasattr( target, "_no_async_engine_events" ): - target._no_async_engine_events() # type: ignore + target._no_async_engine_events() return default_dispatch @@ -640,7 +640,7 @@ class DialectEvents(event.Events[Dialect]): _dispatch_target = Dialect @classmethod - def _listen( # type: ignore + def _listen( cls, event_key: event._EventKey[Dialect], *, diff --git a/venv/Lib/site-packages/sqlalchemy/engine/interfaces.py b/venv/Lib/site-packages/sqlalchemy/engine/interfaces.py index c7db910..ea1f27d 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/interfaces.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/interfaces.py @@ -521,7 +521,7 @@ class ReflectedIndex(TypedDict): """index name""" column_names: List[Optional[str]] - """column names which the index refers towards. + """column names which the index references. An element of this list is ``None`` if it's an expression and is returned in the ``expressions`` list. """ diff --git a/venv/Lib/site-packages/sqlalchemy/engine/mock.py b/venv/Lib/site-packages/sqlalchemy/engine/mock.py index b80eab5..618ea1d 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/mock.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/mock.py @@ -126,6 +126,6 @@ def create_mock_engine( dialect_args[k] = kw.pop(k) # create dialect - dialect = dialect_cls(**dialect_args) # type: ignore + dialect = dialect_cls(**dialect_args) return MockConnection(dialect, executor) diff --git a/venv/Lib/site-packages/sqlalchemy/engine/reflection.py b/venv/Lib/site-packages/sqlalchemy/engine/reflection.py index 4035901..6d2a8a2 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/reflection.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/reflection.py @@ -230,7 +230,7 @@ class Inspector(inspection.Inspectable["Inspector"]): cls, init: Callable[..., Any], bind: Union[Engine, Connection] ) -> Inspector: if hasattr(bind.dialect, "inspector"): - cls = bind.dialect.inspector # type: ignore[attr-defined] + cls = bind.dialect.inspector self = cls.__new__(cls) init(self, bind) @@ -240,7 +240,7 @@ class Inspector(inspection.Inspectable["Inspector"]): if hasattr(bind, "exec_driver_sql"): self._init_connection(bind) # type: ignore[arg-type] else: - self._init_engine(bind) # type: ignore[arg-type] + self._init_engine(bind) def _init_engine(self, engine: Engine) -> None: self.bind = self.engine = engine @@ -1627,9 +1627,7 @@ class Inspector(inspection.Inspectable["Inspector"]): orig_name = col_d["name"] table.metadata.dispatch.column_reflect(self, table, col_d) - table.dispatch.column_reflect( # type: ignore[attr-defined] - self, table, col_d - ) + table.dispatch.column_reflect(self, table, col_d) # fetch name again as column_reflect is allowed to # change it @@ -2038,7 +2036,7 @@ class ReflectionDefaults: @classmethod def pk_constraint(cls) -> ReflectedPrimaryKeyConstraint: - return { # type: ignore # pep-655 not supported + return { "name": None, "constrained_columns": [], } diff --git a/venv/Lib/site-packages/sqlalchemy/engine/result.py b/venv/Lib/site-packages/sqlalchemy/engine/result.py index 1c9cc50..132ae88 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/result.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/result.py @@ -373,7 +373,7 @@ class SimpleResultMetaData(ResultMetaData): indexes: Sequence[int] new_keys: Sequence[str] extra: Sequence[Any] - indexes, new_keys, extra = zip(*metadata_for_keys) # type: ignore + indexes, new_keys, extra = zip(*metadata_for_keys) if self._translated_indexes: indexes = [self._translated_indexes[idx] for idx in indexes] @@ -459,7 +459,7 @@ class ResultInternal(InPlaceGenerative, Generic[_R]): else: _proc = Row - def process_row( # type: ignore + def process_row( metadata: ResultMetaData, processors: Optional[_ProcessorsType], key_to_index: Mapping[_KeyType, int], diff --git a/venv/Lib/site-packages/sqlalchemy/engine/util.py b/venv/Lib/site-packages/sqlalchemy/engine/util.py index b0a54f9..9b147a7 100644 --- a/venv/Lib/site-packages/sqlalchemy/engine/util.py +++ b/venv/Lib/site-packages/sqlalchemy/engine/util.py @@ -48,7 +48,7 @@ def connection_memoize(key: str) -> Callable[[_C], _C]: connection.info[key] = val = fn(self, connection) return val - return decorated # type: ignore + return decorated class _TConsSubject(Protocol): diff --git a/venv/Lib/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-310.pyc index 141e007d738a54c687635d5ba99344f6074aa6ad..a22bb6a31d4460ad5fe93a258cb2eda8c09f10f9 100644 GIT binary patch delta 19 ZcmZ3=wv>%4pO=@50SH!SZ{(6@1^_9d1LFVy delta 19 ZcmZ3=wv>%4pO=@50SMxmHgZWb0{|t>110suH61d{*& diff --git a/venv/Lib/site-packages/sqlalchemy/event/__pycache__/attr.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/event/__pycache__/attr.cpython-310.pyc index 08a54d82e1fab5e05ded559e49984914f87ec0f4..7ac603a367b94f75798ae5991ce14df35df6fdd0 100644 GIT binary patch delta 21 bcmbQRiE+XvMy`BbUM>b8Se?C*i!BlWL7fFu delta 21 bcmbQRiE+XvMy`BbUM>b8h-cc!#TE$wJ;(%~ diff --git a/venv/Lib/site-packages/sqlalchemy/event/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/event/__pycache__/base.cpython-310.pyc index 5a8005535d41b0942f733d06bfd0d6c44af0ab2f..c92b323d48b5b15937178ca6c2de29bad918d993 100644 GIT binary patch delta 22 ccmX?6e4>~)pO=@50SH!S>t}>+~)pO=@50SMxm^fQ__^6s_-085VsL;wH) diff --git a/venv/Lib/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-310.pyc index 13bd5d25a70ac8758d1de356307466815e475a32..c21b6ae23cf0b3c1440b455c12556302043f0354 100644 GIT binary patch delta 19 ZcmX?XcG!$7pO=@50SH!SZ{)I+1^_gU1hoJF delta 19 ZcmX?XcG!$7pO=@50SMxmHgZ`?0{}3&1ONa4 diff --git a/venv/Lib/site-packages/sqlalchemy/event/__pycache__/registry.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/event/__pycache__/registry.cpython-310.pyc index eefd630bbdb1b0b1af44c2f0d3574e5c7255e89a..177ab424d8a8839e19cd0168d9d7c2e291b39173 100644 GIT binary patch delta 22 ccmZ4Lu+)J!pO=@50SH!S>t|fv$Sa`$07L!-;Q#;t delta 22 ccmZ4Lu+)J!pO=@50SMxm^fTUXSyB0=jG*M0D{%o8@X5+0VUJ}mjD0& delta 19 YcmeBY>SyB0=jG*M0D^d?ja;mZ03rVZ;s5{u diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-310.pyc index 813f684e16c35ca4a0c7f2f732f67dcdd189a930..a89526fb8f0c385b8ecc68c1bf39f0390d3c7ae5 100644 GIT binary patch delta 24 ecmaF!p83stX5M^WUM>b8Se>n(F=Zp~{qF#BGzl^Q delta 24 ecmaF!p83stX5M^WUM>b8h-cEz*s_uL{&xUu;0T=n diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-310.pyc index 1c1bcf883d76bec992b8258eb4d462aa9edfbb94..8d490ef1d4eb2b27047b6f637b0e3d02903f4fe0 100644 GIT binary patch delta 21 bcmeC_X71@`=E~>ggb8Se>n(!M>4q8WW@0q~;~3rYIy9PfnB; z*}PMsIf2n+vTdV2OMG&E?Bu>y&CSyqPrFaHZgiRKJAq?!{Yh;`#ygu=pVDPyyg!+- zNf=1JJ#DCZ6KH`ZQ;`jjD!Prtz6)Zr6x|1jKbY)%Mw9W*C$KtwT!cnq>(^3${bc|h{FSTgg{@{1C|);^!ia{e*nSc0Tr%fDFPex8f3;B5b<`h;B1k}@fVZWK=MWJfn4Fqw=TK}JOXjS zc7c2Vv{3Jojrj{86Xuy$AT~!4*eG?760mv9Al6$D0cL@{{ciHYOHzzaC-1qWEcF~D Y^%6up1QEF);sc2I2=e!4fy--|0K0XG0ssI2 delta 393 zcmaE{ntAVPX5M^WUM>b8h-cEz5Z}lkv#*B=&H(xuY%gA_da^YfO zASrRiP}Lu3ye3nT4Uj6jg~YxCVzU(81Bu_CoOec(@%H2yXH?$RgO30J diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-310.pyc index 3385421a5ca962fd39573b28d36a2ecd22eda560..968eb48b062b84e1c74478a58e4571df94a3e665 100644 GIT binary patch delta 19 Zcmewu{4tm-pO=@50SH!SZ{&Ke2>?J!1_uBD delta 19 Zcmewu{4tm-pO=@50SMxmHgY}J1OPmB1yTS2 diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-310.pyc index 423a1e4e306e4c1bdf04247dc86cc1e962109b49..219c352a4b04a1dc13eeaa922d2ac099ec7af00a 100644 GIT binary patch delta 19 ZcmaD=_^OaApO=@50SH!SZ{&Jl0RTfw20Z`( delta 19 ZcmaD=_^OaApO=@50SMxmHgY|%002LB1&9Cu diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-310.pyc index d24f6a8fae4e7eb8a0d86d9f052869c896692315..04e1c459dd93618e0f7f8c598118a128d5f282a7 100644 GIT binary patch delta 21 bcmeymmg(zSCa!#5UM>b8Se?C*>-97MQgH`3 delta 21 bcmeymmg(zSCa!#5UM>b8h-cc!^?DirPMijV diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-310.pyc index cb084aa0a9d7415d6a9fae6009bba5e964c1bb82..84977b3a2b30fac14f14deca8345677ce813c77d 100644 GIT binary patch delta 19 Zcmdm7yt$YwpO=@50SH!SZ{%8O2>?501)Tr@ delta 19 Zcmdm7yt$YwpO=@50SMxmHgc`B1OPXY1n2+& diff --git a/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-310.pyc index 500ef9364637a182293b764b84a3d08925069e66..48e8c41d517e78ec8a7fe183e9140637356d1200 100644 GIT binary patch delta 19 Zcmdn4xm}YhpO=@50SH!SZ{%7l0st}v1n>X= delta 19 Zcmdn4xm}YhpO=@50SMxmHgc^M0RS#A1Umo# diff --git a/venv/Lib/site-packages/sqlalchemy/ext/associationproxy.py b/venv/Lib/site-packages/sqlalchemy/ext/associationproxy.py index 38755c8..31df134 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/associationproxy.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/associationproxy.py @@ -1047,7 +1047,7 @@ class AssociationProxyInstance(SQLORMOperations[_T]): target_assoc = self._unwrap_target_assoc_proxy if target_assoc is not None: - inner = target_assoc._criterion_exists( # type: ignore + inner = target_assoc._criterion_exists( criterion=criterion, **kwargs ) return self._comparator._criterion_exists(inner) @@ -1961,7 +1961,7 @@ class _AssociationSet(_AssociationSingleItem[_T], MutableSet[_T]): return set(self).symmetric_difference(__s) def __xor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: - return self.symmetric_difference(s) # type: ignore + return self.symmetric_difference(s) def symmetric_difference_update(self, other: Iterable[Any]) -> None: want, have = self.symmetric_difference(other), set(self) diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py index ad6cd15..8564db6 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py @@ -22,3 +22,4 @@ from .session import async_sessionmaker as async_sessionmaker from .session import AsyncAttrs as AsyncAttrs from .session import AsyncSession as AsyncSession from .session import AsyncSessionTransaction as AsyncSessionTransaction +from .session import close_all_sessions as close_all_sessions diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-310.pyc index 036da91057a15848da4f5fd3e22de4d669eb10ad..4c5db43e2a1d91d8512510629268b68f3459b3e2 100644 GIT binary patch delta 109 zcmZo-U(L>!&&$ij00gVE^)u{PC-TWK-kGR Kv+ytqFaiMWbsJm& delta 78 zcmZ3@-o(zA&&$ij00i+&`WgROCi2NJUYMwTfmJA&K~s1$4`UW1v!ABu0 diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-310.pyc index 3779b0de37501ba383ee2db3ba233203514ff71f..1a39db4c8c2ffcf7c35576afe66b856e674eb62d 100644 GIT binary patch delta 220 zcmV<203-j9L5x8SZw(C!00000t7|W48nF!z1{M?m000O91OWyC1pfpB0s#yG1pW#H zlQssT0Yj772BrZ^lYj@f0Z)@T2#x_*lgJ3l0bjF|34;Lv4YL;u8vy}zlQRsQ0eO?q z42l7KlUoh70e`a*4g&!Jg`*V@0ReKe77%{{0g9fScF WlYbt!0SB`;A5sAaN)#FjQ5Y((J2?&j delta 224 zcmeBioZ!ft&&$ij00i+&`WYb`dHLC-B!D~)MixdkMwb69%uHYw(|?wKTx^q#*cLIm zPQJ>vjL~;;4f_tpz{#c@eT-3)k8qq~Ox)bh+04kuzgd`Dnvt=5vOdoo#_Gvuc)A$t zCWrHGWo+Ec%g4;f*uGehpOLX-vyebNBkyFORmDs|LWHeKY4QUhsm(hCxfvN}Z$2Uv z#>BX4v$QBsN8e_7F@IJ@rpfuzlNj$$W|Fzi$TRttOc|rV`POg^Q U&d9mhSU!l6-A6=$(W5x0Ytt5FF zH?1gh%UfpU&O_ysLWHFzL5Xw$tstZeMiK^DeLXcV17~1n&TnRZMl8$-uOcrmy-G%3 z!Mfby0j~{a;jhr1QzqJHjuN`1e9mmq!jlJ= z$H&+N2Dx!lyTAxX#p;16wpyLQ3_ss;ANWFbalawR5$}YNgA+b!;7|IbDx_0=QjVNA zXA5NGHjM{z$v34Rtu&O9jSeY?@YY>pKp*+o@-R$x+ewV_oNX9*N$%7}!)KvVl{}RY z?7_4&F_;R{O7VlI)2tpsrEt&zvmP-NbEF%m>FtqcDCgTpcLKHiGiL~BqQTsGxae+P z1^PH5e_oBd99opBS>X+pO0QD;s+S3!aZ#%i&>94U(Fmb6{t@2XT>3x*g?8BOFwkRr zF_!SA@>u~t4mr~%VBx{aC4iNlR?SGlx2yA!%I2C1AcLK?uN55T;|`}lC3~KaRM5g3 zFT4QmkfHG#hG?POU~9L$bQC4^Ttz*7=t)Bp zZ|)5Q+Bo&rF_^k!%M)5TM6H(W6pvpe;h^I#Kc4OjfWiI0%1Zwu1)(%@&!QN7@E26ThnDG(Nts2mQ7yNDr>9lXicU5Z`yj^Jlpf?d7jUYWno?x+Cr^XCCSPVe!034 zZJ-kzX|K}(zU1U(4JET{9bm^{?qdSZyt?(KfDc{WWW!)0Z#q3NcxQ!!6hj5AoE6iT;TR>j!J;{oMQuEds*1n;V%L6_O<{3 diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-310.pyc index 9d2dbd483c5804460f0b8791f558a9a93cf92787..f21d3ae27f102c0b8a56df60ebc3c55f2f704495 100644 GIT binary patch delta 19 Zcmcb}c9D%MpO=@50SH!SZ{%`k1^_TB1ZMyM delta 19 Zcmcb}c9D%MpO=@50SMxmHgdT$0{|>l1F`@B diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-310.pyc index 22b39e8a58504ee588efceb0d6c828aafdac3246..4a2ae499ad48c7329be2f53025fa1c6506e5384d 100644 GIT binary patch delta 24 ecmbRFg>mK=M&5j0UM>b8Se>n(p|z2hrwRaH?FQHY delta 24 ecmbRFg>mK=M&5j0UM>b8h-cEzu-eGWQw0E8Nd_|j diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-310.pyc index 88b02c2fc894f1278c08d544b03bca406ce81e00..255cea356a47597f2eba8173255e96e7f35d807e 100644 GIT binary patch delta 8207 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 diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-310.pyc index aeac19171aa5daa73a5fb616efd1d378bbdc086e..3ec02d7b55e1bf1016d25ae6fae3dfd18c639dc7 100644 GIT binary patch delta 12845 zcmb_C33ycHwR7*RnS>A^2_ys&LP!Dx!V-`K&_S3C^WP)`lNtDD!jk&l zh+?%Zw8AefMJj^THg2ts(pFnRty&Qg1%=L2gx2b#)D>40ednAzTZW|2?|bmg$@$NI z&cELO-Y=ig-hWh^>h0IhtbuEcm&YG6S}qpguB)$Roy3vCM_;dC}VOJiH43}Q8kj@53HZPzHn?_SL6 z*bJAnPqH;pYi79BJX^zNvHC3TcQkKy;R9#v)LThz~;8eZ5lRjzXWjpeu*vE zW&r6%wh*KjDnpdKK$hla?ah*H88}ug4e6)sL19qhL(&{9vPTWm3jWzzgJ%&ZoFr zIX1dAe2#cJ%_aR*6b{&2SC4!x&x1c9W1Hf4`2C#Z3S>SThGF!IG{ zp$S1VfRNE{XI`h>PDVqfwcNW_;r>nhT9k+xS0hClMu2JfaOPsLskL%an#Aiw|BR{9 zh~T`8QIfP@tjn|{pJsaaZ`dQVx5b{!yucZj$p&xH!Qe3`>67&AEc+W9!7N+!wq*8q zHj0ggu1-<<0q3-my1GAU>)Dt+I`$5m%u2TyK{Ksa{y$jxzvaKnrn1t2Y9P*h6@>O4 zn}(_hhLQ8XtcKN+&VU|Hk#`QJR+yJy?;M+f9NXnOfq&Ah!z>0~X7D`BzIt*tFu~w? zn3ce>4TO5k#hOrU=Izn5f3c-(*%pIs&}E$W*>%hYob-4<0fv!(z^-R2$WcZ-lXxG( z%nS1pg7}cNAjfvO&POyyF{#YU?0pP#*-5@K!CoNJs~E<|Fu8$c%VeLhHr5V3KbXmo zhYNTY*c#@B=!dY=>{I4tYhi?BvCkN1K9I`>%+ERj8;YX{41dnPU^lS;0;!zvxcZXa z$TmZJ82gId%(j5+aQ0Pz-NL>P=m>U^-O6qQ%mUaC*bf043D}R=R={!r+s1wjSRP6L1F%uBmZjc3nhAEtJ{hPx*-vpmL-u3X*X-wPH^_`-->|#bUcd_2CAN?4 z2W%YsmIdx%zXY_9eaG%&zXELh?Gn?#Ph#Edeu#Dg;4*uNJq$c6b^x@s>^JPUz?%rp z9$}9HrwA$*WRC$>47A7D0l-R<=$3XD_iM z)SjkHBMnCqdpSx{RgSV(NTfRK^cZ`U+S8RJaA9W0*$HabC`sX-#T7-*Uf-hyelmNL zy+y;Tmg$=`V^e~MvscTKPm~TTm;6D`u-CQH95Hib#n9M7MysT`in*MAr?+EmwN~sJ zSv{c>S2iC4lq^W%M94rwSA-SPyZlOrkNbr-cj8Ri8e(dGl-dNqmgL*yaoSh8Jj`Z} zqQ1DL6eHlc8=MvEbLS;nu(=sQqd1cL)F9Z`v`%*q1@Vi#9BI6GBJU=tIyf!gAkX~) z%Kr#JV|eQ#3n3#{TDjtDhdqemyA{QvvWYQl1MVcTZFGZF6FfQk6JrJLfn+G6|6?TF zjsR0j&<~k-r^k*dHVS#-f$AM7Qi1^YvWr6&uJyx?>~Jr)*FiCAd0S_P;_>@d@H>#* zFUqd z13_exM(~Cyx$+n_bXn~zWb$7jNT|qf#B=3&Qnxr)K0FiWWGL0eV5GbJo9uq?8pXqR zh+!3D3}vVq6mu)`rap#Jx>a7Un?DZd#r{h?Fjbb@7ml|ydOgaDXj%2ZHNg+hTF*jR zFN_oSR*Xow!N}xorUnhu&e4e1Dqaj+954e;!FcRjZnav+TkH#0@JB(X5oR*g82d(D zBeZaE?KY`n zFss>Y3IAJ+l0HjIi*KFV;dZtw9hy&HUFI!85bwXRnSV7+w3OroAUivB zSu7;}C&;F+;^PAbit~dglu+A4KvUvsn?<#a7FL#^wCM?@O(Am^`x9CG_q6oLRSj6)#Pq7*5_Ni*5@vR&zrCq>@vPbf_Jxa@8x}S; z#m#bDYk3xe-X;>d*e7OBTR!3nNr<1C0InmvogWv5nvd#!5d~|OO-EQZmHGX3HyIICgdlMvR8nX ztqmTV*&s=qMRxss%WR;8^nUK}^f+~(?rQ+@#rNyyNUw@l>W_lLU9)rYjw9;?g4Yow z1b7l?lY(!}K9aiR6tY7I@TAm8k`Nn}&xBI}k4Xi3busEG+}nwRp9U*4#J5YYk@AC! zmTi;+0&U}_+gMGgPEe#7MD87PvE03(h#iz=#zw*GWdi_=QT=?tj;Obg2% z?%1&GWf~;;J6RU9;kxNKJe}tRx7ser7Anj#5J{*>NWV&Hb9sIzx>wATzm~*ZwyJwd zR!U-g$ zD=fNt;exfn&g!iL6Xi=TPP zbPrQbFXvD__old&wz)tG89a*5uQ2{M%&@mKQz%WlDs~j>1v5^QGC+9k%}Kvn>~*_W zIh<=mN6RRYTT(7s_L_yWWXOsh&U1NKEH_H-Iay2*f!;#k?}5X!;Q4|M5c$STld!fF zo8E;+f!wuEw6zqXYdxI(J6vL2<NqEZo&4bgQ;%|xT ziJsNa(;Zl^5&aV)`V2cET#8h&O_^Zk;m8hSWJ^WO{FL$IVMKuwzsu7`BPe{CX7PJ1 zF24_kj?0fj&%A|M2+_u|`@=%`EC$r159ws7#oO?6C zKLE)*oiMlOo4d47jIN(Gw<}`ZlFUH#RXvb4ohpNzmp@)tvGy&)nZvh2oPFf;zDm!wsv})l`Z!0+_pwNMejdbtWL3C z$;ucA(QTIenwvFnN|fek;J#RD67$;2i}^52aSMW;i(DuvYHnPtxM@k^PI$UdYUE1%;0YK%CO)Hlu5LQG-NafhkADFrbrSlE1V3k1Ts8~<7Ucf2S;Y26BJq{ z&hsYeQgFKOj5Ll^?Wh{wvbDWvA%BZ#=&Y1wDR@g~hhYjn(?=Y)ARg}+nTd{3Xtx-9 zLxrr7g3cQ@=+$aCP_(xsk#SgD+B^*coqE$cX)Fc03dMUX9x`yn<==`EH%~$zNm~|3 z`K09R%Lg*FdeL>uV$AF4E$^Dk43K>!F9z%$c_A|~FBBT27w2!UMW@#7%fr2=^yL&8 zP2#~FB>&-#GO2)qZ0$=P8Ex(5;P-+INQx}Z?#hOMgJ11A8?MKiz8oRrpt!WJ z3KN{V|2B0Tx%(1F#ygmxS)AWrYE8jdD8l}T_3I@x)Oa5?QYEp@HVBJ>p}Fr#*Qzz> z=*t%}J{I@fHy!2QxvxxChpVSAd1Ry-g44UZq#_FnjQ{|H^%lfw#wV;O$j>zZQ!j~g z_va>~Oh^llnf!5)`9QTaAh_g#PIwo9SS>(rqJ9UsIv2_i3nKUfg2xa%fgm>YaFVEF zBUWD;8&3iwVlnXlV-hd0BE5SR!#0*;fFgQ2PCagLU;?q&1vY8a$J9yt**NY0w0mIu zKNqL|pF4j6wRLf;0EHBu@w7HzZTL$FsDomihLQog`vU`X7jYD&Vg|yC%`u=BXd7X* zG4oR>@mB;P1pkA8)~+`ZODN1+K!bHBRyZo=+wqc+Kl#f?(XhYcfOm&+N+kTc0(>j2f>MTb6s_=VkCMeHfguZKw4}zlX@nq*Cl+dz^@a34(5)Ti<%Y$xP!q{h1=ot zsgGLx`$*n~V7ut|Sax79q7NdV`}?O5JA~jF1kWS*3xXpE@NSImy!c7PP9r#j;O_|j zf#5v^=Mel8!FdG#Lhu2AkU934$3H}B^2Z3jLhy~a_p#!Df@muO8-g|j?Fd{5Rs(=% zB6t>8IA4PlHv&4tcn}+bU^#+0JwXFD*8zAKem;DkW!C71>js!)StoxBKPmO=6ss)e zJ?@c4iYFeQ&~KD_V-Fv2d?DupWu!2g}CBwOH@qW*Ly_^X9qeySA3b5h0L1DOVll7AF@ z^1utGY8)L_IOSuSp)_UVTDaGO3vzq-qJ?s%=}$)&Dh3U_kvL>L;?Th?X_E*YES!PI z9I8p=eHv-e;3F+n0flG{iB*pZha>7IV$Pwl@SwZyQ0=NbG#@nyb96RplF6&Iw#N{@ z{nD8mn_($Pj3k);v|n1*(_$mXd|`p05J>~Ra*OZkXt2LV^Qj0{NH7da*!SKu)Bq9%NIMt?OBj7L4rzeGCyH@f6D)d^ z;wYrX>|CWbjkJSqtY1yLb$n3(e$#tk7-Sb55 zqWBx=g!a@@w0azyZ;0=u?TSfBG!507`t4mCi43%Nc zzKj~0f=#LiI!`rEK?N37h@h>s25L@A z3~VHlNjAY(iDqr8o_J2=Ys9Q$+oj{dlgIuf<&FlYp)`7pLT{2B>f4uhK#aB}K3W`j zEjI-|hSk(_qCO$sd9A!ETvk+9$tV%I_K8trK}N^KM5DO&c#(tyV3@e?_|OV6C5Hyk zH!1e`C}=0`Z4e-1vQb<-UJRQe+G#kEWm4_%aegx>Vt1CbiB;q^IEr8x9@Wt_@6RPId$88b!h8@sQksFL`NC`rDkh*Y7? zNTbsUO=PTKD9LUQ-^E7e)>MqGXB|U&xYOtU1~KGhbz0&q5UnTcW`(;anjEf^>g6je zK(x#y4BMU#=;X6ZynnJXK#|gFqxL?=oCP68maLITpb4Vm6e_K+Gy!Slpi!NgII6Eh zt%RX%LmG8?tUJz)MdCCpL7#&j-3&I0qo?vS$m6Z3avK7S;$o)wcxFa0=dT~jBk2?t zUbje!l8Z}SSl`SVw!#P#$ONjUOx&S$GKY`7HJoHEIBtR)-<%-@s3s>s4A#O#JLnw! zbfGD{d`mT}3mh)?PWbishXT*y$2aMK;O)O3K1__e|A$(4?VN${n=G(JTPo??ELz%g z#oE_~nCOMhB(qr@oRA#|ziF_Bj}5)OX;43TXoUX5(GeP=PP^zkgvd4!|4x}IL=$*8 zsN4!k@%I7Y*n;syrKEyaP`^)y%z>;H4CSI!b)eWo@XA4bX#zU|X3swpMW;7PzZTu6 zhh?KxUW+BC{<2_mB!XP=#_2J_`1Y6pFU0nE0Pwx82VT)CRu{g(XmvOhAD@6sD}az* zSr4;`Pej3F{J_NS-?SE9m+>MLDMnC&ycFa`zW(8pkd#WKn9<2dBpW_u1%0&6OHqFc zf-(f<2r2;BlHsLr)Kw)?Oh{P;Z-?kZHJcHeti#Rm3e1**EqHlE-`VkLJITN1{3U|>5d0ZI9ROQ;_&p7L4Zd-cU463hsmnO+Fu3{CKA>*uG^|TS z;7mqAYz{>GI%KNq@Ul*~QVm)fA9_hKn8evLgT=8k{pj!KXWZGEK+2$WttOCOXdY~k R43h3!bG><(xu3b;{{a@;+T8#E delta 11999 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

TRKAU%A{OXi~cv~GltM#m2jCR|MN6@}e z^tcPl62;H9x@;REIt;Z>-RgrYx2;X(-{=E}-1kd`J?O0<`2&)HOCc$Yfxgc5A;UFj zlOPI5MRp*c-)@-x1+cJh^q}cly<13yt1@W&I}&rq9t{vMm)~-&zy!-jWj~2Y z3Xh5`@$jt;nC@q{&X9_G(3A~kkBZ_Xu=rXRSasWSgVuxUVCJZ(5eIfvo6e!5wC!VI zy|YM^-SLv}**2ItD%vouZ-9xr9e1l+c%?W!JX7@D zm4a};x@(6Py?rn^RQSZ|zDr9Q(d1ho{h_-yNdmzW1(Jg zpe|9TqvC3z-#rtvY1nGk7H_I>%>1FC`d({pq_iS@P|aszB(y6ux4MEq?oW(^w35i$#{uRl>kj)RwHlJ z!VG2`9~yl=O%f#!Rr;~};Bkr0tbD+0=UrXM(dpG@O7zL@sH{*jAWpy12 zw$ui~2!u{NDw1XADrye*yX~oVySwO>0;TjvpZtwJfe*V%>Lt zcN%ft_a+VwQvZbnr;!ik{=WzR)u6#4Hncx}OyhFDAKf!Jom~Wg*XBYMa{G`xg5*IY zk0Obd9!?TY6%p-Us*T@(B0LoS3n;R4#q(n9(Gje1}(~P#J)bReKO+E5XL+{yfZ-e<|kcuKKkLCFnU{bW1 z;g%CjwL9UdTYK*0*P`wRNPdK52$CEiL37iRWi6|%jSJ_tXa~6csM?Fdl#Q2AtMf z;FpHKbje^!mt;NgMQKq!2d+nee5kC4lihQ25}xm7e?^IKoJV%}h5w0fUrP$Cd@^84 z!Llfad-D!4bbodYHH@aY4@|WdQ+;J)X`uG(i0Fa%LiYwwOLwQb4&IZk-(Nbn5q+>T z!tY54i3*SUE&`&hAJJ~39>YpnE?(R}QEC#O?Qduug&`x5FwvS2o**v}ZM_ltUj{FO zxw!>qQG6zW+n)1D%0R?sY9&lRTH?rKG$xWD*$#wH2YAy6lcfC_C9|YWQCxV$-ABg+ zdYim~7T6I%f9KeQ9}ct|Yc>%@u!mC}ho?}0MekKG+Q&@^i4T#5b$yQi}|Xzc35 z(}bWIDwL@kZ1~m*vkjj<<^Ug*HU_25L5anM3Yx4|c#-6^T5k_GVR&i=G$9?*PnR>K zZDVcTZc*`Kz5$mMv3!13pyNfoR6%``hfzY$5%BF)eAfh1;F*1cqpgdp4~RQnDwY<} zQ_I^g?W({&gi`B<|2TY^1+SSBxzB7<-EgGG>z)?(zI;jbGPK5)1q~e@hdbI4iSFdF zWnArqQ;R1=@hesSXerZ3W??)ko@h}MM|D3EwbVpffzz~t8-vm)&INi?;THQtn_FlX z!ZFddvBlV^6WARFPJM_GW7hVN-y*a~OSJg%48)=pl~!O}ZnTB45EbK*6icw!#tc1n zzxFmL6V#)`)#d=w$@GkAZVre24K4m}z^(SW){{K^lCnsGFxr9~JFyRnH9dE4pi9 zvmv)K$)Yh> z8{={eofEmB!YFnJZ(mDUrSPlJl44P}Qt!~+I^CsE(PQrg;Z!tq$QqtW6(EkA0l_3V z`{%w?vFq)+4641DDIiY0J*O!&G!zgUhpV7=*b2)F?V52V8#hQ;sH4TEcWV8VDXk@x zIIWFC0Wn;*?OI9ilN5qr_)IwY9I*=$h(n^oV@GxBA0e})qek|!%_Toe=Gf|;<ZcdM3|7Mg*tEjUL@2xkNjGaN z=71+Skn?Gnp&fPjw zgsMh~2_>!Y_Ko8cvXYFK%;n^G4y2^v6}+5t!KCr>i&2!0B6tA@@B8o@3+>=)7HUGD z&4ylV`RBlEU|t6b?NgU~kozr?dLT-s9X??2saE)`b!)d(dwlUmZ=E@An6#d18zPkh zmX^Okvq95L*9Z^ma;kOUqVwW|O`6dpiw92>iW^Ui6uVD!WT&ml X)a(42rRI@F$tW4VG0!vSnuq)cvQi{s diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py index 1fecf60..251f521 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py @@ -58,9 +58,7 @@ class ReversibleProxy(Generic[_PT]): ) proxy_ref = weakref.ref( self, - functools.partial( # type: ignore - ReversibleProxy._target_gced, target_ref - ), + functools.partial(ReversibleProxy._target_gced, target_ref), ) ReversibleProxy._proxy_objects[target_ref] = proxy_ref @@ -70,7 +68,7 @@ class ReversibleProxy(Generic[_PT]): def _target_gced( cls, ref: weakref.ref[_PT], - proxy_ref: Optional[weakref.ref[Self]] = None, + proxy_ref: Optional[weakref.ref[Self]] = None, # noqa: U100 ) -> None: cls._proxy_objects.pop(ref, None) @@ -124,7 +122,7 @@ class StartableContext(Awaitable[_T_co], abc.ABC): return self.start().__await__() async def __aenter__(self) -> _T_co: - return await self.start(is_ctxmanager=True) # type: ignore + return await self.start(is_ctxmanager=True) @abc.abstractmethod async def __aexit__( diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py index deab97f..bf968cc 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py @@ -257,7 +257,9 @@ class AsyncConnection( AsyncEngine._retrieve_proxy_for_target(target.engine), target ) - async def start(self, is_ctxmanager: bool = False) -> AsyncConnection: + async def start( + self, is_ctxmanager: bool = False # noqa: U100 + ) -> AsyncConnection: """Start this :class:`_asyncio.AsyncConnection` object's context outside of using a Python ``with:`` block. @@ -1442,7 +1444,9 @@ def _get_sync_engine_or_connection( @inspection._inspects(AsyncConnection) -def _no_insp_for_async_conn_yet(subject: AsyncConnection) -> NoReturn: +def _no_insp_for_async_conn_yet( + subject: AsyncConnection, # noqa: U100 +) -> NoReturn: raise exc.NoInspectionAvailable( "Inspection on an AsyncConnection is currently not supported. " "Please use ``run_sync`` to pass a callable where it's possible " @@ -1452,7 +1456,9 @@ def _no_insp_for_async_conn_yet(subject: AsyncConnection) -> NoReturn: @inspection._inspects(AsyncEngine) -def _no_insp_for_async_engine_xyet(subject: AsyncEngine) -> NoReturn: +def _no_insp_for_async_engine_xyet( + subject: AsyncEngine, # noqa: U100 +) -> NoReturn: raise exc.NoInspectionAvailable( "Inspection on an AsyncEngine is currently not supported. " "Please obtain a connection then use ``conn.run_sync`` to pass a " diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py index 3dcb1cf..a13e106 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py @@ -60,7 +60,7 @@ class AsyncCommon(FilterResult[_R]): .. versionadded:: 2.0.0b3 """ - return self._real_result.closed # type: ignore + return self._real_result.closed class AsyncResult(_WithKeys, AsyncCommon[Row[_TP]]): diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py index b70c336..4c68f53 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py @@ -77,6 +77,7 @@ _T = TypeVar("_T", bound=Any) "begin", "begin_nested", "close", + "reset", "commit", "connection", "delete", @@ -94,6 +95,8 @@ _T = TypeVar("_T", bound=Any) "rollback", "scalar", "scalars", + "get", + "get_one", "stream", "stream_scalars", ], @@ -108,6 +111,7 @@ _T = TypeVar("_T", bound=Any) "no_autoflush", "info", ], + use_intermediate_variable=["get"], ) class async_scoped_session(Generic[_AS]): """Provides scoped management of :class:`.AsyncSession` objects. @@ -213,49 +217,6 @@ class async_scoped_session(Generic[_AS]): await self.registry().close() self.registry.clear() - async def get( - self, - entity: _EntityBindKey[_O], - ident: _PKIdentityArgument, - *, - options: Optional[Sequence[ORMOption]] = None, - populate_existing: bool = False, - with_for_update: ForUpdateParameter = None, - identity_token: Optional[Any] = None, - execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, - ) -> Optional[_O]: - r"""Return an instance based on the given primary key identifier, - or ``None`` if not found. - - .. container:: class_bases - - Proxied for the :class:`_asyncio.AsyncSession` class on - behalf of the :class:`_asyncio.scoping.async_scoped_session` class. - - .. seealso:: - - :meth:`_orm.Session.get` - main documentation for get - - - - """ # noqa: E501 - - # this was proxied but Mypy is requiring the return type to be - # clarified - - # work around: - # https://github.com/python/typing/discussions/1143 - return_value = await self._proxied.get( - entity, - ident, - options=options, - populate_existing=populate_existing, - with_for_update=with_for_update, - identity_token=identity_token, - execution_options=execution_options, - ) - return return_value - # START PROXY METHODS async_scoped_session # code within this block is **programmatically, @@ -433,6 +394,12 @@ class async_scoped_session(Generic[_AS]): For a general description of ORM begin nested, see :meth:`_orm.Session.begin_nested`. + .. seealso:: + + :ref:`aiosqlite_serializable` - special workarounds required + with the SQLite asyncio driver in order for SAVEPOINT to work + correctly. + """ # noqa: E501 @@ -447,34 +414,45 @@ class async_scoped_session(Generic[_AS]): Proxied for the :class:`_asyncio.AsyncSession` class on behalf of the :class:`_asyncio.scoping.async_scoped_session` class. - This expunges all ORM objects associated with this - :class:`_asyncio.AsyncSession`, ends any transaction in progress and - :term:`releases` any :class:`_asyncio.AsyncConnection` objects which - this :class:`_asyncio.AsyncSession` itself has checked out from - associated :class:`_asyncio.AsyncEngine` objects. The operation then - leaves the :class:`_asyncio.AsyncSession` in a state which it may be - used again. - - .. tip:: - - The :meth:`_asyncio.AsyncSession.close` method **does not prevent - the Session from being used again**. The - :class:`_asyncio.AsyncSession` itself does not actually have a - distinct "closed" state; it merely means the - :class:`_asyncio.AsyncSession` will release all database - connections and ORM objects. - - .. seealso:: + :meth:`_orm.Session.close` - main documentation for + "close" + :ref:`session_closing` - detail on the semantics of - :meth:`_asyncio.AsyncSession.close` + :meth:`_asyncio.AsyncSession.close` and + :meth:`_asyncio.AsyncSession.reset`. """ # noqa: E501 return await self._proxied.close() + async def reset(self) -> None: + r"""Close out the transactional resources and ORM objects used by this + :class:`_orm.Session`, resetting the session to its initial state. + + .. container:: class_bases + + Proxied for the :class:`_asyncio.AsyncSession` class on + behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + + .. versionadded:: 2.0.22 + + .. seealso:: + + :meth:`_orm.Session.reset` - main documentation for + "reset" + + :ref:`session_closing` - detail on the semantics of + :meth:`_asyncio.AsyncSession.close` and + :meth:`_asyncio.AsyncSession.reset`. + + + """ # noqa: E501 + + return await self._proxied.reset() + async def commit(self) -> None: r"""Commit the current transaction in progress. @@ -483,6 +461,11 @@ class async_scoped_session(Generic[_AS]): Proxied for the :class:`_asyncio.AsyncSession` class on behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + .. seealso:: + + :meth:`_orm.Session.commit` - main documentation for + "commit" + """ # noqa: E501 return await self._proxied.commit() @@ -1014,6 +997,11 @@ class async_scoped_session(Generic[_AS]): Proxied for the :class:`_asyncio.AsyncSession` class on behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + .. seealso:: + + :meth:`_orm.Session.rollback` - main documentation for + "rollback" + """ # noqa: E501 return await self._proxied.rollback() @@ -1137,6 +1125,85 @@ class async_scoped_session(Generic[_AS]): **kw, ) + async def get( + self, + entity: _EntityBindKey[_O], + ident: _PKIdentityArgument, + *, + options: Optional[Sequence[ORMOption]] = None, + populate_existing: bool = False, + with_for_update: ForUpdateParameter = None, + identity_token: Optional[Any] = None, + execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, + ) -> Union[_O, None]: + r"""Return an instance based on the given primary key identifier, + or ``None`` if not found. + + .. container:: class_bases + + Proxied for the :class:`_asyncio.AsyncSession` class on + behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + + .. seealso:: + + :meth:`_orm.Session.get` - main documentation for get + + + + """ # noqa: E501 + + result = await self._proxied.get( + entity, + ident, + options=options, + populate_existing=populate_existing, + with_for_update=with_for_update, + identity_token=identity_token, + execution_options=execution_options, + ) + return result + + async def get_one( + self, + entity: _EntityBindKey[_O], + ident: _PKIdentityArgument, + *, + options: Optional[Sequence[ORMOption]] = None, + populate_existing: bool = False, + with_for_update: ForUpdateParameter = None, + identity_token: Optional[Any] = None, + execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, + ) -> _O: + r"""Return an instance based on the given primary key identifier, + or raise an exception if not found. + + .. container:: class_bases + + Proxied for the :class:`_asyncio.AsyncSession` class on + behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + + Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query selects + no rows. + + ..versionadded: 2.0.22 + + .. seealso:: + + :meth:`_orm.Session.get_one` - main documentation for get_one + + + """ # noqa: E501 + + return await self._proxied.get_one( + entity, + ident, + options=options, + populate_existing=populate_existing, + with_for_update=with_for_update, + identity_token=identity_token, + execution_options=execution_options, + ) + @overload async def stream( self, @@ -1483,7 +1550,7 @@ class async_scoped_session(Generic[_AS]): return self._proxied.info @classmethod - async def close_all(self) -> None: + async def close_all(cls) -> None: r"""Close all :class:`_asyncio.AsyncSession` sessions. .. container:: class_bases @@ -1491,6 +1558,8 @@ class async_scoped_session(Generic[_AS]): Proxied for the :class:`_asyncio.AsyncSession` class on behalf of the :class:`_asyncio.scoping.async_scoped_session` class. + .. deprecated:: 2.0 The :meth:`.AsyncSession.close_all` method is deprecated and will be removed in a future release. Please refer to :func:`_asyncio.close_all_sessions`. + """ # noqa: E501 return await AsyncSession.close_all() diff --git a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py index da69c4f..30232e5 100644 --- a/venv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py +++ b/venv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py @@ -32,6 +32,7 @@ from .result import _ensure_sync_result from .result import AsyncResult from .result import AsyncScalarResult from ... import util +from ...orm import close_all_sessions as _sync_close_all_sessions from ...orm import object_session from ...orm import Session from ...orm import SessionTransaction @@ -509,7 +510,7 @@ class AsyncSession(ReversibleProxy[Session]): else: execution_options = _EXECUTE_OPTIONS - result = await greenlet_spawn( + return await greenlet_spawn( self.sync_session.scalar, statement, params=params, @@ -517,7 +518,6 @@ class AsyncSession(ReversibleProxy[Session]): bind_arguments=bind_arguments, **kw, ) - return result @overload async def scalars( @@ -588,7 +588,7 @@ class AsyncSession(ReversibleProxy[Session]): with_for_update: ForUpdateParameter = None, identity_token: Optional[Any] = None, execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, - ) -> Optional[_O]: + ) -> Union[_O, None]: """Return an instance based on the given primary key identifier, or ``None`` if not found. @@ -599,9 +599,7 @@ class AsyncSession(ReversibleProxy[Session]): """ - # result_obj = self.sync_session.get(entity, ident) - - result_obj = await greenlet_spawn( + return await greenlet_spawn( cast("Callable[..., _O]", self.sync_session.get), entity, ident, @@ -609,8 +607,44 @@ class AsyncSession(ReversibleProxy[Session]): populate_existing=populate_existing, with_for_update=with_for_update, identity_token=identity_token, + execution_options=execution_options, + ) + + async def get_one( + self, + entity: _EntityBindKey[_O], + ident: _PKIdentityArgument, + *, + options: Optional[Sequence[ORMOption]] = None, + populate_existing: bool = False, + with_for_update: ForUpdateParameter = None, + identity_token: Optional[Any] = None, + execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, + ) -> _O: + """Return an instance based on the given primary key identifier, + or raise an exception if not found. + + Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query selects + no rows. + + ..versionadded: 2.0.22 + + .. seealso:: + + :meth:`_orm.Session.get_one` - main documentation for get_one + + """ + + return await greenlet_spawn( + cast("Callable[..., _O]", self.sync_session.get_one), + entity, + ident, + options=options, + populate_existing=populate_existing, + with_for_update=with_for_update, + identity_token=identity_token, + execution_options=execution_options, ) - return result_obj @overload async def stream( @@ -946,48 +980,70 @@ class AsyncSession(ReversibleProxy[Session]): For a general description of ORM begin nested, see :meth:`_orm.Session.begin_nested`. + .. seealso:: + + :ref:`aiosqlite_serializable` - special workarounds required + with the SQLite asyncio driver in order for SAVEPOINT to work + correctly. + """ return AsyncSessionTransaction(self, nested=True) async def rollback(self) -> None: - """Rollback the current transaction in progress.""" + """Rollback the current transaction in progress. + + .. seealso:: + + :meth:`_orm.Session.rollback` - main documentation for + "rollback" + """ await greenlet_spawn(self.sync_session.rollback) async def commit(self) -> None: - """Commit the current transaction in progress.""" + """Commit the current transaction in progress. + + .. seealso:: + + :meth:`_orm.Session.commit` - main documentation for + "commit" + """ await greenlet_spawn(self.sync_session.commit) async def close(self) -> None: """Close out the transactional resources and ORM objects used by this :class:`_asyncio.AsyncSession`. - This expunges all ORM objects associated with this - :class:`_asyncio.AsyncSession`, ends any transaction in progress and - :term:`releases` any :class:`_asyncio.AsyncConnection` objects which - this :class:`_asyncio.AsyncSession` itself has checked out from - associated :class:`_asyncio.AsyncEngine` objects. The operation then - leaves the :class:`_asyncio.AsyncSession` in a state which it may be - used again. - - .. tip:: - - The :meth:`_asyncio.AsyncSession.close` method **does not prevent - the Session from being used again**. The - :class:`_asyncio.AsyncSession` itself does not actually have a - distinct "closed" state; it merely means the - :class:`_asyncio.AsyncSession` will release all database - connections and ORM objects. - - .. seealso:: + :meth:`_orm.Session.close` - main documentation for + "close" + :ref:`session_closing` - detail on the semantics of - :meth:`_asyncio.AsyncSession.close` + :meth:`_asyncio.AsyncSession.close` and + :meth:`_asyncio.AsyncSession.reset`. """ await greenlet_spawn(self.sync_session.close) + async def reset(self) -> None: + """Close out the transactional resources and ORM objects used by this + :class:`_orm.Session`, resetting the session to its initial state. + + .. versionadded:: 2.0.22 + + .. seealso:: + + :meth:`_orm.Session.reset` - main documentation for + "reset" + + :ref:`session_closing` - detail on the semantics of + :meth:`_asyncio.AsyncSession.close` and + :meth:`_asyncio.AsyncSession.reset`. + + """ + await greenlet_spawn(self.sync_session.reset) + async def aclose(self) -> None: """A synonym for :meth:`_asyncio.AsyncSession.close`. @@ -1008,9 +1064,15 @@ class AsyncSession(ReversibleProxy[Session]): await greenlet_spawn(self.sync_session.invalidate) @classmethod - async def close_all(self) -> None: + @util.deprecated( + "2.0", + "The :meth:`.AsyncSession.close_all` method is deprecated and will be " + "removed in a future release. Please refer to " + ":func:`_asyncio.close_all_sessions`.", + ) + async def close_all(cls) -> None: """Close all :class:`_asyncio.AsyncSession` sessions.""" - await greenlet_spawn(self.sync_session.close_all) + await close_all_sessions() async def __aenter__(self: _AS) -> _AS: return self @@ -1862,4 +1924,17 @@ def async_session(session: Session) -> Optional[AsyncSession]: return AsyncSession._retrieve_proxy_for_target(session, regenerate=False) +async def close_all_sessions() -> None: + """Close all :class:`_asyncio.AsyncSession` sessions. + + .. versionadded:: 2.0.23 + + .. seealso:: + + :func:`.session.close_all_sessions` + + """ + await greenlet_spawn(_sync_close_all_sessions) + + _instance_state._async_provider = async_session # type: ignore diff --git a/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-310.pyc index a3c7956de449fce1a6779a9dcb056af385e20c91..a8c603ec2fea2ce618ffe93d656f498e7d682e59 100644 GIT binary patch delta 19 ZcmdnZvzv!2pO=@50SH!SZ{#v$0{|_x1T+8u delta 19 ZcmdnZvzv!2pO=@50SMxmHgXxV0RSoB1AhPj diff --git a/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-310.pyc index e008f2d28a131fe33c498c02d02abd853299837f..65ef13a493749b2af161b3a6b2d989255ad18785 100644 GIT binary patch delta 21 bcmey}%J{pLkt?5 Union[_HasClauseElement, SQLColumnExpression[_T]]: + ) -> Union[_HasClauseElement, SQLColumnExpression[_T_co]]: ... @@ -1516,7 +1516,7 @@ class ExprComparator(Comparator[_T]): def operate( self, op: OperatorType, *other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(self.expression, *other, **kwargs) # type: ignore + return op(self.expression, *other, **kwargs) def reverse_operate( self, op: OperatorType, other: Any, **kwargs: Any diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-310.pyc index 4c6d316d3d8ed9e441bc96dc073462472002048b..d5039295777ab979cc46086639e18d58deb341a3 100644 GIT binary patch delta 18 YcmdnWxRsGBpO=@50SH!SPvlw+04Hw*W&i*H delta 18 YcmdnWxRsGBpO=@50SMxmCUUI?03=TXu>b%7 diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-310.pyc index 12afdbbf75f42cecbdf310ca9ef123e2e0479e30..fd77fbe2572174a715f2a2601562a65ecb386809 100644 GIT binary patch delta 19 Zcmca%aKnHrpO=@50SH!SZ{+fm001`K1myq# delta 19 Zcmca%aKnHrpO=@50SMxmHgfq%001)x1TX*q diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-310.pyc index 509b594b43d6203da03c9bc85a093daae85ac6cc..2ed1f862485cad5f0e462a047515ce967d705c4b 100644 GIT binary patch delta 19 ZcmX@;aL|D(pO=@50SH!SZ{#vp001?c1jqmY delta 19 ZcmX@;aL|D(pO=@50SMxmHgcIO001$@1QP%N diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-310.pyc index 19352084c793471988a6d174acb495c1665572ca..cf55f5f31e8ee67d6e4d83a7c0ffbcbd47351c1a 100644 GIT binary patch delta 19 ZcmX@@aoU3`pO=@50SH!SZ{%`R0RT8F1o{8~ delta 19 ZcmX@@aoU3`pO=@50SMxmHgY+t001;r1VsP< diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-310.pyc index 65b8a52ed893919e37398c87dd3bdc1c6d8c12ee..30ce0e3444223e4e9ba56f3a46b953fb0ab01a1d 100644 GIT binary patch delta 183 zcmV;o07(C^H=H*PZw(C!00000t7|W4*D8??90A_3E7$?E6#^FplWqrHlTZg9lPm`$ zlgkHjla&ZUlRF4m0$LN3fd~_`><9+|lO_rw0(vo%uL&uW9SR7uM+!;-ld%g_laLD_ zlLZWC0V$JD3mcQq3=aV&lMf6SlZ6Z}v)&8@0|DEU;}7Kl>9ffYfB^ybvq}1b0ZNl$8dsCL8up3wIMo0E delta 209 zcmV;?051QWH?TJjZw(C!00000Uji>^E-aA_90BmLE7$>(mjM#90|FNX0V9)n2OE=b z2PTsm2VIl72XT{a2w0OT2t%{Q2pj_A{i%3EE diff --git a/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc index dfba6a4d211cff21acec9c94c6d0901140e21e34..0406da6c028662e6197ccc25ececcf80ca1e5140 100644 GIT binary patch delta 19 ZcmdmJyU~^_pO=@50SH!SZ{%7o2LLnE1rPuL delta 19 ZcmdmJyU~^_pO=@50SMxmHgYYO0{}1n1X}t_gU8lmGw# delta 22 ccmaFw`QDQ^pO=@50SMxm^fQz;@;*`l07 str: if mypy_14: - return _mypy_format_type(typ_, options) # type: ignore + return _mypy_format_type(typ_, options) else: return _mypy_format_type(typ_) # type: ignore diff --git a/venv/Lib/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-310.pyc index da40b1d31396c1ef434f9f3aa2c2d8e84cf02aa4..6545e800f00d12e7a55c969758f6f6330175bc40 100644 GIT binary patch delta 19 ZcmdnSyp5SFpO=@50SH!SZ{%9T2mma=1dadz delta 19 ZcmdnSyp5SFpO=@50SMxmHgc_D1OO=O1K9uo diff --git a/venv/Lib/site-packages/sqlalchemy/future/__pycache__/engine.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/future/__pycache__/engine.cpython-310.pyc index 1b43fd153c371f8da4236aa2a089171aaaf74ffd..8a3198fd60140a20e783fb39b3055ec682343174 100644 GIT binary patch delta 19 Zcmeyu^o5BlpO=@50SH!SZ{*5i1OPPB1jYaW delta 19 Zcmeyu^o5BlpO=@50SMxmHgaV#0st`m1Q7rL diff --git a/venv/Lib/site-packages/sqlalchemy/log.py b/venv/Lib/site-packages/sqlalchemy/log.py index f1e2cf1..8de6d18 100644 --- a/venv/Lib/site-packages/sqlalchemy/log.py +++ b/venv/Lib/site-packages/sqlalchemy/log.py @@ -75,10 +75,10 @@ def _qual_logger_name_for_cls(cls: Type[Identified]) -> str: def class_logger(cls: Type[_IT]) -> Type[_IT]: logger = logging.getLogger(_qual_logger_name_for_cls(cls)) - cls._should_log_debug = lambda self: logger.isEnabledFor( # type: ignore[assignment] # noqa: E501 + cls._should_log_debug = lambda self: logger.isEnabledFor( # type: ignore[method-assign] # noqa: E501 logging.DEBUG ) - cls._should_log_info = lambda self: logger.isEnabledFor( # type: ignore[assignment] # noqa: E501 + cls._should_log_info = lambda self: logger.isEnabledFor( # type: ignore[method-assign] # noqa: E501 logging.INFO ) cls.logger = logger diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-310.pyc index a57e531364127ac366828537be783510009e892b..383dc932ab85746c3ce992a0d45991ac1310cfcf 100644 GIT binary patch delta 19 YcmeCx@73qZ=jG*M0D{%o8@Zar0W6pVfdBvi delta 19 YcmeCx@73qZ=jG*M0D^d?ja<#*04T!)%m4rY diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-310.pyc index 7efd205900666dc8085804053dc291f19e34ff4d..9f8af7915c451bb8062558ca96cb719ebcaf2db4 100644 GIT binary patch delta 107 zcmdn@ob~*3R^EJGUM>b8Se>n((KnG-mQiD)b_6pc)8rOr6_!-ptkBJ?n6LA27exWp z++s<}&(E3MBXCyamr!V4W`16DykEX!QM!&oW?o5bbDZGzI6=n8L5!u_ol+S0@iMY( KXDnje%Lo7p5+WM_ delta 90 zcmX^AoOR!GR^EJGUM>b8h-cEz$ePG2%c!uY0c8VZ3OoR03sV3o43oYF zjSgB2a%FC0WpZC`b!=>NlS>Dp2oL}O015yI0kiW5Zvg>slVb^j0cexv3EBa4lfepd z0dtcy3z7kNlgA6A0e+Kf4734+lOPR<0gaQX4RHaGlN%0w0h5!N4ut`hlOGRb0h^P9 e5268}lO_<30i~0*5QPD%vpW&N1OW<@{S`E$uQxOR delta 151 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 delta 19982 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 FfIr__5j6k+ delta 923 zcmYk4U2F_%7{}k|o!Q;_+O6#>C8tEtXh=zkh@NvUxNws5K|%z<#Co^2)76#PS=;h% z8p}yTwbpqmr{b&i5mzEiL?R)L3n55wL9&SwE{Jf^8($IiOt~=0%sl^@|MQXG^WMD0 zU*F=fY&2>xx@&%{aO;fp5Gv_ygDGlU)(VkeUq= z9Mf%<%n6Y)+ashS?y?^`BH5rtaa2Zzcu|+SyGm+KOzM5CsCiY+1j(c(d5e-}QaKBK zG^J3Ah79GBf)#^m+~I?9p$bO%<_{GLR7=s4mQeEGmZT}dZ9Kb&8dZ}eA*ro1QABzb z@{Ip;QCcnvjY?}yjWBOEsQO{E@y19)REn&mJxt*1V_mg9`>nSR&4 z4FDy-^6yfBYgp5L8!q@G-8R4-{C)p5cz~bwUx7z>@jwZlU{lXgc!l?R2H?7%I@rO% z@<;m00Hc1k{2M?LFC2ah>u}$H8_K86U7Fc2@d{^4XtGv z6*{p#M6MXIu97-M6DWc~E({SK;==4zi!m80R_HQ3e0o?T)k2M3lMd$c)cy{K`6A-Tta;8zT#yB^CulF~e Ke5opnYvCJXTqpbh diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-310.pyc index 36b7a7f7ace70e700e461a1e7ac17546e4d81958..c9e643761d36d37ae4e0f6067f143e45f78fa7aa 100644 GIT binary patch delta 21 bcmX@nz<8p8kt?5b8Se?C*OK&p(PzDB& delta 21 bcmdn-jA_R+Ca!#5UM>b8h-cc!rMDRXOfd!9 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/context.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/context.cpython-310.pyc index c5c42b263375bdd684a8c69f0a178053598d92ab..bb31f3c69e17348041526cc4ba89a82afbcdc7e1 100644 GIT binary patch delta 44 vcmeBp#N6?SnJb@{mx}=iR%dVInxf5^HhI3b9Cr**pePkY#BM&J?Qj$T7tRc# delta 44 vcmeBp#N6?SnJb@{mx}=i;+ZybP0?nInLJ-xjyo18P?QQH(l(#ab~p+E10W0S diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-310.pyc index 2f79cb3a11dac2c1ed2146da721dbd384dd1d147..bb7cbf4fdfd4454419f728dd39142d52e9e02b7e 100644 GIT binary patch delta 52 zcmX@JgZa!3X8wF$UM>b8Se>n(ari&OM*iTb8h-cEzC}d#V$RE6!Ee^;p3ZDG1TV!&9G0WtJ%~gzXn}2T( G)BpgA^AOMg diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-310.pyc index 7607991a55278062a8f8b0e7311bc8c8daeece11..faee449f2b4107c44ca4bbb89fe01ce842d71b0a 100644 GIT binary patch delta 1146 zcmY*XU2GIp6u#%q?Ci|!&i7#;6Yld@+WYSkGM`>P+U`Gv~YK z`@VZ-rkCi+B^nyDER*2%Zmw@{X7Gd1@+NH8`d$8xL+NZBTvkXAtg*|Y+irrd-SvVA$3W7XC=h}-TaM`#O`!hU94 zlSO;FQ)~5hWK)RO#?!60cDGaRFEki!tYn6?$Vj70>XqxHiGs{mSp2U6q%v$B&-}i7 zQ{!eEC$KC-uNHpD8ja-2yeZudV zUcd`_mKXBEUW5f~GEs)Y5;HL&xN6v>6|!Mu`A3S&&&x1ISL2U#SxJ z)>(KSZF^B5B@->KwS&w=iMZ)~EP%yTV>&81<#&+S z0B!ukiC&*`1%F)r!^G>U-!ahuZ>mvBab4C_ozi7fQn!s{zJtCM0k7g z0p;t`-Pbug#Z2)>3Oj^T`h~)I@woRXz(LVfehA<@G4kRCfbYefm6#9y7WYrDQed~( z^YSKuDc*eLEbJFUuRaJcAm&~>3@|U&&8P|t@V-MA;T@s!vtWGU$5U*VR-;Fg{Nmv! zt^->5Qw!VR4?eQ+1zhEQ$1lLI{LkYbQ=*HHPCN#1PQ(}U3dBU^ t)CL@iF3z1k18}d%yqTjg#J_#(3}i&*?MYwwxgbPB<|F0?GpWTx%0C-#Mh*Y~ delta 1061 zcmY*XU1(fI6h7bF-Me>hc5gP>Hh-(NO{&(kS_+}~pewPp*c6KhK?OrVt~GA#CcAr+ zu<6{a>;|&&ufeIUX-vCYDGJusG6A~Rpbj0pvozizDP#Jk7va^az>j!QDJs}a3mDqzThfxDNy_); zx}}g-C(V;*SE+*ht}11k^7neNTHFnBF11k|AkUGIRz=KHw##d-l9#B6{1BgQk(fZk zYL(WgkstDsyjyCmfGO7nNla@nL6EeblZswjP{<9B1~%`yW+!>=UdI8^hz5lt(poFa z@*??iBeyft#qn~kyWzEaso;F!gcP-#q!mb%RJ(btUfn3M8!jyWR{&F4uEqcSwzr{n ziyM{J61n!WQAZhTluUoo+sK`v%%)m*m8w+d5}@qyM!csY7LYeMy15o`HPyuv5kKnN zev=>b$tX*U2hwDsEL@JwB&IM$(p*5n7@)rery7C=x!rfLuznfgXn#X$??5Az zdYWA46#SNKh^^+pnxg}76K>0_C0lm$HTbQKl6-euGAY5h&Rt*I>TPq|-1b?Lt?JLQ zO+ADEw)y`(t&%jPbr0pbb$a{{fi3Fp!V3Cy!g~iust+f&sh=la?z+ma(*zG;3L$vC zVTMBx*X^)6HaVF}*aGY}rr`CTVg2T)yQc2Piq1{78`!Vsr+*Z9Pv`tkfO*|ldJyX8?B0cm~ar6a&$-G4Y_ zAg%Vi@-^x@rOpBGt1phs-~%=A>P394%%gdHs)|R?<8!_B*dxGYHS^j@tm+MmPXRxu z+2dz$MeSJHho6+c^cj9pdtSeU@07Frk@!8Lzgm7AcvttH%o?!u;;BA}YY~0b8Se?C*t0x8kM41Km delta 21 bcmbQXlX2QkMy`BbUM>b8h-cc!)e{2%K*R+? diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-310.pyc index 94ad69faeae66464229ce525e6ad4182c54b085d..653b376b6c0cbb13c8e6470766ec3822a1860875 100644 GIT binary patch delta 25 fcmbQ#!8ECZi7%g*mx}=iR%h#HWKG@3$I=1-Rp18A delta 25 fcmbQ#!8ECZi7%g*mx}=i;+ga_(xz?XV`%{ZPb3Bv diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-310.pyc index aab76792cc97bdbab4884fa64069d116bbeb85da..0eab6c79718ef7bc6bccb78208b416e9e41e5bf7 100644 GIT binary patch literal 9451 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 IZw?Lo7rDK9mH+?% delta 3279 zcmZ`5TWlOxb?(gU?Ck8r>-Da^4?ouLu9GHh2`Qm%h(m*GNS#op0d7+bo4q&5I{Pqp zW|M5Suxf3TA5y8hd?4|V4SW!ZpD27*NJV^rg!lmoX~Yj7JXFL7;s>b+IOmS-Y=YU< zoH^&*bI+Xjy?2ZWYW>#=jz9A{A}jE)VRJ$-aC4sZ?jk<)^w;tG-fjg@HkB< zJPvr0CKa9lJVl2To@}I>!*p2TsYa$bLPr!n)W|k-G^g-1;G=X@;lqHB(J_T*0MFAr z;3G`w?9-GYvW-HsNQ*?{QE>|l$${b$Edgz_QEsxadpaFo(O8}pwl!AZV_OED0J_LZ zK$rL^(33p5F||=<<80y{fwf6C1#440zh!I@It`pMn+DD_&++ks20La}7Bx1*W`Q}& zXOPK<)sjhP*&LhS*618tSl23x56|jFBHuO&@(0FA`4{7^9bM<1S8uoE-_6NI10s7y z(}*_;2-hfK8r7M}bY^T5YA^yiB0*mMIFcu8@^_K%lZ1TBsx1X()%QgZ@%*aKX>_v+ zDsORWS2s5sUDt0@v(|1j?rUO7eq>eS&w+L?3&14udi0e1ZFJ%2G>~HIaZpAw58zpN zJQIMerHIJO2j%SR2ey`he_$(E$xRxG=`6wwW`flg)4^&h$iCcdRh#wNGFV!_+VS~n zbF*=2t!Bga{a;M>V&nau(KD|_>RQkKA$gY&trzKOuFzZ%(qC2r&?Up8%deH-}(~Bx;B_n3wE0ws2!HXszvqGTrLDH{^>)dxMO$Zx@X!@Pa z1`q7EU|hIYyP|+n@vn5a=(@EA#8_6G#W!PO9Ql^wxPft#cWJ`!Zt_~S(WqWU4Xo~M zR{h!yu?Ui)f?x^v=r?ZEpL{))JBiv$7u_&{*O=zMhk8aqk!s7chORyw#NsK$< zDYnFhSbE!}adw1dSq`uSJIcmb9MF&Ku?aQ_ydid+J&QeQ(lju!5luP_ zOl&=qW&m4Yi-3*X)l7|Mp&XwPN95@wm9f-vUxn8cNeqMP0?ZQhQU{8lVyNtj30#~6 zaGwM*Hw=;MhCwRh8g9G^j|xqiWXM~i%TPrvD4kd9cj~QUu3K-_eb)^v!TpYCi5y7R zh^F=79sYE9VOM<`Cjb_Kul2MIvPHg1dN2t((0M@X0EvRI)+12zK<^m48qs`n2U=x= z>=LhxZP9~y5th9rQlKxe>n#`&tr{0tUP0tqqvOeoL*p-~5;i>;MFWX1qf8W;FrV5$ zsIlbewhoo_A5+)=?HIN$zdJPPyojRaTD!&N&xa}}RY-|=0k{=Cj37!pp<5vDYw&pJ zxueU=>Dv=zBfYC{4CBbVXY6El(G6{9qz6vzWaWqH_g8XipX%cvweOItMxS^d6j7UT zzgoM&nMeQ`n76AC?o)`yloZGck(GZNUOJ=ldJL9ScLifE4gj2$yyk<`?v1+Vw?#L| zU0hyYU%hP`o@N}tM5cH1}YkMPlss4LOM*a69z^3vy9)t zF(*zVz?g`$0BE!h^>_#30u=_6%tdeEi%r+vuk#g@#k382p;WyB%2z5h(dHAB>+Ougj0de-R2_K1>)- zwHEt_CjU5b3N%kmelUHgoZ!v&E&eZ5@g+&7ihW(2L;?pEL znKFVS0ItI0;Yq6wSSz9HW`dZh1hEZs%+Vdgah!xxbW-q-WnysbJSd+a1^K7)pHI)C zk~swP2(BP_^c{tjk%#vV3r>ptW0xq7JTdc)HFO_(7c~VYUOJRf6+JL&4KFa^!o>$v zmO)HB4FGQ4p*Ba)62)1o%!?~>ZuaB-U~hKdtwEee5J!NcR1Hy~`a+$Ssub{Gp|RTn z21&cs=!zi}Od}XZkilh(x31S)Tx5}hb);sSx>|-ekL+u_QN@Yt$>q7?XYrz;JW-x1 z0|(qVh)iI=*le>-gP#U}G!M-&V~Kb|PmsO8E+5Q6ivne&jr34rB15vK)-TQ{;{OGA CsjV>p diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-310.pyc index cf1ff4d2d9f699b56bdc56884df1f74ccddb1806..72bef3508f6ed2a602703d152eb492b6b75f7e64 100644 GIT binary patch delta 19 ZcmZ1!yC{|`pO=@50SH!SZ{(Vx2LLtc1v3Bu delta 19 ZcmZ1!yC{|`pO=@50SMxmHge6-0{}7<1bzSj diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/events.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/events.cpython-310.pyc index ee5f9fc5f36e15b013ad211f49ca101125f0876a..5dbf46e5072a806631a38ea35441c36ace68ed01 100644 GIT binary patch delta 24 ecmbP!mwozOcCLJ0UM>b8Se@O-wUvvp_Zb8h-Yf#+RDY)`wjqC`3AcH diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-310.pyc index 85ba037dcdfc33a7f01d707d6e07887ce59ab325..c778683d2e9ceb34d2f9765a3562cd427cb5cb0a 100644 GIT binary patch delta 19 ZcmaE7{mz;zpO=@50SH!SZ{&I+3jjQv1;PLT delta 19 ZcmaE7{mz;zpO=@50SMxmHgY|Y1pqk51q}cI diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-310.pyc index 013773d93d2b2545e10cb0364c99fa0edb31f88c..90d7b74c40f8e2d950878a9ed8cc457e64a0acf1 100644 GIT binary patch delta 19 ZcmezF{@tA`pO=@50SH!SZ{&Kb3;;in1^WO1 delta 19 ZcmezF{@tA`pO=@50SMxmHgdgH1^_#|1x5e> diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-310.pyc index 7badac41e86b4dd72e619fa3b7be7773ceff5a97..90bc83324fe01cdd946bfff2fde7977a4eda67a6 100644 GIT binary patch delta 24 ecmZqO$k@7(kvE^0mx}=iR%h#Hux{k7hyValB?eCb delta 24 ecmZqO$k@7(kvE^0mx}=i;+ga_$~W>>L;wIyYX%Ge diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-310.pyc index c0c8d0537148dc0816b96e20526479bc89ff8b7b..78f31f6dca29485d28a8171e01147623cf8f92c3 100644 GIT binary patch delta 9164 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 bmuFw&p6ed&&T)*eDfF+?aUnZBd))s6`bTnd delta 9128 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 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-310.pyc index 8891c252511487b23a53761045b710ee80c3fadd..7f71e0610986ab1f3889a919b6309b0a55182dc0 100644 GIT binary patch delta 6415 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 Tc__2qvDh)ik>|c6tKokENzU&0 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-310.pyc index 53395af6d263f7875f1b3d41f6075df47da611c9..46a36cbe6760df0ed019978ca1e377198390f100 100644 GIT binary patch delta 21 bcmey|%lNsMkt?5tTrNjC-S diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-310.pyc index 0aa3a62ffcd0f1ab8f46c84e9e0139fa3e2168c3..1249707e9b630dd95daa0a013f3c0455097fba67 100644 GIT binary patch delta 628 zcmYL_O-vI}6ouzZr!!-<*u=!tR3T`LPK**%%F+cfBwZ^8V$z@^k)UaK730rBu&4hZ4T#9;O+D1ML|r?BLaNj>jM0+&^2w64p#v>Z;)Eq0iEDbhei!G!Z^YBjaI9lvNEC zUap{{tw_ct`bHl?sR5}RV=JZ_Dim5KP>Frz;VPQ-6`jAki2Y)yiaJo^`IFcqx|Z== z56w_EBeA+88jW9z-H1n{tWLdk`e8wSq=vQ&uPOCP!ZEiFo+U$FJwjQv(IzcpGqnQf z61BamtKGJfRhl%(GCW&DC+7G@4JmvVW8Vbb(%Uz$n*6&x}A^Y4iU11M>PLE lsRE%)SR|~7z8|=YpwIAi+6Q;RJ}uv7qp9Jaeag0if&V-@y2t^NkocKq(JdB55QLeg2=8WMi(D zX5(x^C10>X_J}>6(%EEsr{)Bv5-ncY;zdUamb@s?v=1{PSV2fU$)G{BXAqP!gJS{A zi|qv**ZHmtIOqYgvTqT?9%RM#63)XBojLTvk&`(@fJO0BLLABInzrR*H{(}(IpgEd zG|S{!CGs)Fc|<*sOOeSVW)zf~4*qGB;ZOMPL0;4r5XQ3TETF@?N|7}=RKO3fDqSj~ z>+p)wES)z{qh^B7N|^KTHS)TFb+J;!nNxWZuF$CK1TO1S%rf?DZeX2EUkIqgOX741 zt$JA(*&ZB_cT1=O8?vhmM{k-T+pL1ETHB7_irtReHm_3bEB)O$|65hFyn7FQF9s@T zY;*gA)^t}JCAT}+W$t1{O1VyS{|d=$GCq_HVen~3Q3b2PJ`QiB8w;#U=ytq-IQ t5zG@zQ2%$t90K}MzD!V-{oimOA=9YqHV^HGc~ae0qdD-`Y&U(O`hTDRznB03 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-310.pyc index 4374836f9eee6acbb018241436c72cbc56a22976..18dcdb856c941366b930a338388448d19940ec63 100644 GIT binary patch delta 5568 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 E0QYG_yZ`_I diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-310.pyc index 2818a4b8ce59fc1164afc7c8130ec9acac6b563d..7e7705ce0d8221ff122a21cdbab1149ecbfb2a3c 100644 GIT binary patch delta 446 zcmZ9H&r1S96vutDTH)>zxu_W#nOTuUc}XI5>k$1ob}KvXp+>MA^%8Hv@D>!pM7Kb1 zK@nLH{R5pk1wlc_P89?lx^$`M(xnDwn0ept`@HW|9$@zY^i5s&x@eu`#@E-HdN>7# zGM=iympn~td>T1h{N`uuvsB$C|N%Ww>`;hT|^jO9ovyHrlVN!>jy22xt4?P>O z54Pddn{qodoLoZ9g0hQzbLh9Vya%=V0QwtXYv`fsc`1rM^m89K=p3XStHIWae9Xk5 zEZyd;{{SNx#3+xah*GdIKwZaj)eMKSr67h#Q>qHIv}_@bUQ(}Q&5XdEyfBmSB45qv zu?`H@M_Y^rIBA&B|4=_D3lo#XW@17v&%}~(N)pJEyXtk=*Z*c+)2udP0d*|?{*j6K Y%d?rCcE*@YEL^zVz`ie^7mfyg0DL!#OaK4? delta 417 zcmZ9HKS)AR6vjQzEO~#3p6JWy1y742v4)06q&|x%$EI+r;SKcy%d0JM9vE&7VO(en zbZD!fOlWRu5}a&uj6jN(Xp4^0QWx&!-1~j!cfNblhEf}peMJ#Hw6=u#9qU%n6Hwu? zLIErc+Y-w+Rbx~qZs5r6{E;LapwEFcJYuU1^=f+WFujF{wRSY_+6QFaF_EZH9HhCu%1I9&bIe3N!Y8Z8538LhW zFhpIKeB08)*`kJF(!6Ca^t5a~i6W_Wer_4iE~Y=OmjHa%s|P?AuN+-0%PZv30opjm^&0_s@%{iDEE>-Xv7A>kXinYpXKWiBE= DO9Xn$=P3+5KJkq@qBjzE_jIdFL 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 delta 7207 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 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/query.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/query.cpython-310.pyc index 798ab451d012b6d6f53f8ed4076f7f6ca7b4bf30..8b505eac68d53cb7cf673e07120f6de0f79ba2c2 100644 GIT binary patch delta 1158 zcmZ9JYfzPC5Xbqw=RF4$4&bP%=p-r!@YYdG#I#U>$P!V5$N?{nh^Pe$HF$3{5E+G( zM?GcPs2He_msWg0MMoPmCA`!KI%+ds8Z|608Dfg{_O+ea{jjsU|I2Qwaa^x)_-8wv z?Y*q1oa@dEzqHT)Ua}YjJdn0~W(O@?_vN$WW8rCCpH_-Dk*E zdeC_msG`9;SRxS-3*lp_8qx>Wt8*_mu~l{q4S`B&h@1#o^^7Xxn0yx%V{lS=kJ!$y zs%pd&ZcF*dHn=C-U+ZMhRcc2aH!ScaF)Qs%72DYU?N}}DNo$}%9e#Tozo=3flP|WJ9id3NWQ4&6iJnzpr%X<~ zUu2_R66ZaD>oPj00{)acxo*?&G9_riF(*NCr63A&q;ug*2Kg$sXpXhMr|7ZCK~+&Q zm(Qi+rwwpauB{zr@S}87d2m_Qtsm~qEvf(FISiK5n^)KvCkb1-z$`U$TLp{6S(f^r z)w8#kz$VrD^#yjynet}XuMX~5%?b7T&OMw`Empmt%6Dz%vWl&&;F`KyDKx7sRduwe zso$J542KHaeU1Rty8A79O6;D|CN5bis~}YcROgW(h1E&c*X7EAEe5%=v^K+_RBj&n z1S%x6t`4eI=+Sh3kkv<@IV=&YzHjoOO{SksF^HC$^TS}G-2W-eWQywARL2TwY|4US ziMwQ){H)%*nunI-SF7xX>7(Y|Si>c0yOC*Qkjl7~j-S-uinlRLb!@ICSxz-)*_kX+ z4=ntAIsDKfx=!LAmBLqY@h_`cDQS-jp+;`DMg((0cj?AmDA#6pPD8Ce+k-oHPI+p3 zQ%Z{-*9TvdXZqbRq9I&=7LE%d^^v~xb&%<~?Iw*F9XE*HHnMf*5E=~%b#x?oHnwOz z9E;o${m)2-+PJ8Pj$*ov`<{(4G!m#kh-Enh>3ea!X#LXTACHG>ah*HWJ;b|;oA)WOE uML&q~EMCt_MtO`47RT|PO&i!xvL|sPGnk}hBUA0|miTuH>>udg!~7Q_5~nu+ delta 1129 zcmWlWdu)w&7{~j0-}fAPUAHoZNv%CA+R(D9YqiV{D;rV{YpF|z7-c#+)5VO@YP4nj zwccG2m!`$g%cJ|TX_!kbOWbBFk}<(HMrz$eXG-_(`Rkh}`99yvbK{Wv^F!{iC841~ z0nTI@{TDP{t_`~%iAVM7bMH%td^j;^JX8tduf;Bt>gedGC;?&_`UXJ^7&>N zZH7AR8yjet0RhXRolI(FOgD+17H;5{#J8LXJydzdaeAw1nR`i4=8RmD#6ROhgAwvD zYn;JkNtv_GV3BIfUdt*;dpiQwO4hs>*dzt>*SXjxp^FPm8pU4P0#~JQSrs%(!h8KK zyv2w0H-TAph>+J?Pa_aCrgJOw0@-gg`nuZ3bQ8`DmIUyI1wz-`U z=Nm6|n|z_$hv1kyti2;hG`Xl(rZCIou6=DZ zO$6)uS6L06b<%6}bY5vs^YPHnmeC$!>tc!t zvB#9K)o2URw@Pp->7o~HBGjOVoma{(2H8CoD+t%0D*8gQeWHwfhS{%|J08c`H_AE4 aMBCoXTqfwpo0;hf^oMl{j|~s&Vf_bwr<+ay diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-310.pyc index baf80b3143aa54e6ecd1ab1997d735a210980128..98f39bbab3fba9f194b603d511f4257820ceadde 100644 GIT binary patch delta 12774 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 delta 12398 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 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-310.pyc index 68a78c36b970f894f215f8062a5f41f3e8316e5a..493d18ec81096b9544bb8bb8348631b60c51198b 100644 GIT binary patch delta 8576 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 delta 6601 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 S>g}&DETuQ3gosk2u>S%)6^^3- diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/session.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/session.cpython-310.pyc index 92d797ac5bfe71e5a36528fdf020bb258b5bcd1c..d806015dac8cdb01e5eded1baacb174a510227ff 100644 GIT binary patch delta 28137 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 bE*2<5veGZ7AC>W^E=_HhTAtb`J?sAg!vz@` diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state.cpython-310.pyc index 2c01ea8105ffc67224d71543090e60dd27111d0c..33eaafcbab99e3201db44828e23e4e88cdc4d40d 100644 GIT binary patch delta 24 ecmX@u!gR2Oi8r5@mx}=iR%h#H2yNswX#xOLE(T%% delta 24 ecmX@u!gR2Oi8r5@mx}=i;+ga_>^Jh7Gywol8wJ_` diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-310.pyc index efe2a98c46a9ca164f0528f16bff4333aa338038..860cd7f33fcb0ae1b8faf736c06eac708d2eef5a 100644 GIT binary patch delta 19 ZcmaE&_C$>X= delta 19 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 MzS0OKc;$-tU)PP@@Bjb+ delta 6828 zcmai3dtB62)8AQkm&*b!2rP(PL_}5)?}~_uD3m6Kc_FuOUD*W|7naU0DvFtwre-FL znwE-WVy2e)GqsENOJ$cw^OA1rW12qCTlQu*pG!VH@61_*9^O9h>mOg{H)qbwoH=u5 z&RLs3^Sk(&Ux+ItBuGX7Eb3n6``-$=7^O97$K`vKZ=y>5#;l+Ln`&NQokkdJP^YO- z%~S~k|FuDksto1@R{7VdDnJ+s)fIju8E8}0s6?DiH9=JuI7(IAVO~(3R;1#}PR0od zG^&nK&C?Snr%qepSErX>dO0UY&e7MgMs+sXouD%Ljq?WCXIBfm+wE{w2_Sz=T5pik zRbq8oT-6>o-s$v&E)+sR2Ur&S=!116LEdJydYk=wZ>2}^y1Q(FE?r36#h6JP1`4=d|ZEtzfEra8RvL@0ga$xVCyvr1YnZ^W z8pkJgh9{M(L_5&nxh`vAiBg$l0BFGaI3v8Ltm)bdU@e|Ze#W$#XVf#~GxTQI$WX>G zharLiaZWcYe4t$Jb{ur8n6nz2yY~VOUg&-VI^f#W!>}5smXGJU6ENY7PS>sUZ7SZ*TyJ;;KR=kJq$gBfEO@)%@*CVpJyRQ+1SScU{?bA zW!{f%oie3=0zf_14#@bG{lSd7sFE8q#`>4D#9-~v_+`2b#224)8V98yLMT?o*K z$A=AqUzK~q9so#DM&%>|q@jJpR)|wVa+d?-Dld&J0vL)vj`|Z6D@XGh)nVQa7W-_E zuv$ul!($f?t5W)46Ub0cSAxfE1GtQPA1a3cOc*<$Llotb7{p7`5%sxJGIpFFtjFCC z7ego-3a{!m@mOd4xo{Q?MCW)nv9FDP8)9(HBd_|$@oWv?hzSoG*0bQ344j%mi|Z!1 zbO9_7h@lgoEjBQz@X&MyJ%0u>gfN5>m_tgO)*83n?zC6ht2|zf+f(Tg(nbfCIZN}r zq4v^Jdx^&}({8D@ddkHBR+fZ6PVCwtk%i=1f{6M`NuG2J)GzUIFg6qw!9IMnXd=Yn z&Z5{T>FfrcdYnOKGp*xl(T6dES<67?X140%J)e(<9zC7dlX)^rIbP;asvu66)n=)5 z*=n425rl6}Nulk%Fl9MpDJ5p`13lV{dk|VT`%?4^e69GW@L@FDr1M1~jE(ifom2b6 z6}&!m0|`H6NjFF4K;L)9V&U$%Ro01c&?YC7x*9b;iM zmX^A7^4QGBJL%Ed`81&b|6cm8PhA1-FH1FOS+kKwgq~qE-YJ`AWWT&YqNd8i@wJQl z4waS1!z0S#@~#j*iA1Ol{4R;`J;zAjDV2%Wh=CQ4#XrXCM=;1F^RKec;tKD}yI@>c zF-$v!MrY%RiskAlfM<-IV+)Cqr==AJ`&Ot9RtIPTw1yN>h|6Xihw-$^6hHBZZ<*V1 zm2*h&1U4~|VKU$k>Bb;l?3<)S6e;(d3c#1Rt7?TIjV1arux^ou<6K9nf`?TbVUJ>} zHmboNM~Lqs9{aePwH^}eiI?3^LJB_S$$@BG?@87*@l1a_>FEmT_>HF!N^nTc09`q2 zeFA6JWW$rF)QpFligxDn;GawUiDEXL=Lk%!3dFs$(xDV@%o+j$6K0nf96T?Vb;@$u z7aL|LB|3>|3h`ChMJ!N7;Pv;oEEO(Cl~{`BW71{&tR084P? z+_5^j#!|dK*JN18^PgjonwDT}T@P4^`E@BU8!PM1cIv@n8iro%hKZ@8ObtQvyq<}2 zzO)}I?6at@dF)lbjU#X zQ<~;i0=0Nz#$m*Q%J3~j-tQ|8mThi5w6}5lf@feW_Fk9?cNNFNR0s+5r}R*hSg>l& zAUv|53m$rUHUwejGv)DHS!pxF+azEPp5^eATih*ojW|5`Of+QU7tf@_LewnkqJ51d zf5je)p4Q2Uuc5NYq#a4jVEk%Pv7Uzof70>ew)6PnFsk8Ii;b{PS-kizz*9JH$z9ll zo~7wfflW(?N2ap03}qfu`3yGvW$6%uET^&j-BNaPmZeAX{YNZjn8T345Q+NIbtRf`Uo;VUSC$b~$S;RKgveTCs{ndGEwa z3@!%VHFH>rtFqeRv|HRBtH*9Bak|BP9`t1~Qwtbm#>kzN3ABQFOBm#yO5i>9V)=8O zz@R++oTAp{^7t;9?}aNKgj=|7#VEteyrr_-%TiW=->rCHj7(Avlvm&4u*KoFiW#in zAOmlpC}Q9P;kyfQ*%SNtvx%uJ0&ff^G{oSGFN{ew^MKs^=b75YAl*E|l*~WwCu^0! zmCHb1%uIRgreghp2!l6>0`24u=c?M~M~gUGKLqaLZ}p8KvLAg!Q|V6g3BKNt1^4h~ zgM-@5!#MI`P7ss7@4U+Ftzh4zb?L_p{`~B|GbW91=o4nho7BflN$*Y&^#gu|)8IqQ zU3GD&jFB%}Smt*g(mi(OT?eg2V%`y{s(*(yxoRm#MYa_ZD_q=EVn{xFcQ}FpOcF1q=@{jKxJ87Q-tT zyfHuW5;MFEcGhr_C~pK#+Yo_sH^#vMT(>a^GL`o?CaF8@r!fx+1s7c%yGJhT(xdz|n_SM7h3{5WOq8)MY^uX(C0MR)M@uH5-Q z@b`}dbbclM6Vn~VX4Wo?^<9=olUjLTMv5-Cc7nbLT zj8`ihW#t~h8oe5)z0@NONi*h-7I(GNQ8L(Waa2+JE}_CqyZcX``ws$Bkne0*Nsl>z zo4ds|y+X(}N+CU-ddmdA%DrYMzEgsCPk~6goAx1*-J#b zY8pZU|Ci^Xtlz*8#vqM!U`l$<`*Rk}hiZGs-RCMG_&5qa0y0~LiiQ7I-TZ>alQI5q zANT?b5AT5jMSG+UviUmCwU~3_2K_Nbh)KMn$qceY$Qn4BKWTX?@jXLFHn9;8932uB zNu)QFlHB33l)8lPo*IRr$NGX5M;tRkxH9D!y_);ut>dpmB=JPKB)OWcq$~^9pO`=o z<2xskBImI;x7ord2LAa+^u_KclhZrVM6-YC489S$MGUKnZPnF zmup5%wa+_gDuo54<~XAAmEj-80d&RUkK$ko&i%+z5WxZ|ZOdeL+N?@jnm@ATTS<>r z_3=ba#_p$z{jc%!uvO`6S_V+Xvl6&v~OUlFLD;7Mk zk9qqUWUOQrJwt^2p=Oj6W=MK(@58<*P7>{sks&sJAjvuy@$IoqS>1~wqe$wsD{804F& z&BIriM|Q<#ymxl&d_Hl)$RO{TZ}Di`nc<*_O$?n`B#MpiWQgL=T&CJ`H=23pm}g>& zH`1)jr9MKxs&r)?X*`z9R1Z0mAW?MV?-T}^!^l)AgFGtr_?L5o68LTD^_%0U_B}97 zJUoQqafWp`^n9Eln@O1svemze73VV(EX*yk`2=hW&K~B;;K(q^y3_7;Bm)-yyMVQi6{sHfy&KIT7JFs2r`F=T!iXX4 ziCkwkQ?Kzx>}@sJmJ~8j^4j7H6bs8>)AdPp7`y#>Sst&)8&qYjwA(y2)pU%c6LP7O zSuHmx!5u+x-4^_7m9JNGt_j{W(O1pChH1lz{s%^0OQQ}t;@X!0!!ho90{nzSuRj+% zf(9wUa#_A@({f3h3U6GWnViD|EF?z$hY0<=Yxh|ELTF$V&byIE?}}qLk`wdp3(+=8 zo$?hTmo}1A{)qlxXY1rv?Z(kxAA~L#aPu|#FM_vjW+rE`<2ek43^oS7YzSU};OQ;D Opd{Wxn2dXFiT?qM#ooIB diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-310.pyc index 98c68c0a60181a3895a1f4ab458578b41746d9b8..d9abb949b36b8978ad01da4ea5e1c37d8931282c 100644 GIT binary patch delta 18524 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 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-310.pyc index 42d40235eaaa659783584e02f7af53b2a34bc1ab..ec41aa0502579bc150e8b62ddd2bf4f2de56cbce 100644 GIT binary patch delta 19 ZcmaDO_ePE@pO=@50SH!SZ{$ki2LLx{1oQv^ delta 19 ZcmaDO_ePE@pO=@50SMxmHgYBL0{}CV1U~=( diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-310.pyc index f954f842a6a8d823c8a4d669f6150aaddf41acd5..16df85d4792099d4bed0731703481e2d33290b3d 100644 GIT binary patch delta 21 bcmeyhgz?uBMy`BbUM>b8Se?C*s~`vfP>Kd` delta 21 bcmeyhgz?uBMy`BbUM>b8h-cc!RS*OKOtl5N diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/util.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/util.cpython-310.pyc index 27ed4f32e48c2de96b112ea83ad4cc81c5aac427..5e174615febe55ec5e8369ea9cf1e8d21c6a6933 100644 GIT binary patch delta 17969 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 diff --git a/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-310.pyc index 9568fa70cca4e26affb8bb20e4ecbe06087ee518..885d3d0a217998980ed290ee81bab472a9837f0d 100644 GIT binary patch literal 19614 zcmc(H32+=&dfs$T&xyf75+uPxQj_8#P$YD&q@^ec5D7|`k(XPk`S8Q@tbD|i-o&dCX$1D<#Cg6Dx3 zoPyv5;6coF!3Ga&c?@RCy!yaasE85DdF_>eOs_z>`6XISuI;3Lk6;3L2{IhzFE z1bnlzS@6xZE%i}n6!;czw6?Xr&DkdSR^Z#6?SgLuKIV)Gz8&}uXNTZpwVm}{&Mv`s z0N?HG7JMi0`<(j(-v#`B=YHV3z5DR)1I`12-w)h&Y{4G@zQ@@kxD9--vsdsvwFm3_ zoPC1t1-{?eFZhGN4>$(|-v|7lb5QX8wTJ5C&bZ(QfFE)W34Rdx!_LEkKU6zhKjIuQ zQvS%74fPmCJ&qP9oC)M^@eb7F&j|il?bG$6&QZZ1ukEcr>pTm5xA#QtSp7NYIl-T- zJzsypc|q_`0iSdx(ZfyNQ@-Ur{l4i;y_E8v@jm@t%KNmR^QU&CZl#?Uk#^L37HQA= z+ZK-Fd*YVmO#6ElPWodDFD<<69rK=h-$1G7y%$jG1%JoF402z&W!*Av8P2Q7ne?WR zGj+>!PT}cA?>L^0CoQ~&v=iPm(x&~_+O5udC(otEUuu2x`&2dbk2D*#WxLX>)%;3W zZ8q$wGcyy#;@s70VB=r8VV7&6uNvjhx9jD_Mc=c_VW_H?myi&I%QfE)ua-kwstJ}B z7n>>!?4a7XQuB|X{(7;i?)p+#mPVS3z7i~$ux)#;X)C|%p(4MlCx`8_9r*0lL*vEf z>BKudW zl3kdceslV)dv1D;Wi>rrnNhYmaHbpt)wlhVwel4_Zav#o*NLjqyzwmvO%gKgzeB?0 zs*PX~IZUZF`I@y9Ryp*nhj|M*&MeCKibb+|E{QEIdgvFi6G^$5q}&^EZtfKLM+q%A zzrN(FWlq9W%zSu#(8XI}xl!@kv$iG4oqpSIgmcYnKIu4m3bWv=?Pg@;M1vG;)Z zDaU{+Gv9y$bJCs(fs;O#l3%O+o561u>A7R6Lf(7G8>gyx56aEYdWXDi-uCw(P@J4R zjd?rdDepb(?eccNXE_D$uxERFfEB$X-acULN9PA{r5KavIX)Wvq*) zT5g>l( zA-5VXpYy|Lc&SmjT5eqNJ(qGO!20I0Z$Aub7K|UQ%gtsj+UlawW}{NA`7S28E%Ig~ zi_0q7mW&|j?o55L7G=O=p})GRXI9UC*~o_Vxs{*`o?S}-P4YD;L|PJ70R@za=Jf$6Vg z?ilYHE7pRwl5#ElX7HQAZx+8<{O0hR^HS$hVg7dEPKv1smPs(nJTu!WCKRw+ zzid~^jf0_0Q6?hVe+Lr`0T1yHy4dqzUrEQJE?)+l+w)C@1Za;$%s*?-FV$+ctY=XG z$b>Amv6Sl75GxRBU}j#wM6F}%+3Qqr7>c1WU%j%Ve7j9_SCfWFBS#%2c$VNf0vo{Dyq-75Gm!;xH?N*&sY!wt2{5avyD9Ywepcs>AHDDfWMgpQ z)#hdY!U;dP7B&|zyy>gOX84MKsu^CuQh58qsp{nm0SI?wv0S-UzTyWLg6p+%t#Z|` zFF(>$^+#?{jZ^(jEG|cR*R3|Hq3gbZHiG*BtX$EsjJ#o{v){4q<@0&qC8KB-4gR%u ztmV*&xQ5j{6&xA1LhTcOh*SOuhi(QEf~OXY+a_T84$P8ssk_GPxD{D7ye<@rGE3BG zLc+U-n!!s#0}WoqV>GJQ?qY2zaFcbth@5~rXS3PbzpkGfz0tp?T%o-^l^$EV$7&YY z;~8}tKYEhS5R*BV>3*G$oVTt%7obnHvjex{cLNs^1jqV?-wKbYp-enZq*aw3)t%)SG6Q zy`2m5E0`m|v_SKgaVLE)rN>{;TummAie7bo-d8@9YljR`Ni2>)n*(YT1)W@b07AQQ zOJ+C9$mBS=wh(p-$(*hwVzC^!5EWDyE2u6YM`ev6`Log%s9F5Z&P;39dTJ)`MH!e$ z{yVFi#BMr|E*`dnTD9U|T-~CRVn#k}lbgv=@rO9SLg^tOnn!Ly#_oX3)O0aBd@*in z_Jwn~jvrtTp&P#U1>_0a4jHYnb^UG^iZT!}FlwGc;dMPqBT;%Z0t9oIx{dzaG2mQu z^+~2F4MN{-_vs=EuO)8*`L0aH7m+Ky8ZkEF&A3?qz8qp-$W^JgQ)+N+ukZ}rw6>R) zUjNW{RPI`Geumw2H|Q(%Hxx8WdOyP6atRcT5o5$`?OsR6uEKhjidx#fz?vrsrU+gn z;NlnIt4E_{x-rDTE~7L*d_b*hk|6sn8zi;BuJTvlgU`#FN|C%8axiQqCpM+6B* z*{PlZ;0OX6pqPTNH!0*H@^hsR&0QskehB zGrf85Nv7e=EeoUG74IqUX)$xRwx8*n(+J*Hc*48tRmHE)INRG#^s6(@n780fdnaM^ z?$GsmPk5GR%xAo7-Yed#D6!M4d8fTID6z|{d#`(Ef$c^Q?!$N*-kkRa%G{6V2k_kV zzR&x9Jlo!)_m=0N)v_q0&?~y&lkPV;Q7Ji+4U~rdEe)uiJkp0zm+1}a8 zQ3;+z;A#&qI2qmN`SazaTIiN56@M`d+@Mmfm6c0-&R5Zv*lBkcn~O`@bc%MlNvgLD z4z5Q3;DX|egsEH9$Ht23rB>4ORyDPf z{i^XL$nzCi-DU_q4ck4Vc88f2us3aVO8Snp&%p^n7)c{Py*Ol$QoH_W7s$MS`Q>` zCw>AwrNnd;`MbKg*J0wkL>Uk96<1N0bctq)*wttB9QJYd4%^ucfSul_cxKimm=7Mz&ik0RQRF)Yl`mELzFX1)#_nh}hvqc4ls7>eP%gt*u7Vzik6)9rQUQ=z(@5w-~%>)c&i;3}|!|vlfVJ-ZM?}yCthj zJ@=9quS`S*tZwDf*IFHH2T0D-jl8&O$B$jHoQb%zr%#@|s3y?XI(L%>J*o8p$(FF3 z@WI`TW}ivqC>hER5fh!dW;{c^)cSRl`+$a(mG3g$*A1tOzUl}{_wAgbQ6+j_Gw7e< zV{aGK4iT%CyxM2R$=-zZR&kP!2IcKX~Kr{*ADIy~5p4PE@6 zyZ+ngwHRntaki&2%9DhpY4xpGIvx;=XqH~Fz|iTN87)18vBBs}y_sFfE?Au$Z7FrJ zxw?h=H1E>zh{jH6aldYSu_T#f`Ce9tEOKL%Yn$;KP0QEumWYvJamdJ9rSE28o~+*A zl99(ai`9lnVvnNHgetuT^)Bq zxCTMO|Bg3=U5BjJzC_R@ebU0M`-Q%JQ$L2PG?~}-=Ir!qr{A3J(;IE~>fU^tRr~}% z|Gsn=SF}o_0{#AK8IIKIeF^I)Bj`}|Vzha^P+NTtgr+89x3L>oeyYYq&hx zG>?d7%u~{t@1SHb0+7!$-cmA0jUjW)$lq%{l+ZYtAK|cdRrDvghk8Gm;L2_j)CNJ* zA;Se-1O>^n3%NB@as;XQTOjxKeI)j{IeT)vpne9;X$R!b6Z;DUqXf4J#HJ_{`$>X3 z1iiAkO`bN_3VE=p*-f4ykcT9Kb@8#}>8@gRYeL9wX04>rf%rq5#+b0_%Rn$bu;+sD zwxKqQ_{39~Ua;=Kd6l3^>KIZ$DTGwQtS}y!nQt*&mypoFPopwOMOszSaHUz-flSRo zY7wbAvN#fJV5pCi({smP*2Em++v&CHwU=sA@_Y zXv>Kb-w$3`DJ>Ll4m7eW1Gfi=OR0g|r4?d>QVX!#gDZo09zrRN4X+fz#3MIHRz_Ba z5Syr?ts!Y^1on2xv);!h{`I$3hEb}7QmKXEb-6WRc0|5Q9nEL&ZN0hI_L|tgV63|B z5!qE(y46ZG>_oGl?b@|O_<6C09l1J$ODB9Cv}5Slx`g@WAqYwvYTOWUGCtyzv^3J< zU!qM>2{OvX=85cgC<<5!PAl@T4m=NZ?S`lyWU?$%S_tY4!J7mO1goDT_$t8ornM~B z5p81D{Q^tgCHO^vC@*dwHqD}9!@uE5%qnn(z)jtzn+U}MBJ>cS*u9Aub%HX&vy+zv zTdu)ZtNZoKaAA6R91fWuVp~2H%%Q!J0Si(9Q9nd5w7-Gi^*t*?ucKtqXt0=juV{@R zc+EHmqOHka_Cxct`FwXu{==R~Z0|}z!`S&zSJ1U*=9(|Ewk-=vQZE(Y8v z54d1MgjsH3g+WZWo^G3No&9-iqcyp66LW4y@7o<;e?t9LRJ7h{5x(f{I${Ol62+oU zM=&`Qy1!=Hr1U=2XE+&|ASHEd2=o&tNSF3EIaw<*Sod|IWVr#e>l6>42MUL z-h-rFFixbnYcigm?cqI6H0g1Uytfm`6;R`1;U+v-9S&YG=FJ~9uhVbc$B6t)$4pZc2wy|fTY{V>PRnJQTjYZPJkMl7oK>^;kBP4tGFY%2Zonm zP7k$L5yl9okf+M_HeIWYZoK?Sse9S!? z+prf@jlYUsi1Z%I_l?y+z>b%c#N7hc6%s5Fh_!r!n1tb$i7{5E9wlfIqyfhBYLfV8 z2|h<~h(K72(m?M(ybEmHoS48q_9PQOOVBC(Lwx)^fxP!8iA@tQ67+HJFc`D8txtOA z{SDsv65DC-vixc0&oZI3VP{3-aOg@rtv^eQmWBFr1k&x3z{ay1zAgDb&-~3B=5JJc zhnQmaNZVrj9Ak^WNFZ2u+oIQ{Q+KUS}Y7ix8O9 z#%qarjNvJp1vbH4Y*t%v?USvsA7|!I68s#2NQ$2!_A3N?2>v>ONaw#r>^*{CC%8pG znWdLDXBp?mbkw`zL&dct->wR+HFuO&i(Aam*h(#ZyZBr&Z4Hz@vIa{Z6${o_X%*%1 z9bJ{yo#G81@Njv;W8848TDi5%dFc71@iZCR3Gx1&pLQ%S?`6C!_LeeU4tfnClSIGh zSSQSKN@uk?(B9Ud71LR4>$ZanXz4gxx&VZ3o=b6RD7sY$@Ps&kgl~4ln4cZ$gH3T(kPOe>(Gu(FQV&07k`a~O#!ED95 zQQ`FL^xWy!re@!Aii8^Pa`CpKl(Pl<;aAWzMEuL~krDL|kfXjvAgfEd(mnzpslvhn z$imU690<}IWl1H!NfmYg*;#NiPg!KYYgw@0u>k>p3)>O&s<$jZaK;*y<<;R%FhRno>dUBb-I6kqC`+mc1g0pKRJU=)cc4ON z@FVYckxN7r$Nf8?l*F%bqH9mT5PoNSj#INbI3qi{O(k9HaXnC5aw_Hn_9{LV6Pt`? zWHB(H`|~;qtm%}TLnGI^-#}gJpPxGV{UtbKD ze-Cd8Q7ogizdupB-iXqe%D$9P{|r6R28@Xl&wiu-@NwD$`L6p-bU}~a?%x4jR4k2k zZO4NbPt}8$s2FzC)ZT~yIEuoPuCDtBZ24cI?8nkwmz@QBk;~LS28gY-f7*r1DsEeG zzulEi;|NwH*JPJjFwaLZ3&@)4Ul9CDf`3i$ZwNM8@my>XdMzy8k5_x%+u@CRTV>sE!@A!YjZIzV+4)M? zS-+w-RV#S2szRLV>5ll_xLU;}gleNwTjE(~?d-(ond{hWXnFw-o#K*2u#6+is@Z^9 zQ^dUoyn}Ply!DXCWqtk`1tCG|xYNK=np#hhJo$K|qP0!OAv$Nr58D$H6Bn_Q&-1uE z{jt$;s2(?(lGVajWX~6YteCe`cTzXgp@HacIw-z^P#1h8oKO&{1m(_CgABy*l<@*w z=p8BU@hsrnFx<>T!1Nhoq|8I@yTt}iE8`bA18}fSsCRRoDOCFDg+Vo?e~~gonJ1+M zgZh_opM=dbjKjDHhT_;^v*DH1^7wF+<^YG$XZ7z0o+sD=fbcd|ZXo`aQ%GJBz2s~b zgAY2|#UXn}Xkqn5c*`ldv>Dv?4$-iC<0_6mx)mB;s#+F38*OsqgDq6~s3d^BEmB!p zpJW%LGhbsrEOw)d&l6GoAzA!>6k+UAM>%0dVuNV3m^Dl3?7cj~0!6d6ryma{V!R!k z<&IxTWI4jLJeAVXygjNWjW%=m%5*;pWW_*0e2W|%MMQ~5%P|=^5DSdc3ycR=?jT-p z9lx>Y&uU_eDLsl>)NKL|JQ|F-)8#3TI1u`EW>H<#*N_ADHxKd2DO%WAyP*g5ei=;; z{Luu-euR+Xf&QfEu0Z`RTIv}xH7mJXhI{}BhShJVxI@9At{Z3>uXO@zdWOG&w7YGU z%tqG^jB1F-7+qQp`#G)>N_9q+|ERUU|CqYor9~y&B^J{po03@ri|3((x41`kJ%IE`!kkxyJ3X1s^ ze0x4=JWbMR@PNc}THjWIi}FC?qS%RbwkMI&dlT#I!NfY-r|+!bP~m=Wr?(4|djJ@& zCju*Z_d|vsP%CJv%m9^0?seDPw9tm*&@Gg0eW3(5-`av%p@M-Ji>V)9t1gE#_Zy7y^p^llg!IUU5a___6LQzzJ6G39Fa}BXL&6|&J&6q-?cwNaRpZs6DPBy z@2)*GZfkYU*C5}$r3zHHjjJR2Dva#;!KI9^Ct`FGPVGhtV(AMxN#SON(fZLd2?gQ>;Noh^gzm*9afCv( zgj<_p`(R&`mNqYU!Qv6tBa^7+jX;QmtUDJ6Q#{6XE_m+;iDNk%-U)0iv4!_ zGoc$$)HXfj&m$pGzl=-8J{5?LNq`zg_yi<|Z3U|;y#nhh%q`?$SM3Z7w~IIfgMGeg z3f5P8VE~GI+XbAj!C9I#_Qz?T84H6enLF0aTsVY~OOBQnqTAU89M``7KsYQlk6@}d zc|3n=@%$;KF;nKyC@tDC5{6B>*U;fEMo*^MtJfy51BUbJmuwNF$#mYR@|u@q+1N1F z)61#FMK9b3YhUr&V4{;6l13=mK4HS=u$R}xXLw+gEZ*;g%;inAaxV{c-`c#Cv??qr zTm6R)A(V9J5C$Rkye$8tFbvCe5t8c!E+)KfmUe2B;DAU5ea(-yMRkeQ;)r##f-_|z1nWs%5?`a+(h-=@5lMFI2W8syTu7g1X3tHZo!e+~ z`fwfY3xaIjgwe9N3_U~QqDS2omupR^QR!B@`w+3%!gC7Pt&}^zI=YLk0b1T2GhO|A zK8l4E68nb)y9j=Z;64KSmd>Uw*9~q$RRzwNY{}6$aBsLcKhQvk)@@)wI1dT)SJ6OH zdkI7oW%bz!>=200Fv*Os5&RCp=Kvz378y$YET223m&hPi<6xl%M2f?_AjM-6+;F$D z2tkXjEYBZ}=Els8C6iv3>L9A1sb}>PsQ@ z0dk@K`cdPATxtJ*PmMi)9BQ!e7eEd5KY(mZ3w`{g%g;E8qU*e?G!l=)5|bmjdYf79 zsZqC>t$#k{;lGP$=#x^AYg7PYSy8x%68Pgud*8l-8{<+Rw25#UV*c2@kcca8C+lcR zauGRZJhYqe9_5zy^C?Q@e-AiFB@*8Thm;bT-|*iF?Rnfsz1p^aDUN4xa*O^^+hEYt z>0PT)t}TMT9CO=HuIu_@m!;4y*KykVQdit!P2DT{9-yZ0Z*=I3E7;#NN&ml4RQ)07 zseX^3myqf+Nc$-eF~B!9l51_>z#5nU5&M!&{ZG6IHvG$H#T##PVm-dG4s+rEp8XP9 zX>T2-Mtlwa6PT-q5jSQsoIm(|(qki{l#%hXT)F=X$i^#I_lQB=#Dj|QKM;cGbXur! zI(0&fQ~Ig@Lhwzd4sICU{TA~jvP<(=t2vR!B8I-rG)|x1Z0*deV4~6Jo=)Q0);u#COJ} zxZ6%T#H5D_4g*939r+c=MH)Haq3w%DSc>sJHA(Oo!Q%i?MxU8~0=SI4?YhtaRZp_i zrwAmP^bE_4zFZDE;;Vh{#TlH6Hzs)!Qg2z8^ll^mQM`lasy7b0A(*g0!_jpU1B3)uPA>^-@|?0K+l7B0jykUpk#Ko r?l-_bKDTSzAA#Dgr!}}anl8@pR9ET;Qa@lFDj7SCp`D{!$6ok9SU-_w delta 7474 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 G4*U MappedColumn[Any]: r"""declare a new ORM-mapped :class:`_schema.Column` construct diff --git a/venv/Lib/site-packages/sqlalchemy/orm/_typing.py b/venv/Lib/site-packages/sqlalchemy/orm/_typing.py index cc4233b..3085351 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/_typing.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/_typing.py @@ -93,6 +93,7 @@ class _OrmKnownExecutionOptions(_CoreKnownExecutionOptions, total=False): dml_strategy: DMLStrategyArgument is_delete_using: bool is_update_from: bool + render_nulls: bool OrmExecuteOptionsParameter = Union[ @@ -119,7 +120,7 @@ class _LoaderCallable(Protocol): def is_orm_option( opt: ExecutableOption, ) -> TypeGuard[ORMOption]: - return not opt._is_core # type: ignore + return not opt._is_core def is_user_defined_option( diff --git a/venv/Lib/site-packages/sqlalchemy/orm/attributes.py b/venv/Lib/site-packages/sqlalchemy/orm/attributes.py index 6a9766c..1098359 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/attributes.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/attributes.py @@ -120,6 +120,7 @@ if TYPE_CHECKING: _T = TypeVar("_T") +_T_co = TypeVar("_T_co", bound=Any, covariant=True) _AllPendingType = Sequence[ @@ -132,10 +133,10 @@ _UNKNOWN_ATTR_KEY = object() @inspection._self_inspects class QueryableAttribute( - _DeclarativeMapped[_T], - SQLORMExpression[_T], + _DeclarativeMapped[_T_co], + SQLORMExpression[_T_co], interfaces.InspectionAttr, - interfaces.PropComparator[_T], + interfaces.PropComparator[_T_co], roles.JoinTargetRole, roles.OnClauseRole, sql_base.Immutable, @@ -178,13 +179,13 @@ class QueryableAttribute( is_attribute = True - dispatch: dispatcher[QueryableAttribute[_T]] + dispatch: dispatcher[QueryableAttribute[_T_co]] class_: _ExternalEntityType[Any] key: str parententity: _InternalEntityType[Any] impl: AttributeImpl - comparator: interfaces.PropComparator[_T] + comparator: interfaces.PropComparator[_T_co] _of_type: Optional[_InternalEntityType[Any]] _extra_criteria: Tuple[ColumnElement[bool], ...] _doc: Optional[str] @@ -198,7 +199,7 @@ class QueryableAttribute( class_: _ExternalEntityType[_O], key: str, parententity: _InternalEntityType[_O], - comparator: interfaces.PropComparator[_T], + comparator: interfaces.PropComparator[_T_co], impl: Optional[AttributeImpl] = None, of_type: Optional[_InternalEntityType[Any]] = None, extra_criteria: Tuple[ColumnElement[bool], ...] = (), @@ -314,7 +315,7 @@ class QueryableAttribute( """ - expression: ColumnElement[_T] + expression: ColumnElement[_T_co] """The SQL expression object represented by this :class:`.QueryableAttribute`. @@ -334,7 +335,7 @@ class QueryableAttribute( entity_namespace = self._entity_namespace assert isinstance(entity_namespace, HasCacheKey) - if self.key is _UNKNOWN_ATTR_KEY: # type: ignore[comparison-overlap] + if self.key is _UNKNOWN_ATTR_KEY: annotations = {"entity_namespace": entity_namespace} else: annotations = { @@ -376,7 +377,7 @@ class QueryableAttribute( def _annotations(self) -> _AnnotationDict: return self.__clause_element__()._annotations - def __clause_element__(self) -> ColumnElement[_T]: + def __clause_element__(self) -> ColumnElement[_T_co]: return self.expression @property @@ -443,18 +444,18 @@ class QueryableAttribute( extra_criteria=self._extra_criteria, ) - def label(self, name: Optional[str]) -> Label[_T]: + def label(self, name: Optional[str]) -> Label[_T_co]: return self.__clause_element__().label(name) def operate( self, op: OperatorType, *other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(self.comparator, *other, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(self.comparator, *other, **kwargs) # type: ignore[no-any-return] # noqa: E501 def reverse_operate( self, op: OperatorType, other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(other, self.comparator, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(other, self.comparator, **kwargs) # type: ignore[no-any-return] # noqa: E501 def hasparent( self, state: InstanceState[Any], optimistic: bool = False @@ -520,16 +521,16 @@ class InstrumentedAttribute(QueryableAttribute[_T]): # InstrumentedAttribute, while still keeping classlevel # __doc__ correct - @util.rw_hybridproperty # type: ignore - def __doc__(self) -> Optional[str]: # type: ignore + @util.rw_hybridproperty + def __doc__(self) -> Optional[str]: return self._doc @__doc__.setter # type: ignore - def __doc__(self, value: Optional[str]) -> None: # type: ignore + def __doc__(self, value: Optional[str]) -> None: self._doc = value @__doc__.classlevel # type: ignore - def __doc__(cls) -> Optional[str]: # type: ignore + def __doc__(cls) -> Optional[str]: return super().__doc__ def __set__(self, instance: object, value: Any) -> None: @@ -790,7 +791,7 @@ class AttributeEventToken: __slots__ = "impl", "op", "parent_token" - def __init__(self, attribute_impl, op): + def __init__(self, attribute_impl: AttributeImpl, op: util.symbol): self.impl = attribute_impl self.op = op self.parent_token = self.impl.parent_token @@ -833,7 +834,7 @@ class AttributeImpl: self, class_: _ExternalEntityType[_O], key: str, - callable_: _LoaderCallable, + callable_: Optional[_LoaderCallable], dispatch: _Dispatch[QueryableAttribute[Any]], trackparent: bool = False, compare_function: Optional[Callable[..., bool]] = None, @@ -1940,7 +1941,7 @@ class CollectionAttributeImpl(HasCollectionAdapter, AttributeImpl): and "None" or iterable.__class__.__name__ ) - wanted = self._duck_typed_as.__name__ # type: ignore + wanted = self._duck_typed_as.__name__ raise TypeError( "Incompatible collection type: %s is not %s-like" % (given, wanted) @@ -2617,7 +2618,7 @@ def register_attribute_impl( # TODO: this appears to be the WriteOnlyAttributeImpl / # DynamicAttributeImpl constructor which is hardcoded impl = cast("Type[WriteOnlyAttributeImpl]", impl_class)( - class_, key, typecallable, dispatch, **kw + class_, key, dispatch, **kw ) elif uselist: impl = CollectionAttributeImpl( diff --git a/venv/Lib/site-packages/sqlalchemy/orm/base.py b/venv/Lib/site-packages/sqlalchemy/orm/base.py index ecb1059..362346c 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/base.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/base.py @@ -56,6 +56,7 @@ if typing.TYPE_CHECKING: from ..sql.operators import OperatorType _T = TypeVar("_T", bound=Any) +_T_co = TypeVar("_T_co", bound=Any, covariant=True) _O = TypeVar("_O", bound=object) @@ -678,12 +679,12 @@ class InspectionAttrInfo(InspectionAttr): return {} -class SQLORMOperations(SQLCoreOperations[_T], TypingOnly): +class SQLORMOperations(SQLCoreOperations[_T_co], TypingOnly): __slots__ = () if typing.TYPE_CHECKING: - def of_type(self, class_: _EntityType[Any]) -> PropComparator[_T]: + def of_type(self, class_: _EntityType[Any]) -> PropComparator[_T_co]: ... def and_( @@ -706,7 +707,7 @@ class SQLORMOperations(SQLCoreOperations[_T], TypingOnly): ... -class ORMDescriptor(Generic[_T], TypingOnly): +class ORMDescriptor(Generic[_T_co], TypingOnly): """Represent any Python descriptor that provides a SQL expression construct at the class level.""" @@ -717,26 +718,26 @@ class ORMDescriptor(Generic[_T], TypingOnly): @overload def __get__( self, instance: Any, owner: Literal[None] - ) -> ORMDescriptor[_T]: + ) -> ORMDescriptor[_T_co]: ... @overload def __get__( self, instance: Literal[None], owner: Any - ) -> SQLCoreOperations[_T]: + ) -> SQLCoreOperations[_T_co]: ... @overload - def __get__(self, instance: object, owner: Any) -> _T: + def __get__(self, instance: object, owner: Any) -> _T_co: ... def __get__( self, instance: object, owner: Any - ) -> Union[ORMDescriptor[_T], SQLCoreOperations[_T], _T]: + ) -> Union[ORMDescriptor[_T_co], SQLCoreOperations[_T_co], _T_co]: ... -class _MappedAnnotationBase(Generic[_T], TypingOnly): +class _MappedAnnotationBase(Generic[_T_co], TypingOnly): """common class for Mapped and similar ORM container classes. these are classes that can appear on the left side of an ORM declarative @@ -749,7 +750,7 @@ class _MappedAnnotationBase(Generic[_T], TypingOnly): class SQLORMExpression( - SQLORMOperations[_T], SQLColumnExpression[_T], TypingOnly + SQLORMOperations[_T_co], SQLColumnExpression[_T_co], TypingOnly ): """A type that may be used to indicate any ORM-level attribute or object that acts in place of one, in the context of SQL expression @@ -771,9 +772,9 @@ class SQLORMExpression( class Mapped( - SQLORMExpression[_T], - ORMDescriptor[_T], - _MappedAnnotationBase[_T], + SQLORMExpression[_T_co], + ORMDescriptor[_T_co], + _MappedAnnotationBase[_T_co], roles.DDLConstraintColumnRole, ): """Represent an ORM mapped attribute on a mapped class. @@ -819,24 +820,24 @@ class Mapped( @overload def __get__( self, instance: None, owner: Any - ) -> InstrumentedAttribute[_T]: + ) -> InstrumentedAttribute[_T_co]: ... @overload - def __get__(self, instance: object, owner: Any) -> _T: + def __get__(self, instance: object, owner: Any) -> _T_co: ... def __get__( self, instance: Optional[object], owner: Any - ) -> Union[InstrumentedAttribute[_T], _T]: + ) -> Union[InstrumentedAttribute[_T_co], _T_co]: ... @classmethod - def _empty_constructor(cls, arg1: Any) -> Mapped[_T]: + def _empty_constructor(cls, arg1: Any) -> Mapped[_T_co]: ... def __set__( - self, instance: Any, value: Union[SQLCoreOperations[_T], _T] + self, instance: Any, value: Union[SQLCoreOperations[_T_co], _T_co] ) -> None: ... @@ -844,7 +845,7 @@ class Mapped( ... -class _MappedAttribute(Generic[_T], TypingOnly): +class _MappedAttribute(Generic[_T_co], TypingOnly): """Mixin for attributes which should be replaced by mapper-assigned attributes. @@ -853,7 +854,7 @@ class _MappedAttribute(Generic[_T], TypingOnly): __slots__ = () -class _DeclarativeMapped(Mapped[_T], _MappedAttribute[_T]): +class _DeclarativeMapped(Mapped[_T_co], _MappedAttribute[_T_co]): """Mixin for :class:`.MapperProperty` subclasses that allows them to be compatible with ORM-annotated declarative mappings. @@ -878,7 +879,7 @@ class _DeclarativeMapped(Mapped[_T], _MappedAttribute[_T]): return NotImplemented -class DynamicMapped(_MappedAnnotationBase[_T]): +class DynamicMapped(_MappedAnnotationBase[_T_co]): """Represent the ORM mapped attribute type for a "dynamic" relationship. The :class:`_orm.DynamicMapped` type annotation may be used in an @@ -918,23 +919,27 @@ class DynamicMapped(_MappedAnnotationBase[_T]): @overload def __get__( self, instance: None, owner: Any - ) -> InstrumentedAttribute[_T]: + ) -> InstrumentedAttribute[_T_co]: ... @overload - def __get__(self, instance: object, owner: Any) -> AppenderQuery[_T]: + def __get__( + self, instance: object, owner: Any + ) -> AppenderQuery[_T_co]: ... def __get__( self, instance: Optional[object], owner: Any - ) -> Union[InstrumentedAttribute[_T], AppenderQuery[_T]]: + ) -> Union[InstrumentedAttribute[_T_co], AppenderQuery[_T_co]]: ... - def __set__(self, instance: Any, value: typing.Collection[_T]) -> None: + def __set__( + self, instance: Any, value: typing.Collection[_T_co] + ) -> None: ... -class WriteOnlyMapped(_MappedAnnotationBase[_T]): +class WriteOnlyMapped(_MappedAnnotationBase[_T_co]): """Represent the ORM mapped attribute type for a "write only" relationship. The :class:`_orm.WriteOnlyMapped` type annotation may be used in an @@ -970,19 +975,21 @@ class WriteOnlyMapped(_MappedAnnotationBase[_T]): @overload def __get__( self, instance: None, owner: Any - ) -> InstrumentedAttribute[_T]: + ) -> InstrumentedAttribute[_T_co]: ... @overload def __get__( self, instance: object, owner: Any - ) -> WriteOnlyCollection[_T]: + ) -> WriteOnlyCollection[_T_co]: ... def __get__( self, instance: Optional[object], owner: Any - ) -> Union[InstrumentedAttribute[_T], WriteOnlyCollection[_T]]: + ) -> Union[InstrumentedAttribute[_T_co], WriteOnlyCollection[_T_co]]: ... - def __set__(self, instance: Any, value: typing.Collection[_T]) -> None: + def __set__( + self, instance: Any, value: typing.Collection[_T_co] + ) -> None: ... diff --git a/venv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py b/venv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py index 6b35c4a..31caedc 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py @@ -1158,7 +1158,7 @@ class BulkORMInsert(ORMDMLState, InsertDMLState): execution_options, ) = BulkORMInsert.default_insert_options.from_execution_options( "_sa_orm_insert_options", - {"dml_strategy", "autoflush", "populate_existing"}, + {"dml_strategy", "autoflush", "populate_existing", "render_nulls"}, execution_options, statement._execution_options, ) @@ -1438,7 +1438,6 @@ class BulkORMUpdate(BulkUDCompileState, UpdateDMLState): self._resolved_values = dict(self._resolved_values) new_stmt = statement._clone() - new_stmt.table = mapper.local_table # note if the statement has _multi_values, these # are passed through to the new statement, which will then raise @@ -1499,9 +1498,7 @@ class BulkORMUpdate(BulkUDCompileState, UpdateDMLState): # over and over again. so perhaps if it could be RETURNING just # the elements that were based on a SQL expression and not # a constant. For now it doesn't quite seem worth it - new_stmt = new_stmt.return_defaults( - *(list(mapper.local_table.primary_key)) - ) + new_stmt = new_stmt.return_defaults(*new_stmt.table.primary_key) if toplevel: new_stmt = self._setup_orm_returning( @@ -1860,7 +1857,6 @@ class BulkORMDelete(BulkUDCompileState, DeleteDMLState): ) new_stmt = statement._clone() - new_stmt.table = mapper.local_table new_crit = cls._adjust_for_extra_criteria( self.global_attributes, mapper diff --git a/venv/Lib/site-packages/sqlalchemy/orm/decl_api.py b/venv/Lib/site-packages/sqlalchemy/orm/decl_api.py index e6b67b3..80c85f1 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/decl_api.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/decl_api.py @@ -253,7 +253,7 @@ class _declared_attr_common: # which seems to help typing tools interpret the fn as a classmethod # for situations where needed if isinstance(fn, classmethod): - fn = fn.__func__ # type: ignore + fn = fn.__func__ self.fget = fn self._cascading = cascading @@ -281,11 +281,11 @@ class _declared_attr_common: "Unmanaged access of declarative attribute %s from " "non-mapped class %s" % (self.fget.__name__, cls.__name__) ) - return self.fget(cls) # type: ignore + return self.fget(cls) elif manager.is_mapped: # the class is mapped, which means we're outside of the declarative # scan setup, just run the function. - return self.fget(cls) # type: ignore + return self.fget(cls) # here, we are inside of the declarative scan. use the registry # that is tracking the values of these attributes. @@ -297,10 +297,10 @@ class _declared_attr_common: reg = declarative_scan.declared_attr_reg if self in reg: - return reg[self] # type: ignore + return reg[self] else: reg[self] = obj = self.fget(cls) - return obj # type: ignore + return obj class _declared_directive(_declared_attr_common, Generic[_T]): @@ -558,12 +558,12 @@ def _setup_declarative_base(cls: Type[Any]) -> None: reg = registry( metadata=metadata, type_annotation_map=type_annotation_map ) - cls.registry = reg # type: ignore + cls.registry = reg - cls._sa_registry = reg # type: ignore + cls._sa_registry = reg if "metadata" not in cls.__dict__: - cls.metadata = cls.registry.metadata # type: ignore + cls.metadata = cls.registry.metadata if getattr(cls, "__init__", object.__init__) is object.__init__: cls.__init__ = cls.registry.constructor @@ -609,7 +609,7 @@ class MappedAsDataclass(metaclass=DCTransformDeclarative): current_transforms: _DataclassArguments if hasattr(cls, "_sa_apply_dc_transforms"): - current = cls._sa_apply_dc_transforms # type: ignore[attr-defined] + current = cls._sa_apply_dc_transforms _ClassScanMapperConfig._assert_dc_arguments(current) @@ -1274,7 +1274,7 @@ class registry: sql_type = sqltypes._type_map_get(pt) # type: ignore # noqa: E501 if sql_type is not None: - sql_type_inst = sqltypes.to_instance(sql_type) # type: ignore + sql_type_inst = sqltypes.to_instance(sql_type) # ... this additional step will reject most # type -> supertype matches, such as if we had @@ -1556,7 +1556,7 @@ class registry: if hasattr(cls, "__class_getitem__"): - def __class_getitem__(cls: Type[_T], key: str) -> Type[_T]: + def __class_getitem__(cls: Type[_T], key: Any) -> Type[_T]: # allow generic classes in py3.9+ return cls diff --git a/venv/Lib/site-packages/sqlalchemy/orm/decl_base.py b/venv/Lib/site-packages/sqlalchemy/orm/decl_base.py index 816c7a8..d5ef3db 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/decl_base.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/decl_base.py @@ -1434,9 +1434,9 @@ class _ClassScanMapperConfig(_MapperConfig): cls, "_sa_decl_prepare_nocascade", strict=True ) + allow_unmapped_annotations = self.allow_unmapped_annotations expect_annotations_wo_mapped = ( - self.allow_unmapped_annotations - or self.is_dataclass_prior_to_mapping + allow_unmapped_annotations or self.is_dataclass_prior_to_mapping ) look_for_dataclass_things = bool(self.dataclass_setup_arguments) @@ -1531,7 +1531,15 @@ class _ClassScanMapperConfig(_MapperConfig): # Mapped[] etc. were not used. If annotation is None, # do declarative_scan so that the property can raise # for required - if mapped_container is not None or annotation is None: + if ( + mapped_container is not None + or annotation is None + # issue #10516: need to do declarative_scan even with + # a non-Mapped annotation if we are doing + # __allow_unmapped__, for things like col.name + # assignment + or allow_unmapped_annotations + ): try: value.declarative_scan( self, @@ -1609,7 +1617,7 @@ class _ClassScanMapperConfig(_MapperConfig): setattr(cls, k, value) continue - our_stuff[k] = value # type: ignore + our_stuff[k] = value def _extract_declared_columns(self) -> None: our_stuff = self.properties @@ -1979,7 +1987,7 @@ class _DeferredMapperConfig(_ClassScanMapperConfig): # mypy disallows plain property override of variable @property # type: ignore - def cls(self) -> Type[Any]: # type: ignore + def cls(self) -> Type[Any]: return self._cls() # type: ignore @cls.setter @@ -1999,7 +2007,7 @@ class _DeferredMapperConfig(_ClassScanMapperConfig): @classmethod def raise_unmapped_for_cls(cls, class_: Type[Any]) -> NoReturn: if hasattr(class_, "_sa_raise_deferred_config"): - class_._sa_raise_deferred_config() # type: ignore + class_._sa_raise_deferred_config() raise orm_exc.UnmappedClassError( class_, diff --git a/venv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py b/venv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py index e7c9de2..c1fe9de 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py @@ -425,7 +425,7 @@ class CompositeProperty( elif hasattr(self.composite_class, "__composite_values__"): _composite_getters[ self.composite_class - ] = lambda obj: obj.__composite_values__() # type: ignore + ] = lambda obj: obj.__composite_values__() @util.preload_module("sqlalchemy.orm.properties") @util.preload_module("sqlalchemy.orm.decl_base") @@ -628,7 +628,7 @@ class CompositeProperty( proxy_attr = self.parent.class_manager[self.key] proxy_attr.impl.dispatch = proxy_attr.dispatch # type: ignore - proxy_attr.impl.dispatch._active_history = self.active_history # type: ignore # noqa: E501 + proxy_attr.impl.dispatch._active_history = self.active_history # TODO: need a deserialize hook here @@ -806,16 +806,16 @@ class CompositeProperty( def __ne__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 return self._compare(operators.ne, other) - def __lt__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 + def __lt__(self, other: Any) -> ColumnElement[bool]: return self._compare(operators.lt, other) - def __gt__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 + def __gt__(self, other: Any) -> ColumnElement[bool]: return self._compare(operators.gt, other) - def __le__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 + def __le__(self, other: Any) -> ColumnElement[bool]: return self._compare(operators.le, other) - def __ge__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 + def __ge__(self, other: Any) -> ColumnElement[bool]: return self._compare(operators.ge, other) # what might be interesting would be if we create @@ -839,8 +839,8 @@ class CompositeProperty( ] if self._adapt_to_entity: assert self.adapter is not None - comparisons = [self.adapter(x) for x in comparisons] # type: ignore # noqa: E501 - return sql.and_(*comparisons) # type: ignore + comparisons = [self.adapter(x) for x in comparisons] + return sql.and_(*comparisons) def __str__(self) -> str: return str(self.parent.class_.__name__) + "." + self.key diff --git a/venv/Lib/site-packages/sqlalchemy/orm/dynamic.py b/venv/Lib/site-packages/sqlalchemy/orm/dynamic.py index 7514d86..1d0c036 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/dynamic.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/dynamic.py @@ -4,7 +4,6 @@ # # This module is part of SQLAlchemy and is released under # the MIT License: https://www.opensource.org/licenses/mit-license.php -# mypy: ignore-errors """Dynamic collection API. @@ -23,13 +22,19 @@ from __future__ import annotations from typing import Any from typing import Iterable from typing import Iterator +from typing import List +from typing import Optional +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union from . import attributes from . import exc as orm_exc from . import relationships from . import util as orm_util +from .base import PassiveFlag from .query import Query from .session import object_session from .writeonly import AbstractCollectionWriter @@ -39,15 +44,28 @@ from .writeonly import WriteOnlyLoader from .. import util from ..engine import result -if TYPE_CHECKING: - from .session import Session +if TYPE_CHECKING: + from . import QueryableAttribute + from .mapper import Mapper + from .relationships import _RelationshipOrderByArg + from .session import Session + from .state import InstanceState + from .util import AliasedClass + from ..event import _Dispatch + from ..sql.elements import ColumnElement _T = TypeVar("_T", bound=Any) -class DynamicCollectionHistory(WriteOnlyHistory): - def __init__(self, attr, state, passive, apply_to=None): +class DynamicCollectionHistory(WriteOnlyHistory[_T]): + def __init__( + self, + attr: DynamicAttributeImpl, + state: InstanceState[_T], + passive: PassiveFlag, + apply_to: Optional[DynamicCollectionHistory[_T]] = None, + ) -> None: if apply_to: coll = AppenderQuery(attr, state).autoflush(False) self.unchanged_items = util.OrderedIdentitySet(coll) @@ -63,21 +81,21 @@ class DynamicCollectionHistory(WriteOnlyHistory): class DynamicAttributeImpl(WriteOnlyAttributeImpl): _supports_dynamic_iteration = True - collection_history_cls = DynamicCollectionHistory + collection_history_cls = DynamicCollectionHistory[Any] + query_class: Type[AppenderMixin[Any]] # type: ignore[assignment] def __init__( self, - class_, - key, - typecallable, - dispatch, - target_mapper, - order_by, - query_class=None, - **kw, - ): + class_: Union[Type[Any], AliasedClass[Any]], + key: str, + dispatch: _Dispatch[QueryableAttribute[Any]], + target_mapper: Mapper[_T], + order_by: _RelationshipOrderByArg, + query_class: Optional[Type[AppenderMixin[_T]]] = None, + **kw: Any, + ) -> None: attributes.AttributeImpl.__init__( - self, class_, key, typecallable, dispatch, **kw + self, class_, key, None, dispatch, **kw ) self.target_mapper = target_mapper if order_by: @@ -102,21 +120,23 @@ class AppenderMixin(AbstractCollectionWriter[_T]): """ - query_class = None + query_class: Optional[Type[Query[_T]]] = None + _order_by_clauses: Tuple[ColumnElement[Any], ...] - def __init__(self, attr, state): - Query.__init__(self, attr.target_mapper, None) + def __init__( + self, attr: DynamicAttributeImpl, state: InstanceState[_T] + ) -> None: + Query.__init__( + self, # type: ignore[arg-type] + attr.target_mapper, + None, + ) super().__init__(attr, state) @property - def session(self) -> Session: + def session(self) -> Optional[Session]: sess = object_session(self.instance) - if ( - sess is not None - and self.autoflush - and sess.autoflush - and self.instance in sess - ): + if sess is not None and sess.autoflush and self.instance in sess: sess.flush() if not orm_util.has_identity(self.instance): return None @@ -127,7 +147,7 @@ class AppenderMixin(AbstractCollectionWriter[_T]): def session(self, session: Session) -> None: self.sess = session - def _iter(self): + def _iter(self) -> Union[result.ScalarResult[_T], result.Result[_T]]: sess = self.session if sess is None: state = attributes.instance_state(self.instance) @@ -141,9 +161,9 @@ class AppenderMixin(AbstractCollectionWriter[_T]): return result.IteratorResult( result.SimpleResultMetaData([self.attr.class_.__name__]), - self.attr._get_collection_history( + self.attr._get_collection_history( # type: ignore[arg-type] attributes.instance_state(self.instance), - attributes.PASSIVE_NO_INITIALIZE, + PassiveFlag.PASSIVE_NO_INITIALIZE, ).added_items, _source_supports_scalars=True, ).scalars() @@ -155,15 +175,15 @@ class AppenderMixin(AbstractCollectionWriter[_T]): def __iter__(self) -> Iterator[_T]: ... - def __getitem__(self, index: Any) -> _T: + def __getitem__(self, index: Any) -> Union[_T, List[_T]]: sess = self.session if sess is None: return self.attr._get_collection_history( attributes.instance_state(self.instance), - attributes.PASSIVE_NO_INITIALIZE, + PassiveFlag.PASSIVE_NO_INITIALIZE, ).indexed(index) else: - return self._generate(sess).__getitem__(index) + return self._generate(sess).__getitem__(index) # type: ignore[no-any-return] # noqa: E501 def count(self) -> int: sess = self.session @@ -171,13 +191,16 @@ class AppenderMixin(AbstractCollectionWriter[_T]): return len( self.attr._get_collection_history( attributes.instance_state(self.instance), - attributes.PASSIVE_NO_INITIALIZE, + PassiveFlag.PASSIVE_NO_INITIALIZE, ).added_items ) else: return self._generate(sess).count() - def _generate(self, sess=None): + def _generate( + self, + sess: Optional[Session] = None, + ) -> Query[_T]: # note we're returning an entirely new Query class instance # here without any assignment capabilities; the class of this # query is determined by the session. @@ -259,7 +282,7 @@ class AppenderMixin(AbstractCollectionWriter[_T]): self._remove_impl(item) -class AppenderQuery(AppenderMixin[_T], Query[_T]): +class AppenderQuery(AppenderMixin[_T], Query[_T]): # type: ignore[misc] """A dynamic query that supports basic collection storage operations. Methods on :class:`.AppenderQuery` include all methods of @@ -270,7 +293,7 @@ class AppenderQuery(AppenderMixin[_T], Query[_T]): """ -def mixin_user_query(cls): +def mixin_user_query(cls: Any) -> type[AppenderMixin[Any]]: """Return a new class with AppenderQuery functionality layered over.""" name = "Appender" + cls.__name__ return type(name, (AppenderMixin, cls), {"query_class": cls}) diff --git a/venv/Lib/site-packages/sqlalchemy/orm/instrumentation.py b/venv/Lib/site-packages/sqlalchemy/orm/instrumentation.py index 1b755a2..b12d80a 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/instrumentation.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/instrumentation.py @@ -138,7 +138,7 @@ class ClassManager( def deferred_scalar_loader(self): return self.expired_attribute_loader - @deferred_scalar_loader.setter # type: ignore[no-redef] + @deferred_scalar_loader.setter @util.deprecated( "1.4", message="The ClassManager.deferred_scalar_loader attribute is now " @@ -204,7 +204,7 @@ class ClassManager( init_method: Optional[Callable[..., None]] = None, ) -> None: if mapper: - self.mapper = mapper # type: ignore[assignment] + self.mapper = mapper # if registry: registry._add_manager(self) if declarative_scan: @@ -428,7 +428,7 @@ class ClassManager( for key in list(self.originals): self.uninstall_member(key) - self.mapper = None # type: ignore + self.mapper = None self.dispatch = None # type: ignore self.new_init = None self.info.clear() @@ -506,11 +506,11 @@ class ClassManager( # so that mypy sees that __new__ is present. currently # it's bound to Any as there were other problems not having # it that way but these can be revisited - instance = self.class_.__new__(self.class_) # type: ignore + instance = self.class_.__new__(self.class_) if state is None: state = self._state_constructor(instance, self) self._state_setter(instance, state) - return instance # type: ignore[no-any-return] + return instance def setup_instance( self, instance: _O, state: Optional[InstanceState[_O]] = None diff --git a/venv/Lib/site-packages/sqlalchemy/orm/interfaces.py b/venv/Lib/site-packages/sqlalchemy/orm/interfaces.py index 88cafcb..a118b2a 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/interfaces.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/interfaces.py @@ -107,6 +107,7 @@ if typing.TYPE_CHECKING: _StrategyKey = Tuple[Any, ...] _T = TypeVar("_T", bound=Any) +_T_co = TypeVar("_T_co", bound=Any, covariant=True) _TLS = TypeVar("_TLS", bound="Type[LoaderStrategy]") @@ -653,7 +654,7 @@ class MapperProperty( @inspection._self_inspects -class PropComparator(SQLORMOperations[_T], Generic[_T], ColumnOperators): +class PropComparator(SQLORMOperations[_T_co], Generic[_T_co], ColumnOperators): r"""Defines SQL operations for ORM mapped attributes. SQLAlchemy allows for operators to @@ -740,7 +741,7 @@ class PropComparator(SQLORMOperations[_T], Generic[_T], ColumnOperators): _parententity: _InternalEntityType[Any] _adapt_to_entity: Optional[AliasedInsp[Any]] - prop: RODescriptorReference[MapperProperty[_T]] + prop: RODescriptorReference[MapperProperty[_T_co]] def __init__( self, @@ -922,9 +923,7 @@ class PropComparator(SQLORMOperations[_T], Generic[_T], ColumnOperators): """ - return self.operate( # type: ignore - PropComparator.any_op, criterion, **kwargs - ) + return self.operate(PropComparator.any_op, criterion, **kwargs) def has( self, @@ -946,9 +945,7 @@ class PropComparator(SQLORMOperations[_T], Generic[_T], ColumnOperators): """ - return self.operate( # type: ignore - PropComparator.has_op, criterion, **kwargs - ) + return self.operate(PropComparator.has_op, criterion, **kwargs) class StrategizedProperty(MapperProperty[_T]): diff --git a/venv/Lib/site-packages/sqlalchemy/orm/loading.py b/venv/Lib/site-packages/sqlalchemy/orm/loading.py index e7a0d3e..cae6f0b 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/loading.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/loading.py @@ -137,40 +137,64 @@ def instances(cursor: CursorResult[Any], context: QueryContext) -> Result[Any]: "Can't use the ORM yield_per feature in conjunction with unique()" ) - def _not_hashable(datatype): - def go(obj): - raise sa_exc.InvalidRequestError( - "Can't apply uniqueness to row tuple containing value of " - "type %r; this datatype produces non-hashable values" - % datatype - ) + def _not_hashable(datatype, *, legacy=False, uncertain=False): + if not legacy: - return go + def go(obj): + if uncertain: + try: + return hash(obj) + except: + pass - if context.load_options._legacy_uniquing: - unique_filters = [ - _no_unique - if context.yield_per - else id - if ( - ent.use_id_for_hash - or ent._non_hashable_value - or ent._null_column_type - ) - else None - for ent in context.compile_state._entities - ] - else: - unique_filters = [ - _no_unique - if context.yield_per - else _not_hashable(ent.column.type) # type: ignore - if (not ent.use_id_for_hash and ent._non_hashable_value) - else id - if ent.use_id_for_hash - else None - for ent in context.compile_state._entities - ] + raise sa_exc.InvalidRequestError( + "Can't apply uniqueness to row tuple containing value of " + f"""type {datatype!r}; {'the values returned appear to be' + if uncertain else 'this datatype produces'} """ + "non-hashable values" + ) + + return go + elif not uncertain: + return id + else: + _use_id = False + + def go(obj): + nonlocal _use_id + + if not _use_id: + try: + return hash(obj) + except: + pass + + # in #10459, we considered using a warning here, however + # as legacy query uses result.unique() in all cases, this + # would lead to too many warning cases. + _use_id = True + + return id(obj) + + return go + + unique_filters = [ + _no_unique + if context.yield_per + else _not_hashable( + ent.column.type, # type: ignore + legacy=context.load_options._legacy_uniquing, + uncertain=ent._null_column_type, + ) + if ( + not ent.use_id_for_hash + and (ent._non_hashable_value or ent._null_column_type) + ) + else id + if ent.use_id_for_hash + else None + for ent in context.compile_state._entities + ] row_metadata = SimpleResultMetaData( labels, extra, _unique_filters=unique_filters @@ -1246,7 +1270,16 @@ def _load_subclass_via_in( orig_query = context.query - options = (enable_opt,) + orig_query._with_options + (disable_opt,) + if path.parent: + enable_opt_lcl = enable_opt._prepend_path(path) + disable_opt_lcl = disable_opt._prepend_path(path) + else: + enable_opt_lcl = enable_opt + disable_opt_lcl = disable_opt + options = ( + (enable_opt_lcl,) + orig_query._with_options + (disable_opt_lcl,) + ) + q2 = q.options(*options) q2._compile_options = context.compile_state.default_compile_options diff --git a/venv/Lib/site-packages/sqlalchemy/orm/mapper.py b/venv/Lib/site-packages/sqlalchemy/orm/mapper.py index e78830e..c66d876 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/mapper.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/mapper.py @@ -786,7 +786,7 @@ class Mapper( # interim - polymorphic_on is further refined in # _configure_polymorphic_setter - self.polymorphic_on = ( # type: ignore + self.polymorphic_on = ( coercions.expect( # type: ignore roles.ColumnArgumentOrKeyRole, polymorphic_on, @@ -964,8 +964,8 @@ class Mapper( version_id_generator: Optional[Union[Literal[False], Callable[[Any], Any]]] local_table: FromClause - """The immediate :class:`_expression.FromClause` which this - :class:`_orm.Mapper` refers towards. + """The immediate :class:`_expression.FromClause` to which this + :class:`_orm.Mapper` refers. Typically is an instance of :class:`_schema.Table`, may be any :class:`.FromClause`. @@ -1400,7 +1400,7 @@ class Mapper( self.with_polymorphic = None if self.with_polymorphic and self.with_polymorphic[1] is not None: - self.with_polymorphic = ( # type: ignore + self.with_polymorphic = ( self.with_polymorphic[0], coercions.expect( roles.StrictFromClauseRole, @@ -1504,7 +1504,7 @@ class Mapper( manager = instrumentation.register_class( self.class_, mapper=self, - expired_attribute_loader=util.partial( # type: ignore + expired_attribute_loader=util.partial( loading.load_scalar_attributes, self ), # finalize flag means instrument the __init__ method @@ -1610,7 +1610,7 @@ class Mapper( if isinstance(c, str) else c for c in ( - coercions.expect( # type: ignore + coercions.expect( roles.DDLConstraintColumnRole, coerce_pk, argname="primary_key", @@ -4097,7 +4097,7 @@ class _OptGetColumnsNotAvailable(Exception): pass -def configure_mappers(): +def configure_mappers() -> None: """Initialize the inter-mapper relationships of all mappers that have been constructed thus far across all :class:`_orm.registry` collections. diff --git a/venv/Lib/site-packages/sqlalchemy/orm/path_registry.py b/venv/Lib/site-packages/sqlalchemy/orm/path_registry.py index 2cd8a14..354552a 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/path_registry.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/path_registry.py @@ -57,9 +57,9 @@ else: _SerializedPath = List[Any] - +_StrPathToken = str _PathElementType = Union[ - str, "_InternalEntityType[Any]", "MapperProperty[Any]" + _StrPathToken, "_InternalEntityType[Any]", "MapperProperty[Any]" ] # the representation is in fact @@ -70,6 +70,8 @@ _PathElementType = Union[ # chopped at odd intervals as well so this is less flexible _PathRepresentation = Tuple[_PathElementType, ...] +# NOTE: these names are weird since the array is 0-indexed, +# the "_Odd" entries are at 0, 2, 4, etc _OddPathRepresentation = Sequence["_InternalEntityType[Any]"] _EvenPathRepresentation = Sequence[Union["MapperProperty[Any]", str]] @@ -154,6 +156,9 @@ class PathRegistry(HasCacheKey): def _path_for_compare(self) -> Optional[_PathRepresentation]: return self.path + def odd_element(self, index: int) -> _InternalEntityType[Any]: + return self.path[index] # type: ignore + def set(self, attributes: Dict[Any, Any], key: Any, value: Any) -> None: log.debug("set '%s' on path '%s' to '%s'", key, self, value) attributes[(key, self.natural_path)] = value @@ -180,7 +185,7 @@ class PathRegistry(HasCacheKey): return id(self) @overload - def __getitem__(self, entity: str) -> TokenRegistry: + def __getitem__(self, entity: _StrPathToken) -> TokenRegistry: ... @overload @@ -204,7 +209,11 @@ class PathRegistry(HasCacheKey): def __getitem__( self, entity: Union[ - str, int, slice, _InternalEntityType[Any], MapperProperty[Any] + _StrPathToken, + int, + slice, + _InternalEntityType[Any], + MapperProperty[Any], ], ) -> Union[ TokenRegistry, @@ -355,7 +364,7 @@ class CreatesToken(PathRegistry): is_aliased_class: bool is_root: bool - def token(self, token: str) -> TokenRegistry: + def token(self, token: _StrPathToken) -> TokenRegistry: if token.endswith(f":{_WILDCARD_TOKEN}"): return TokenRegistry(self, token) elif token.endswith(f":{_DEFAULT_TOKEN}"): @@ -385,7 +394,7 @@ class RootRegistry(CreatesToken): ) -> Union[TokenRegistry, AbstractEntityRegistry]: if entity in PathToken._intern: if TYPE_CHECKING: - assert isinstance(entity, str) + assert isinstance(entity, _StrPathToken) return TokenRegistry(self, PathToken._intern[entity]) else: try: @@ -433,10 +442,10 @@ class TokenRegistry(PathRegistry): inherit_cache = True - token: str + token: _StrPathToken parent: CreatesToken - def __init__(self, parent: CreatesToken, token: str): + def __init__(self, parent: CreatesToken, token: _StrPathToken): token = PathToken.intern(token) self.token = token @@ -619,7 +628,7 @@ class PropRegistry(PathRegistry): self._wildcard_path_loader_key = ( "loader", - parent.natural_path + self.prop._wildcard_token, # type: ignore + parent.natural_path + self.prop._wildcard_token, ) self._default_path_loader_key = self.prop._default_path_loader_key self._loader_key = ("loader", self.natural_path) @@ -721,7 +730,7 @@ class AbstractEntityRegistry(CreatesToken): @property def root_entity(self) -> _InternalEntityType[Any]: - return cast("_InternalEntityType[Any]", self.path[0]) + return self.odd_element(0) @property def entity_path(self) -> PathRegistry: diff --git a/venv/Lib/site-packages/sqlalchemy/orm/persistence.py b/venv/Lib/site-packages/sqlalchemy/orm/persistence.py index 31fbdf3..6729b47 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/persistence.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/persistence.py @@ -1082,7 +1082,7 @@ def _emit_insert_statements( records = list(records) if returning_is_required_anyway or ( - not hasvalue and len(records) > 1 + table.implicit_returning and not hasvalue and len(records) > 1 ): if ( deterministic_results_reqd diff --git a/venv/Lib/site-packages/sqlalchemy/orm/properties.py b/venv/Lib/site-packages/sqlalchemy/orm/properties.py index 4df5175..4bb396e 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/properties.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/properties.py @@ -25,6 +25,7 @@ from typing import Tuple from typing import Type from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union from . import attributes from . import strategy_options @@ -446,7 +447,7 @@ class ColumnProperty( try: return ce.info # type: ignore except AttributeError: - return self.prop.info # type: ignore + return self.prop.info def _memoized_attr_expressions(self) -> Sequence[NamedColumn[Any]]: """The full sequence of columns referenced by this @@ -475,13 +476,13 @@ class ColumnProperty( def operate( self, op: OperatorType, *other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(self.__clause_element__(), *other, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(self.__clause_element__(), *other, **kwargs) # type: ignore[no-any-return] # noqa: E501 def reverse_operate( self, op: OperatorType, other: Any, **kwargs: Any ) -> ColumnElement[Any]: col = self.__clause_element__() - return op(col._bind_param(op, other), col, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(col._bind_param(op, other), col, **kwargs) # type: ignore[no-any-return] # noqa: E501 def __str__(self) -> str: if not self.parent or not self.key: @@ -542,7 +543,7 @@ class MappedColumn( "_use_existing_column", ) - deferred: bool + deferred: Union[_NoArg, bool] deferred_raiseload: bool deferred_group: Optional[str] @@ -557,17 +558,15 @@ class MappedColumn( self._use_existing_column = kw.pop("use_existing_column", False) - self._has_dataclass_arguments = False - - if attr_opts is not None and attr_opts != _DEFAULT_ATTRIBUTE_OPTIONS: - if attr_opts.dataclasses_default_factory is not _NoArg.NO_ARG: - self._has_dataclass_arguments = True - - elif ( - attr_opts.dataclasses_init is not _NoArg.NO_ARG - or attr_opts.dataclasses_repr is not _NoArg.NO_ARG - ): - self._has_dataclass_arguments = True + self._has_dataclass_arguments = ( + attr_opts is not None + and attr_opts != _DEFAULT_ATTRIBUTE_OPTIONS + and any( + attr_opts[i] is not _NoArg.NO_ARG + for i, attr in enumerate(attr_opts._fields) + if attr != "dataclasses_default" + ) + ) insert_default = kw.pop("insert_default", _NoArg.NO_ARG) self._has_insert_default = insert_default is not _NoArg.NO_ARG @@ -580,12 +579,9 @@ class MappedColumn( self.deferred_group = kw.pop("deferred_group", None) self.deferred_raiseload = kw.pop("deferred_raiseload", None) self.deferred = kw.pop("deferred", _NoArg.NO_ARG) - if self.deferred is _NoArg.NO_ARG: - self.deferred = bool( - self.deferred_group or self.deferred_raiseload - ) self.active_history = kw.pop("active_history", False) - self._sort_order = kw.pop("sort_order", 0) + + self._sort_order = kw.pop("sort_order", _NoArg.NO_ARG) self.column = cast("Column[_T]", Column(*arg, **kw)) self.foreign_keys = self.column.foreign_keys self._has_nullable = "nullable" in kw and kw.get("nullable") not in ( @@ -617,10 +613,16 @@ class MappedColumn( @property def mapper_property_to_assign(self) -> Optional[MapperProperty[_T]]: - if self.deferred or self.active_history: + effective_deferred = self.deferred + if effective_deferred is _NoArg.NO_ARG: + effective_deferred = bool( + self.deferred_group or self.deferred_raiseload + ) + + if effective_deferred or self.active_history: return ColumnProperty( self.column, - deferred=self.deferred, + deferred=effective_deferred, group=self.deferred_group, raiseload=self.deferred_raiseload, attribute_options=self._attribute_options, @@ -631,7 +633,14 @@ class MappedColumn( @property def columns_to_assign(self) -> List[Tuple[Column[Any], int]]: - return [(self.column, self._sort_order)] + return [ + ( + self.column, + self._sort_order + if self._sort_order is not _NoArg.NO_ARG + else 0, + ) + ] def __clause_element__(self) -> Column[_T]: return self.column @@ -639,13 +648,13 @@ class MappedColumn( def operate( self, op: OperatorType, *other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(self.__clause_element__(), *other, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(self.__clause_element__(), *other, **kwargs) # type: ignore[no-any-return] # noqa: E501 def reverse_operate( self, op: OperatorType, other: Any, **kwargs: Any ) -> ColumnElement[Any]: col = self.__clause_element__() - return op(col._bind_param(op, other), col, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(col._bind_param(op, other), col, **kwargs) # type: ignore[no-any-return] # noqa: E501 def found_in_pep593_annotated(self) -> Any: # return a blank mapped_column(). This mapped_column()'s @@ -779,6 +788,65 @@ class MappedColumn( use_args_from.column._merge(self.column) sqltype = self.column.type + if ( + use_args_from.deferred is not _NoArg.NO_ARG + and self.deferred is _NoArg.NO_ARG + ): + self.deferred = use_args_from.deferred + + if ( + use_args_from.deferred_group is not None + and self.deferred_group is None + ): + self.deferred_group = use_args_from.deferred_group + + if ( + use_args_from.deferred_raiseload is not None + and self.deferred_raiseload is None + ): + self.deferred_raiseload = use_args_from.deferred_raiseload + + if ( + use_args_from._use_existing_column + and not self._use_existing_column + ): + self._use_existing_column = True + + if use_args_from.active_history: + self.active_history = use_args_from.active_history + + if ( + use_args_from._sort_order is not None + and self._sort_order is _NoArg.NO_ARG + ): + self._sort_order = use_args_from._sort_order + + if ( + use_args_from.column.key is not None + or use_args_from.column.name is not None + ): + util.warn_deprecated( + "Can't use the 'key' or 'name' arguments in " + "Annotated with mapped_column(); this will be ignored", + "2.0.22", + ) + + if use_args_from._has_dataclass_arguments: + for idx, arg in enumerate( + use_args_from._attribute_options._fields + ): + if ( + use_args_from._attribute_options[idx] + is not _NoArg.NO_ARG + ): + arg = arg.replace("dataclasses_", "") + util.warn_deprecated( + f"Argument '{arg}' is a dataclass argument and " + "cannot be specified within a mapped_column() " + "bundled inside of an Annotated object", + "2.0.22", + ) + if sqltype._isnull and not self.column.foreign_keys: new_sqltype = None diff --git a/venv/Lib/site-packages/sqlalchemy/orm/query.py b/venv/Lib/site-packages/sqlalchemy/orm/query.py index 14e75fa..5da7ee9 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/query.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/query.py @@ -235,7 +235,9 @@ class Query( def __init__( self, - entities: Sequence[_ColumnsClauseArgument[Any]], + entities: Union[ + _ColumnsClauseArgument[Any], Sequence[_ColumnsClauseArgument[Any]] + ], session: Optional[Session] = None, ): """Construct a :class:`_query.Query` directly. @@ -274,11 +276,14 @@ class Query( self._set_entities(entities) def _set_propagate_attrs(self, values: Mapping[str, Any]) -> Self: - self._propagate_attrs = util.immutabledict(values) # type: ignore + self._propagate_attrs = util.immutabledict(values) return self def _set_entities( - self, entities: Iterable[_ColumnsClauseArgument[Any]] + self, + entities: Union[ + _ColumnsClauseArgument[Any], Iterable[_ColumnsClauseArgument[Any]] + ], ) -> None: self._raw_columns = [ coercions.expect( @@ -478,7 +483,7 @@ class Query( return self def _clone(self, **kw: Any) -> Self: - return self._generate() # type: ignore + return self._generate() def _get_select_statement_only(self) -> Select[_T]: if self._statement is not None: @@ -1450,7 +1455,7 @@ class Query( q._set_entities(columns) if not q.load_options._yield_per: q.load_options += {"_yield_per": 10} - return iter(q) # type: ignore + return iter(q) @util.deprecated( "1.4", diff --git a/venv/Lib/site-packages/sqlalchemy/orm/relationships.py b/venv/Lib/site-packages/sqlalchemy/orm/relationships.py index d3a8da0..7ea30d7 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/relationships.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/relationships.py @@ -271,6 +271,9 @@ class _RelationshipArg(Generic[_T1, _T2]): self.resolved = attr_value +_RelationshipOrderByArg = Union[Literal[False], Tuple[ColumnElement[Any], ...]] + + class _RelationshipArgs(NamedTuple): """stores user-passed parameters that are resolved at mapper configuration time. @@ -289,10 +292,7 @@ class _RelationshipArgs(NamedTuple): Optional[_RelationshipJoinConditionArgument], Optional[ColumnElement[Any]], ] - order_by: _RelationshipArg[ - _ORMOrderByArgument, - Union[Literal[None, False], Tuple[ColumnElement[Any], ...]], - ] + order_by: _RelationshipArg[_ORMOrderByArgument, _RelationshipOrderByArg] foreign_keys: _RelationshipArg[ Optional[_ORMColCollectionArgument], Set[ColumnElement[Any]] ] @@ -341,7 +341,7 @@ class RelationshipProperty( secondaryjoin: Optional[ColumnElement[bool]] secondary: Optional[FromClause] _join_condition: JoinCondition - order_by: Union[Literal[False], Tuple[ColumnElement[Any], ...]] + order_by: _RelationshipOrderByArg _user_defined_foreign_keys: Set[ColumnElement[Any]] _calculated_foreign_keys: Set[ColumnElement[Any]] @@ -1614,7 +1614,8 @@ class RelationshipProperty( @util.memoized_property def entity(self) -> _InternalEntityType[_T]: """Return the target mapped entity, which is an inspect() of the - class or aliased class that is referred towards. + class or aliased class that is referenced by this + :class:`.RelationshipProperty`. """ self.parent._check_configure() @@ -1764,7 +1765,7 @@ class RelationshipProperty( argument = de_optionalize_union_types(argument) if hasattr(argument, "__origin__"): - arg_origin = argument.__origin__ # type: ignore + arg_origin = argument.__origin__ if isinstance(arg_origin, type) and issubclass( arg_origin, abc.Collection ): @@ -1786,7 +1787,7 @@ class RelationshipProperty( if argument.__args__: # type: ignore if isinstance(arg_origin, type) and issubclass( - arg_origin, typing.Mapping # type: ignore + arg_origin, typing.Mapping ): type_arg = argument.__args__[-1] # type: ignore else: @@ -1804,7 +1805,7 @@ class RelationshipProperty( f"Generic alias {argument} requires an argument" ) elif hasattr(argument, "__forward_arg__"): - argument = argument.__forward_arg__ # type: ignore + argument = argument.__forward_arg__ argument = resolve_name_to_real_class_name( argument, originating_module @@ -1874,7 +1875,7 @@ class RelationshipProperty( % (self.key, type(resolved_argument)) ) - self.entity = entity # type: ignore + self.entity = entity self.target = self.entity.persist_selectable def _setup_join_conditions(self) -> None: @@ -1990,7 +1991,7 @@ class RelationshipProperty( 'and not on the "many" side of a many-to-one or many-to-many ' "relationship. " "To force this relationship to allow a particular " - '"%(relatedcls)s" object to be referred towards by only ' + '"%(relatedcls)s" object to be referenced by only ' 'a single "%(clsname)s" object at a time via the ' "%(rel)s relationship, which " "would allow " diff --git a/venv/Lib/site-packages/sqlalchemy/orm/scoping.py b/venv/Lib/site-packages/sqlalchemy/orm/scoping.py index fc144d9..ab632bd 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/scoping.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/scoping.py @@ -108,6 +108,7 @@ __all__ = ["scoped_session"] "begin", "begin_nested", "close", + "reset", "commit", "connection", "delete", @@ -118,6 +119,7 @@ __all__ = ["scoped_session"] "expunge_all", "flush", "get", + "get_one", "get_bind", "is_modified", "bulk_save_objects", @@ -466,7 +468,8 @@ class scoped_session(Generic[_S]): :ref:`pysqlite_serializable` - special workarounds required with the SQLite driver in order for SAVEPOINT to work - correctly. + correctly. For asyncio use cases, see the section + :ref:`aiosqlite_serializable`. """ # noqa: E501 @@ -491,12 +494,17 @@ class scoped_session(Generic[_S]): .. tip:: - The :meth:`_orm.Session.close` method **does not prevent the - Session from being used again**. The :class:`_orm.Session` itself - does not actually have a distinct "closed" state; it merely means + In the default running mode the :meth:`_orm.Session.close` + method **does not prevent the Session from being used again**. + The :class:`_orm.Session` itself does not actually have a + distinct "closed" state; it merely means the :class:`_orm.Session` will release all database connections and ORM objects. + Setting the parameter :paramref:`_orm.Session.close_resets_only` + to ``False`` will instead make the ``close`` final, meaning that + any further action on the session will be forbidden. + .. versionchanged:: 1.4 The :meth:`.Session.close` method does not immediately create a new :class:`.SessionTransaction` object; instead, the new :class:`.SessionTransaction` is created only if @@ -505,13 +513,49 @@ class scoped_session(Generic[_S]): .. seealso:: :ref:`session_closing` - detail on the semantics of - :meth:`_orm.Session.close` + :meth:`_orm.Session.close` and :meth:`_orm.Session.reset`. + + :meth:`_orm.Session.reset` - a similar method that behaves like + ``close()`` with the parameter + :paramref:`_orm.Session.close_resets_only` set to ``True``. """ # noqa: E501 return self._proxied.close() + def reset(self) -> None: + r"""Close out the transactional resources and ORM objects used by this + :class:`_orm.Session`, resetting the session to its initial state. + + .. container:: class_bases + + Proxied for the :class:`_orm.Session` class on + behalf of the :class:`_orm.scoping.scoped_session` class. + + This method provides for same "reset-only" behavior that the + :meth:_orm.Session.close method has provided historically, where the + state of the :class:`_orm.Session` is reset as though the object were + brand new, and ready to be used again. + The method may then be useful for :class:`_orm.Session` objects + which set :paramref:`_orm.Session.close_resets_only` to ``False``, + so that "reset only" behavior is still available from this method. + + .. versionadded:: 2.0.22 + + .. seealso:: + + :ref:`session_closing` - detail on the semantics of + :meth:`_orm.Session.close` and :meth:`_orm.Session.reset`. + + :meth:`_orm.Session.close` - a similar method will additionally + prevent re-use of the Session when the parameter + :paramref:`_orm.Session.close_resets_only` is set to ``False``. + + """ # noqa: E501 + + return self._proxied.reset() + def commit(self) -> None: r"""Flush pending changes and commit the current transaction. @@ -1028,6 +1072,56 @@ class scoped_session(Generic[_S]): bind_arguments=bind_arguments, ) + def get_one( + self, + entity: _EntityBindKey[_O], + ident: _PKIdentityArgument, + *, + options: Optional[Sequence[ORMOption]] = None, + populate_existing: bool = False, + with_for_update: ForUpdateParameter = None, + identity_token: Optional[Any] = None, + execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, + bind_arguments: Optional[_BindArguments] = None, + ) -> _O: + r"""Return exactly one instance based on the given primary key + identifier, or raise an exception if not found. + + .. container:: class_bases + + Proxied for the :class:`_orm.Session` class on + behalf of the :class:`_orm.scoping.scoped_session` class. + + Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query + selects no rows. + + For a detailed documentation of the arguments see the + method :meth:`.Session.get`. + + .. versionadded:: 2.0.22 + + :return: The object instance. + + .. seealso:: + + :meth:`.Session.get` - equivalent method that instead + returns ``None`` if no row was found with the provided primary + key + + + """ # noqa: E501 + + return self._proxied.get_one( + entity, + ident, + options=options, + populate_existing=populate_existing, + with_for_update=with_for_update, + identity_token=identity_token, + execution_options=execution_options, + bind_arguments=bind_arguments, + ) + def get_bind( self, mapper: Optional[_EntityBindKey[_O]] = None, diff --git a/venv/Lib/site-packages/sqlalchemy/orm/session.py b/venv/Lib/site-packages/sqlalchemy/orm/session.py index e5eb503..d861981 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/session.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/session.py @@ -83,6 +83,7 @@ from ..sql import roles from ..sql import Select from ..sql import TableClause from ..sql import visitors +from ..sql.base import _NoArg from ..sql.base import CompileState from ..sql.schema import Table from ..sql.selectable import ForUpdateArg @@ -510,7 +511,8 @@ class ORMExecuteState(util.MemoizedSlots): """ - return self.bind_arguments.get("mapper", None) + mp: Optional[Mapper[Any]] = self.bind_arguments.get("mapper", None) + return mp @property def all_mappers(self) -> Sequence[Mapper[Any]]: @@ -718,9 +720,14 @@ class ORMExecuteState(util.MemoizedSlots): "This ORM execution is not against a SELECT statement " "so there are no load options." ) - return self.execution_options.get( + + lo: Union[ + context.QueryContext.default_load_options, + Type[context.QueryContext.default_load_options], + ] = self.execution_options.get( "_sa_orm_load_options", context.QueryContext.default_load_options ) + return lo @property def update_delete_options( @@ -737,10 +744,14 @@ class ORMExecuteState(util.MemoizedSlots): "This ORM execution is not against an UPDATE or DELETE " "statement so there are no update options." ) - return self.execution_options.get( + uo: Union[ + bulk_persistence.BulkUDCompileState.default_update_options, + Type[bulk_persistence.BulkUDCompileState.default_update_options], + ] = self.execution_options.get( "_sa_orm_update_options", bulk_persistence.BulkUDCompileState.default_update_options, ) + return uo @property def _non_compile_orm_options(self) -> Sequence[ORMOption]: @@ -881,6 +892,12 @@ class SessionTransaction(_StateChange, TransactionalContext): self.nested = nested = origin is SessionTransactionOrigin.BEGIN_NESTED self.origin = origin + if session._close_state is _SessionCloseState.CLOSED: + raise sa_exc.InvalidRequestError( + "This Session has been permanently closed and is unable " + "to handle any more transaction requests." + ) + if nested: if not parent: raise sa_exc.InvalidRequestError( @@ -1372,6 +1389,12 @@ class SessionTransaction(_StateChange, TransactionalContext): return self._state not in (COMMITTED, CLOSED) +class _SessionCloseState(Enum): + ACTIVE = 1 + CLOSED = 2 + CLOSE_IS_RESET = 3 + + class Session(_SessionClassMethods, EventTarget): """Manages persistence operations for ORM-mapped objects. @@ -1416,6 +1439,7 @@ class Session(_SessionClassMethods, EventTarget): twophase: bool join_transaction_mode: JoinTransactionMode _query_cls: Type[Query[Any]] + _close_state: _SessionCloseState def __init__( self, @@ -1432,6 +1456,7 @@ class Session(_SessionClassMethods, EventTarget): query_cls: Optional[Type[Query[Any]]] = None, autocommit: Literal[False] = False, join_transaction_mode: JoinTransactionMode = "conditional_savepoint", + close_resets_only: Union[bool, _NoArg] = _NoArg.NO_ARG, ): r"""Construct a new :class:`_orm.Session`. @@ -1607,8 +1632,9 @@ class Session(_SessionClassMethods, EventTarget): .. tip:: When using SQLite, the SQLite driver included through Python 3.11 does not handle SAVEPOINTs correctly in all cases - without workarounds. See the section - :ref:`pysqlite_serializable` for details on current workarounds. + without workarounds. See the sections + :ref:`pysqlite_serializable` and :ref:`aiosqlite_serializable` + for details on current workarounds. * ``"control_fully"`` - the :class:`_orm.Session` will take control of the given transaction as its own; @@ -1639,6 +1665,18 @@ class Session(_SessionClassMethods, EventTarget): .. versionadded:: 2.0.0rc1 + :param close_resets_only: Defaults to ``True``. Determines if + the session should reset itself after calling ``.close()`` + or should pass in a no longer usable state, disabling re-use. + + .. versionadded:: 2.0.22 added flag ``close_resets_only``. + A future SQLAlchemy version may change the default value of + this flag to ``False``. + + .. seealso:: + + :ref:`session_closing` - Detail on the semantics of + :meth:`_orm.Session.close` and :meth:`_orm.Session.reset`. """ # noqa @@ -1671,6 +1709,13 @@ class Session(_SessionClassMethods, EventTarget): self.autoflush = autoflush self.expire_on_commit = expire_on_commit self.enable_baked_queries = enable_baked_queries + + # the idea is that at some point NO_ARG will warn that in the future + # the default will switch to close_resets_only=False. + if close_resets_only or close_resets_only is _NoArg.NO_ARG: + self._close_state = _SessionCloseState.CLOSE_IS_RESET + else: + self._close_state = _SessionCloseState.ACTIVE if ( join_transaction_mode and join_transaction_mode @@ -1858,7 +1903,8 @@ class Session(_SessionClassMethods, EventTarget): :ref:`pysqlite_serializable` - special workarounds required with the SQLite driver in order for SAVEPOINT to work - correctly. + correctly. For asyncio use cases, see the section + :ref:`aiosqlite_serializable`. """ return self.begin(nested=True) @@ -2393,12 +2439,17 @@ class Session(_SessionClassMethods, EventTarget): .. tip:: - The :meth:`_orm.Session.close` method **does not prevent the - Session from being used again**. The :class:`_orm.Session` itself - does not actually have a distinct "closed" state; it merely means + In the default running mode the :meth:`_orm.Session.close` + method **does not prevent the Session from being used again**. + The :class:`_orm.Session` itself does not actually have a + distinct "closed" state; it merely means the :class:`_orm.Session` will release all database connections and ORM objects. + Setting the parameter :paramref:`_orm.Session.close_resets_only` + to ``False`` will instead make the ``close`` final, meaning that + any further action on the session will be forbidden. + .. versionchanged:: 1.4 The :meth:`.Session.close` method does not immediately create a new :class:`.SessionTransaction` object; instead, the new :class:`.SessionTransaction` is created only if @@ -2407,11 +2458,40 @@ class Session(_SessionClassMethods, EventTarget): .. seealso:: :ref:`session_closing` - detail on the semantics of - :meth:`_orm.Session.close` + :meth:`_orm.Session.close` and :meth:`_orm.Session.reset`. + + :meth:`_orm.Session.reset` - a similar method that behaves like + ``close()`` with the parameter + :paramref:`_orm.Session.close_resets_only` set to ``True``. """ self._close_impl(invalidate=False) + def reset(self) -> None: + """Close out the transactional resources and ORM objects used by this + :class:`_orm.Session`, resetting the session to its initial state. + + This method provides for same "reset-only" behavior that the + :meth:_orm.Session.close method has provided historically, where the + state of the :class:`_orm.Session` is reset as though the object were + brand new, and ready to be used again. + The method may then be useful for :class:`_orm.Session` objects + which set :paramref:`_orm.Session.close_resets_only` to ``False``, + so that "reset only" behavior is still available from this method. + + .. versionadded:: 2.0.22 + + .. seealso:: + + :ref:`session_closing` - detail on the semantics of + :meth:`_orm.Session.close` and :meth:`_orm.Session.reset`. + + :meth:`_orm.Session.close` - a similar method will additionally + prevent re-use of the Session when the parameter + :paramref:`_orm.Session.close_resets_only` is set to ``False``. + """ + self._close_impl(invalidate=False, is_reset=True) + def invalidate(self) -> None: """Close this Session, using connection invalidation. @@ -2448,7 +2528,9 @@ class Session(_SessionClassMethods, EventTarget): """ self._close_impl(invalidate=True) - def _close_impl(self, invalidate: bool) -> None: + def _close_impl(self, invalidate: bool, is_reset: bool = False) -> None: + if not is_reset and self._close_state is _SessionCloseState.ACTIVE: + self._close_state = _SessionCloseState.CLOSED self.expunge_all() if self._transaction is not None: for transaction in self._transaction._iterate_self_and_parents(): @@ -3580,6 +3662,57 @@ class Session(_SessionClassMethods, EventTarget): bind_arguments=bind_arguments, ) + def get_one( + self, + entity: _EntityBindKey[_O], + ident: _PKIdentityArgument, + *, + options: Optional[Sequence[ORMOption]] = None, + populate_existing: bool = False, + with_for_update: ForUpdateParameter = None, + identity_token: Optional[Any] = None, + execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, + bind_arguments: Optional[_BindArguments] = None, + ) -> _O: + """Return exactly one instance based on the given primary key + identifier, or raise an exception if not found. + + Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query + selects no rows. + + For a detailed documentation of the arguments see the + method :meth:`.Session.get`. + + .. versionadded:: 2.0.22 + + :return: The object instance. + + .. seealso:: + + :meth:`.Session.get` - equivalent method that instead + returns ``None`` if no row was found with the provided primary + key + + """ + + instance = self.get( + entity, + ident, + options=options, + populate_existing=populate_existing, + with_for_update=with_for_update, + identity_token=identity_token, + execution_options=execution_options, + bind_arguments=bind_arguments, + ) + + if instance is None: + raise sa_exc.NoResultFound( + "No row was found when one was required" + ) + + return instance + def _get_impl( self, entity: _EntityBindKey[_O], diff --git a/venv/Lib/site-packages/sqlalchemy/orm/state.py b/venv/Lib/site-packages/sqlalchemy/orm/state.py index b1ae198..d9e1f85 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/state.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/state.py @@ -617,8 +617,8 @@ class InstanceState(interfaces.InspectionAttrInfo, Generic[_O]): self.class_ = state_dict["class_"] self.committed_state = state_dict.get("committed_state", {}) - self._pending_mutations = state_dict.get("_pending_mutations", {}) # type: ignore # noqa E501 - self.parents = state_dict.get("parents", {}) # type: ignore + self._pending_mutations = state_dict.get("_pending_mutations", {}) + self.parents = state_dict.get("parents", {}) self.modified = state_dict.get("modified", False) self.expired = state_dict.get("expired", False) if "info" in state_dict: diff --git a/venv/Lib/site-packages/sqlalchemy/orm/strategies.py b/venv/Lib/site-packages/sqlalchemy/orm/strategies.py index a0e0929..1e58f40 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/strategies.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/strategies.py @@ -306,8 +306,9 @@ class ExpressionColumnLoader(ColumnLoader): **kwargs, ): columns = None - if loadopt and "expression" in loadopt.local_opts: - columns = [loadopt.local_opts["expression"]] + if loadopt and loadopt._extra_criteria: + columns = loadopt._extra_criteria + elif self._have_default_expression: columns = self.parent_property.columns @@ -343,8 +344,8 @@ class ExpressionColumnLoader(ColumnLoader): ): # look through list of columns represented here # to see which, if any, is present in the row. - if loadopt and "expression" in loadopt.local_opts: - columns = [loadopt.local_opts["expression"]] + if loadopt and loadopt._extra_criteria: + columns = loadopt._extra_criteria for col in columns: if adapter: diff --git a/venv/Lib/site-packages/sqlalchemy/orm/strategy_options.py b/venv/Lib/site-packages/sqlalchemy/orm/strategy_options.py index d59fbb7..6c81e8f 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/strategy_options.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/strategy_options.py @@ -34,6 +34,7 @@ from .attributes import QueryableAttribute from .base import InspectionAttr from .interfaces import LoaderOption from .path_registry import _DEFAULT_TOKEN +from .path_registry import _StrPathToken from .path_registry import _WILDCARD_TOKEN from .path_registry import AbstractEntityRegistry from .path_registry import path_is_property @@ -77,7 +78,7 @@ if typing.TYPE_CHECKING: from ..sql.cache_key import CacheKey -_AttrType = Union[str, "QueryableAttribute[Any]"] +_AttrType = Union[Literal["*"], "QueryableAttribute[Any]"] _WildcardKeyType = Literal["relationship", "column"] _StrategySpec = Dict[str, Any] @@ -541,7 +542,12 @@ class _AbstractLoad(traversals.GenerativeOnTraversal, LoaderOption): ) def defaultload(self, attr: _AttrType) -> Self: - """Indicate an attribute should load using its default loader style. + """Indicate an attribute should load using its predefined loader style. + + The behavior of this loading option is to not change the current + loading style of the attribute, meaning that the previously configured + one is used or, if no previous style was selected, the default + loading will be used. This method is used to link to other loader options further into a chain of attributes without altering the loader style of the links @@ -741,7 +747,7 @@ class _AbstractLoad(traversals.GenerativeOnTraversal, LoaderOption): ) return self._set_column_strategy( - (key,), {"query_expression": True}, opts={"expression": expression} + (key,), {"query_expression": True}, extra_criteria=(expression,) ) def selectin_polymorphic(self, classes: Iterable[Type[Any]]) -> Self: @@ -813,6 +819,7 @@ class _AbstractLoad(traversals.GenerativeOnTraversal, LoaderOption): attrs: Tuple[_AttrType, ...], strategy: Optional[_StrategySpec], opts: Optional[_OptsType] = None, + extra_criteria: Optional[Tuple[Any, ...]] = None, ) -> Self: strategy_key = self._coerce_strat(strategy) @@ -822,6 +829,7 @@ class _AbstractLoad(traversals.GenerativeOnTraversal, LoaderOption): _COLUMN_TOKEN, opts=opts, attr_group=attrs, + extra_criteria=extra_criteria, ) return self @@ -878,6 +886,7 @@ class _AbstractLoad(traversals.GenerativeOnTraversal, LoaderOption): attr_group: Optional[_AttrGroupType] = None, propagate_to_loaders: bool = True, reconcile_to_other: Optional[bool] = None, + extra_criteria: Optional[Tuple[Any, ...]] = None, ) -> Self: raise NotImplementedError() @@ -977,6 +986,7 @@ class Load(_AbstractLoad): __slots__ = ( "path", "context", + "additional_source_entities", ) _traverse_internals = [ @@ -986,11 +996,16 @@ class Load(_AbstractLoad): visitors.InternalTraversal.dp_has_cache_key_list, ), ("propagate_to_loaders", visitors.InternalTraversal.dp_boolean), + ( + "additional_source_entities", + visitors.InternalTraversal.dp_has_cache_key_list, + ), ] _cache_key_traversal = None path: PathRegistry context: Tuple[_LoadElement, ...] + additional_source_entities: Tuple[_InternalEntityType[Any], ...] def __init__(self, entity: _EntityType[Any]): insp = cast("Union[Mapper[Any], AliasedInsp[Any]]", inspect(entity)) @@ -999,16 +1014,20 @@ class Load(_AbstractLoad): self.path = insp._path_registry self.context = () self.propagate_to_loaders = False + self.additional_source_entities = () def __str__(self) -> str: return f"Load({self.path[0]})" @classmethod - def _construct_for_existing_path(cls, path: PathRegistry) -> Load: + def _construct_for_existing_path( + cls, path: AbstractEntityRegistry + ) -> Load: load = cls.__new__(cls) load.path = path load.context = () load.propagate_to_loaders = False + load.additional_source_entities = () return load def _adapt_cached_option_to_uncached_option( @@ -1016,6 +1035,13 @@ class Load(_AbstractLoad): ) -> ORMOption: return self._adjust_for_extra_criteria(context) + def _prepend_path(self, path: PathRegistry) -> Load: + cloned = self._clone() + cloned.context = tuple( + element._prepend_path(path) for element in self.context + ) + return cloned + def _adjust_for_extra_criteria(self, context: QueryContext) -> Load: """Apply the current bound parameters in a QueryContext to all occurrences "extra_criteria" stored within this ``Load`` object, @@ -1029,16 +1055,10 @@ class Load(_AbstractLoad): found_crit = False def process(opt: _LoadElement) -> _LoadElement: - if not opt._extra_criteria: - return opt - nonlocal orig_cache_key, replacement_cache_key, found_crit found_crit = True - # avoid generating cache keys for the queries if we don't - # actually have any extra_criteria options, which is the - # common case if orig_cache_key is None or replacement_cache_key is None: orig_cache_key = orig_query._generate_cache_key() replacement_cache_key = context.query._generate_cache_key() @@ -1052,8 +1072,12 @@ class Load(_AbstractLoad): ) for crit in opt._extra_criteria ) + return opt + # avoid generating cache keys for the queries if we don't + # actually have any extra_criteria options, which is the + # common case new_context = tuple( process(value._clone()) if value._extra_criteria else value for value in self.context @@ -1116,9 +1140,12 @@ class Load(_AbstractLoad): assert cloned.propagate_to_loaders == self.propagate_to_loaders - if not orm_util._entity_corresponds_to_use_path_impl( - cast("_InternalEntityType[Any]", parent.path[-1]), - cast("_InternalEntityType[Any]", cloned.path[0]), + if not any( + orm_util._entity_corresponds_to_use_path_impl( + elem, cloned.path.odd_element(0) + ) + for elem in (parent.path.odd_element(-1),) + + parent.additional_source_entities ): if len(cloned.path) > 1: attrname = cloned.path[1] @@ -1137,6 +1164,9 @@ class Load(_AbstractLoad): if cloned.context: parent.context += cloned.context + parent.additional_source_entities += ( + cloned.additional_source_entities + ) @_generative def options(self, *opts: _AbstractLoad) -> Self: @@ -1191,6 +1221,7 @@ class Load(_AbstractLoad): attr_group: Optional[_AttrGroupType] = None, propagate_to_loaders: bool = True, reconcile_to_other: Optional[bool] = None, + extra_criteria: Optional[Tuple[Any, ...]] = None, ) -> Self: # for individual strategy that needs to propagate, set the whole # Load container to also propagate, so that it shows up in @@ -1224,9 +1255,14 @@ class Load(_AbstractLoad): propagate_to_loaders, attr_group=attr_group, reconcile_to_other=reconcile_to_other, + extra_criteria=extra_criteria, ) if load_element: self.context += (load_element,) + assert opts is not None + self.additional_source_entities += cast( + "Tuple[_InternalEntityType[Any]]", opts["entities"] + ) else: for attr in attrs: @@ -1240,6 +1276,7 @@ class Load(_AbstractLoad): propagate_to_loaders, attr_group=attr_group, reconcile_to_other=reconcile_to_other, + extra_criteria=extra_criteria, ) else: load_element = _AttributeStrategyLoad.create( @@ -1251,6 +1288,7 @@ class Load(_AbstractLoad): propagate_to_loaders, attr_group=attr_group, reconcile_to_other=reconcile_to_other, + extra_criteria=extra_criteria, ) if load_element: @@ -1314,6 +1352,7 @@ class _WildcardLoad(_AbstractLoad): attr_group=None, propagate_to_loaders=True, reconcile_to_other=None, + extra_criteria=None, ): assert attrs is not None attr = attrs[0] @@ -1330,6 +1369,8 @@ class _WildcardLoad(_AbstractLoad): if opts: self.local_opts = util.immutabledict(opts) + assert extra_criteria is None + def options(self, *opts: _AbstractLoad) -> Self: raise NotImplementedError("Star option does not support sub-options") @@ -1616,7 +1657,9 @@ class _LoadElement( return effective_path - def _init_path(self, path, attr, wildcard_key, attr_group, raiseerr): + def _init_path( + self, path, attr, wildcard_key, attr_group, raiseerr, extra_criteria + ): """Apply ORM attributes and/or wildcard to an existing path, producing a new path. @@ -1668,7 +1711,7 @@ class _LoadElement( def create( cls, path: PathRegistry, - attr: Optional[_AttrType], + attr: Union[_AttrType, _StrPathToken, None], strategy: Optional[_StrategyKey], wildcard_key: Optional[_WildcardKeyType], local_opts: Optional[_OptsType], @@ -1676,6 +1719,7 @@ class _LoadElement( raiseerr: bool = True, attr_group: Optional[_AttrGroupType] = None, reconcile_to_other: Optional[bool] = None, + extra_criteria: Optional[Tuple[Any, ...]] = None, ) -> _LoadElement: """Create a new :class:`._LoadElement` object.""" @@ -1695,7 +1739,9 @@ class _LoadElement( else: opt._reconcile_to_other = None - path = opt._init_path(path, attr, wildcard_key, attr_group, raiseerr) + path = opt._init_path( + path, attr, wildcard_key, attr_group, raiseerr, extra_criteria + ) if not path: return None # type: ignore @@ -1714,9 +1760,7 @@ class _LoadElement( return cloned - def _prepend_path_from( - self, parent: Union[Load, _LoadElement] - ) -> _LoadElement: + def _prepend_path_from(self, parent: Load) -> _LoadElement: """adjust the path of this :class:`._LoadElement` to be a subpath of that of the given parent :class:`_orm.Load` object's path. @@ -1725,22 +1769,30 @@ class _LoadElement( which is in turn part of the :meth:`_orm.Load.options` method. """ + + if not any( + orm_util._entity_corresponds_to_use_path_impl( + elem, + self.path.odd_element(0), + ) + for elem in (parent.path.odd_element(-1),) + + parent.additional_source_entities + ): + raise sa_exc.ArgumentError( + f'Attribute "{self.path[1]}" does not link ' + f'from element "{parent.path[-1]}".' + ) + + return self._prepend_path(parent.path) + + def _prepend_path(self, path: PathRegistry) -> _LoadElement: cloned = self._clone() assert cloned.strategy == self.strategy assert cloned.local_opts == self.local_opts assert cloned.is_class_strategy == self.is_class_strategy - if not orm_util._entity_corresponds_to_use_path_impl( - cast("_InternalEntityType[Any]", parent.path[-1]), - cast("_InternalEntityType[Any]", cloned.path[0]), - ): - raise sa_exc.ArgumentError( - f'Attribute "{cloned.path[1]}" does not link ' - f'from element "{parent.path[-1]}".' - ) - - cloned.path = PathRegistry.coerce(parent.path[0:-1] + cloned.path[:]) + cloned.path = PathRegistry.coerce(path[0:-1] + cloned.path[:]) return cloned @@ -1789,7 +1841,7 @@ class _LoadElement( replacement.local_opts = replacement.local_opts.union( existing.local_opts ) - replacement._extra_criteria += replacement._extra_criteria + replacement._extra_criteria += existing._extra_criteria return replacement elif replacement.path.is_token: # use 'last one wins' logic for wildcard options. this is also @@ -1831,7 +1883,9 @@ class _AttributeStrategyLoad(_LoadElement): is_class_strategy = False is_token_strategy = False - def _init_path(self, path, attr, wildcard_key, attr_group, raiseerr): + def _init_path( + self, path, attr, wildcard_key, attr_group, raiseerr, extra_criteria + ): assert attr is not None self._of_type = None self._path_with_polymorphic_path = None @@ -1877,7 +1931,11 @@ class _AttributeStrategyLoad(_LoadElement): # from an attribute. This appears to have been an artifact of how # _UnboundLoad / Load interacted together, which was opaque and # poorly defined. - self._extra_criteria = attr._extra_criteria + if extra_criteria: + assert not attr._extra_criteria + self._extra_criteria = extra_criteria + else: + self._extra_criteria = attr._extra_criteria if getattr(attr, "_of_type", None): ac = attr._of_type @@ -2070,7 +2128,9 @@ class _TokenStrategyLoad(_LoadElement): is_class_strategy = False is_token_strategy = True - def _init_path(self, path, attr, wildcard_key, attr_group, raiseerr): + def _init_path( + self, path, attr, wildcard_key, attr_group, raiseerr, extra_criteria + ): # assert isinstance(attr, str) or attr is None if attr is not None: default_token = attr.endswith(_DEFAULT_TOKEN) @@ -2156,7 +2216,9 @@ class _ClassStrategyLoad(_LoadElement): __visit_name__ = "class_strategy_load_element" - def _init_path(self, path, attr, wildcard_key, attr_group, raiseerr): + def _init_path( + self, path, attr, wildcard_key, attr_group, raiseerr, extra_criteria + ): return path def _prepare_for_compile_state( @@ -2447,7 +2509,9 @@ def _raise_for_does_not_link(path, attrname, parent_entity): ( " Did you mean to use " f'"{path[-2]}' - f'.of_type({parent_entity_str})"?' + f'.of_type({parent_entity_str})" or "loadopt.options(' + f"selectin_polymorphic({path[-2].mapper.class_.__name__}, " + f'[{parent_entity_str}]), ...)" ?' if not path_is_of_type and not path[-1].is_aliased_class and orm_util._entity_corresponds_to( diff --git a/venv/Lib/site-packages/sqlalchemy/orm/util.py b/venv/Lib/site-packages/sqlalchemy/orm/util.py index 4371e61..ea2f1a1 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/util.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/util.py @@ -45,6 +45,7 @@ from .base import _never_set as _never_set # noqa: F401 from .base import _none_set as _none_set # noqa: F401 from .base import attribute_str as attribute_str # noqa: F401 from .base import class_mapper as class_mapper +from .base import DynamicMapped from .base import InspectionAttr as InspectionAttr from .base import instance_str as instance_str # noqa: F401 from .base import Mapped @@ -55,6 +56,7 @@ from .base import ORMDescriptor from .base import state_attribute_str as state_attribute_str # noqa: F401 from .base import state_class_str as state_class_str # noqa: F401 from .base import state_str as state_str # noqa: F401 +from .base import WriteOnlyMapped from .interfaces import CriteriaOption from .interfaces import MapperProperty as MapperProperty from .interfaces import ORMColumnsClauseRole @@ -100,6 +102,7 @@ if typing.TYPE_CHECKING: from .context import _MapperEntity from .context import ORMCompileState from .mapper import Mapper + from .path_registry import AbstractEntityRegistry from .query import Query from .relationships import RelationshipProperty from ..engine import Row @@ -137,7 +140,14 @@ all_cascades = frozenset( _de_stringify_partial = functools.partial( - functools.partial, locals_=util.immutabledict({"Mapped": Mapped}) + functools.partial, + locals_=util.immutabledict( + { + "Mapped": Mapped, + "WriteOnlyMapped": WriteOnlyMapped, + "DynamicMapped": DynamicMapped, + } + ), ) # partial is practically useless as we have to write out the whole @@ -935,7 +945,7 @@ class AliasedInsp( """the AliasedClass that refers to this AliasedInsp""" _target: Union[Type[_O], AliasedClass[_O]] - """the thing referred towards by the AliasedClass/AliasedInsp. + """the thing referenced by the AliasedClass/AliasedInsp. In the vast majority of cases, this is the mapped class. However it may also be another AliasedClass (alias of alias). @@ -1124,7 +1134,7 @@ class AliasedInsp( return self.mapper.class_ @property - def _path_registry(self) -> PathRegistry: + def _path_registry(self) -> AbstractEntityRegistry: if self._use_mapper_path: return self.mapper._path_registry else: @@ -1204,7 +1214,7 @@ class AliasedInsp( # IMO mypy should see this one also as returning the same type # we put into it, but it's not return ( - self._adapter.traverse(expr) # type: ignore + self._adapter.traverse(expr) ._annotate(d) ._set_propagate_attrs( {"compile_state_plugin": "orm", "plugin_subject": self} @@ -1397,7 +1407,7 @@ class LoaderCriteriaOption(CriteriaOption): self.deferred_where_criteria = True self.where_criteria = lambdas.DeferredLambdaElement( - where_criteria, # type: ignore + where_criteria, roles.WhereHavingRole, lambda_args=(_WrapUserEntity(wrap_entity),), opts=lambdas.LambdaOptions( @@ -1620,12 +1630,18 @@ class Bundle( ) @property - def mapper(self) -> Mapper[Any]: - return self.exprs[0]._annotations.get("parentmapper", None) + def mapper(self) -> Optional[Mapper[Any]]: + mp: Optional[Mapper[Any]] = self.exprs[0]._annotations.get( + "parentmapper", None + ) + return mp @property - def entity(self) -> _InternalEntityType[Any]: - return self.exprs[0]._annotations.get("parententity", None) + def entity(self) -> Optional[_InternalEntityType[Any]]: + ie: Optional[_InternalEntityType[Any]] = self.exprs[ + 0 + ]._annotations.get("parententity", None) + return ie @property def entity_namespace( @@ -1827,8 +1843,8 @@ class _ORMJoin(expression.Join): prop = None on_selectable = None + left_selectable = left_info.selectable if prop: - left_selectable = left_info.selectable adapt_from: Optional[FromClause] if sql_util.clause_is_present(on_selectable, left_selectable): adapt_from = on_selectable @@ -1865,25 +1881,25 @@ class _ORMJoin(expression.Join): self._target_adapter = target_adapter - # we don't use the normal coercions logic for _ORMJoin - # (probably should), so do some gymnastics to get the entity. - # logic here is for #8721, which was a major bug in 1.4 - # for almost two years, not reported/fixed until 1.4.43 (!) - if is_selectable(left_info): - parententity = left_selectable._annotations.get( - "parententity", None - ) - elif insp_is_mapper(left_info) or insp_is_aliased_class(left_info): - parententity = left_info - else: - parententity = None + # we don't use the normal coercions logic for _ORMJoin + # (probably should), so do some gymnastics to get the entity. + # logic here is for #8721, which was a major bug in 1.4 + # for almost two years, not reported/fixed until 1.4.43 (!) + if is_selectable(left_info): + parententity = left_selectable._annotations.get( + "parententity", None + ) + elif insp_is_mapper(left_info) or insp_is_aliased_class(left_info): + parententity = left_info + else: + parententity = None - if parententity is not None: - self._annotations = self._annotations.union( - {"parententity": parententity} - ) + if parententity is not None: + self._annotations = self._annotations.union( + {"parententity": parententity} + ) - augment_onclause = onclause is None and _extra_criteria + augment_onclause = bool(_extra_criteria) and not prop expression.Join.__init__(self, left, right, onclause, isouter, full) assert self.onclause is not None @@ -2169,9 +2185,9 @@ def _getitem(iterable_query: Query[Any], item: Any) -> Any: res = iterable_query.slice(start, stop) if step is not None: - return list(res)[None : None : item.step] # type: ignore + return list(res)[None : None : item.step] else: - return list(res) # type: ignore + return list(res) else: if item == -1: _no_negative_indexes() @@ -2234,14 +2250,17 @@ def _cleanup_mapped_str_annotation( "outside of TYPE_CHECKING blocks" ) from ne - try: - if issubclass(obj, _MappedAnnotationBase): - real_symbol = obj.__name__ - else: + if obj is typing.ClassVar: + real_symbol = "ClassVar" + else: + try: + if issubclass(obj, _MappedAnnotationBase): + real_symbol = obj.__name__ + else: + return annotation + except TypeError: + # avoid isinstance(obj, type) check, just catch TypeError return annotation - except TypeError: - # avoid isinstance(obj, type) check, just catch TypeError - return annotation # note: if one of the codepaths above didn't define real_symbol and # then didn't return, real_symbol raises UnboundLocalError @@ -2380,9 +2399,9 @@ def _extract_mapped_subtype( else: return annotated, None - if len(annotated.__args__) != 1: # type: ignore + if len(annotated.__args__) != 1: raise sa_exc.ArgumentError( "Expected sub-type for Mapped[] annotation" ) - return annotated.__args__[0], annotated.__origin__ # type: ignore + return annotated.__args__[0], annotated.__origin__ diff --git a/venv/Lib/site-packages/sqlalchemy/orm/writeonly.py b/venv/Lib/site-packages/sqlalchemy/orm/writeonly.py index 0f24583..416a039 100644 --- a/venv/Lib/site-packages/sqlalchemy/orm/writeonly.py +++ b/venv/Lib/site-packages/sqlalchemy/orm/writeonly.py @@ -4,8 +4,6 @@ # # This module is part of SQLAlchemy and is released under # the MIT License: https://www.opensource.org/licenses/mit-license.php -# mypy: ignore-errors - """Write-only collection API. @@ -21,12 +19,17 @@ object must be executed each time. from __future__ import annotations from typing import Any +from typing import Collection +from typing import Dict from typing import Generic from typing import Iterable +from typing import Iterator +from typing import List from typing import NoReturn from typing import Optional from typing import overload from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar from typing import Union @@ -36,9 +39,10 @@ from . import attributes from . import interfaces from . import relationships from . import strategies +from .base import NEVER_SET from .base import object_mapper from .base import PassiveFlag -from .relationships import RelationshipDirection +from .base import RelationshipDirection from .. import exc from .. import inspect from .. import log @@ -53,22 +57,38 @@ from ..sql.dml import Update from ..util.typing import Literal if TYPE_CHECKING: + from . import QueryableAttribute from ._typing import _InstanceDict - from .attributes import _AdaptedCollectionProtocol from .attributes import AttributeEventToken - from .attributes import CollectionAdapter from .base import LoaderCallableStatus + from .collections import _AdaptedCollectionProtocol + from .collections import CollectionAdapter + from .mapper import Mapper + from .relationships import _RelationshipOrderByArg from .state import InstanceState + from .util import AliasedClass + from ..event import _Dispatch + from ..sql.selectable import FromClause from ..sql.selectable import Select - _T = TypeVar("_T", bound=Any) -class WriteOnlyHistory: +class WriteOnlyHistory(Generic[_T]): """Overrides AttributeHistory to receive append/remove events directly.""" - def __init__(self, attr, state, passive, apply_to=None): + unchanged_items: util.OrderedIdentitySet + added_items: util.OrderedIdentitySet + deleted_items: util.OrderedIdentitySet + _reconcile_collection: bool + + def __init__( + self, + attr: WriteOnlyAttributeImpl, + state: InstanceState[_T], + passive: PassiveFlag, + apply_to: Optional[WriteOnlyHistory[_T]] = None, + ) -> None: if apply_to: if passive & PassiveFlag.SQL_OK: raise exc.InvalidRequestError( @@ -90,18 +110,18 @@ class WriteOnlyHistory: self._reconcile_collection = False @property - def added_plus_unchanged(self): + def added_plus_unchanged(self) -> List[_T]: return list(self.added_items.union(self.unchanged_items)) @property - def all_items(self): + def all_items(self) -> List[_T]: return list( self.added_items.union(self.unchanged_items).union( self.deleted_items ) ) - def as_history(self): + def as_history(self) -> attributes.History: if self._reconcile_collection: added = self.added_items.difference(self.unchanged_items) deleted = self.deleted_items.intersection(self.unchanged_items) @@ -114,13 +134,13 @@ class WriteOnlyHistory: ) return attributes.History(list(added), list(unchanged), list(deleted)) - def indexed(self, index): + def indexed(self, index: Union[int, slice]) -> Union[List[_T], _T]: return list(self.added_items)[index] - def add_added(self, value): + def add_added(self, value: _T) -> None: self.added_items.add(value) - def add_removed(self, value): + def add_removed(self, value: _T) -> None: if value in self.added_items: self.added_items.remove(value) else: @@ -130,35 +150,41 @@ class WriteOnlyHistory: class WriteOnlyAttributeImpl( attributes.HasCollectionAdapter, attributes.AttributeImpl ): - uses_objects = True - default_accepts_scalar_loader = False - supports_population = False - _supports_dynamic_iteration = False - collection = False - dynamic = True - order_by = () - collection_history_cls = WriteOnlyHistory + uses_objects: bool = True + default_accepts_scalar_loader: bool = False + supports_population: bool = False + _supports_dynamic_iteration: bool = False + collection: bool = False + dynamic: bool = True + order_by: _RelationshipOrderByArg = () + collection_history_cls: Type[WriteOnlyHistory[Any]] = WriteOnlyHistory + + query_class: Type[WriteOnlyCollection[Any]] def __init__( self, - class_, - key, - typecallable, - dispatch, - target_mapper, - order_by, - **kw, + class_: Union[Type[Any], AliasedClass[Any]], + key: str, + dispatch: _Dispatch[QueryableAttribute[Any]], + target_mapper: Mapper[_T], + order_by: _RelationshipOrderByArg, + **kw: Any, ): - super().__init__(class_, key, typecallable, dispatch, **kw) + super().__init__(class_, key, None, dispatch, **kw) self.target_mapper = target_mapper self.query_class = WriteOnlyCollection if order_by: self.order_by = tuple(order_by) - def get(self, state, dict_, passive=attributes.PASSIVE_OFF): - if not passive & attributes.SQL_OK: + def get( + self, + state: InstanceState[Any], + dict_: _InstanceDict, + passive: PassiveFlag = PassiveFlag.PASSIVE_OFF, + ) -> Union[util.OrderedIdentitySet, WriteOnlyCollection[Any]]: + if not passive & PassiveFlag.SQL_OK: return self._get_collection_history( - state, attributes.PASSIVE_NO_INITIALIZE + state, PassiveFlag.PASSIVE_NO_INITIALIZE ).added_items else: return self.query_class(self, state) @@ -204,24 +230,34 @@ class WriteOnlyAttributeImpl( ) -> Union[ Literal[LoaderCallableStatus.PASSIVE_NO_RESULT], CollectionAdapter ]: - if not passive & attributes.SQL_OK: + data: Collection[Any] + if not passive & PassiveFlag.SQL_OK: data = self._get_collection_history(state, passive).added_items else: history = self._get_collection_history(state, passive) data = history.added_plus_unchanged - return DynamicCollectionAdapter(data) # type: ignore + return DynamicCollectionAdapter(data) # type: ignore[return-value] @util.memoized_property - def _append_token(self): + def _append_token( # type:ignore[override] + self, + ) -> attributes.AttributeEventToken: return attributes.AttributeEventToken(self, attributes.OP_APPEND) @util.memoized_property - def _remove_token(self): + def _remove_token( # type:ignore[override] + self, + ) -> attributes.AttributeEventToken: return attributes.AttributeEventToken(self, attributes.OP_REMOVE) def fire_append_event( - self, state, dict_, value, initiator, collection_history=None - ): + self, + state: InstanceState[Any], + dict_: _InstanceDict, + value: Any, + initiator: Optional[AttributeEventToken], + collection_history: Optional[WriteOnlyHistory[Any]] = None, + ) -> None: if collection_history is None: collection_history = self._modified_event(state, dict_) @@ -234,8 +270,13 @@ class WriteOnlyAttributeImpl( self.sethasparent(attributes.instance_state(value), state, True) def fire_remove_event( - self, state, dict_, value, initiator, collection_history=None - ): + self, + state: InstanceState[Any], + dict_: _InstanceDict, + value: Any, + initiator: Optional[AttributeEventToken], + collection_history: Optional[WriteOnlyHistory[Any]] = None, + ) -> None: if collection_history is None: collection_history = self._modified_event(state, dict_) @@ -247,18 +288,20 @@ class WriteOnlyAttributeImpl( for fn in self.dispatch.remove: fn(state, value, initiator or self._remove_token) - def _modified_event(self, state, dict_): + def _modified_event( + self, state: InstanceState[Any], dict_: _InstanceDict + ) -> WriteOnlyHistory[Any]: if self.key not in state.committed_state: state.committed_state[self.key] = self.collection_history_cls( self, state, PassiveFlag.PASSIVE_NO_FETCH ) - state._modified_event(dict_, self, attributes.NEVER_SET) + state._modified_event(dict_, self, NEVER_SET) # this is a hack to allow the entities.ComparableEntity fixture # to work dict_[self.key] = True - return state.committed_state[self.key] + return state.committed_state[self.key] # type: ignore[no-any-return] def set( self, @@ -321,25 +364,38 @@ class WriteOnlyAttributeImpl( collection_history=collection_history, ) - def delete(self, *args, **kwargs): + def delete(self, *args: Any, **kwargs: Any) -> NoReturn: raise NotImplementedError() - def set_committed_value(self, state, dict_, value): + def set_committed_value( + self, state: InstanceState[Any], dict_: _InstanceDict, value: Any + ) -> NoReturn: raise NotImplementedError( "Dynamic attributes don't support collection population." ) - def get_history(self, state, dict_, passive=attributes.PASSIVE_NO_FETCH): + def get_history( + self, + state: InstanceState[Any], + dict_: _InstanceDict, + passive: PassiveFlag = PassiveFlag.PASSIVE_NO_FETCH, + ) -> attributes.History: c = self._get_collection_history(state, passive) return c.as_history() def get_all_pending( - self, state, dict_, passive=attributes.PASSIVE_NO_INITIALIZE - ): + self, + state: InstanceState[Any], + dict_: _InstanceDict, + passive: PassiveFlag = PassiveFlag.PASSIVE_NO_INITIALIZE, + ) -> List[Tuple[InstanceState[Any], Any]]: c = self._get_collection_history(state, passive) return [(attributes.instance_state(x), x) for x in c.all_items] - def _get_collection_history(self, state, passive): + def _get_collection_history( + self, state: InstanceState[Any], passive: PassiveFlag + ) -> WriteOnlyHistory[Any]: + c: WriteOnlyHistory[Any] if self.key in state.committed_state: c = state.committed_state[self.key] else: @@ -347,7 +403,7 @@ class WriteOnlyAttributeImpl( self, state, PassiveFlag.PASSIVE_NO_FETCH ) - if state.has_identity and (passive & attributes.INIT_OK): + if state.has_identity and (passive & PassiveFlag.INIT_OK): return self.collection_history_cls( self, state, passive, apply_to=c ) @@ -356,34 +412,34 @@ class WriteOnlyAttributeImpl( def append( self, - state, - dict_, - value, - initiator, - passive=attributes.PASSIVE_NO_FETCH, - ): + state: InstanceState[Any], + dict_: _InstanceDict, + value: Any, + initiator: Optional[AttributeEventToken], + passive: PassiveFlag = PassiveFlag.PASSIVE_NO_FETCH, + ) -> None: if initiator is not self: self.fire_append_event(state, dict_, value, initiator) def remove( self, - state, - dict_, - value, - initiator, - passive=attributes.PASSIVE_NO_FETCH, - ): + state: InstanceState[Any], + dict_: _InstanceDict, + value: Any, + initiator: Optional[AttributeEventToken], + passive: PassiveFlag = PassiveFlag.PASSIVE_NO_FETCH, + ) -> None: if initiator is not self: self.fire_remove_event(state, dict_, value, initiator) def pop( self, - state, - dict_, - value, - initiator, - passive=attributes.PASSIVE_NO_FETCH, - ): + state: InstanceState[Any], + dict_: _InstanceDict, + value: Any, + initiator: Optional[AttributeEventToken], + passive: PassiveFlag = PassiveFlag.PASSIVE_NO_FETCH, + ) -> None: self.remove(state, dict_, value, initiator, passive=passive) @@ -392,7 +448,7 @@ class WriteOnlyAttributeImpl( class WriteOnlyLoader(strategies.AbstractRelationshipLoader, log.Identified): impl_class = WriteOnlyAttributeImpl - def init_class_attribute(self, mapper): + def init_class_attribute(self, mapper: Mapper[Any]) -> None: self.is_class_level = True if not self.uselist or self.parent_property.direction not in ( interfaces.ONETOMANY, @@ -404,7 +460,7 @@ class WriteOnlyLoader(strategies.AbstractRelationshipLoader, log.Identified): "uselist=False." % self.parent_property ) - strategies._register_attribute( + strategies._register_attribute( # type: ignore[no-untyped-call] self.parent_property, mapper, useobject=True, @@ -418,19 +474,21 @@ class WriteOnlyLoader(strategies.AbstractRelationshipLoader, log.Identified): class DynamicCollectionAdapter: """simplified CollectionAdapter for internal API consistency""" - def __init__(self, data): + data: Collection[Any] + + def __init__(self, data: Collection[Any]): self.data = data - def __iter__(self): + def __iter__(self) -> Iterator[Any]: return iter(self.data) - def _reset_empty(self): + def _reset_empty(self) -> None: pass - def __len__(self): + def __len__(self) -> int: return len(self.data) - def __bool__(self): + def __bool__(self) -> bool: return True @@ -443,8 +501,14 @@ class AbstractCollectionWriter(Generic[_T]): if not TYPE_CHECKING: __slots__ = () - def __init__(self, attr, state): - self.instance = instance = state.obj() + instance: _T + _from_obj: Tuple[FromClause, ...] + + def __init__(self, attr: WriteOnlyAttributeImpl, state: InstanceState[_T]): + instance = state.obj() + if TYPE_CHECKING: + assert instance + self.instance = instance self.attr = attr mapper = object_mapper(instance) @@ -535,7 +599,7 @@ class WriteOnlyCollection(AbstractCollectionWriter[_T]): stmt = stmt.order_by(*self._order_by_clauses) return stmt - def insert(self) -> Insert[_T]: + def insert(self) -> Insert: """For one-to-many collections, produce a :class:`_dml.Insert` which will insert new rows in terms of this this instance-local :class:`_orm.WriteOnlyCollection`. @@ -561,7 +625,7 @@ class WriteOnlyCollection(AbstractCollectionWriter[_T]): "INSERT along with add_all()." ) - dict_ = {} + dict_: Dict[str, Any] = {} for l, r in prop.synchronize_pairs: fn = prop._get_attr_w_warn_on_none( @@ -575,14 +639,14 @@ class WriteOnlyCollection(AbstractCollectionWriter[_T]): return insert(self.attr.target_mapper).values(**dict_) - def update(self) -> Update[_T]: + def update(self) -> Update: """Produce a :class:`_dml.Update` which will refer to rows in terms of this instance-local :class:`_orm.WriteOnlyCollection`. """ return update(self.attr.target_mapper).where(*self._where_criteria) - def delete(self) -> Delete[_T]: + def delete(self) -> Delete: """Produce a :class:`_dml.Delete` which will refer to rows in terms of this instance-local :class:`_orm.WriteOnlyCollection`. diff --git a/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-310.pyc index 8a90129a196c27f328faaf3a69c0dc83812ec6dd..839aa103da3792c1bfc79cc7ceabcf4a73beeef8 100644 GIT binary patch delta 19 ZcmdnRy^EVGpO=@50SH!SZ{*s*3IHx_1g-!8 delta 19 ZcmdnRy^EVGpO=@50SMxmHgauX1pq3S1Ni^| diff --git a/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/base.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/pool/__pycache__/base.cpython-310.pyc index a9bb76b674b97275bb47e207089ff3343a718dfc..91ec99709f5ac36ddcbe6dab1ce4ece606ec8a55 100644 GIT binary patch delta 373 zcmW;FPbh9Xg**t4AJ#2?H+t=pt zH|6jYO8VtO$}awtk^?!3A{@wt8?(pv`s)4p&ZoFUiZeM)Cc%)o9ed4?uy1-9fSY{{ zba4eTZ^I-OAT`(^^L<7eSm$so3#artddv$v4<1Z&v=~uOA7f55Qm-^9TCxlV$(q^o zmQlH@h@PbbG|}q#x!9~rT97jju?slpGp4}9-0@Fjehw~PLZiAwKXyn>xUfe#$uJmE(vCxx zPMU!fnblof(~0WB4b?7x=O2)+T+nMy0YEhHf+cG zLdE*W!$lonGA1p7Rp- ze8N>K;F;e{R|74S={|vpe%zzF9<5xIC%-_!*(km|a}D`)_v|TFslZdO+fek2qSKv` z6!es1i(=+n*rk=ZHtcb6J`y+}gLe}bbnflI73D8{;D)k%J9wlA-w|H;_To3N$~Twp Pm`)e^6QPYTM& None: # needed for mock testing del self._creator_arg - del self._invoke_creator # type: ignore[misc] + del self._invoke_creator def _should_wrap_creator( self, creator: Union[_CreatorFnType, _CreatorWRecFnType] @@ -835,7 +835,7 @@ class _ConnectionRecord(ConnectionPoolEntry): # time and invalidation for the logic below to work reliably. if self.dbapi_connection is None: - self.info.clear() # type: ignore # our info is always present + self.info.clear() self.__connect() elif ( self.__pool._recycle > -1 @@ -863,7 +863,7 @@ class _ConnectionRecord(ConnectionPoolEntry): if recycle: self.__close(terminate=True) - self.info.clear() # type: ignore # our info is always present + self.info.clear() self.__connect() @@ -1040,7 +1040,9 @@ def _finalize_fairy( # test/engine/test_pool.py::PoolEventsTest::test_checkin_event_gc[True] # which actually started failing when pytest warnings plugin was # turned on, due to util.warn() above - fairy.dbapi_connection = fairy._connection_record = None # type: ignore + if fairy is not None: + fairy.dbapi_connection = None # type: ignore + fairy._connection_record = None del dbapi_connection del connection_record del fairy diff --git a/venv/Lib/site-packages/sqlalchemy/pool/events.py b/venv/Lib/site-packages/sqlalchemy/pool/events.py index 8366b7b..762418b 100644 --- a/venv/Lib/site-packages/sqlalchemy/pool/events.py +++ b/venv/Lib/site-packages/sqlalchemy/pool/events.py @@ -82,7 +82,7 @@ class PoolEvents(event.Events[Pool]): return None @classmethod - def _listen( # type: ignore[override] # would rather keep **kw + def _listen( cls, event_key: event._EventKey[Pool], **kw: Any, diff --git a/venv/Lib/site-packages/sqlalchemy/pool/impl.py b/venv/Lib/site-packages/sqlalchemy/pool/impl.py index 84849ed..af4f788 100644 --- a/venv/Lib/site-packages/sqlalchemy/pool/impl.py +++ b/venv/Lib/site-packages/sqlalchemy/pool/impl.py @@ -386,7 +386,7 @@ class SingletonThreadPool(Pool): def _do_return_conn(self, record: ConnectionPoolEntry) -> None: try: - del self._fairy.current # type: ignore + del self._fairy.current except AttributeError: pass diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-310.pyc index fc4443aaee3f249d605759a3370519e9ab10a88f..551a9987355fa54256ded565b48b23bebdb77bd9 100644 GIT binary patch delta 19 ZcmbQKI8%`;pO=@50SH!SZ{+G1001m~1cCqn delta 19 ZcmbQKI8%`;pO=@50SMxmHgfd~001bc1I+*c diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-310.pyc index ebcfc7bb73882afd4326b32acb24cc82c39fa584..6e774c6fdf43b6cad7451e0429e8eab2abdcfb9f 100644 GIT binary patch delta 19 ZcmZ1?zeJuZpO=@50SH!SZ{(WA4*)IN1fBo@ delta 19 ZcmZ1?zeJuZpO=@50SMxmHge742LLJs1L*(& diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-310.pyc index 9656ddf5f45c296eef612638359b5c7e90057cb1..bf1d8294f95e2b910c82284fb89dd69725f9a3d4 100644 GIT binary patch delta 21 bcmdn>j(OKRX0Ci*UM>b8Se?C*%iuczQRfEi delta 21 bcmdn>j(OKRX0Ci*UM>b8h-cc!W$+yUP7($; diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-310.pyc index 5285864744f7b421fc86bb33a7ee200774a94237..be2cec7ade490ce939338632dedb23a9fe232980 100644 GIT binary patch delta 19 ZcmX@Ya)gB|pO=@50SH!SZ{)IK0st-d1Umo# delta 19 ZcmX@Ya)gB|pO=@50SMxmHgZ`p0RSo@1BL(q diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-310.pyc index 94577498826dd44a3378afa8ba1c2291d4a1d185..a8b647f93db8da33448218e03965040118b25d0f 100644 GIT binary patch delta 19 ZcmZ21yjYkkpO=@50SH!SZ{(WE2>>h>1bqMi delta 19 ZcmZ21yjYkkpO=@50SMxmHge761OO;O1IPdX diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-310.pyc index 174703e329cde10aaa6ab4ee6704d7a9a729cf46..4469e9b4e4fca26acc8d7b53072ad295f4fcd9b3 100644 GIT binary patch delta 21 bcmaDdh4IN0My`BbUM>b8Se?C*E6NK1N~{J2 delta 21 bcmaDdh4IN0My`BbUM>b8h-cc!73Bp0M%M*U diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-310.pyc index 047dac611c6cb958a3e653eaa921819a16f56705..d27782a508c771e9ab23d5f39dfd98c0e192a963 100644 GIT binary patch delta 22 ccmbOfF)4yKpO=@50SH!S>t`(4$jhn&07IJvwEzGB delta 22 ccmbOfF)4yKpO=@50SMxm^fR_>t}4-$h*P{08e%X^8f$< delta 22 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 delta 4535 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 NSfNRhdifW=_HT*?qj>-T delta 1320 zcmZXUe@t6d6vy9bw~o=lDp?pSOHcw!X(z)FDH%!&6xuSn(iSO{LV=ZST^K8cV8W0k zV>A9EiGKaV5b@U^B+g8;HCaeDSAPxNGQ{~~b10K(WIEzDMT|N{?|G%n=zDpeoO|y1 zbwrKpE;Fe$I9H4g9(?Ur2ZUScWN={RpFMYQ8?MmS#%V8%`v)!Ky?PpWvl2#RF*jt0Y=Jl z=(%XDYzt8obLFjc5!MPFokX~zF<~=Rkxye-st71Qmn1w?tzEZTWG|E?id+_ocgl0< z1H5i=BTLP+1BPtg<&f1x(AjGfp$6>*>P69p$W>w9zfCk@6CCz*d~XM(VxYQD zba$b82d#o>$6?jG@t7k%?dGnw{T;zTFxVOB=x zW;Ye!y_%KgnOs^t?pROR(Q-!zscgbGat+6K4z0hzDfEmZ0w$Q8ZHZdPoO&|il5>W> z#hbMTYQmSbyTn$RTzTX`$TccjvBs@acgfL&cfV0ykH?*5nB|C*3?1VRgR@L)`a(US z-axpsEz}hVhIaMt#;Ds)w{gQgM)Mf-?Ho z*8M9HhU>B@j5q4;(6e~yG2ed;7O=KHkDfwd{k%A7SzaBz3Y)j5V2v8m}vT10_&qmaj&ni9QVvS?B0PZOu1%6~<_#MS&Qkf(?@&Cb6YOFY>!uoOC|=O3Tx9=p)uoF+OH|!uX6K zA8`5DPxJ6A#th?Y#&yOwjPDpX8MhceF@9$J!uXZ(JL4|~k${4sWauQED^6RTBc|MV ozqMT}UrGIJDc?(HS&A{i7TI%mx}=iR%dVIDr^A&O#B9J delta 21 bcmey}!SuU>i7TI%mx}=i;+Zyb6}A8XNhbxl diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-310.pyc index 060bf660d87813e90879e2407b4b49d1be9168e1..5c91bfa7ba8ac9f9228fc0a7c00a308d47adf4cc 100644 GIT binary patch delta 15958 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 diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-310.pyc index 93565010084f94a774d81ca75b72aa0ed31e0008..c49c9f177bd310a0252f72a8a187e860f4b49285 100644 GIT binary patch delta 533 zcmXYuPiPZC6vp?P-Ay)|KSYyQV??l5HFfPlsUk&fLmJ&G+7ep@p+#j2*|5n;cU7q1 zAA0g(s0Tw8t%w)PfQMiO!Hdw=Q#~mnf++Q%wI{LG+0}vh-f#Fm-Wz6C=5TEu2|FIw zC9$52b(~Lrno0cHfi)hr#AGWykd2HJVP{}F@9-ySOi2YJVFli?x1G|&dz=8eHw;3b_XmvEJ)%8ko)H*A|O zEY;IotvVeG5pAB7inb*JV=#D{K?$5XTr_ap4K<{ z1FYOQyjVpGPT7E&xK7Mf-Ej3erG{Q(Grb>bDKEsQ^2YF1gqFl()mk)rsu)ug1#C@W YY*h(y{j?*a&b>1&6+N`)>|W@90Yb~GPyhe` delta 536 zcmYjOT}TvB6rS(S-PxISchlO^NdoD;)v<>_BP7aY-C7MZ7R~ZODkj+3MqjEsCIuA{ z6dn{J5{poJDA?{(M(+umK7`RrMD$V^L1xe|bZ3j`!uig3Ip25A;oeKnuvS6ROC(~N zI!9UaiKW-&=cz8lN+nNj>etiFzB800gbfWx(FukZXear zB<&qnbzGCPZKR_j+jey`*z!upFQ7+W-hGncG_CC^V~%F`o<*6qb}r#Dt#%Gzf%2I= zp3|*NA707NnVn!CIXT%I>v@>aXlS|RW zzGdAI`jm1KnDvsjL}SC>f9+2_3{F4 zBrt_p>Q&4LETMZtLUTjpZmmMA6tcP?HjJP~#Qc)5RKQ)YP@CDHm~~rKiYF z&l^`f?k1`^sgS!H19O=D=}~M{)lL4*BUS0-Uul?=-lUS&|0gw+>7P-UzEqxuk^7@| zIM&^K0YSWIR&Nbe&eW1|5fRbSBeMG!)K9(bpO<$Anqa(C?>6#~o*vHfn9iBpGU)3V Ql-GymBWR`Ev33~00U@2OH~;_u diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-310.pyc index 4ae1a0f07dc3d9998b86d1c2efb55482ce1b77ea..6525bab1ee9a63d1136a7edce787b7de1b12dd2f 100644 GIT binary patch delta 2821 zcmai0dr(wm6u;-PEQ13fuUKe(O<+0$m7bHLh6(2yR z9j#S|0>zRnD{tmZ)7Z-yYsw~jShGFtF{X`Umi>`g(>WiCGA+amXU})e`Of*B-}kz& ze5!VQqJ~$7hYwQd??BltC0Q?r=iRYJrIDHbGZh8AGf2^u2Bj3%K{2cX(o_-E03AV2 zsqa?W)lLA#sp_T%WgV0T>t_CS26coqKqnLh#V8LbHd9WWrLfYYyK41&>ISD;z3Eo( z^f;?G?XsF2XS4WC!c`@Nn~Djol%(J6sH$>#oPLx3NR><6#U|BF!_rE($EJz|HUw8W zgzgoIJWGlswpuielWE!xP!#V_GKGN|qCizG^lJh9X=(;|@#3rz#=X-H!f<~`u}gR8 zx)6&gw!0^{sKL`E!{GpqurGodtgy$Mx5>FV>T@E=rpzDywEVysjyl=JvRCBC?rhZD4Vo{Z4%e9v_tSHuDrK0yO)ogKE#C-I=qDrr^{x#0pa6Zu0QV1V@mpj zX$Dff(z1yrAh7wrhPj_|JjFjRSi*L#AUHvwm78Nf>-Xl1Uj9O(Qq?HWaU%K zWm$H!1W+r_St7obWh3)1S$Dz&96vh;e1@2PDgt`k+tHDGCuM-yvBP~-ZxUTmUJEIb z)S@s|_^#4v!Lzw#gRi&Ng4*JE%N7c?1vwtVPHm*IXK^MZ@QUV$$4H7+76JBPJBH?s zy^9Y3QF}v14rhwQ(<}n*#Qo&(p(C%c2M7ZdO$1~dK6OvbM7|Ey9PuPuC4jZ81px3e z&R?3)2S86I4j&l60Sb8@pIa(!03eybIr-sZ2JHGZ)br#1TU4Hafr}obqKENB{z2Gc zG(0>B61c;w9QW7aJNW*xapUDB(=VGZQJSMTL~EhEyEH2djQ^ zhDJ0OBqrC>*dL}93YSB7X`;H^C2GkOXid)Ik^=jXYd4@GUZJ=jv7_LdCCrd5M9BN1 zk!QxS%dYQof0K4E1{Jb!EGP1W{ijI)?S2`2o5QiPPdhUke zBBw|FTg79}Zy^Y~T>Bs#vx}aAoA6@M0T_wx#fM-lE-2YgXYS9EufT?<+;w0z7M8{X z+=hDDMz|HPlsyX>*j1hl>BfcfK|q{cu2>!&0OF?5^J%|yJ_Ms9-bjVZv_Vn7mEPl&6uVyft~2nV}p5mE54>D z!wx*7e=tghb7Fr)joV8PSOvZ8PKWNOH%?Ul1{C$?N*g@_=T?q^?HF3SbFjSnE^(<{ z_(E+8bQ<5(&H?yrZ&Dq=S7@tmhwt%t{VntsU2YwPkqt>>Hga^JWB(yJ?#JAQOM%Ea zXK1UeYIJ~x{zBiHtt0z7{Fc;mM@50tk){|KjX!|wGzx8NAC_9Q(YiLH$2bm8uFDCO zHUV#6zfeX`#Les5U+PH}@su#pdw<>G;WpV=xDO8;`;w%-wVj zmK!rRn}GPrYDu7(r%P@MworUAu5W3F4H)0r32k_+HJQk{*gCg=Vj^kMStGCQb3ZKR_`=E?`s7#>^q}F$vl5gBHV6N?>P)G3nz6gCsSM32-(Ga?C#n_<9Yk6 za=Z*{_BB&iSN6RD=Z)8&v8uLeUK##mlHVorgFx^bEclHQohk();;52 DRp-D7 delta 2904 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 delta 3774 zcmZ`*2~?Cv5}q1n1{ki9b3kC^WageW2`mp`CJF>11_te{aV znCR{*xEha`ApR(a;;M)k^OSg@j2bUQ6q8NVsJlk9UHzjo;kmrWH(ym(S65e8*Wc?d zS!}szVV7rTr~`}98`NlHFijf;R=80+7~8ZF zc3QTE!a^gr0u`vy)4c_*VTb!I=)@Bqi(waz?>hlHaCP5nup4td!{CAV4^K6Kh?APM zc-Tt|PsMgG6}W9@euQ{}9SrmeVGi-__}F_i^Af2mclm-8UlHsj*iTT4H*~4sD30zo z3p@^yCY7LyfLnb@>?=IvGeXr&Gz-sEJ1KJ+wMIAJ`{08Lzxm*e#eRdVc?h&RHaK`- zt6#L$PA2G;!Y7qU^n+f@dS!f{67K+$F_hP7=)#PGm?*!#V&$Yg7*nb zQ@1dY?J$S5e4EvbC2MkuvI{c}`DsF0PI_UwP#`3d!9{{;1T750Fg7SL_85to1aA}Y zos|>IBCuefmrKb!L5g}(*a{8A4-g#0OF<#fiWb2>Hm6C!)7rw4sZ};H889x`OGQkm z6!U`r2rg0{Nx`?qlm7*_>Jy+H{X?Q44pTx#+n609?g(jsb38}IY+42`3aw-Z>DAv| zC6b#xeCR5p22AKbanxl}nzr<6BU12|=E0L?5QnII>yVDR!f-mt!eiLh8N9PW;v?gO4KuwV=c%qBY00H=&@Fv`6J;@CR6)3?^99FOl_)fzq zmY?uQVVcs8%?lEPimX+hUF2D2wq76d=|ted)^o=97Fk22n6;=w0q^7FrEh~)+_?0F z65Mg-@^Dy=<;!E;_;H4jCsW^32@mjx<+`blNX?e+8H;92ZzVh>MGOJY?|+E#o$|}i zy_j37C?3Y(-#?yGwK~bW(yF!C@NiOUx73wrG_Z zOkRx7OQK;mM*g(}wxj3D`>Z;wOH<%DW|aCt6_%DR0avss3ugUmNZAUg5)YP%j+*bt z6~CNkh@Iu_U^SyT_}S*92~>hci|q7V;XDmrAh0FqAb6MHV}i8=#|i#Uz-!on7;oxr z7+K+^;@wt;$rU;qJ;feM@Bsf@5o>K!%}dKJN-wyC-&V{U%11+9ne-|cNApHROL&oG z4bH3V7o{WGNXmZ1_=-HLS){8X@Sy?TUU{ZHNf*YmNPT`kc2`ETUK6n83cxXxZ(Tp` zC{rg)8ZQ+S-9{mT=FBDF&bV9CQalE}JipGo3SQvitKPU~sRDo7IsgK3z&0K16DMx# zmdkwrCpWoSsWNl3Gjr4H#H1Y&mYQ$K`ALEjg0JaR)WwWGQ!w!q)>jRbK3=BYA#Dzy zS50uF2wt{~;S{hA6ZiPTDO|KC0+d*_N5`6G>z=6$>D@pjrpB0RG?O)Wx4P6!_P|wp z%gy8f93gHtlf&_$xYJC21NYU4W^x=Z+t(<`uC(5C_KGWD?N+9+m+rp`=j@;EXKHXM z6gRI+4$~+NG%*J|_fOy<&%?pBp`gRmT0L`I!f|hH1mm5xF%13dCNRvddzay%y6Fr( z>eCr6t#`5EEk|l3SW&Nw`2EH1sVG`<5QV`{G=>;IeqLW7KB$ie_GBD)AV^6?UV?KE zl(UjqX!I2Q4r)Qu+b6HF9Oh+-IH%EH0sgq^NCtc&{&K_?*fUbzRLDMS^PBV#ij_@2 z`Q2hZcS5qwY#}elke*wZS@?nJBPviW{0nQ2O=Z^V=0K>!@a9nV5lm?=253g(@xSZdnR&83%r|KBSV3CP;O^i41x1 z^NYoc|8>>g=cKcHASG@Hf$1da{yoJvPI`b|Ogj0QMN}{wPtaRRHho7fo|K=u?cvhCJ}*06pf9OF9|Gya uMb}l>NFsm9uOaac{(P?k9I&lB$R$R$L^DOU#C3tatz#Vfjd8T~`0#(%2M8(v diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-310.pyc index 27107dd367aafa1a747ea3e04ddb29712acb0498..0f1d60933e55e944699eed9aa915db0f8f04d34f 100644 GIT binary patch delta 45392 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

0VNuB}r*nlR!=`JiCBrfzw)S7K2Z;3+ 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 delta 21 bcmbOb8h-cc!)!_*MI*$a` diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-310.pyc index 1fb7b39abd06ee69c94503bcf4310bd18b23ed5b..8d218c183f51ee7de8ec133b5b827abb9d37ea93 100644 GIT binary patch delta 19 ZcmaE>_EwE6pO=@50SH!SZ{$iA1^_ss1q%QG delta 19 ZcmaE>_EwE6pO=@50SMxmHgY8k0{}G51Xch5 diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-310.pyc index c1455f606a609c7349d07f1d6c200925c09d0871..6921474c5bdc14d3d42463c652199df23ac210ca 100644 GIT binary patch delta 3817 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 diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-310.pyc index 1a41e034bbe3dc93c9b5a8c4cf43fc60eadf9bd1..e6443c8bbe813d8ed4444b33c92094e591a5d845 100644 GIT binary patch delta 7480 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 delta 7389 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 Mg8#M5%2@e-0Ag;l+5i9m delta 36137 zcmbt-2Yi%8^Z)JUa;ZQl0TMz8ozQy?y@N!Mq8!5I$Q=;46!wBZ2wsq4K@dE3Z75*H zuK0SkS26b2US7-DeP7$FB9^zI=zqSmclTV*!SoO{ZS#QcW?6o(fi&$g(4t4?R^=Q9i1J8&6DTJ_Z3!la&}_41Hnbk zB8CeH?(FQ$a7Ti>IJ+=hNN`tYSB5+Jx>a^}c4xSV;2zE%40k5Dr?V%+T?p>w?8R_b zf{O#rV$O7>SK+UxJ4?hcMjFH?(q?a~Q*c{=P1i!=1x9Gr-ria)fgP!vhH(=^RP$ zAkSdxOIwuA=Gnz7!oRb(HL-1thWQI!!p5mM$Y~GC39rg(I9u3i0-_*)!&S_Mi=NU)v zbmw%2#}homIfLN|1kZHNWOyRMvz)USo19v*twYDIRrbMPKHYZz9p4sJJ06K>At0v%bd#?p6hc}mO0C)=LMd5o-;i2cS)z4 z;02zA3@;~mk>^Z?%e@^vXXV+P9&a0ON3Yl0V};DKQGNxLFQ)tu?;vkxo^6Gl%2rOd zd7Pdl+iadC-n6YL&cG_~s?`p3 zXVo^lv(odNr^-`JP?dMg>S|(H<5@^77kc}8yRNR;YTqiHYpHatM^UNTDxHdQeorms zYQ1ZzSwH31dCuHs3wX}-_V)U{!-!F>=gd6YR)=#PRi5KnPsr=3ZmoBq*G=WA&T}&C z8FtU}9=m6QXXCZf^B2z+&w1O@oa+gHt7jYGZv*~TyK{rL!yc(F@Vwx;z;hvqxzY2Y zXQ$_4g6cdkd3Jj)A!t)o3vc@VK)q+r0pZ+8V7+HAL3IpWO3)@^8}wX8Y%lZnVYZv8 z1>$m!C)Z z>pa(^|JQpb65&=V*zY+&2nQHp8|4prZlL@Pq`vKxyU}wKzJoAt@!U!!w|aLF-}5Pd$a5RzZzJ6(>PD*b0xG-Ra|e~(u{9u_7gF|4 z&s~(g%X^{s0_xR8RC2fH9xA!Vdl50&N%?y{_fh^n&RGYb~is~x2Z%OdA zX1T$eTGu%$QCSu2-ll(RZlsLz;WXu~@wv;rjlmUdMh|2Za8p%CV(e5kWs6f)8cK^} zRULz`wka643i;JYd`Q+K;RenDR7OcS$5mckv(e?|i1~xTqS-{Xa$Tjjs&=YU)vDMLw)?%l6>1aO07ckd zQR}UA+Wj@_J>e9uQi+<(a#d7S)VhG>e?NFdyUAj?p7*n86Fk~(#E_xH!I{0%Tjf<1 zi^^_cvYy)aJ!DL&o2Q?0`-LQlNrW8>W zx}whOan-2m8n3F|$lX!9sM6WOwa)K#`O8;%E8VV2cTJqYEP5H(K+-o4rxa`u!V|3T zILW~>jnXqO6&(+M(y^6&Tt0ZEPMLDr%oQp~Fv;3Lf7E42E=Qt~#A$=FVTZ@#b5*Qp z5ggQ|e}GXvG5jlHL{|bbEfQ3m7T;e~U4jIShFiE??y9QlS~up7pGM;gCu;eDM29%8XHB>?2nVIR#T&imf z=ff{{og~G=!!3Gbra1gy;0<;vF6mPf`=tm?(Qi zwenW1tOAkWMdGOIgZADxIM_{13*Om#*`QP4l2%^rTUS}-zsxWw>C<=EDNyB*tEg7B zWO5PmD}(#`l#Kb`lxiJy>^g3XfV#8=@SOe2)%0MSzH3EIa7W+%{TtBt=}7KEVvRr< zW!d9axys#S(dhZX;HQ24Sv=p^9aaU)`VAfq%@vEV-BsmXUz`$7Dfjs;SCq&x%>^`< z>#oDk^|Q<9qVf8GxuQJSb)Zii4(=KFoOmF(cu-M3D|acx8jK_WiBf8+Ysk|F2aOOr zgD(u4D~1LO26tWfCm_W9A1@){^h$57+vBcvo5kcopghDpD*Y?f!^qYmVasXSadkgc zgo2k1K8M808Zz2ph=a3-j2GL2JBM`d^av>3NZ?u2UnmKu&!GmVpuzdUSB8x3@FEo+ zZysBGmRDE%ma3P4{&KMA(Bk}805&3t$);XK_O;;Zp`CJG2lxgOo;}-wR}C$6yh-`v zqxIb9WryH9LyH`LMZOdA`Dy-IwREX^E7)mRzJukfKRkX|$;hm?z~fUSuLgHicAtyB z78it5{p-kqsb^5p8womLbj3;g6u2djQw21_eh}4GO@a7PmJZjTLA$3x!1#1c>#Ms2WsQnqj`siGm^& z_msPC*#bIFi{Lr6VY#B}kO+QRmED3zy9^ZQ{n21b^%mg@Zm*swJ`Fxwy{lPFW8`{= z1l=`5<}?7AC4CvtYe;@X!UGn=r(^@!@k- ziKMn3sqL8G)W*XZB{ZVt)s;2lZVmoWJ3aRRL`h^EEL~S1EAl<|P^%gfAc!{Wn-y-%Au7zM}q()GRn3E>)d_wdW1U z<I=hWJDH9oH@B81`$)exM&^|G9%x(F8qU*1+E zP6XR;J0^ZUoUuJD^U><>Y@b+!+XNfx+lVcPTV3#x=(Unc;sMLI)pRfP;rVv zkHc9WufJSX@FvR45Q`bBwhUObvXj?wx$Z=7+8wUF_$M*?OH`z|Js#>x1HsAG+Hh;C zcUAaZ9&e4e%0s&vS9R4rhY#+)F123^h{8>rY&xqPLix}ru=28g;%~ugF7ssZy2Nv6 za4_@o{E?W3(I|Qxc+$BW?GioSgy9G`bJswKNTl^x@a)S+3;SVx`HYky;7R7o-LS{x zvijdLMjG|LUj$oS)mL=apL|6-tNB-zoXIo5p?G0^8|ru(i5m&~1B_NwOghMmY-o54 zxgD#qEEgtOja!kremVU4Reo_6o#fd{52eulQmw0UVKZ<}g}>6y z{*I5`LzOwfX8YPX?xX(I%?&mjY#03SV8-ED`(6*6wbfCog2R>9tLAxhc8dYy2C(Lk4KnP*suRqoekR*=3LleOd_1hTYj|= zh`jo-hrR{bwZRj2^%c{Cz3=WMZVk@5yZdN5^R)4Hk~X6aK;iLkswQVMcX{nPw=c5S zG;!>v;Gw(6wP71!`O82|$E>z7!JqHGIp9SWQ5)%m;r#@YP8hxo+do3yqu+?vyi~r2T3(E~jP>h5*)}BaBYBgO;GuhS0&gMr5t2ucFhN33>ZyX}Ak?^^ zw6r+KsGobn0{#F(tKlD!{RxRBmetCqsQ4!m)>43(M^t{Cilak;-7~4*QZE~brC!h- zvYUlHp)|scF(PmWaEri2XneOJ_tO~Ij1{stOe3aI!|W63xrA|yMlUfG(gyoGdh`(K z2NRODprAW=Ceh&`hho=44;v!>rO~!Lo^*(V{?3#Z49egx!9NAeWt5oD?M$mSy{2$tTTALt2?o^nNY zo96?E9vRsbJrlAidbVRz^ZV;l}WBr(%D+|1=->B_x6 zADzp^i=IW<{6`Ldalcav6`U06pN(N&V77F%!TL}^fF9`CO2c-9^wWyl z@bnF*)^4ovx@aY&!ip+d1aQ!(>WE=D#Zz5we9amN!=8#~89fXnwNzKFtD*h2mqR=S z-r*L0ucCmNR`f^}CO&OtHu~x4QHeK#?H_zEm(8B-$PL+f$m@gY5A~e98O@ZS5bdig zk(`S%ZlAqIOo-#HV>@lv%&HaDbWrVGN-?8)Xi^qES+g0b8iS8N)T2`a@(@LB0mMGz zJV0BKY&&d!xQ}-U^jbV9Y{y2!tl4D0ac2?g2xY@*tK5DBYi0}mIWV37(=gojvo%;bD z&_!KD`(Zeat7{dro|%Y2D{40`W&Iv+0YjQvwUS0|$;2uuWp7lk8-5Y(b`JqA%xqwR;cRANK{IJ@(TAlpP7?!aeYh$;ru8H{f$NLF5Vd3qFZ+p)BEg) zmbTvOI9l?! z)>qW7is-@wTZtlr050~3-rQ5XQhEUSag=vvkmug85wUYPn~q1k%5V0!(O?)zbWF4+ zL9%eB@~)sKcQjZ0FX*d#Q4bI4CwhsJ&fKA?L`Cau1DZKRa6GjxEEeq?f8}0<#uSU* zVqnZOn7PkN=b6J30#m#$b21+k_v-F1R=uIbHo-l$>3aBd(Lx{TEn0WwcIhUBP4!P` z5JF&k__h95Z!xo9pIG%DVt)exTWVh)F)T0;B!iI9bqQKhkysioi#G5RNQP4-#Yo&G zH)_}e@$~Ktx+I-bbdSPjwx~Q=4uFj3B*s{cqKhI?ZH80VP(;1b=#xb#1Iqc7yrZY} z70zB9f_z5#<87zVsm>De)P0ML@_4c?ReuLXRp`0CVr+`=YsWw_%Hc*?ZD{I1F-ba> zL7WwO*I;o%t`ORNOtjNC3=wTc@QfDWmb}%%$xp4<7(H#bG0gObC63KIb%OY=(MN}f zid=R9?0C4b!Dum{eM3cFfR#nJPpGd*Za~#UKnDP|0>tqa>tra(%22i*5I1-!vNs_M zMbq=L$a72e70P&ND~>r3L<2>SFac*it;QwzaN~+K!^zD-}?Gt;sf!W-aK5~vWmsEj02m3aE5Ee8rtAh zR{O)*zKW_fF52&5UX$}|0GID5ai$Rt9<_uW22hWn6{}H8=OLo;%s9rRjJ^+NnbctbQaI)+sBIj6D$!qG+74>RvRm@3|Yv# zn{?+#_?nq+m-b&X?MUsv*t7J@9b{YGXPnp-xR3DaZL4j{;Su%11z2pB^>VfJkE|D~ z#cHWW)~3|UTKiV1^6KUO)B`ru6RwDr_n>k|J>A3*Hlj@1pMJnL#kMqia|&UkFy)B) zlqkm9KGa4=ZRR?mX4MA-gEj(ftFwq{7Aom)2K~+UNJ3ghVgRD~jk5jCNC11ieSh;v zgSOQz)F#4d!8n@;r^V(}YB;qvheX~`pUM=e^fy9LMRn9d3&Ly}P?r#COD4Sp1)Cl9 z4ko}~tBF?X0O7S_yaR;SigD8F)8cSitJ?^twf{EOWNX4|qYhI^8~0UIpO zEuL!ZwR!#@Ae8nzhoi>&8kn<9UayBw5;MlHrUGXM9*CN$0te@GApiRq#6eC|t@OSF zt1Tnejtqx>ev+8nGF#HoE&WTU16Jk%j%Bd^V4AqTFcsCw+%BBYNPYEmQJZ5;YSz{^T{uI$9ykC6xsmYN z_avZ~z%7rUu!D}-DD+YtDC2CkfKDuVr+b=vxz~3_HJ#tHFG=9M2jq`|(f3H;=bbrx z55v8Zww*3)!~D){1gGV?dZtKU$tT~B0~wp)u)}OZqYK@e;O9myH}qFz-$KIPntRQ@ z<2;}=)loQ$?su&5qVWwI3-x<5MIf*pq&txC-sl2ANw>DBxDW|D<7C@g-U72w46$`t zyIqFhxYR}9!dl@~8- z0&Zs9G1F(@bvNq&9^=Ym1#tp#M0SoM)I&{K*%QyHAOQ7(r==wfcfwv;I<2(0xndhR z9j&>Muzsw8VUyv`y~X-}8x6)JG6KDWMv6{)ZslxNQMHP0TG6%}*DTD5)tP9E9ndp? zus>A82y(WHT|a`cS1hMv0CfXuZ{+re0(&o#n^1@il{ss=4cR-8Ab2)sO^BS-pOI`p z!j6!=+#AUL4ar6%mgOG84@u`yE7!c0|cCu_>U!YM|>dm3frQ&OQXE&N;TVt$Pd_rRfK~#b6 zH(v~znt;Z9EaA(53Dd5~B)MBrPWF@{N6^#f-|P}XJN`@cxP?~`dVIcEBgE~YJ`2S> zM<2Eg4vTLjGCF@VF(bKDy3JEM%^aVO1^=+VWr-NzVCmiZ{UxHKgXg42|F%Tr_r;V8 zXW;H#h1=)b$Wd)LwbET%zRDc4@Py`>_-<(G*&?l3AP;OmflAm{=F+vWGq4#|UXR)5 zu)BN@2=5|U3;g9s{(&q9!|Y7^qKtiU01(HP+^27V=SCTedKB63kQ}3=rHQ=1N1o-{ zrr)m+om>sT=UE&^)gSVRW3dfnrhg#&0ZGCT!Q!9S&edXpxfy3}CgMb-g?@Xr=%4hd zF|2xqE?h$=75C|ZCq(<;&$nc1_Zl%ZYXsWh^W`di?;0^`D8t<75vrmMLj!~|7=RMw z!MvCqD)foHG5}umRQXhUi;mJ$9QJ5GL5%+kq52UN9P38z|CM)vc-G>SASmYU{LtKL zu~Ujq^!sbYqQz$u0bSxUhDsZ)HQp+}S_&?faj;47^2~niE7Y(n?&xP7KvN$hBH zH-Ia*dK~XRtPg^It z*x})E5w$3E@j5YC4C27yH_)7nI!rfYYiZ}r=R&m)J+NMM6k>%g+#rSo+Cy$4wiTzd zQs}Bxjjy6MZuUX9;S`^@N*w_%jzl8QI>Vw;S-s`XH|?^5hMvnJA67u5&F#4TO#gn% zPDvLO1j=*~dUb<%OaypxTcgXKfL%mP#m?;IZo05)%)@U+T|u6|AVJ%ap{Gle{HWQS z`86Gpa5|UL05rX*lR`^{&eBF^5`&a&Su)E zMb2`c-Yn+lB!(d7IJV?m(c9c}Ofj6Vt%do5Q=UV!stvFhlBD)P}joZBT^P0Qf^-G}V&&n9AnS35B{|f7c*J^=nG0a$<7E`pqN@ zL2_qk;TCbd2sHI1DjhUzglu9MXJ^~^abAEss%Dtket8I=goIBZ$pZae$l8*isAFQ` z*%H!F4@)o$UuJvclXPo|-nmswq`Mh(ir+?mvQ_L_%#yP8Crq3JXm|{GB3L4i!($6M zqsPWfzmFt`CtuoZJJo<(Eai_9eQ<4odW z{rGk<$iYf{TmNgjST>#AX^Ls!VK8V#N%T;S5y3m0VPY3dS8m}^pvH-g~o#{L}xg>CU>Bg>}5 z{dxjf)+y{sWk6@FT~>n|6qdBFtrKz z!2N3^+|NcJx{-W~G86kD%TX2Y9yqk(y%*vuv!i$f5Yw_s8IMCHD<0%Bo;i)Y)%pP> z*!P$%mBXx)jFqqfLHJReLi-u=ne4j%1yWwe8T~)8#=T&-oRa9i4fPbjb2-|gH5ob! z#9bnQ)RAJv`y@ubF^*8kI3|G8jn`&7;UQp%wa)@E2gKaOmo?4tH?(=j%X#A^T6Z-n~b3&tgB`9i>%z{MQsj zzP(3GnZk}W&D<}s7743ep5(kSZJp44aKaMsbGCNv6^n*}6I}^yU0Pi`lO6-}9@y(K zt6j1c91*=;|6{Kh(0&GyhI2f42t${0>Fp!8a##A*EIsH_(N4_9+e0BSREwbK)2RXN z4umX&kPJ?cO3x084kAsj3<}?1?wp`wH17s)Ih`g%pB$^92~^-Ygv#3K)XV50;aaHG zt`ZdwEX=Z~)96VQG~Zbmbiqh83lNJn8xW6KDnWDwWibkzNSe+sXD%!uY7{Foqt_V8 z5TCqEbX(9J;&!K&RS$yrRtD}0sIDlw8vJ-}@&PW?s)m689ZEV&Aot(&n9D^!(Npi~ zBRlFHmy1fFLqAXCj1E!j7Dq8Z14f99o>v7 z?dzXOmw9`FVAP@1rXybbNsbNR2`JJyAQBpm4q}+%59EsYg))IZi6z z9R1F9qLcOBVTR7VUi9eoJ!senSX;?v1^nxJU4Fgj6=0ksgTZ1^?8EgHVA*uASlDPi z%bHNHX@H9*EtwG>u+BstT9Eac)i*t<-Ll!Shh|Oix?l|zLuKHL#=7W*`$c!D`TU9B z0@YXUrz;fW^~?Lk;(YE%G9l_Qy5=1$@^ah@;6@`;rb}jWm<`+Yp##D@G=@XFkntGK zSV7Wl1!m8MdeT8Ln4Q2MX~?YBW`2V+d4go~8#7joLc(*Dr)M%ffyE{=O+T#!wsf04 zOV}NF^S8NOjmIQyLod(Tb=w=nS>h{QeS>&gc&*zs(|*h(s#@EAQExjS=0|S0OUqJ= zg_)&R%Vk8sMtm*iLvL!muABbkW>J`K-eFVq(KlW*5~pP{yG7@&2d6yJU>#ixCr*0b zT_P=2RfUVs}1<;S7%rY)u9@J0X zEY=J#zFvI=tYiX0@%KW&0qANM7BGO9m80IADXT!vK0Z6?XtKwR8KQ9l=(>qecyKp@ zg{5bfxC|(0;1Y~*E6ULb3%fpki)h{)fN^rS6f)@w8Z(z zQ=_0*O`=M(;hhX<3KFYvZWr=Bsb?G#vqw!u^)yOoHo&Ew!fbc}I-8+iJS5hqvyRi$ zP(AxL(QyX*PM%IUFmR@q(z8cgC!@YJP?OGd|60Dt=1&laj+klj!itA81kbDbp4-I8 zCev*;L`!g5@zae({|stt@=7x`YGPJiFL};cizAN>2d;YwFWj8&pW;O?S7o(l9l83# zIcU?;oMmHZ>_NT#cJk+A%|txWB||sfE~Yt7LyKM*b*>)&t!y@~>G~B>gqquwbs5^H z_rS5txLohXCQVQM@$EEeF1|xFo5v)EJ=);-!JcT5^P2LtL_VD=-hrjri8$TXT&UBd zE+j*z-6>{^G4Q+{b1KIdauwZn>v)&wU@Ra-U7{!4CGrb- z@K0uPU+N8aiD~2FO^(;o|LuT}K_wTE=ye@9>`3oVr$RLw)pw!1yXn|v5X_K=io(s5 z^4bj))qfW)Qe}WnP-1INz_0YTuEYc{zuqHyrJY3urAkD7n|(xU+}~RO6~x%8g~*V@IZ4skph;nKqLD8$9KB< zeWJTLZ{|kJh*Zrd+#mJy`@|Vdrp6gykvK|(AN68TG3_i_AB^h-GYm03Y)rO3aahUI zBw>+)0NnrFxM{(np^Xo8zrz%0kBQk;XvJaCUx;`0<@by3=HW(t=*az|F-0uaPdq5P zv~q*tawACtq%!4&vGT-r;J6C(zaOMXq0tQ3D=I_JdPwAT{{@p@s3l;T%-eUO`lPQ&+@{?hiO$_DQCUhp{CEcl zF?}BI5^VNRM?Lb0$QjaznirAaROz^NAvpS4cjV=5HZ9Y!(555eQ2uP}F;zK9i1$UX zbufVpWH#IM-rOjXl_*;Z2-1Y{qOiFlWey}(>gxAIUb}uk@DgfqE3?LPw~R5AayMc< zU^K%vCcAm5hUH`pT54oX(-ifOrWS00=I!mlL4Rr!>iWKzCLHYgPt(;Oi0+e;SxglP z)T;$a79!fZ*3s+Z{j0niYF+2Jee1l5flQwM?gLSBIxmWm_udq`_Bj&Xi}Ca4R>b)C z(G2gfj{(z?A2fq>-G^egBTgj)PpT4(B>Msyn3jO!s7n4fRnm!rWpadm>?1KIiw~yE zNm1M~(D`GLJBIr#)f$X9q@Zx30RnKZm?U9npoCe_?ge`7$0E;;SC07GDEiiqMaQws zFNIn05wy9w?^mmdEV_zvZxh%;fH_)zBD!bKB*E1zB(sGUcZt^eGCQBo`xC_m{Zx+Kwzv=z5*y7&Ylk=h=#*A0|bq{cI~6lIu` zagjBQ$k-gli{B(t3S}n^xgpprc!Ws=@J)^)yTnsO-R?8-oLCh4_%m^v@SOatjmY5o zV*dfgzsZOidJ$xz2KJG~$R-#TT+$ZUNpF4h3o)->Wa2=%VF$hFR823eCZoHO5VmRG zmtuk0*hsaAIGKe%(XLQ|X?u}r=esZIspP2G8ypj7U{caXmJRa(AYX{&Qz}(Q0701O z1ZKfRRbn^%)U{pu&{v{YlVd~*eDm}_zYbHC!9pml=SfQE{YR3}joeBNacypOK` zhbW93neZzj0W~wG;O!7JS;ukiu#Y=VxOKVH=%Wv-yq-ny*L1jq*VA2ecNhnHYB*v1 z{!|Zojan+hv2(uw(eO$*3XQ|w&3Q;pQ&Wyu@<`$y&Y(x;_^N={6V9errw|PCr>qq3 zNJgMLmYrja%{^+U*VuXdF$!%H;}!?V=F!i7Ew+oRLUXUens3*GE2g&D1V76v&xE`dDy*Sty6RZPt z3`lJ6Wl@@k^uF&z*|?^NM1B>zYL$X%($Rz&Kc&YU6W!trAwzFICPsIieljBH?0J~L z1v-38bTQ{<8)LFILO2$fp;*us9dwp$HzARR*l#;QU>(qI04G)mq%&8{PU>)onY10y zo4*%%@+#}ND|G+&bd(dobHi{7y_=(cK^rX33M!*pR&EsVW3}(l3cFzI5!yD?#vYg9 z@;Sf0PA|jL*7ZtMdO`IAl2pzjL1N_)#FHxAbA2w0{unAWM~eRH&SI?3w=+XY_ESiAzJq9 zi`F2Q>IWzpG0e6E!~^u$Uqxp#{-Vd@NZ(ia2y1}4Z5|E6Y|aIqaZ;}zE;Bz9_%CNq+F<`M?XoeU^DTVhk@us zt=A3EpXA8S`U4@0=xWukLgwY)j)uk}*^16J0)l@~+d_k+Y#~lZ4@hTusEA#g47a0e zlh*Vw4_I(n$Vm!!z)x!gh*6yAX3JT#rBzfO@oCUro;4iw;` z0Ug}Y;#$52chTuOZ`3WYtVT>=q7%+sx;swq6Z*YD_uZ{~JWIsREPM&Y+|EUqF!Iw{u*5l0(!)hS5oM1PTtB0n`3C^Ps#ctgf38&Gc z&2qQ$s0&CzG%CypJm||;&FI3D-?hHlT=g@KHl`S8yqew%W_^1-yY$QHatnXiL){NK zPA2d^bgwxu=%6Y?PVB`TEfR)et*|j11j$bQS%&N{_^r$WJup-D>~=E6&=$bM#ZRW&-QLK&*BH`RV`%KIp2eb-7Hkk?{bjMHlP%o@i{O*y@&0T zYa-tfx)O4iQ9Zp`2&2T%n{T}O@7M3NkbgSK@^~%i*t78RI15=8+mao=`!D*1962(8 zFq`b)q@J)50&WA3?MPzNk3)Rw0Op=?oK}?&Jncqdm&d5CAczi5nyxfU;y&1UDNu94 zkBt{Tij9loXtkc08Zj|8ihIdxkkvPsrfRIf=`4=)TtSHJL0HB>xnXp_GgeOQnf_(TnIDJyp?9 z77+fGCWpU^mhI&1oZBEQn{#(Sk*Kh)ogC7{q<9rr2n-g9l?{=SuC=I5(_gofBg6pR zwY}^+9ut<1jA4n?#Rl*h0Bu_1RYqkLTa$HH)zSwB>9ereEeV02jrP2vKo;oR+RJS7 zp{KRF^DNm~ztUd1vwYyi$r^p2m+V;bPvUzhrPP!$e?)eNB8Oy*$>BuPruik67W%S0 z`L1}@yceH+SBBo1FFOqfCP}>kEwQG~2E#})HYnEZPzfkrLSWe81UjN_cZX?Lp*`ZbM=X zpk=ra>UDjhlN=-Vv6l?ZDUvsdC4a0vUisIc9c!0tZCEUCm~@96n$ty&vX4YSM)$3` zA#0{E7iP+|U{zY26(4=;$9l+ifjiKljwAuSEuh@=MIbt0LA)GymVy-|`l2kOCp5*K zuy*1swIwhc(lK<=QWg|{78#qrn_kdUR+%IDNc?Nf<78&v0Qo$LrJjL{Hh* zxV06=t=;+~y*}_&dpRXr9YE(IlN`>i7o3|qh*I9J-T=rN%`!-dQNKoi-b-F?78pKf zV7;8##z zmKm};V@;fNYO*M&YFv%zQnE?<8G0B$8v_Z`5uH8B1mh@V4>( zBY?g~l1yJbU`fkH7wwm$Ub5pz%0uQ-s|3qg7EvcG6yq7N}V9Pc4MY2 zTT_1YJ(Z}2*6PzHNcUi~vKuLI(VT{=ff}MuTaqRdr2)b@`lAVQxH$@J6Qm0Sp&=8c zPmJd#V;k|fA!Z56z_U3GzZdVKn!WkvRy1{}f41hCbzSun9@_5zI7vP_2m};Z{%WLw z;iyNTq^4a_X;g6$v7j#zeLPuC%4$z!SiR{sv+g%Vo-vXoVk@zMN6bq2%QultSKKGB zqMpyMLsMj7;_HfSNP-JPUrmuiq?pdZr2fDmGxX@`vUn6r966vUh6J@pmLt(gB!{^l zfaF){Yp2VS{%ockquJ?A8^77{CmB8UATbMS#|$|v?l`|=@7~0Z#*O#=KuM;2^=GQM zS?d{caFa()Z_bcGGwHIe1D3cA!9MT{A>rtib=q`VDX50LaRa)`lZ~A*PZ^GfcoHNG z9)g?OF#hz{E%iKS$aQ%{qdW^h~l3e0~XfrDSuWcxH6 zxvR|94S|@qC3P9f!24yLK1W85i!G-Xl!vrM#oA4Z;iB||L2w}f-bFDoT1YK>6F_h7)w zAZsom96-ORHb7~TMUJ%pJNHVMvBL=(WrqI*!P_HgKvF|ZMynn}!EUqycM*NhiRIy_ zhvliF_T$gnF${n3#({|=;H}MxI!6=_Aq$_W9tDJX!c&;%qIo`MB4m2!%q{aroe=GtsOcHqa&^ynTCGn0a^!nM- zCAvcav=&?k*4d*vT8CMOhgo^lEkFI0NPEOs zE9xmU%FXlF>vn3VSN6-h8Kq6Rt3Q!Y^?JWo{$-d|gVCl7tZC6t(Q*xhVdr~3jmD3} z%GTaiH%@==lx_5cm2?38{0iBw6FO;H-UG;5dY?t(W%{=j6eXXh^H<8Tjt+!DGqCJM z*-qE4ly??#_i^G9&W<$gqR*IlRU?}AhQ_awZG^Z&FQ|}3OA1i-CE+@=N*B(VddAGj z3l`6v8W)6ybKM-39o&j<-iF%T~ z;vR5^cQelVX`sXQ%wy8OAj=b!&#u{sPP$iwnSY6Zr^u!c_+(dkZR7{9mgQvVPkpk3 zcp&tvj{@t-O%KrHUK+Jb-7@V5NSc?RX9w}eI}qvV>Ve4ma8Z>!Ppk|ztCp{(XRU$Q zyt4WAm+NIkU=nO6>Lgez&9ai2BDKqYa@?@bbW(t-eoD_^QVmYCkLYPN5qFn75a__ zIpgHlHal*S-$ZUcQ==vC%+gyhl)$pAKu;E%T$C{ zmpPMumSaPI{EmZ)e2wS!TPaYvcB`CemT3Mw?GV)`CO}_;$WLLX7Z#DHV=P%2)P>Ob z2C#3bhi#K12J<$jABf$kW;OG;??5)8N9R-7K7HLb*)PD@Y|cz_sy5AYhRw7Q{F7L> zxyrT{65*Prxzv`G@E}Z0yaeRzQLH-`Y)jC(xqJy}<9cA}U?rivt9Ndv^YoRGTTpmu z=JoAzPN1&y!Ycayw)vW^tJGadA6_*-v@tpI4#iUbR$5rrtO?7C4Nh6U#wpjWEhSH$ z;A>bgOM_PXuaimMPh-F@(`DMy=^HZmKU=8RTTsi0=KF zltr{iEq#=MF-@bB9_A#Yg~yik8WMke&gHsJ|8x^wHCH!(o^KG4oSYDTpxT!cANewNnMvae@#UVeh#9D2dt>Oe>DALR>d9F5OnO{NdAKa zKG$4}X9FCH>}k5$vvOn4{t(~^6mVEH4q5i{Pf{6eX!!>e)JT2jv$E%WgkH{e3#%e` zvGL~L0wm`84K~NLzit3CHXLs3Yj9+3CmIY!`@g#9b8_q)bctt((@y&}^Sj67EWQVA z!k95rZljEd;EMQO`j0dX{1;G3E4RM)Il7@dOV56uz7$EX%zSi|Zq3%Ll=jdi&&xG( z;%qdGE}Pe84n?+6EHa9d{;XDJ5KVwKx+abLDmBLm=_8+=$Y2{mL_s} zz-6xlP{Sbm1%`H^nN(C*(#p~WbX3I+%tG}Os6H+!;Q?Yg3%hM%gk%MAhy%=7pNZPA z5}TiBW5@eBvR@#9OEw?s=R?7NAj@;16wrT>{EEbuLWwn|*7SUvT6$g|e^rjk$H!9X z|K|U(1>|rkvVW1C=&Pi^sJA1pxmVB?B=JJ%tJml;Mb?dwa2z^$hwk~N9N7UOZ#aWq zQSj44Bw9z`1%l};zmOK%{id9pIx`Q&vD>ifE(pgDfdwQ4!|3skRcgsy25Knhcw3zx zmYw4_RQOI#7riPhADzty9SXQbkdOnr7XURNu_8W}|1y-dh8zj)Abu{Qw;<)HtV@8? z2!@OFfN$w;(JSxC%wD{fF;Q_6@+*mEKszGI)8c*Eksd*GdS808tVi_b{!zbEd_+GO ztnStCzAx9!wVu9n4|w8m|5%B9FdzB3IzDsehZs<2SVVro!Ww_RZ?3QVK=urvJLI8Q z@4SIwZgJy?{^K}AokP3`lbQ1thFh>E17xAgrHet}L}I<5u?Jb+3iJTPhRz$6D+hry z+wKNHc*fI(-OE5pZB}7HU{3I}9>4W|fhz{9C1`@25j{d%`N=&9O0c+Z3m22!8-vn1{8`s!n{ zw}V?X%Vic@_Hx3YrS&^nS_9Th<*EuO?C%gW(**InlGj6!3z5{J{z@cYAlnFt32_ol z%Wenspa2P%b|mQcrA1b0>p0{tD87n5O0oBQx@!HNzV~~XCu;Qz-^;1uYTfb&y0k?7 zv#EQ~avq?3B>Zv%pKy1iY}k&^#p*>r$YMA9k^3P`PayU}QjCN*?R@~f30{2x^+VDh z$p9pSknnoI;U$m4Fe-Cqt)s7-^`}?vC>+%v{~+@MY7ENLBEMK>ehQAglXG;^I_UE64TH&TQGt?{_ z^71XilGT>F=lO73Ca5o9`gb1>G4)79io!WI3R3 z^}9dHg20)8&ql(Ic_|=vGAjXLv2ix1&7*Gx|Bg7Z_B%5c;TK)`I~ntVbSaW+fSEOu zerr71Jfds!Vf6Db1h*sUhNLsP+?A4WraM62kEiW0UG6krEYLt04}`A(%?30U$>~VO zAYm`P2+Xen$|jU;L9!3Y?MU!U(>(vdF}A`Xm$QXyqR(f&eB-B2xzUl9{`4o=YA#Np z)LWF$XYea4*KyzYG=UF$-bP!z#Ihr^{9kNI3a6KtuhYO=+x)xr%zw(^dh9CWYQ_rjUz5uixZv^zrv}hsgddCzYNe@c*sy+pqqAu1AX0 diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-310.pyc index 721f2f7f1480e11b5c1716a96946adddd5d548b1..c528952aa094189e4d4377a39d62c10c135f5351 100644 GIT binary patch delta 9316 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 delta 9431 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 Pq`Wp1oOHUp_V)h)OwfWq diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-310.pyc index 2e2c31d0af6089fa11c5a35c366479a06c49f139..95fa42fb5d62168475de764ef7a362149bfd83cc 100644 GIT binary patch delta 7415 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 Y__hlT^?_gOVA=EzUF?TS>$}MLALH1^+5i9m delta 6690 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 diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-310.pyc index 1faa26a052a3c711dd1b94c319c26fb5e7b7bf0b..4c84127db0ba6ea98de2f4d775f47b4ab6a79f23 100644 GIT binary patch delta 25 fcmaF!iSf-RM!tMrUM>b8Se>n(@vdznUtA>sd{YS* delta 25 fcmaF!iSf-RM!tMrUM>b8h-cEzuxsDQ7gq@YagPVH diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-310.pyc index 928e2d145c0b642bdcd9aad666c388140853a9a9..987d22c2dfcfd4e2386c87bb88f27351f6dd0aff 100644 GIT binary patch delta 6522 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 aY{tmEk;^4`VMKdp#nFp2-D{1f4*voY<8K%M delta 7839 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 D#k=gf diff --git a/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/util.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/sql/__pycache__/util.cpython-310.pyc index 9137100705e81f2ff17fa63ea8d2ae07bf8faffe..87b21774be91c2cdbf5536ce6362f3d94b39664f 100644 GIT binary patch delta 69 zcmX@Tfa&-GCfb8Se>n(!L^Y$yOYsoa%HESqOibw4n__Efsag#OpGl5Iha`( VIhcSVOhB52;~xjp<~^PLYye)L5D5SP delta 73 zcmX@Ufa&xCCfb8h-cEz$lA!8-O1=Mxw2DERaD?D2P21&zBKnX5QR<>Fc9jTAqDY!VkXe5^7th`KJ?C(iK4W|hx}Z*%ks>tP zTim^NUpJ;lDo^P@0KYi8<2~{_{hn~xWcP%XLVM63?F-cVl|Cg9Ieqq2TTxYpNr-A? zGx_AhbW?UvLbg(l;b%@HXd3ADb#|K+k2s!4MD=wrY)8nWC&JDE$aL*ch2>wu4+A4~&U=uPP+F4BBi7e=V4{1IaGsXT;Hc2&HT zFu`(_cr;B;>mX)m-r9q^RBRi^1A1*sV2w#DNtfoc8Wy29WaD`iIrzL!$-}WJ_ z(m>rPzS5t%eo-M<@5Tl#)DK{pk2;bPwo$qB0%UsV3`j-|S!^;LI=+fr%4wKHHa%{L zVv8*&E^ARib4_!)c1=o3QWD!})6{&b^_pqcWfWcJT`d}@w7c1ZaT;!J#1t!=`3Gh!(*ytj delta 543 zcmW-cT}YDw6o&VHn_FeW;l5c?&?ZY#OtaP|ZKJGhu$1M3jao|)w~tXabvZ`%qd|@! zFI(bpQL=s#5#GG}ClKTH7Bvtc z-QGVKAgwi0++ScEGLx911&v6<))5R+m8~0BIBQ!JkmZy6WQhs7ZtufA(mGD59~77% z!7Wn8aS_v0;{1pi{^isGi>%onlsj?jfkVI$Pd45W@P%Bi^LS4Su0ebykGn_iIpYo? zM|w{RFZh}#Ctw}*doMvxd2bw>=*;2YFp|_XhApIQPU0`0Yrd+2l?4B+Tx#CmBE*#R zR1&%3XrmH66bZEB20ae=gz^7-dKXY}ZP2g6T^a~AVTqPPKH*j2W@6`wyauK0=op3k z>t*DTESHUr!bw)i2M?`C25ONkIKnHEw+Klp@5~^@_d9O^7swr-!ZH39Usge+xwGMa D+$+D^ diff --git a/venv/Lib/site-packages/sqlalchemy/sql/_typing.py b/venv/Lib/site-packages/sqlalchemy/sql/_typing.py index a08a770..c9e1830 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/_typing.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/_typing.py @@ -411,7 +411,7 @@ def Nullable( .. versionadded:: 2.0.20 """ - return val # type: ignore + return val @overload diff --git a/venv/Lib/site-packages/sqlalchemy/sql/annotation.py b/venv/Lib/site-packages/sqlalchemy/sql/annotation.py index 4ccde59..08ff47d 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/annotation.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/annotation.py @@ -300,7 +300,7 @@ class Annotated(SupportsAnnotations): def _annotate(self, values: _AnnotationDict) -> Self: _values = self._annotations.union(values) - new = self._with_annotations(_values) # type: ignore + new = self._with_annotations(_values) return new def _with_annotations(self, values: _AnnotationDict) -> Self: diff --git a/venv/Lib/site-packages/sqlalchemy/sql/base.py b/venv/Lib/site-packages/sqlalchemy/sql/base.py index 913ab43..104c595 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/base.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/base.py @@ -273,7 +273,7 @@ def _generative(fn: _Fn) -> _Fn: """ - @util.decorator # type: ignore + @util.decorator def _generative( fn: _Fn, self: _SelfGenerativeType, *args: Any, **kw: Any ) -> _SelfGenerativeType: @@ -299,7 +299,7 @@ def _exclusive_against(*names: str, **kw: Any) -> Callable[[_Fn], _Fn]: for name in names ] - @util.decorator # type: ignore + @util.decorator def check(fn, *args, **kw): # make pylance happy by not including "self" in the argument # list @@ -315,7 +315,7 @@ def _exclusive_against(*names: str, **kw: Any) -> Callable[[_Fn], _Fn]: raise exc.InvalidRequestError(msg) return fn(self, *args, **kw) - return check # type: ignore + return check def _clone(element, **kw): @@ -1176,6 +1176,7 @@ class Executable(roles.StatementRole): autoflush: bool = False, synchronize_session: SynchronizeSessionArgument = ..., dml_strategy: DMLStrategyArgument = ..., + render_nulls: bool = ..., is_delete_using: bool = ..., is_update_from: bool = ..., **opt: Any, diff --git a/venv/Lib/site-packages/sqlalchemy/sql/cache_key.py b/venv/Lib/site-packages/sqlalchemy/sql/cache_key.py index 8c21be1..500e3e4 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/cache_key.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/cache_key.py @@ -546,6 +546,9 @@ class CacheKey(NamedTuple): def _apply_params_to_element( self, original_cache_key: CacheKey, target_element: ClauseElement ) -> ClauseElement: + if target_element._is_immutable: + return target_element + translate = { k.key: v.value for k, v in zip(original_cache_key.bindparams, self.bindparams) diff --git a/venv/Lib/site-packages/sqlalchemy/sql/compiler.py b/venv/Lib/site-packages/sqlalchemy/sql/compiler.py index 2304bde..cb6899c 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/compiler.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/compiler.py @@ -2080,14 +2080,12 @@ class SQLCompiler(Compiled): if parameter in self.literal_execute_params: if escaped_name not in replacement_expressions: - value = parameters.pop(escaped_name) - - replacement_expressions[ - escaped_name - ] = self.render_literal_bindparam( - parameter, - render_literal_value=value, - ) + replacement_expressions[ + escaped_name + ] = self.render_literal_bindparam( + parameter, + render_literal_value=parameters.pop(escaped_name), + ) continue if parameter in self.post_compile_params: @@ -2742,6 +2740,7 @@ class SQLCompiler(Compiled): except KeyError as err: raise exc.UnsupportedCompilationError(self, operator_) from err else: + kw["_in_operator_expression"] = True return self._generate_delimited_list( clauselist.clauses, opstring, **kw ) @@ -3370,9 +3369,9 @@ class SQLCompiler(Compiled): def _generate_generic_binary( self, binary, opstring, eager_grouping=False, **kw ): - _in_binary = kw.get("_in_binary", False) + _in_operator_expression = kw.get("_in_operator_expression", False) - kw["_in_binary"] = True + kw["_in_operator_expression"] = True kw["_binary_op"] = binary.operator text = ( binary.left._compiler_dispatch( @@ -3384,7 +3383,7 @@ class SQLCompiler(Compiled): ) ) - if _in_binary and eager_grouping: + if _in_operator_expression and eager_grouping: text = "(%s)" % text return text @@ -3767,6 +3766,12 @@ class SQLCompiler(Compiled): """ + if value is None and not type_.should_evaluate_none: + # issue #10535 - handle NULL in the compiler without placing + # this onto each type, except for "evaluate None" types + # (e.g. JSON) + return self.process(elements.Null._instance()) + processor = type_._cached_literal_processor(self.dialect) if processor: try: @@ -4089,7 +4094,7 @@ class SQLCompiler(Compiled): from_linter.froms[cte._de_clone()] = cte_name if not is_new_cte and embedded_in_current_named_cte: - return self.preparer.format_alias(cte, cte_name) # type: ignore[no-any-return] # noqa: E501 + return self.preparer.format_alias(cte, cte_name) if cte_pre_alias_name: text = self.preparer.format_alias(cte, cte_pre_alias_name) @@ -6688,8 +6693,6 @@ class DDLCompiler(Compiled): text.append("NO MAXVALUE") if identity_options.cache is not None: text.append("CACHE %d" % identity_options.cache) - if identity_options.order is not None: - text.append("ORDER" if identity_options.order else "NO ORDER") if identity_options.cycle is not None: text.append("CYCLE" if identity_options.cycle else "NO CYCLE") return " ".join(text) diff --git a/venv/Lib/site-packages/sqlalchemy/sql/crud.py b/venv/Lib/site-packages/sqlalchemy/sql/crud.py index 4191069..e51403e 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/crud.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/crud.py @@ -491,10 +491,10 @@ def _key_getters_for_crud_column( key: Union[ColumnClause[Any], str] ) -> Union[str, Tuple[str, str]]: str_key = c_key_role(key) - if hasattr(key, "table") and key.table in _et: # type: ignore + if hasattr(key, "table") and key.table in _et: return (key.table.name, str_key) # type: ignore else: - return str_key # type: ignore + return str_key def _getattr_col_key( col: ColumnClause[Any], @@ -513,7 +513,7 @@ def _key_getters_for_crud_column( return col.key else: - _column_as_key = functools.partial( # type: ignore + _column_as_key = functools.partial( coercions.expect_as_key, roles.DMLColumnRole ) _getattr_col_key = _col_bind_name = operator.attrgetter("key") # type: ignore # noqa: E501 @@ -647,6 +647,9 @@ def _scan_cols( compiler_implicit_returning = compiler.implicit_returning + # TODO - see TODO(return_defaults_columns) below + # cols_in_params = set() + for c in cols: # scan through every column in the target table @@ -672,6 +675,9 @@ def _scan_cols( kw, ) + # TODO - see TODO(return_defaults_columns) below + # cols_in_params.add(c) + elif isinsert: # no parameter is present and it's an insert. @@ -764,6 +770,19 @@ def _scan_cols( if c in remaining_supplemental ) + # TODO(return_defaults_columns): there can still be more columns in + # _return_defaults_columns in the case that they are from something like an + # aliased of the table. we can add them here, however this breaks other ORM + # things. so this is for another day. see + # test/orm/dml/test_update_delete_where.py -> test_update_from_alias + + # if stmt._return_defaults_columns: + # compiler_implicit_returning.extend( + # set(stmt._return_defaults_columns) + # .difference(compiler_implicit_returning) + # .difference(cols_in_params) + # ) + return (use_insertmanyvalues, use_sentinel_columns) @@ -1559,7 +1578,11 @@ def _get_returning_modifiers(compiler, stmt, compile_state, toplevel): should_implicit_return_defaults = ( implicit_returning and stmt._return_defaults ) - explicit_returning = should_implicit_return_defaults or stmt._returning + explicit_returning = ( + should_implicit_return_defaults + or stmt._returning + or stmt._supplemental_returning + ) use_insertmanyvalues = ( toplevel and compiler.for_executemany diff --git a/venv/Lib/site-packages/sqlalchemy/sql/ddl.py b/venv/Lib/site-packages/sqlalchemy/sql/ddl.py index 09cc54d..06bbcae 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/ddl.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/ddl.py @@ -403,17 +403,14 @@ class DDL(ExecutableDDLElement): self.context = context or {} def __repr__(self): + parts = [repr(self.statement)] + if self.context: + parts.append(f"context={self.context}") + return "<%s@%s; %s>" % ( type(self).__name__, id(self), - ", ".join( - [repr(self.statement)] - + [ - "%s=%r" % (key, getattr(self, key)) - for key in ("on", "context") - if getattr(self, key) - ] - ), + ", ".join(parts), ) @@ -470,7 +467,7 @@ class CreateSchema(_CreateBase): __visit_name__ = "create_schema" - stringify_dialect = "default" # type: ignore + stringify_dialect = "default" def __init__( self, @@ -491,7 +488,7 @@ class DropSchema(_DropBase): __visit_name__ = "drop_schema" - stringify_dialect = "default" # type: ignore + stringify_dialect = "default" def __init__( self, diff --git a/venv/Lib/site-packages/sqlalchemy/sql/dml.py b/venv/Lib/site-packages/sqlalchemy/sql/dml.py index 4047ba4..4ca6ed3 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/dml.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/dml.py @@ -211,7 +211,11 @@ class DMLState(CompileState): primary_table = all_tables[0] seen = {primary_table} - for crit in statement._where_criteria: + consider = statement._where_criteria + if self._dict_parameters: + consider += tuple(self._dict_parameters.values()) + + for crit in consider: for item in _from_objects(crit): if not seen.intersection(item._cloned_set): froms.append(item) @@ -563,7 +567,8 @@ class UpdateBase( 3. :meth:`.UpdateBase.return_defaults` can be called against any backend. Backends that don't support RETURNING will skip the usage - of the feature, rather than raising an exception. The return value + of the feature, rather than raising an exception, *unless* + ``supplemental_cols`` is passed. The return value of :attr:`_engine.CursorResult.returned_defaults` will be ``None`` for backends that don't support RETURNING or for which the target :class:`.Table` sets :paramref:`.Table.implicit_returning` to diff --git a/venv/Lib/site-packages/sqlalchemy/sql/elements.py b/venv/Lib/site-packages/sqlalchemy/sql/elements.py index a6b4c8a..90ee100 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/elements.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/elements.py @@ -117,6 +117,7 @@ _NUMERIC = Union[float, Decimal] _NUMBER = Union[float, int, Decimal] _T = TypeVar("_T", bound="Any") +_T_co = TypeVar("_T_co", bound=Any, covariant=True) _OPT = TypeVar("_OPT", bound="Any") _NT = TypeVar("_NT", bound="_NUMERIC") @@ -804,7 +805,7 @@ class CompilerColumnElement( # SQLCoreOperations should be suiting the ExpressionElementRole # and ColumnsClauseRole. however the MRO issues become too elaborate # at the moment. -class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): +class SQLCoreOperations(Generic[_T_co], ColumnOperators, TypingOnly): __slots__ = () # annotations for comparison methods @@ -873,7 +874,7 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): def __or__(self, other: Any) -> BooleanClauseList: ... - def __invert__(self) -> ColumnElement[_T]: + def __invert__(self) -> ColumnElement[_T_co]: ... def __lt__(self, other: Any) -> ColumnElement[bool]: @@ -882,6 +883,13 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): def __le__(self, other: Any) -> ColumnElement[bool]: ... + # declare also that this class has an hash method otherwise + # it may be assumed to be None by type checkers since the + # object defines __eq__ and python sets it to None in that case: + # https://docs.python.org/3/reference/datamodel.html#object.__hash__ + def __hash__(self) -> int: + ... + def __eq__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 ... @@ -900,7 +908,7 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): def __ge__(self, other: Any) -> ColumnElement[bool]: ... - def __neg__(self) -> UnaryExpression[_T]: + def __neg__(self) -> UnaryExpression[_T_co]: ... def __contains__(self, other: Any) -> ColumnElement[bool]: @@ -961,7 +969,7 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): def bitwise_and(self, other: Any) -> BinaryExpression[Any]: ... - def bitwise_not(self) -> UnaryExpression[_T]: + def bitwise_not(self) -> UnaryExpression[_T_co]: ... def bitwise_lshift(self, other: Any) -> BinaryExpression[Any]: @@ -1074,22 +1082,22 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): ) -> ColumnElement[str]: ... - def desc(self) -> UnaryExpression[_T]: + def desc(self) -> UnaryExpression[_T_co]: ... - def asc(self) -> UnaryExpression[_T]: + def asc(self) -> UnaryExpression[_T_co]: ... - def nulls_first(self) -> UnaryExpression[_T]: + def nulls_first(self) -> UnaryExpression[_T_co]: ... - def nullsfirst(self) -> UnaryExpression[_T]: + def nullsfirst(self) -> UnaryExpression[_T_co]: ... - def nulls_last(self) -> UnaryExpression[_T]: + def nulls_last(self) -> UnaryExpression[_T_co]: ... - def nullslast(self) -> UnaryExpression[_T]: + def nullslast(self) -> UnaryExpression[_T_co]: ... def collate(self, collation: str) -> CollationClause: @@ -1100,7 +1108,7 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): ) -> BinaryExpression[bool]: ... - def distinct(self: _SQO[_T]) -> UnaryExpression[_T]: + def distinct(self: _SQO[_T_co]) -> UnaryExpression[_T_co]: ... def any_(self) -> CollectionAggregate[Any]: @@ -1128,19 +1136,11 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): ) -> ColumnElement[str]: ... - @overload - def __add__(self, other: Any) -> ColumnElement[Any]: - ... - def __add__(self, other: Any) -> ColumnElement[Any]: ... @overload - def __radd__(self: _SQO[_NT], other: Any) -> ColumnElement[_NT]: - ... - - @overload - def __radd__(self: _SQO[int], other: Any) -> ColumnElement[int]: + def __radd__(self: _SQO[_NMT], other: Any) -> ColumnElement[_NMT]: ... @overload @@ -1282,7 +1282,7 @@ class SQLCoreOperations(Generic[_T], ColumnOperators, TypingOnly): class SQLColumnExpression( - SQLCoreOperations[_T], roles.ExpressionElementRole[_T], TypingOnly + SQLCoreOperations[_T_co], roles.ExpressionElementRole[_T_co], TypingOnly ): """A type that may be used to indicate any SQL column element or object that acts in place of one. @@ -1613,12 +1613,12 @@ class ColumnElement( *other: Any, **kwargs: Any, ) -> ColumnElement[Any]: - return op(self.comparator, *other, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(self.comparator, *other, **kwargs) # type: ignore[no-any-return] # noqa: E501 def reverse_operate( self, op: operators.OperatorType, other: Any, **kwargs: Any ) -> ColumnElement[Any]: - return op(other, self.comparator, **kwargs) # type: ignore[return-value,no-any-return] # noqa: E501 + return op(other, self.comparator, **kwargs) # type: ignore[no-any-return] # noqa: E501 def _bind_param( self, @@ -3132,7 +3132,7 @@ class BooleanClauseList(ExpressionClauseList[bool]): }, *args)'.""", version="1.4", ) - return cls._construct_raw(operator) # type: ignore[no-any-return] + return cls._construct_raw(operator) lcc, convert_clauses = cls._process_clauses_for_boolean( operator, @@ -3162,7 +3162,7 @@ class BooleanClauseList(ExpressionClauseList[bool]): assert lcc # just one element. return it as a single boolean element, # not a list and discard the operator. - return convert_clauses[0] # type: ignore[no-any-return] # noqa: E501 + return convert_clauses[0] @classmethod def _construct_for_whereclause( @@ -4182,7 +4182,7 @@ class Over(ColumnElement[_T]): element: ColumnElement[_T] """The underlying expression object to which this :class:`.Over` - object refers towards.""" + object refers.""" range_: Optional[typing_Tuple[int, int]] diff --git a/venv/Lib/site-packages/sqlalchemy/sql/functions.py b/venv/Lib/site-packages/sqlalchemy/sql/functions.py index 30e280c..fc23e9d 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/functions.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/functions.py @@ -916,6 +916,10 @@ class _FunctionGenerator: # code within this block is **programmatically, # statically generated** by tools/generate_sql_functions.py + @property + def aggregate_strings(self) -> Type[aggregate_strings]: + ... + @property def ansifunction(self) -> Type[AnsiFunction[Any]]: ... @@ -1795,3 +1799,30 @@ class grouping_sets(GenericFunction[_T]): """ _has_args = True inherit_cache = True + + +class aggregate_strings(GenericFunction[str]): + """Implement a generic string aggregation function. + + This function will concatenate non-null values into a string and + separate the values by a delimiter. + + This function is compiled on a per-backend basis, into functions + such as ``group_concat()``, ``string_agg()``, or ``LISTAGG()``. + + e.g. Example usage with delimiter '.':: + + stmt = select(func.aggregate_strings(table.c.str_col, ".")) + + The return type of this function is :class:`.String`. + + .. versionadded: 2.0.21 + + """ + + type = sqltypes.String() + _has_args = True + inherit_cache = True + + def __init__(self, clause, separator): + super().__init__(clause, separator) diff --git a/venv/Lib/site-packages/sqlalchemy/sql/lambdas.py b/venv/Lib/site-packages/sqlalchemy/sql/lambdas.py index 455649c..7aef605 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/lambdas.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/lambdas.py @@ -718,7 +718,7 @@ class LinkedLambdaElement(StatementLambdaElement): opts: Union[Type[LambdaOptions], LambdaOptions], ): self.opts = opts - self.fn = fn # type: ignore[assignment] + self.fn = fn self.parent_lambda = parent_lambda self.tracker_key = parent_lambda.tracker_key + (fn.__code__,) diff --git a/venv/Lib/site-packages/sqlalchemy/sql/operators.py b/venv/Lib/site-packages/sqlalchemy/sql/operators.py index dbd593e..6402d0f 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/operators.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/operators.py @@ -307,7 +307,7 @@ class Operators: ) def against(other: Any) -> Operators: - return operator(self, other) # type: ignore + return operator(self, other) return against @@ -569,8 +569,16 @@ class ColumnOperators(Operators): """ return self.operate(le, other) - # TODO: not sure why we have this - __hash__ = Operators.__hash__ # type: ignore + # ColumnOperators defines an __eq__ so it must explicitly declare also + # an hash or it's set to None by python: + # https://docs.python.org/3/reference/datamodel.html#object.__hash__ + if TYPE_CHECKING: + + def __hash__(self) -> int: + ... + + else: + __hash__ = Operators.__hash__ def __eq__(self, other: Any) -> ColumnOperators: # type: ignore[override] """Implement the ``==`` operator. @@ -2533,8 +2541,8 @@ _PRECEDENCE: Dict[OperatorType, int] = { bitwise_and_op: 7, bitwise_lshift_op: 7, bitwise_rshift_op: 7, - concat_op: 6, filter_op: 6, + concat_op: 5, match_op: 5, not_match_op: 5, regexp_match_op: 5, diff --git a/venv/Lib/site-packages/sqlalchemy/sql/roles.py b/venv/Lib/site-packages/sqlalchemy/sql/roles.py index f8aac70..6f29922 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/roles.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/roles.py @@ -23,6 +23,7 @@ if TYPE_CHECKING: from .selectable import Subquery _T = TypeVar("_T", bound=Any) +_T_co = TypeVar("_T_co", bound=Any, covariant=True) class SQLRole: @@ -110,7 +111,7 @@ class ColumnsClauseRole(AllowsLambdaRole, UsesInspection, ColumnListRole): raise NotImplementedError() -class TypedColumnsClauseRole(Generic[_T], SQLRole): +class TypedColumnsClauseRole(Generic[_T_co], SQLRole): """element-typed form of ColumnsClauseRole""" __slots__ = () @@ -162,7 +163,7 @@ class WhereHavingRole(OnClauseRole): _role_name = "SQL expression for WHERE/HAVING role" -class ExpressionElementRole(TypedColumnsClauseRole[_T]): +class ExpressionElementRole(TypedColumnsClauseRole[_T_co]): # note when using generics for ExpressionElementRole, # the generic type needs to be in # sqlalchemy.sql.coercions._impl_lookup mapping also. diff --git a/venv/Lib/site-packages/sqlalchemy/sql/schema.py b/venv/Lib/site-packages/sqlalchemy/sql/schema.py index 008ae2c..c464d7e 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/schema.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/schema.py @@ -50,7 +50,6 @@ from typing import overload from typing import Sequence as _typing_Sequence from typing import Set from typing import Tuple -from typing import Type from typing import TYPE_CHECKING from typing import TypeVar from typing import Union @@ -1433,7 +1432,7 @@ class Table( elif schema is None: actual_schema = metadata.schema else: - actual_schema = schema # type: ignore + actual_schema = schema key = _get_table_key(name, actual_schema) if key in metadata.tables: util.warn( @@ -2452,14 +2451,8 @@ class Column(DialectKWArgs, SchemaItem, ColumnClause[_T]): # Constraint objects plus non-constraint-bound ForeignKey objects args: List[SchemaItem] = [ - c._copy(**kw) - for c in self.constraints - if not c._type_bound # type: ignore - ] + [ - c._copy(**kw) # type: ignore - for c in self.foreign_keys - if not c.constraint - ] + c._copy(**kw) for c in self.constraints if not c._type_bound + ] + [c._copy(**kw) for c in self.foreign_keys if not c.constraint] # ticket #5276 column_kwargs = {} @@ -2529,6 +2522,15 @@ class Column(DialectKWArgs, SchemaItem, ColumnClause[_T]): if self.primary_key: other.primary_key = True + if self.autoincrement != "auto" and other.autoincrement == "auto": + other.autoincrement = self.autoincrement + + if self.system: + other.system = self.system + + if self.info: + other.info.update(self.info) + type_ = self.type if not type_._isnull and other.type._isnull: if isinstance(type_, SchemaEventTarget): @@ -2574,6 +2576,12 @@ class Column(DialectKWArgs, SchemaItem, ColumnClause[_T]): if self.index and not other.index: other.index = True + if self.doc and other.doc is None: + other.doc = self.doc + + if self.comment and other.comment is None: + other.comment = self.comment + if self.unique and not other.unique: other.unique = True @@ -3973,7 +3981,7 @@ class FetchedValue(SchemaEventTarget): if for_update == self.for_update: return self else: - return self._clone(for_update) # type: ignore + return self._clone(for_update) def _copy(self) -> FetchedValue: return FetchedValue(self.for_update) @@ -4151,7 +4159,7 @@ class Constraint(DialectKWArgs, HasConditionalDDL, SchemaItem): "and will be removed in a future release.", ) def copy(self, **kw: Any) -> Self: - return self._copy(**kw) # type: ignore + return self._copy(**kw) def _copy(self, **kw: Any) -> Self: raise NotImplementedError() @@ -5286,35 +5294,31 @@ class Index( ) -_AllConstraints = Union[ - Index, - UniqueConstraint, - CheckConstraint, - ForeignKeyConstraint, - PrimaryKeyConstraint, -] - -_NamingSchemaCallable = Callable[[_AllConstraints, Table], str] +_NamingSchemaCallable = Callable[[Constraint, Table], str] +_NamingSchemaDirective = Union[str, _NamingSchemaCallable] class _NamingSchemaTD(TypedDict, total=False): - fk: Union[str, _NamingSchemaCallable] - pk: Union[str, _NamingSchemaCallable] - ix: Union[str, _NamingSchemaCallable] - ck: Union[str, _NamingSchemaCallable] - uq: Union[str, _NamingSchemaCallable] + fk: _NamingSchemaDirective + pk: _NamingSchemaDirective + ix: _NamingSchemaDirective + ck: _NamingSchemaDirective + uq: _NamingSchemaDirective _NamingSchemaParameter = Union[ + # it seems like the TypedDict here is useful for pylance typeahead, + # and not much else _NamingSchemaTD, - Mapping[ - Union[Type[_AllConstraints], str], Union[str, _NamingSchemaCallable] - ], + # there is no form that allows Union[Type[Any], str] to work in all + # cases, including breaking out Mapping[] entries for each combination + # even, therefore keys must be `Any` (see #10264) + Mapping[Any, _NamingSchemaDirective], ] DEFAULT_NAMING_CONVENTION: _NamingSchemaParameter = util.immutabledict( - {"ix": "ix_%(column_0_label)s"} # type: ignore[arg-type] + {"ix": "ix_%(column_0_label)s"} ) @@ -5522,7 +5526,7 @@ class MetaData(HasSchemaAttr): def _remove_table(self, name: str, schema: Optional[str]) -> None: key = _get_table_key(name, schema) - removed = dict.pop(self.tables, key, None) # type: ignore + removed = dict.pop(self.tables, key, None) if removed is not None: for fk in removed.foreign_keys: fk._remove_from_metadata(self) @@ -5622,7 +5626,9 @@ class MetaData(HasSchemaAttr): bind: Union[Engine, Connection], schema: Optional[str] = None, views: bool = False, - only: Optional[_typing_Sequence[str]] = None, + only: Union[ + _typing_Sequence[str], Callable[[str, MetaData], bool], None + ] = None, extend_existing: bool = False, autoload_replace: bool = True, resolve_fks: bool = True, diff --git a/venv/Lib/site-packages/sqlalchemy/sql/selectable.py b/venv/Lib/site-packages/sqlalchemy/sql/selectable.py index b13c532..91b939e 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/selectable.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/selectable.py @@ -323,9 +323,7 @@ class Selectable(ReturnsRows): object, returning a copy of this :class:`_expression.FromClause`. """ - return util.preloaded.sql_util.ClauseAdapter(alias).traverse( # type: ignore # noqa: E501 - self - ) + return util.preloaded.sql_util.ClauseAdapter(alias).traverse(self) def corresponding_column( self, column: KeyedColumnElement[Any], require_embedded: bool = False @@ -1420,7 +1418,7 @@ class Join(roles.DMLTableRole, FromClause): continue for fk in sorted( b.foreign_keys, - key=lambda fk: fk.parent._creation_order, # type: ignore + key=lambda fk: fk.parent._creation_order, ): if ( consider_as_foreign_keys is not None @@ -1441,7 +1439,7 @@ class Join(roles.DMLTableRole, FromClause): if left is not b: for fk in sorted( left.foreign_keys, - key=lambda fk: fk.parent._creation_order, # type: ignore + key=lambda fk: fk.parent._creation_order, ): if ( consider_as_foreign_keys is not None @@ -2436,7 +2434,7 @@ class HasCTE(roles.HasCTERole, SelectsRows): SELECT t.c1, t.c2 FROM t - Above, the "anon_1" CTE is not referred towards in the SELECT + Above, the "anon_1" CTE is not referenced in the SELECT statement, however still accomplishes the task of running an INSERT statement. @@ -3151,7 +3149,7 @@ class Values(roles.InElementRole, Generative, LateralFromClause): __visit_name__ = "values" - _data: Tuple[List[Tuple[Any, ...]], ...] = () + _data: Tuple[Sequence[Tuple[Any, ...]], ...] = () _unnamed: bool _traverse_internals: _TraverseInternalsType = [ @@ -3169,6 +3167,7 @@ class Values(roles.InElementRole, Generative, LateralFromClause): ): super().__init__() self._column_args = columns + if name is None: self._unnamed = True self.name = _anonymous_label.safe_construct(id(self), "anon") @@ -3234,7 +3233,7 @@ class Values(roles.InElementRole, Generative, LateralFromClause): return self @_generative - def data(self, values: List[Tuple[Any, ...]]) -> Self: + def data(self, values: Sequence[Tuple[Any, ...]]) -> Self: """Return a new :class:`_expression.Values` construct, adding the given data to the data list. @@ -3262,6 +3261,13 @@ class Values(roles.InElementRole, Generative, LateralFromClause): def _populate_column_collection(self) -> None: for c in self._column_args: + if c.table is not None and c.table is not self: + _, c = c._make_proxy(self) + else: + # if the column was used in other contexts, ensure + # no memoizations of other FROM clauses. + # see test_values.py -> test_auto_proxy_select_direct_col + c._reset_memoizations() self._columns.add(c) c.table = self @@ -3294,7 +3300,7 @@ class ScalarValues(roles.InElementRole, GroupedElement, ColumnElement[Any]): def __init__( self, columns: Sequence[ColumnClause[Any]], - data: Tuple[List[Tuple[Any, ...]], ...], + data: Tuple[Sequence[Tuple[Any, ...]], ...], literal_binds: bool, ): super().__init__() @@ -4744,7 +4750,7 @@ class SelectState(util.MemoizedSlots, CompileState): Dict[str, ColumnElement[Any]], ]: with_cols: Dict[str, ColumnElement[Any]] = { - c._tq_label or c.key: c # type: ignore + c._tq_label or c.key: c for c in self.statement._all_selected_columns if c._allow_label_resolve } @@ -5012,7 +5018,7 @@ class _MemoizedSelectEntities( c.__dict__ = {k: v for k, v in self.__dict__.items()} c._is_clone_of = self.__dict__.get("_is_clone_of", self) - return c # type: ignore + return c @classmethod def _generate_for_statement(cls, select_stmt: Select[Any]) -> None: @@ -6720,7 +6726,7 @@ class Exists(UnaryExpression[bool]): ) return e - def select_from(self, *froms: FromClause) -> Self: + def select_from(self, *froms: _FromClauseArgument) -> Self: """Return a new :class:`_expression.Exists` construct, applying the given expression to the :meth:`_expression.Select.select_from` diff --git a/venv/Lib/site-packages/sqlalchemy/sql/sqltypes.py b/venv/Lib/site-packages/sqlalchemy/sql/sqltypes.py index 2ed4c8b..ddee776 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/sqltypes.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/sqltypes.py @@ -608,14 +608,21 @@ class Numeric(HasExpressionLookup, TypeEngine[_N]): class Float(Numeric[_N]): - """Type representing floating point types, such as ``FLOAT`` or ``REAL``. This type returns Python ``float`` objects by default, unless the - :paramref:`.Float.asdecimal` flag is set to True, in which case they + :paramref:`.Float.asdecimal` flag is set to ``True``, in which case they are coerced to ``decimal.Decimal`` objects. - + When a :paramref:`.Float.precision` is not provided in a + :class:`_types.Float` type some backend may compile this type as + an 8 bytes / 64 bit float datatype. To use a 4 bytes / 32 bit float + datatype a precision <= 24 can usually be provided or the + :class:`_types.REAL` type can be used. + This is known to be the case in the PostgreSQL and MSSQL dialects + that render the type as ``FLOAT`` that's in both an alias of + ``DOUBLE PRECISION``. Other third party dialects may have similar + behavior. """ __visit_name__ = "float" @@ -733,16 +740,12 @@ class _RenderISO8601NoT: if _portion is not None: def process(value): - if value is not None: - value = f"""'{value.isoformat().split("T")[_portion]}'""" - return value + return f"""'{value.isoformat().split("T")[_portion]}'""" else: def process(value): - if value is not None: - value = f"""'{value.isoformat().replace("T", " ")}'""" - return value + return f"""'{value.isoformat().replace("T", " ")}'""" return process @@ -1395,7 +1398,10 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): compliant enumerated type, which should then return a list of string values to be persisted. This allows for alternate usages such as using the string value of an enum to be persisted to the database - instead of its name. + instead of its name. The callable must return the values to be + persisted in the same order as iterating through the Enum's + ``__member__`` attribute. For example + ``lambda x: [i.value for i in x]``. .. versionadded:: 1.2.3 @@ -1451,7 +1457,11 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): self._default_length = length = 0 if length_arg is not NO_ARG: - if not _disable_warnings and length_arg < length: + if ( + not _disable_warnings + and length_arg is not None + and length_arg < length + ): raise ValueError( "When provided, length must be larger or equal" " than the length of the longest enum value. %s < %s" @@ -1658,14 +1668,14 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): ) def as_generic(self, allow_nulltype=False): - if hasattr(self, "enums"): + try: args = self.enums - else: + except AttributeError: raise NotImplementedError( "TypeEngine.as_generic() heuristic " "is undefined for types that inherit Enum but do not have " "an `enums` attribute." - ) + ) from None return util.constructor_copy( self, self._generic_type_affinity, *args, _disable_warnings=True @@ -2038,8 +2048,8 @@ class Interval(Emulated, _AbstractInterval, TypeDecorator[dt.timedelta]): """A type for ``datetime.timedelta()`` objects. The Interval type deals with ``datetime.timedelta`` objects. In - PostgreSQL, the native ``INTERVAL`` type is used; for others, the - value is stored as a date which is relative to the "epoch" + PostgreSQL and Oracle, the native ``INTERVAL`` type is used; for others, + the value is stored as a date which is relative to the "epoch" (Jan. 1, 1970). Note that the ``Interval`` type does not currently provide date arithmetic @@ -2470,6 +2480,9 @@ class JSON(Indexable, TypeEngine[Any]): value = int_processor(value) elif string_processor and isinstance(value, str): value = string_processor(value) + else: + raise NotImplementedError() + return value return process @@ -3692,28 +3705,20 @@ class Uuid(Emulated, TypeEngine[_UUID_RETURN]): if not self.as_uuid: def process(value): - if value is not None: - value = ( - f"""'{value.replace("-", "").replace("'", "''")}'""" - ) - return value + return f"""'{value.replace("-", "").replace("'", "''")}'""" return process else: if character_based_uuid: def process(value): - if value is not None: - value = f"""'{value.hex}'""" - return value + return f"""'{value.hex}'""" return process else: def process(value): - if value is not None: - value = f"""'{str(value).replace("'", "''")}'""" - return value + return f"""'{str(value).replace("'", "''")}'""" return process diff --git a/venv/Lib/site-packages/sqlalchemy/sql/traversals.py b/venv/Lib/site-packages/sqlalchemy/sql/traversals.py index 5c782f1..5758dff 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/traversals.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/traversals.py @@ -56,15 +56,15 @@ def _preconfigure_traversals(target_hierarchy: Type[Any]) -> None: if hasattr(cls, "_generate_cache_attrs") and hasattr( cls, "_traverse_internals" ): - cls._generate_cache_attrs() # type: ignore + cls._generate_cache_attrs() _copy_internals.generate_dispatch( - cls, # type: ignore - cls._traverse_internals, # type: ignore + cls, + cls._traverse_internals, "_generated_copy_internals_traversal", ) _get_children.generate_dispatch( - cls, # type: ignore - cls._traverse_internals, # type: ignore + cls, + cls._traverse_internals, "_generated_get_children_traversal", ) diff --git a/venv/Lib/site-packages/sqlalchemy/sql/type_api.py b/venv/Lib/site-packages/sqlalchemy/sql/type_api.py index 2be3972..9cf4872 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/type_api.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/type_api.py @@ -191,7 +191,7 @@ class TypeEngine(Visitable, Generic[_T]): op_fn, addtl_kw = default_comparator.operator_lookup[op.__name__] if kwargs: addtl_kw = addtl_kw.union(kwargs) - return op_fn(self.expr, op, *other, **addtl_kw) # type: ignore + return op_fn(self.expr, op, *other, **addtl_kw) @util.preload_module("sqlalchemy.sql.default_comparator") def reverse_operate( @@ -201,7 +201,7 @@ class TypeEngine(Visitable, Generic[_T]): op_fn, addtl_kw = default_comparator.operator_lookup[op.__name__] if kwargs: addtl_kw = addtl_kw.union(kwargs) - return op_fn(self.expr, op, other, reverse=True, **addtl_kw) # type: ignore # noqa: E501 + return op_fn(self.expr, op, other, reverse=True, **addtl_kw) def _adapt_expression( self, @@ -354,33 +354,6 @@ class TypeEngine(Visitable, Generic[_T]): def copy(self, **kw: Any) -> Self: return self.adapt(self.__class__) - def compare_against_backend( - self, dialect: Dialect, conn_type: TypeEngine[Any] - ) -> Optional[bool]: - """Compare this type against the given backend type. - - This function is currently not implemented for SQLAlchemy - types, and for all built in types will return ``None``. However, - it can be implemented by a user-defined type - where it can be consumed by schema comparison tools such as - Alembic autogenerate. - - A future release of SQLAlchemy will potentially implement this method - for builtin types as well. - - The function should return True if this type is equivalent to the - given type; the type is typically reflected from the database - so should be database specific. The dialect in use is also - passed. It can also return False to assert that the type is - not equivalent. - - :param dialect: a :class:`.Dialect` that is involved in the comparison. - - :param conn_type: the type object reflected from the backend. - - """ - return None - def copy_value(self, value: Any) -> Any: return value @@ -816,7 +789,7 @@ class TypeEngine(Visitable, Generic[_T]): best_uppercase = None if not isinstance(self, TypeEngine): - return self.__class__ # type: ignore # mypy bug? + return self.__class__ for t in self.__class__.__mro__: if ( @@ -2323,7 +2296,7 @@ def to_instance( return NULLTYPE if callable(typeobj): - return typeobj(*arg, **kw) # type: ignore # for pyright + return typeobj(*arg, **kw) else: return typeobj diff --git a/venv/Lib/site-packages/sqlalchemy/sql/util.py b/venv/Lib/site-packages/sqlalchemy/sql/util.py index 0a50197..28480a5 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/util.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/util.py @@ -1440,7 +1440,7 @@ def _offset_or_limit_clause_asint_if_possible( if clause is None: return None if hasattr(clause, "_limit_offset_value"): - value = clause._limit_offset_value # type: ignore + value = clause._limit_offset_value return util.asint(value) else: return clause @@ -1489,13 +1489,11 @@ def _make_slice( offset_clause = 0 if start != 0: - offset_clause = offset_clause + start # type: ignore + offset_clause = offset_clause + start if offset_clause == 0: offset_clause = None else: - offset_clause = _offset_or_limit_clause( - offset_clause # type: ignore - ) + offset_clause = _offset_or_limit_clause(offset_clause) - return limit_clause, offset_clause # type: ignore + return limit_clause, offset_clause diff --git a/venv/Lib/site-packages/sqlalchemy/sql/visitors.py b/venv/Lib/site-packages/sqlalchemy/sql/visitors.py index 69dc6a8..cccebe6 100644 --- a/venv/Lib/site-packages/sqlalchemy/sql/visitors.py +++ b/venv/Lib/site-packages/sqlalchemy/sql/visitors.py @@ -146,7 +146,7 @@ class Visitable: cls._original_compiler_dispatch ) = _compiler_dispatch - def __class_getitem__(cls, key: str) -> Any: + def __class_getitem__(cls, key: Any) -> Any: # allow generic classes in py3.9+ return cls @@ -161,16 +161,17 @@ class InternalTraversal(Enum): the ``_traverse_internals`` collection. Such as, the :class:`.Case` object defines ``_traverse_internals`` as :: - _traverse_internals = [ - ("value", InternalTraversal.dp_clauseelement), - ("whens", InternalTraversal.dp_clauseelement_tuples), - ("else_", InternalTraversal.dp_clauseelement), - ] + class Case(ColumnElement[_T]): + _traverse_internals = [ + ("value", InternalTraversal.dp_clauseelement), + ("whens", InternalTraversal.dp_clauseelement_tuples), + ("else_", InternalTraversal.dp_clauseelement), + ] Above, the :class:`.Case` class indicates its internal state as the attributes named ``value``, ``whens``, and ``else_``. They each link to an :class:`.InternalTraversal` method which indicates the type - of datastructure referred towards. + of datastructure to which each attribute refers. Using the ``_traverse_internals`` structure, objects of type :class:`.InternalTraversible` will have the following methods automatically diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-310.pyc index 591f4ef1597af38218bbd0faf3323e23c817a941..41fc15f6d145cf5b4330d56822d6df7286194bca 100644 GIT binary patch delta 19 ZcmX>oaZrLQpO=@50SH!SZ{#xP0RS*J1Y`gJ delta 19 ZcmX>oaZrLQpO=@50SMxmHgcKs001mv1Frx8 diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-310.pyc index b62654ceb31de5f94a4896cf21d42a7446151cad..995ae09a9d7cbd4f1cccdab138cbd3b3b5bbc106 100644 GIT binary patch delta 21 bcmX^2i1FMbMy`BbUM>b8Se?C*%cT$iQj-RT delta 21 bcmX^2i1FMbMy`BbUM>b8h-cc!BqIeUEvea4_+xD`1o z$@)9#Rb$tQQ64%2v7oIaR9j7GNzDqHs;%@mOiePJaAdr=!>dTgX(|!LMnaj>P0Rzz z|GXZUNoA^ktJmZtf^2+s58yXz4^7&Q|oeoItMh?8tRaF%( z*9>r-sjL^cDY{Sn1R~-__N;?M{I10v6pP_ZD!b8~?AV(M%wu+KN=CU8yM%DW64 zb29%g{&3v;02)2MUi{#&Zx>k%7pxJ#r_J1GJ>B zs8Jy24*b)e!bM@@u2viB5&MmUXy*eXx+S3OvYyRk?J}k8AQz2CdAyX7M3;&yFE^e6@?6=Q!?L`xPgSs!^ZRT50ur2*y#N3J diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-310.pyc index 10358649276ffdb7d4f81debe6bf814808bbd08b..31929b52b38d62e91ef5587dddefc3531f7102e0 100644 GIT binary patch delta 19 ZcmbO%FZnra@~I1yW1u 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 MB^Zdw;cHRlf7PZ%@&Et; diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-310.pyc index 61797e660a59d64bf520e52663bc2fd5cc758220..29a937804ed63694fb99a802ddff593c3d88437a 100644 GIT binary patch delta 19 ZcmaEm{UDnwpO=@50SH!SZ{)gW3IIU>1`q%M delta 19 ZcmaEm{UDnwpO=@50SMxmHga7v1pqxO1zP|B diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-310.pyc index 3d5cfb9991e8854477c9f601cabf3a5ee499fa02..8a44f80eea407013aa7e5106a0d2788f96655d20 100644 GIT binary patch delta 19 Zcmew$_Cbs*pO=@50SH!SZ{$kj1^_nf1nd9+ delta 19 Zcmew$_Cbs*pO=@50SMxmHgctL0{}A@1UCQx diff --git a/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-310.pyc index db10e27c6e70aa8fe66f93a06b2f9d5447d3d7f5..88503d48bc3516a172facc60c5c2604a465679ff 100644 GIT binary patch delta 19 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 H2>1MdfoyV^ delta 16642 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

    m?< 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 Kj6c7x<9`8I-!QHK diff --git a/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-310.pyc index 3ce452c9269498b87f1a34bb892521150e47e70a..b2fd1c3ff3698ccd3fe7c3c897aec56784a0dc8c 100644 GIT binary patch delta 21 bcmcb&fbre}My`BbUM>b8Se?C*Db8h-cc!6%qgdN23K? diff --git a/venv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py b/venv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py index 393070d..f6a7f15 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py @@ -14,6 +14,7 @@ from argparse import Namespace import configparser import logging import os +from pathlib import Path import re import sys from typing import Any @@ -320,6 +321,10 @@ def _log(opt_str, value, parser): def _list_dbs(*args): + if file_config is None: + # assume the current working directory is the one containing the + # setup file + read_config(Path.cwd()) print("Available --db options (use --dburi to override)") for macro in sorted(file_config.options("db")): print("%20s\t%s" % (macro, file_config.get("db", macro))) @@ -420,6 +425,7 @@ def _engine_uri(options, file_config): from sqlalchemy import testing from sqlalchemy.testing import config from sqlalchemy.testing import provision + from sqlalchemy.engine import url as sa_url if options.dburi: db_urls = list(options.dburi) @@ -444,18 +450,19 @@ def _engine_uri(options, file_config): config._current = None - expanded_urls = list(provision.generate_db_urls(db_urls, extra_drivers)) - - for db_url in expanded_urls: - log.info("Adding database URL: %s", db_url) - - if options.write_idents and provision.FOLLOWER_IDENT: + if options.write_idents and provision.FOLLOWER_IDENT: + for db_url in [sa_url.make_url(db_url) for db_url in db_urls]: with open(options.write_idents, "a") as file_: file_.write( f"{provision.FOLLOWER_IDENT} " f"{db_url.render_as_string(hide_password=False)}\n" ) + expanded_urls = list(provision.generate_db_urls(db_urls, extra_drivers)) + + for db_url in expanded_urls: + log.info("Adding database URL: %s", db_url) + cfg = provision.setup_config( db_url, options, file_config, provision.FOLLOWER_IDENT ) @@ -473,9 +480,6 @@ def _setup_requirements(argument): from sqlalchemy.testing import config from sqlalchemy import testing - if config.requirements is not None: - return - modname, clsname = argument.split(":") # importlib.import_module() only introduced in 2.7, a little diff --git a/venv/Lib/site-packages/sqlalchemy/testing/requirements.py b/venv/Lib/site-packages/sqlalchemy/testing/requirements.py index 479e1be..5d1f3fb 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/requirements.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/requirements.py @@ -22,9 +22,8 @@ from __future__ import annotations import platform from . import asyncio as _test_asyncio -from . import config from . import exclusions -from . import only_on +from .exclusions import only_on from .. import create_engine from .. import util from ..pool import QueuePool @@ -59,6 +58,12 @@ class SuiteRequirements(Requirements): return exclusions.closed() + @property + def uuid_data_type(self): + """Return databases that support the UUID datatype.""" + + return exclusions.closed() + @property def foreign_keys(self): """Target database must support foreign keys.""" @@ -840,6 +845,14 @@ class SuiteRequirements(Requirements): """Target driver can create tables with a name like 'some " table'""" return exclusions.open() + @property + def datetime_interval(self): + """target dialect supports rendering of a datetime.timedelta as a + literal string, e.g. via the TypeEngine.literal_processor() method. + + """ + return exclusions.closed() + @property def datetime_literals(self): """target dialect supports rendering of a date, time, or datetime as a @@ -1448,10 +1461,14 @@ class SuiteRequirements(Requirements): @property def timing_intensive(self): + from . import config + return config.add_to_marker.timing_intensive @property def memory_intensive(self): + from . import config + return config.add_to_marker.memory_intensive @property diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-310.pyc index a170fd877694fbebfd4370b968461cede95cc845..0bc021b94cad62f6b49484d03fe147d02f4ba329 100644 GIT binary patch delta 19 Zcmey*{GXXCpO=@50SH!SZ{+&Q2mm*h1!({P delta 19 Zcmey*{GXXCpO=@50SMxmHgbJs1OPL^1hfDE diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-310.pyc index 0b45fe0b9bce9451803415803920e6a5e72f058f..88f0620949a107c6bc4bc24e59ac62aa481f5f3f 100644 GIT binary patch delta 19 Zcmdm`yi1uYpO=@50SH!SZ{*q_2mmpt1nK|) delta 19 Zcmdm`yi1uYpO=@50SMxmHgatc1OP451T_Ev diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-310.pyc index a013b30d74ae9c4c85417780d31e75439b776fa0..f63293fac2360ab511ff8da09bf7e4c3860de988 100644 GIT binary patch delta 19 ZcmdlUwmpn1pO=@50SH!SZ{*U|1^_n}1mOSx delta 19 ZcmdlUwmpn1pO=@50SMxmHgf4|0{}BY1S|jm diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-310.pyc index 86315906d02329b8d1e7d4c3a83f4b2e812ff8ac..e6b670129deafc525dd3d5b8e853e59216057229 100644 GIT binary patch delta 19 ZcmX@8bWn*apO=@50SH!SZ{#u;1OPFR1bqMi delta 19 ZcmX@8bWn*apO=@50SMxmHgcH@0st+$1IPdX diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-310.pyc index 9a72ef0cd8baab2a5930e49ac76251be5665d824..912bfb7715d42090316896314b20666dfcda4715 100644 GIT binary patch delta 21 bcmcaRlkx6MMy`BbUM>b8Se?C*>#`33OGpNM delta 21 bcmcaRlkx6MMy`BbUM>b8h-cc!b=e01M{@XP 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 diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-310.pyc index 0bb7a5659027f876062ec00118bd92672d356a86..cc8e90127325853218aec163d02d0324190fd9ae 100644 GIT binary patch delta 212 zcmaDB`zw|&pO=@50SH!S>t~4CZ{%~6;1U3G9e}u)ZE~E%{Ja#=bf$%jX{;$?DZHti zDdNqHDZFVcDH1SV7Iz9$3V$zS3KLLNGDRvyx|b(KCPlV|p_ws?FGVgzzJ(!*KSd!$ z5l9Q9D5WR^X~7hg6jdNCl%kfR4y1)sG=dp4HE)SdeyAwAxkl20QIxH2y}w-U(6%+F6rO5S`zil2pzHMbZjyZM^jM?OZL%_nr_7y%doItu^* delta 192 zcmewr`z)3(pO=@50SMxm^fUh3ZRB&4;Nk~z9e}u)X>y#z{H%qHX{;%tDZHtiDPqlx zDZFVcDdI3*7Iz9$3V$zS3KLLNB1JMqs+T84Iz^_1p_ws?FGV&*u7x3rKSe%80Z0p^ zD5fX@X~7ib6cr#Xl%krV2Bd{k)Por`HExMcc2E}G+#qSeD8dxQk(imETUlI~6UClb cT$z`gTe7%Q6yBL#uh(mP?Kn;9{4{@U(rh7#(o%{b2uT0akkB9g+=FFh)`=a*4zrs? z6i1dwfGg5S91sT^aj7_=-g@Z)sS*do36NGGdf^ZuRf0orq`WtqI7vaGEA2P$z5Vvh zoA=Gk$HNattV%p?D)4;0IJWSh=NoI9kO$%>Ia71YdX$;-3X6V88dQ2Qrn2}vZBS;h z#HO-AHb^GMlB{J@$;4TTwZdpg=Am7t^x9avV-^#|WS+9a(rU?5nJ3LUcJicHC+mX$ zTUj?d0^`^r*28+iXp=v*vp&|3)J%||oei*~(oeHv*A;v4PMZEo$!+mS`<4ufyP@yM zkl55u96t_g%NTjbn_I}0N<0cK9|W*NzUDfmJU@YvXT*>CyEQ-JdO6Qoa>|~q`TEK- z1JBo)Q*u0q4(^LS+VvfCOlnEE-tzs?6OFe?@rSi^!79ps)=Jh16t?K{e}PnKs-Y>v~nMM;i)J z%377yV`x=Xz6{a0wDqFJVylX~Hl=(>m;z$NXZR6VJ8uQ>NoK19##?&1Qg-^reew?P z1%In^FL-jR3!Pd(Ic3wW$M9^a5VR9~2nKE;j38iAehLAl^+Rh54tMx-7-%ZQTkw+# zg8N!NS19=*shDr@%Gz9I1>`mODE=YEKZ(|9MXA9)Kr<+t^D%S|Hz5s{f6Q}SFAGb_ z?xxDRb51$O3l$f_S)MDn&Us+EuL2k$L)EE9l0+x^wyy2BbYfDIn1ucfUkplONI~ID&P|Uu-gA>BK9xnvHuP@DJ@JaE|7^dUPqRsf~w9FWJnvC+WVOo9;64>Mek&etHe3dPgf_YK3JMTw+ zA-xxoB{vOLZ4;@WEPlpL@gdW zyZ9)cB=^K;@%Or?A(gEKW#CmC+(EJ}uZyGB5V9t#XG;p_*%fwk8t8fMJ)CF~6qrk)j1Cu4Bg2ceW2oe%1-*eg;1PBj5f5&_8|BmlV&z-$eIUW~% z{3{5()9EK+KiTZW^3O41;H*Q66xL%HrQp0geJI z7IxdmAq?J%U1SWtiBARx_^}rGXKZ!=-3}t$bO&*D2tG&(Y>28ba1p*o^UAp6r*oET z>x8IjnYIac>l)YQV=qbDQFLiR^mAy0C2@_qc`d~{;j*;5XR{%m{xG=??TN2s0J3s( z9IIOKZ#l!L+)wU9MV@aS;pbYQrh+fdlVYQ850s=r9zb{U-hcauN&mf%n@N>C1~v65 z?+tjT3$;t<8 diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-310.pyc index 826e21146ee15f5a662ac0e6f327a92cb33e99c5..927844ce914c6668b82cb29b5f8ec90a51bf46db 100644 GIT binary patch delta 21 bcmdn6jCsQ{X0Ci*UM>b8Se?C*OYJfMMZpFd delta 21 bcmdn6jCsQ{X0Ci*UM>b8h-cc!rFIzrLF@%( diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-310.pyc index 69a190202707b133fcf196ad389e661f4c3852c5..3c0874141affe43a2eb7e6a16ff43113a957abed 100644 GIT binary patch delta 19 YcmeBm?sewM=jG*M0D{%o8@ZYl0WV4fvj6}9 delta 19 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 Oa^!hgZu#&_^Zp;CEWv32 delta 18459 zcmb7M34B!5)z6!mOeQN3LP8d@LLd+l0)#DL352kREi8`Wkj%W0A(NSKXTlP}sE7!P zpjU0Hs9>!a7172Ow<1*QZtbFdwV(F0ty=3=ziMl(eCL1O%)FT~v8X=|_nmvsx#ygF z?z!hK!<)V4zg=q{E;Y`BKaMcj5CXAa! zxLVgt!p#ihW)p6fYc}C#hdZ7_xH+ym!qtUwb%dMinn$>KYF$v6xrD2C^~@*a{4jDJ zAsbu^2)7`Nt0&w-*CN6#3ghMzZn0|#;g*DP4TM|jT1L2KVcY`3HM*7)Zh08DkZ>zp zD+#w!t?LO&vxtzZT&oGWI^1wE;hJ1)2)8DTTSBHrv;@Hrv;_l+|%%?H|NR&GN^-=i=W~ zl;QG7LSt&YXt~m~IYG4Sw1`Erz&1U5#7^rG+tIiqi94;ElQt&@;&)nHab1d7C%4$L zb1i!9uEZ$z+UEM~+T=NZBC& zkXBm4T12I-#zf4^bv`P*WOpAO13Friuxg;ubAo zdbV{^t;g*TIDH+Rvwk8U7_wCH$Zv+!^l%4VXu1_3nn>&*+&%Q?a}$A#kXpivrZGCj zi)Qa8HBu>RWVf}d0cRU|lt=*0763t@EME7Ik%qoYQD-R4lCb2tvSMhiazy?!{h=NY z8bMv*AkdrGpC~ahh)y);?)@mmm^9tNHuZLSJPtp3pm&r11U36Sg@BDc$8t8)oThXa zJJxt*dB*Mr$e`&`kkNO8XAeMs+=uGi)sD`Xt6I zQ2kUwf10gR_&QY)*dgZNGui2B_WL{3K%37c+6f~90J{J#0oVhu7vL%YqgyUPPH{eg zo%F|_C;ygNsGJ{~d~$5oGUWofJ!?t{kD$WLdQG~<>5Fm03X4KJ*@ z0mUBz7@cs5^*clrzo0+THcm3OjhKSk2Ki*U?6sx@AnrQ!;}Ps!Y0uwcjVRQj{-k8fWefF2;cfx z{yy)t4Rfm3EIjhg5rysh>7&dnIGWxLvL6GHq|f!EK+Fa}D2{d)@ z#1|H2wXDj|HhmQ*m*(#)yOa1e(2QP0f75gv1opWA-0W^20EU%yC4oCa;7@XYAp$AZ!L!~(`RuyEa!g%{e7o>qc)YrbDod(CFa=6UGh{RcOOxWyvsQtV}Dp zUtb6?Vw$<7IZ$TO%&k5j$|5AoPpR_1%7R7_vPAmJz+%v#4GlOt-OhH8sxQXKTqesE zBWq)ZEq0(vA#e(fbBo*C9B})*e(?|_cnqMwVLL$;x$>QnS;~pf{F1{)9awsp@J&u+ z8KM7B#-DlgM_dSiU@0~N@LFoH=eakBD&`S^aLSKI1;XR+E-lO-1Db(`et|qzy13^u zYEl;8C@}b6CHj3GY9T^ZZ_p2(M71KGqQ63G^b=I>*B#K-7=lpZ$nL;2{dt1y9GziZ z1?ex9`$yMIi4;d)k)H_92_Q7l}E=4%0XR>TOO zAup-QP`1bm#?Dusledo@Ka<6H9_?eA4vz{lSnK?>zPG9VE*S7dqUbJ?N6Ipbvi zRi&83b8_Lhl41Swlb4LkPu>xxD+Zl>dfecZ(cvm0N?ikq<^UW7;CS^6N<0^Ap;ScN z2Ha_YGXQ&KVfmQxFp78q;AMbU01WN8#LoOURm_%M<>Qpc`;L}dmCcW!h@06 z8BkqTWMY?{hT0aiS1NsxWscONDx6mEgMvFmO`k^m(1l0hMB|>OklfJC4hDCtWo4e?ay&z&ikQ322H- zQ&f9=bBoiZHj4iRK9;e(VRE7JsC;;GZA@~l$NMCru@C9;wqRGQxdq73@!~H(|+RB=_6$P+zCB2h%r;L zjYu?$n^FwT=4^JhsSaN|^QM$%bGRS&^u&7A=@Vou*Gtrg-%7Q%I4kY*#oxdriMFr7 zjV~|zl;;7R$Y^YBwV|?SZsxr4;A%`f&ZQs)%{1?jy?~xGooa7n{=tlv zg_|0dPiDCSRHG?!c>VI8PpKGMFhUu}Cm=j`xwv^ha*4l#&*uP!06Z@G_6FO3`Iq{^ zruP*2&-&(`sI}`ekU0p1QlA*x^k)`WBq~)l%n&0$A}=M_D}RCEu@Rw7zB#|W7M7)9 zWdpPM+jNAnh;dakJDv;QD1AK*Ns6A(vGlMY2Vio{dazOK@v6tKI?9Gd47VArUMHZ% zx2T)k-k9;XXSlt7+S1bW>lE$|n(>Zybw@1SY_8j`;wSh$YwZ*=5TU-WBq?9{R4ob!K+lV z55Z&#xI0uwaIf#DB{65w=z@QvozWGS*g4;)isux$aZ$eVJ_m#+*Okks7gZ){wh%A* z`J$FuI0rfXyWqp#z_F7D4f=*MkL9TU7l6^(YI*JAETvTTF0Pssqt^kn$K@J6sSt+`&<}4jO-hv{u6!9oo0U~rj1%#MPeF>ZNE*&HjTO&(0(hNRV!Pv-#j)qZ(5VskmC?BbYjGChe zWk^txL|M~#(RW$&wZ`Iewdexfq6N#Vrwu6hSeUC{@1P3%D0ypRW`zTbl-ubJICupe z*s$rOU7dVwd6tsS>YVl3q-Dj*Oq1V3Lx-;6j8&!I zPeVAq7z_|GoneXLzzyj5IaGTdbs2G9l%!vXtDAvy_SqLY5_Jwt9-TO?0+irtsms+9V<-C}gTW zN13*TWy&R<@~OqyHN9yA&*Q9UcNziVBTOs@t;rrUpn3DC^%nG(4YEAe>dAG9vSZCZ z>3*kmZP9nl>+j(;`&cLW;o9l$n0b94#5X2Kj5e$YtHi5bcyaqL;j)ml*(DFG%T)@4 zDqUte8z<}5m!9iHzCjoG`t=jeIkZO@9Xb`jq5~Sfh-wd_k0dlJ3b~U>WXOi|DigZF z!4oH&SLB_m+Z<(yiCcFG+~&yoqB4;W=KXo{D5|&_1U&AexO=+Sl9TP*C*Y)^*VOny zJY>iLxB|dn!@0sPe*= zrHJdUez~M_P8yQ!7trcP*}dWGQe=3+tw~CV7iB`td}tNQ*(>GY3&(AK9U{&Kml+A@2|*`tnvy_gzd){ps$!@mE*huMy?50 z)4PS>#%Da0UNXsEM`i4R3MB-=z2i8vE(fRp;6bya7Q_()ZS-796~|1nY-1kfZb(3I z3F_QfuFQea$r70$$M%dwN5-z1ojy+lD;}*OgzM_?(k*i*<-dM9y!_lGUv0i>K0UR- z_JNs<3vtqqStdt|#C!(P2Ar0pbUn11f_txdt9)=bmCP4ceRg==Eg2liUSLz&T> zXdw+rCsM^k!>R_h*UsJKiizGRLSJ_I{kcnwOrL+THSztAST_r_h+SS^d2j`Jl>vVt%Luq zlrOZGhWLHaz9EM-ZUWP95p{TSl$G*I&*fuTIo_eMhV|5Zp!2jT9R*6WT-&iLmI!tp zi0D5Zg~@J+cRq2ZyV2CmMJ|2E&`1YE1A5{~=(-HDuK-vFupZz%06V}10LCyHE?P$w zDe|~?rcwu|>^tlIoyiCfd6UEpP=#JjW%*dplJCT^s*Myc7 z;#Fe0!z@>AyV|O^zpf|my6t)6MiU7QC+_%q6;1KRN@1(@GV0k^1hK7#TXo{-Mfiqy%1!hIeY{*6aak0IETEA>}d+FJhn_lBEt^Y-{ zJaN&MvhXkpHzX*c_M$%?dGg|&d8Xf(<))qfQDLG6;UADnp50ks`kh%8?z%>4ktcRl zOxQ|o%S?^zHDVhGw*y3&6TNp6?$7#kO1*e`4m&u8;9FwJjTh&b-Zsmf7hi1MhX(tv z>lrZ-oe22QclYoS_dw0MtK_v8=SX+Y@W}&r1uG5>EoaREWJzqr_s#O5p6*)sFC~KS zLi`c{K3T+i(;IoQ{yVTSZ>7a6LS@;0Ns;MOv%Kb#-7_#{=>EcR;C?uY1JEsk0hs2? zy36uSU(w9G^gumNJYIP)Jt?c{j~^$kJm(?ix0uS>%f>2-+;rJvbIjIOb$;YZMZ^uLp=AplU6Xjjeip z0e&su2rmCaEW!PkElD2PlOcb)=TEtiY5-31fh&sW*~G7|SWkC!<$Ie7!fN#2v%GC@ zkupV|+IwK^7zmXblC(+m;JaUO<@PJ{l-crzD{JY(^7Sh>j&u-JS%N*q<)(=34Dg{I zB{2Gzm<*o9a_zp-WVRb8nzzcm`wEgHY#<-lm#;L)*Y?%Ko;TkFdLy&sfaHU40f1cq zugY2bi;FHr@iKtj1nh%i=D)Z?Ub=ro&t5dR5)HESxZnu*9Id`C5i+@7T!kiA6VNh4 z&sMo9J=;-*leRO{=;aEYE zT6{jw269JnrCf83eofber4U_;#Q=AbKxL+;2K{C%MZd!N38b8j>X;38m?U=BZ9z{_ zafEq9@1BzN`$OE*ZIo9W>^&d(qqvJDXlx8UA^TpP-wjD)41>EGU*G;iv-NAMChmb# z_=d7U5eiap)$gdpmna$faBNNqi%9Pqg}mpWQ(fD-eg$ zi4krVOtf3GCECo^K}qpSN}9N%Z>9W|lE}VCdE+KI{)RkyGPd}J%8{ecH=myj2hMb=PQnMTrsm!G*ZnYCUVdYF!h;~Dw|$S?SVke~k2fA% z|3M;9>=PutzUi_j@J)Z~CV~5O@i4$+1ZbyZ1g58eJq6$cU5rFUGVzB+rY9}(!yo7~ zK(o-3`zjhe9@G0nbfGKR6F?Zwz)K~&05cDtHU%ZnQlOwi_2|=;10{2ac75IRPsS7P z7cG66Ke8z4k3iN(3DA5zhVosq{HE;0=cx&T!Sk~5ru?24=&O;w@b^EG(du;XR<+RW z@tp2uB)?Ok2X+a;tuSA@5y4AD5IRcZGJWH41!XYYLw_UQ&_<$mPVl>tvG2`HdgI-_ zznxe|T;+#1B@Ta?no^5bKymh#xn~}H;y6L^8UjarZ+5o z&mO)-QC{V^x&7ALvUmxz>aW&~z?D$BS8Ar`G=(AY1+}0R73sIq^ zIvo7E+Nsieb4P?H{f-3z)3o5;e!kb~bE%>zo+cT2H%+n(Mf@JkKBTX1Yw?&-{<31W znm9w~CNYEXG}b|fql;MaQ}n4+lnv3N68p`wa>0?J9zks*oNyLC(+Ozte!6_4%WZn* z6r(x4GBTzFPhXByKZi)n8N%5UH~VR2gU@Q_PKV!kUZW{~P3hE9ajw-|E>wCKL`S7;3rem{9vZ+Uj#kUVVGE(}=Yk zdTr45?*wQ`V3iDQm>a9a0rx#H`V#=sR(m4H9X$7pl{-tW{Bf4Dp|9}ABb1&Gh@kh} z#DgRsg8$zDI4W>Js6$0K7W95EInyJ5NWpHtTE22ep(6S|xuZgv1w(2H{;n2!5m80+ zj1Bu4x`%beUjaS__ymCIbtWW|mLrefnWOBNTkl+-%JW0fZ{cUk-``njdyyz8*zcF= z$9~)crxb4i6MU!B-$)G@2jRMg0fLXxw1iL`j2WkXf}xyzSE1?l_`bDw9a5A>OSY=3`Jh3Dw3M?oLdBSFE&_#=MRTk}BO=bucJV57_ z+OXJ?INA=2c=XQ3ixiSnE|O0lA1?p>K%z3L@9+Z_rH4h_PfFTN?Nwb#RB(yY4|+bm z?a%?0CM|08Y=lQTg`=c{eKsTIP!)Nt;_8>}}WIqmO zoPwML?leA60{jMm*QbwA`V`>r0AB!{1+YQ}8$cpJGC;Zs?qfJj*plL2BI&irnU4gN zdqYvQB6 zCl`&p4^s3243zjEw@T;Ze@O_=Pr2fW{KD74#)!biV6#tusmN=dC>@go8yVJN&mH1$ z3j8$I-RubdX7o{O-&;>iR_ex~bvR|v67Z~#&M5R#E29Hwt-DPfO2+gNa^+Knt1xHi zNg(y1UnK2Cqi|rfCx?y+{9B@qxTy)MMasryC(WjkmsvY{hEM@~`hCIu;5eLf{dzJ8JQks93Z~CoO zmi+8zYY-en3HV{t)E!?O*ybzlwZ%s7=x&W3MHNV6dMT9OJe?(%pGq|S*(&X)j-7{2 zNZ;&GHzJEl-3i5hb*t(vX6<{ev0bu~;gBmP!>9V`C{uPmlVtjbRqlMIy} zqFC@l!&pnmv!^Q+i>y4;+VVNcPKn4mqBMS{Del8(e<9{es9K7?MgxoiC<7P^U<4rc zaW>OL`Q@47@ztoF1~44}uL2`1#EKKBwo_N5_L(Q+o()q!2AX6fp3yR>+~$@+-b zqSnX`jLa)cCU|ZdnR4X5o&A?tMCDgzZ21oVB3l_PAO6MXQPRvpfAs)l<~Z772*}s~ z1V3-&;4q+226ePhTD-@%jh3K=;1lDf+49mCvX$v_?h7}}bf8ajM0dO|c^)FfQ0WIh zp$G$mt&kZnUPLFbhh7{z3Vdj1x)|LVw~@ve<8r|+-+poWTpadO78RrAId+Smd^Jh? zOWR84QcqEWvlGM$E|enFMeY6OVxK1i&GHn*osSaF7yt zD18lFGD?r5)WhfBrTCr*Py|p2kPDCwFbp6EpblUNz$k!Ug2NpsK{s89b>ct3t^t;} zh3}xmzOfq>oJHVxM#KZig|F}JDMpDy71mun3mk(|831jhf>+<;QK|r_1Yk2^@a$%v z=!i^tkwHvGMGBQF=nsCm;uqDRngTEtm9{3z-YA{zQTgZh_M|5Mw<&;)u-_51XPdIY zSm*bFGc3s#i7^$Mk1fvDWV^D_3|q4`$^Hw1Ml?n$Y)<@+nf^71(4N3>2Ts^*wH-cJ nmq*1rra1q-vgFrldYU<-K4WP{8vQ>tV`Rqcj79Ruuc!S#3nN7D diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-310.pyc index f1dfd3c6955a4fd3d48d5b7a459a3cbcd577029c..e3d9ace41bd71a603d20ba52d511ef8fdd37174e 100644 GIT binary patch delta 19 YcmZpYZIb26=jG*M0D{%o8@Vd@04RwBGXMYp delta 19 YcmZpYZIb26=jG*M0D^d?ja(Ic03@^negFUf diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-310.pyc index 84aab682b7585c51f0377c4fec6b41e15ce3e199..c5e73290c2f2780b294ca5040b14e152688d8ce0 100644 GIT binary patch literal 3528 zcmc&%-E!N;6~-=p3I0f;WjS@6T20cVNE5qp`je(<>ZvpB)XAt9R(gTa3<`1A6e$p- zcR}0A(9=%s+q^+9$lPiAD18Im_DZkNX_J0u0g1F?wVmD+92}h8J-b+(^L=Lz$L)4# z;rh$r&4a&oEbDL7SiKxHZsXQDgs=q5tPzVDBb{e_WXHDA?aUduv1@b(x)*!UUE#sr zkA0*2(1SQIdH}r#ZiH{H+ViCvlczsU>Pmx@g86>5<8q4|Z>1=JpFp1WMMZsXQ}gpgLu zgcWnaVq5Uo5q9iKPdLJTW<6!G58V^K(E|~P#xpC%&P5Z?P&Vh-bKer}FWG|2=CD2N zh>lnzYs_7H!T7pZ7aR5XhUnsZFO^&O2BS$PKbwfOkRQuT7IGI`j~$uz4k8w}b(+gW zjUV;K)4bU2k$+Av(gWOgaO*c93Pfwh3MP2Lg)N*fZ0K%b3lDqZPaTRC-sL2F&Ify+X{q$yC*ys&_p#K6#dxy!JE5d4B-M6odp#@765{&N<_(gudSJ9!tX3OCr3wXc+#{U_7_4%t8_+Vw~a~_~L(-sY+9z(&`ct z38M5W7?tj$1F2-mdL}?X`=D2pje$-ouaqq%k$ZAYv;)Xb$)_mcl%56%VIPc@kSf_f zLavfU?;y>xW2ba5dSAUvhO8)=`bNwM+%=rP3oE?^5io~cW6sy19kLGN{3`R>=w+#%vV?HNCoQJY4ij~%w97w3+tFQ5wq4x%-UcCl1!hU#muc@R>fu; zJ5aAeM4fL0q9U?-olM9L6;s|M?Rz95669|67K!hZc$>sKB#7>-JTMNamV6IGn%EJ* zqal9qC;M;wSxqm4oB$AsU@$L8tF(WE#U3c^De@MQ@RS9d8;U>{}THBz9C@lpZ4@E z3NBi-zCGW>H(joFZfLu;u*?ciLEd0VUbGs^Rut}>P|2~RsroiGm)Y?<)VvOHY^!a0 z)RZQ2R1mtd0-@K?TQ(|=;)q`XkV&;arbz}_KO*fXWNqWDE1mo4ATyajy+I>OxEW$Q zIQevGgU9DUckHPfWKXPCKO}Jz0#q+Xg`!j9JRmQxFf=*a=SQ&Av`}Eb#67+VlGD9~ zblpYL4q2CZyvsT`!>%%i2VVzYc@B=Tw=YQHFMP?x=xqJp(Fw#7Dm&^|H7eKiCkB=4 zK;On{GBKF?eL?*Ot!JpLdumj!*Qf+?=bJ02yj-L54^+J^)6?@9jT$@ZeF`2O%_~^^ zfSTJRD0iu!LPT3D=%cDg{fxviab1Kv^)oCF;}=Mbj|5$YEt&SkmV)ORk+RiLWU z)Dlz)EH406_&nvSpG&&a)Wg^NvdK)6J9Gtxl&fJjk0F_f1bUIBB^<(F{$JUv# zj;hB_)GjSWHFq3h`>4^dHEm9**wa+Hrd6423g)v~x%!yU{AJO*IQ`9AwKT8XV}Qatn`=uHsH z9=v(?;^z?WBIcqW#hnx%Sa->f*`5E)KbbsbFOya$9@izYT)f(RRQgs9)%#1kxgCk9 zM7x%VM$xHuB|AFN9fKGLl5O_yx3dkX`MqRuD2vB0a}8}N#1zUnzeUd|$xm=k@CDx` z4545q00}s}C+CY`A1bZ3Pg!7NX2DT!blPp&2wI&sOM*PY7^IAW(j~Q^mf^4R$B~T& zEz=@x%MX}Az{cT(BOjI(vA9>@egf_jYzktqW|IP;(mfXqX&Ad`Qbt46UPXd1D^iGg zg0Nznycplucl2tl?oq!gzBfvQqpn-?JlFltBUFoL9n$q^3I4DT-X=ED*G|dm`X@d9 Bc8&l5 diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py index e164605..09f24d3 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py @@ -18,7 +18,6 @@ from ... import literal_column from ... import Numeric from ... import select from ... import String -from ...dialects.postgresql import BYTEA from ...types import LargeBinary from ...types import UUID from ...types import Uuid @@ -104,6 +103,15 @@ class InsertBehaviorTest(fixtures.TablesTest): Column("id", Integer, primary_key=True, autoincrement=False), Column("data", String(50)), ) + Table( + "no_implicit_returning", + metadata, + Column( + "id", Integer, primary_key=True, test_needs_autoincrement=True + ), + Column("data", String(50)), + implicit_returning=False, + ) Table( "includes_defaults", metadata, @@ -119,6 +127,33 @@ class InsertBehaviorTest(fixtures.TablesTest): ), ) + @testing.variation("style", ["plain", "return_defaults"]) + @testing.variation("executemany", [True, False]) + def test_no_results_for_non_returning_insert( + self, connection, style, executemany + ): + """test another INSERT issue found during #10453""" + + table = self.tables.no_implicit_returning + + stmt = table.insert() + if style.return_defaults: + stmt = stmt.return_defaults() + + if executemany: + data = [ + {"data": "d1"}, + {"data": "d2"}, + {"data": "d3"}, + {"data": "d4"}, + {"data": "d5"}, + ] + else: + data = {"data": "d1"} + + r = connection.execute(stmt, data) + assert not r.returns_rows + @requirements.autoincrement_insert def test_autoclose_on_insert(self, connection): r = connection.execute( @@ -394,7 +429,7 @@ class ReturningTest(fixtures.TablesTest): True, testing.requires.float_or_double_precision_behaves_generically, ), - (Float(), 8.5514, False), + (Float(), 8.5514, True), ( Float(8), 8.5514, @@ -517,7 +552,6 @@ class ReturningTest(fixtures.TablesTest): b"this is binary", ), ("LargeBinary2", LargeBinary(), b"7\xe7\x9f"), - ("PG BYTEA", BYTEA(), b"7\xe7\x9f", testing.only_on("postgresql")), argnames="type_,value", id_="iaa", ) diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py index 05b68e7..f2ecf1c 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py @@ -287,6 +287,65 @@ class HasIndexTest(fixtures.TablesTest): ) +class BizarroCharacterFKResolutionTest(fixtures.TestBase): + """tests for #10275""" + + __backend__ = True + + @testing.combinations( + ("id",), ("(3)",), ("col%p",), ("[brack]",), argnames="columnname" + ) + @testing.variation("use_composite", [True, False]) + @testing.combinations( + ("plain",), + ("(2)",), + ("per % cent",), + ("[brackets]",), + argnames="tablename", + ) + def test_fk_ref( + self, connection, metadata, use_composite, tablename, columnname + ): + tt = Table( + tablename, + metadata, + Column(columnname, Integer, key="id", primary_key=True), + test_needs_fk=True, + ) + if use_composite: + tt.append_column(Column("id2", Integer, primary_key=True)) + + if use_composite: + Table( + "other", + metadata, + Column("id", Integer, primary_key=True), + Column("ref", Integer), + Column("ref2", Integer), + sa.ForeignKeyConstraint(["ref", "ref2"], [tt.c.id, tt.c.id2]), + test_needs_fk=True, + ) + else: + Table( + "other", + metadata, + Column("id", Integer, primary_key=True), + Column("ref", ForeignKey(tt.c.id)), + test_needs_fk=True, + ) + + metadata.create_all(connection) + + m2 = MetaData() + + o2 = Table("other", m2, autoload_with=connection) + t1 = m2.tables[tablename] + + assert o2.c.ref.references(t1.c[0]) + if use_composite: + assert o2.c.ref2.references(t1.c[1]) + + class QuotedNameArgumentTest(fixtures.TablesTest): run_create_tables = "once" __backend__ = True @@ -3053,6 +3112,7 @@ __all__ = ( "ComponentReflectionTestExtra", "TableNoColumnsTest", "QuotedNameArgumentTest", + "BizarroCharacterFKResolutionTest", "HasTableTest", "HasIndexTest", "NormalizedNameTest", diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py index c0f5e40..e439d6c 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py @@ -254,7 +254,7 @@ class ServerSideCursorsTest( elif self.engine.dialect.driver == "pymysql": sscursor = __import__("pymysql.cursors").cursors.SSCursor return isinstance(cursor, sscursor) - elif self.engine.dialect.driver in ("aiomysql", "asyncmy"): + elif self.engine.dialect.driver in ("aiomysql", "asyncmy", "aioodbc"): return cursor.server_side elif self.engine.dialect.driver == "mysqldb": sscursor = __import__("MySQLdb.cursors").cursors.SSCursor @@ -311,7 +311,7 @@ class ServerSideCursorsTest( True, "SELECT 1 FOR UPDATE", True, - testing.skip_if("sqlite"), + testing.skip_if(["sqlite", "mssql"]), ), ("text_no_ss", False, text("select 42"), False), ( diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py index ba8e104..58295a5 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py @@ -66,6 +66,49 @@ class RowCountTest(fixtures.TablesTest): eq_(rows, self.data) + @testing.variation("statement", ["update", "delete", "insert", "select"]) + @testing.variation("close_first", [True, False]) + def test_non_rowcount_scenarios_no_raise( + self, connection, statement, close_first + ): + employees_table = self.tables.employees + + # WHERE matches 3, 3 rows changed + department = employees_table.c.department + + if statement.update: + r = connection.execute( + employees_table.update().where(department == "C"), + {"department": "Z"}, + ) + elif statement.delete: + r = connection.execute( + employees_table.delete().where(department == "C"), + {"department": "Z"}, + ) + elif statement.insert: + r = connection.execute( + employees_table.insert(), + [ + {"employee_id": 25, "name": "none 1", "department": "X"}, + {"employee_id": 26, "name": "none 2", "department": "Z"}, + {"employee_id": 27, "name": "none 3", "department": "Z"}, + ], + ) + elif statement.select: + s = select( + employees_table.c.name, employees_table.c.department + ).where(employees_table.c.department == "C") + r = connection.execute(s) + r.all() + else: + statement.fail() + + if close_first: + r.close() + + assert r.rowcount in (-1, 3) + def test_update_rowcount1(self, connection): employees_table = self.tables.employees diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py index 0a1419f..5debb45 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py @@ -28,6 +28,7 @@ from ... import Date from ... import DateTime from ... import Float from ... import Integer +from ... import Interval from ... import JSON from ... import literal from ... import literal_column @@ -82,6 +83,11 @@ class _LiteralRoundTripFixture: ) connection.execute(ins) + ins = t.insert().values( + x=literal(None, type_, literal_execute=True) + ) + connection.execute(ins) + if support_whereclause and self.supports_whereclause: if compare: stmt = t.select().where( @@ -108,7 +114,7 @@ class _LiteralRoundTripFixture: ) ) else: - stmt = t.select() + stmt = t.select().where(t.c.x.is_not(None)) rows = connection.execute(stmt).all() assert rows, "No rows returned" @@ -118,6 +124,10 @@ class _LiteralRoundTripFixture: value = filter_(value) assert value in output + stmt = t.select().where(t.c.x.is_(None)) + rows = connection.execute(stmt).all() + eq_(rows, [(None,)]) + return run @@ -452,6 +462,102 @@ class StringTest(_LiteralRoundTripFixture, fixtures.TestBase): ) +class IntervalTest(_LiteralRoundTripFixture, fixtures.TestBase): + __requires__ = ("datetime_interval",) + __backend__ = True + + datatype = Interval + data = datetime.timedelta(days=1, seconds=4) + + def test_literal(self, literal_round_trip): + literal_round_trip(self.datatype, [self.data], [self.data]) + + def test_select_direct_literal_interval(self, connection): + row = connection.execute(select(literal(self.data))).first() + eq_(row, (self.data,)) + + def test_arithmetic_operation_literal_interval(self, connection): + now = datetime.datetime.now().replace(microsecond=0) + # Able to subtract + row = connection.execute( + select(literal(now) - literal(self.data)) + ).scalar() + eq_(row, now - self.data) + + # Able to Add + row = connection.execute( + select(literal(now) + literal(self.data)) + ).scalar() + eq_(row, now + self.data) + + @testing.fixture + def arithmetic_table_fixture(cls, metadata, connection): + class Decorated(TypeDecorator): + impl = cls.datatype + cache_ok = True + + it = Table( + "interval_table", + metadata, + Column( + "id", Integer, primary_key=True, test_needs_autoincrement=True + ), + Column("interval_data", cls.datatype), + Column("date_data", DateTime), + Column("decorated_interval_data", Decorated), + ) + it.create(connection) + return it + + def test_arithmetic_operation_table_interval_and_literal_interval( + self, connection, arithmetic_table_fixture + ): + interval_table = arithmetic_table_fixture + data = datetime.timedelta(days=2, seconds=5) + connection.execute( + interval_table.insert(), {"id": 1, "interval_data": data} + ) + # Subtraction Operation + value = connection.execute( + select(interval_table.c.interval_data - literal(self.data)) + ).scalar() + eq_(value, data - self.data) + + # Addition Operation + value = connection.execute( + select(interval_table.c.interval_data + literal(self.data)) + ).scalar() + eq_(value, data + self.data) + + def test_arithmetic_operation_table_date_and_literal_interval( + self, connection, arithmetic_table_fixture + ): + interval_table = arithmetic_table_fixture + now = datetime.datetime.now().replace(microsecond=0) + connection.execute( + interval_table.insert(), {"id": 1, "date_data": now} + ) + # Subtraction Operation + value = connection.execute( + select(interval_table.c.date_data - literal(self.data)) + ).scalar() + eq_(value, (now - self.data)) + + # Addition Operation + value = connection.execute( + select(interval_table.c.date_data + literal(self.data)) + ).scalar() + eq_(value, (now + self.data)) + + +class PrecisionIntervalTest(IntervalTest): + __requires__ = ("datetime_interval",) + __backend__ = True + + datatype = Interval(day_precision=9, second_precision=9) + data = datetime.timedelta(days=103, seconds=4) + + class _DateFixture(_LiteralRoundTripFixture, fixtures.TestBase): compare = None @@ -1940,6 +2046,8 @@ __all__ = ( "TextTest", "NumericTest", "IntegerTest", + "IntervalTest", + "PrecisionIntervalTest", "CastTypeDecoratorTest", "DateTimeHistoricTest", "DateTimeCoercedToDateTimeTest", diff --git a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py index 62776ea..2d13bda 100644 --- a/venv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py +++ b/venv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py @@ -6,6 +6,7 @@ from ..schema import Column from ..schema import Table from ... import Integer from ... import String +from ... import testing class SimpleUpdateDeleteTest(fixtures.TablesTest): @@ -58,5 +59,71 @@ class SimpleUpdateDeleteTest(fixtures.TablesTest): [(1, "d1"), (3, "d3")], ) + @testing.variation("criteria", ["rows", "norows", "emptyin"]) + @testing.requires.update_returning + def test_update_returning(self, connection, criteria): + t = self.tables.plain_pk + + stmt = t.update().returning(t.c.id, t.c.data) + + if criteria.norows: + stmt = stmt.where(t.c.id == 10) + elif criteria.rows: + stmt = stmt.where(t.c.id == 2) + elif criteria.emptyin: + stmt = stmt.where(t.c.id.in_([])) + else: + criteria.fail() + + r = connection.execute(stmt, dict(data="d2_new")) + assert not r.is_insert + assert r.returns_rows + eq_(r.keys(), ["id", "data"]) + + if criteria.rows: + eq_(r.all(), [(2, "d2_new")]) + else: + eq_(r.all(), []) + + eq_( + connection.execute(t.select().order_by(t.c.id)).fetchall(), + [(1, "d1"), (2, "d2_new"), (3, "d3")] + if criteria.rows + else [(1, "d1"), (2, "d2"), (3, "d3")], + ) + + @testing.variation("criteria", ["rows", "norows", "emptyin"]) + @testing.requires.delete_returning + def test_delete_returning(self, connection, criteria): + t = self.tables.plain_pk + + stmt = t.delete().returning(t.c.id, t.c.data) + + if criteria.norows: + stmt = stmt.where(t.c.id == 10) + elif criteria.rows: + stmt = stmt.where(t.c.id == 2) + elif criteria.emptyin: + stmt = stmt.where(t.c.id.in_([])) + else: + criteria.fail() + + r = connection.execute(stmt) + assert not r.is_insert + assert r.returns_rows + eq_(r.keys(), ["id", "data"]) + + if criteria.rows: + eq_(r.all(), [(2, "d2")]) + else: + eq_(r.all(), []) + + eq_( + connection.execute(t.select().order_by(t.c.id)).fetchall(), + [(1, "d1"), (3, "d3")] + if criteria.rows + else [(1, "d1"), (2, "d2"), (3, "d3")], + ) + __all__ = ("SimpleUpdateDeleteTest",) diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-310.pyc index b7b2f91c2d4caf9d823a2df903a76a6a982ca71b..9abdfc8eb0aaeea14963c330f69b49cad05073af 100644 GIT binary patch delta 19 Zcmcbpby15epO=@50SH!SZ{%_p1pqY!1i=6R delta 19 Zcmcbpby15epO=@50SMxmHgdU(0st{D1PlNG diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-310.pyc index df856f87765ac1d05156b8126602df2f57bd54b1..46e120934300fb3d36844654e31cb63872d242de 100644 GIT binary patch delta 63 zcmca{fbrY`M!tMrUM>b8Se>n(F(+^%pNY%l+Gt*p8ip)}1&lR}3mI#fYnW3QN*Rm9 SCg-{oG4n8UY<}cYCJg{wV-jcp delta 82 zcmX?ifbqrwM!tMrUM>b8h-cEzXbIZLXX2vG0^~X~FfbNd0U0$6SquvpYZz;o7BbZ` g*D%*Gl`b8Se>n(A-IuuSpWc68wR}q delta 24 ecmdnIka6=uM&5j0UM>b8h-cEzaNNkdEC2vf7X~;0 diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/compat.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/compat.cpython-310.pyc index cdb07befa7368218c4100bf29e75d1da6786d2fc..3050238e6ed3a6150fc72015905fa0ce7eb071e1 100644 GIT binary patch delta 2140 zcmZXUS!`5Q7{~9qv-I|M)=o>OWm=|`0#l?=_EKnNE1Q<3D0)C9?R>X%x=hQNnMwf} zOdB822FgLDg4jx8LQE8_Lc)V2MtLw8jq$-;m-wKP7!yO(7kJR`JA($}OzwYv-+I=$ z->&~_qi?|LH8uRa-Mgs!*V=Jkgnc!>pe^U*TpLog^*?{DnW`UDn+VPGy|#1GA3tDX;9Xy^XLN(BUfXF zF*zG@C0+^{58bmf5pt#K9Ls8fszgsFOEX72-R{Ks_u%Ye~w5yg1KRrT8TWS!jSI z7+Q*SVZ@i>L?!#`S z?MnBMTCH6kI0`+`JL=+F;1~?RAoklDKs*EjaT_?=wb*mh-|KgE);Rrz>r0(&ke7@< zSxQb69ypN2yPMWge2xU&SGN1Ioeud%=Tx~7IY1Ww3Wz; zWM=rXZWnZSq`Ui)owlPNmWw($UJ=?`f*4N?Wa5|_|0nl2wp8PKm}p1--{3SSHMpS$ zpJY>7yC$}yA$F3~$>$40ekvWoN3}AT)J!}aDLoH|?1`99`^XQ^qMtzlX zhquwS7v0z7nD?NOLb}YvAWbYdgvJegey4Q=m>9x>B~@uOVh%x@ZWng0SZ1XX17O*1 zu;}-Uza$`rG4>%o;xNguJnQT59zn#(93{^&wXjlu*!vNh`J-bZCs+H|FitVQBhf#2 zi&9mG6LP};_55zMj}&Bv2a~CT^|p489k-3nY_cztOr>pBA2Y=>RB=d71R{Y0g!4$| zlXS~Z0-M;UvM4xZodrw!u7w_!F6@ zas3f_FIZu`K$%Qzp}3FYKjWjidE^hligGbd3E0XRUDzDO%tQHtqyIL%gAO65$BIKP z_Z!6Lgve$ zWo(udlk(kgY0(rVtA)HNKM&7h-^ky>>)4g)hVnRLS8<=`1Z&uXi)9*kv2<~L`c}nf zj5W)%k;bO?sr~~R$C0)&c40i;*^#!=@wj-JBG*Z-q2RGz&1Yo?^W)u+MrE|Dftu6* z&Mb7}y$!H14RKSpRJP@GQBUO#Dt8NY-Jc`}T}7ct#ff50F-Tt8!+e!^$V;5}sy%k+ zZ-Zgl@igl|-G!1d%!tMe1A>sl$1l zqUwYcsbf;4mZGNTR68Z!qs#{7o<@vqw+rHN7)Zq9wi%CiWiwe};Wn$$>5nGVQS6c* zSIuVK(|4*Cv1WQ}h$M<#nCu@M5E*=9i9O`(BBul2Q(_;Ht0QF{&Io!z*zSSO9xIU% z9dbvsbk%;!?k7>ZK14K3k|Q}ma*{-C+!Z2qGn8G Pm+AB|L-)z*>ZZQ|dFKJb delta 1922 zcmY+ES!`5Q7{~9qvvg)UdzWda%S=lPOp%r<1xi^7y0+$cvyTu2+A2uPKN2T6>tE|ElEgwY2RpY*{OB0L%VzB6LtOy=L;x88HkcX}TU z{L=5w`+Ob^KZf2l_I2C5zmeUTUo%v+XWUs2_b?3@IFKuOrD7+tmwOdgAp5vau?yMH z{fgbl0Ul87K@Reu;!5NY4=MH{hk01B54nn0DfS~*^Xj590%+9m8pT26T3)L-gdE`! zrkSqsItWiVc)g-3q^P25qy|MbNR5hWk($hkh2}*KA`?1~{mXU8am=V#Xo31g##@n# zWJJ+e0S%bewx}(%FKROyUx~q0&^Te|tIdQNKg)QB=^S6fpD-iP1kDh8Q|D{d?m_4s!?6krGJ#2!1qf_~VAv=fTcum|=c_QN3T!?ay6 z15d+#Y%l;e^?fF-r8RRmJPSj((*sHmDm_GM4vctV7Di!g&cXMVKJlR3zk@q?$Vv3xE*V~RpLzZ|vwtg}ta4;(-0tY3cP`io`dSMC#)7GBkY zj^ek;ib`-EL==bRRAqDM9EF@HF6Lo&CXRlxP|4Uax#+dnysY)DU?=2e-;&S3l#*@K zv=X{_Nj~s()-F<|OH~G$mw9zDhK8JoM&%KIuj4QpSLH?js4Gpx#Drvls_H2;KE>aC zT27D&vQ*NO4G#*d1i4JRWcf^^W8$T zyh$cb%k9A}?0Jd>Y^m(z7nG_xoRL?8cUel#hFYA*$(xZ^LXE)}2v?D;CP~R}L%Z3R zG8m4rb8=mn`+h>VTC+<`AUF1~$JcI)V?0w%oB6L(2_51s6d8;~mzSy@*qtAcOUi3? z?d(taL){R2RmSU&7bUshC3%nJ63Jx}m45}Ph8j z3YOdxv-w=+R8owJkEmE}>|>%elvI<>QJQ6pK_#x^+H&H0+d`t{O} z7RsANdh8`Gd(}Lg<(sCwv;VJB_4}!`QN$?JOwyvsrdXu-HgOxt1(J4>c@nz%;v$I} z+B-yQa*EXW6sZ}$Pf;~UMQWOg)UwqA?dp64{aclneFG`cy027W7?4jHM#*CsBh%Kj zF!6BJ(~%juJVNIrF3?P7piu z!{c}p#EWDEQu#~MmXW-ZE6-ar&7{_sD_PzJCBR%hd}2 diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-310.pyc index a8410e2d8537659da426fe4031a56ac03040df62..9754a291a35991629ada86a3638dd25da661036c 100644 GIT binary patch delta 19 ZcmdnVyOWnIpO=@50SH!SZ{%9f1^_OL1h4=A delta 19 ZcmdnVyOWnIpO=@50SMxmHgc_J0{|+v1N#5~ diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-310.pyc index 1019dd3a88aec5690ab28a41493d85b66539cf63..b50e1b69d1ec97d1a14e34194ae1000beda5d916 100644 GIT binary patch delta 22 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 diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-310.pyc index 1758f88c0fd5893630717bcaa448c6e1fe30ef42..b44af7649121cac267f2f43c8c3a438879ded31a 100644 GIT binary patch delta 19 ZcmbQDF-3zbpO=@50SH!SZ{*?<0RStp1O)&9 delta 19 ZcmbQDF-3zbpO=@50SMxmHga)^001Z415f|} diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/queue.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/queue.cpython-310.pyc index 2d72c63159b80a34fe1593ebc4c447f21f797098..346454e9d9e802a42d55bb8ecf3e0abbe7f86a3d 100644 GIT binary patch delta 19 ZcmbOmI5&_hpO=@50SH!SZ{(V+0RS_N1qJ{B delta 19 ZcmbOmI5&_hpO=@50SMxmHgZkY001wz1W^D0 diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-310.pyc index 8c2616d1c695ed44c0e2e676c045eed485479437..d4fd45f0c5cb5cd8d0b6e0bb7e70c6afea953906 100644 GIT binary patch delta 19 Zcmcbibwi6QpO=@50SH!SZ{+e51pqb<1l9lm delta 19 Zcmcbibwi6QpO=@50SMxmHgfri0st~O1R($b diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/topological.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/topological.cpython-310.pyc index ac82e1674f6816b100d1cc1778bbcdf28356b666..94dd781df3e7b9e8e25cc80abcf53995a3fd99e7 100644 GIT binary patch delta 19 YcmZn@ZxiRr=jG*M0D{%o8@Xz@0Vq-gFaQ7m delta 19 YcmZn@ZxiRr=jG*M0D^d?ja)U{03>|_djJ3c diff --git a/venv/Lib/site-packages/sqlalchemy/util/__pycache__/typing.cpython-310.pyc b/venv/Lib/site-packages/sqlalchemy/util/__pycache__/typing.cpython-310.pyc index 7957e322266761f46788ebe44c023158e0e9a51b..65693b1c7f2359729ca0185f6b362f4473363054 100644 GIT binary patch delta 3896 zcma);YgAO%702(nb7!~=FuZ0MhWAq#Kpp}jNQ@e5tgk3&ET>U?>??wRdIxHCX~rsA zqo~l6m}u1aNZJ^i7?~L3BZ(<%HQKakQezUQT`Q>{nzh=slI2Q2*nTM8`|vD+tIT50 z@9h0Q=kC4lx#!M-w!gGFHbg|&75qE5zG$6mdbcBq&F{|7^Q+BPZUqG_&DIthw=o4- zLk{5~lC8)(*CpGKLwTs=5M(>IOV*LYc$nl+t6;2@bNOHM>i;VF`nkW+c85*n`cYTM4rGW5c?qu2RS@P2C|WJd9LIM$X@Q1oP(Ul^O$19 zL9Sr~?*WzPBj@d6ya2!R!3_oIn}|FSxe&P!xd`J$_+2~@FE%_)C0)#PVkb(PC$*Gv ze<@R1HKPnvl$IKHn1tWuMjD@Nr1J{HZ8!~^M=_=tcEbUsYpouIS3a&l8I*S@P;O-J zvhXS#PlgH{R~XqwzDGgdRP;@OO7vBtufQl?t4e>hkpWe>#v`D@RQ#{@AG5$OVLmMA zu<>c|E2x3m4vjyGp(V!{yb5)|F*1E%d={R9yc)|d1!%Fq{rb+*a(|C{2HGVIu$NJ541shhn4@(h=u_C z1U7eQ*onC~dJBF!VssI<436L;Y$fJ%;ceIk+mYtMCGf)zr1`k&J8&5~U^lM10ItB# zVK4d@!c}+%_8~oizWsjaL|g>d;1F~nEyjAfv7UF~IXH~<)WCc2JiLIBT5RbNIEpPj zD%-vU@9T@k61f+aV(b_k$JlWr%vdU0{UpXuVB8Ha9kB3as5l9yP;m+s%cSB*sPLXP zqKptYW7y~pc@()^9g1IuS5W*4itD792U@j&h1H4-y^k#y8KECBQ+ykGoVANi`!2RA z5Ea&AVLgFfM;T+=#r?>;tT*uIs5^{(EH1{>*u(JXc}!85@0y5?Z7N^RlZ{uuo7);& zePW`s%Jw&0-B%@AoD)21JPT(UQ~OklgRH9lN8h3T%iJkWJ6Eusg1Ktkc$_J|aGawu z2dZ_{g?+@@7ZjWi6=Lo?W6NOar%72tW<46OX37?vC&!y) zUKTl->4_(3UKEaXo1JMY{X3Yh+Egu9R%T^~UB!!;-K4sV6O+pYqE}sLy2$l5nX!7^gMs&H z=JTZJ5qGoxnst!SKoitxC(*9*wXa^&yvpbETKX%!BEHEk@b=M^rsD(SRL%Es z;AKHu%LZs~HiFjHRV{|kye_II+++uZEhlH1Y}9p>nIDjOkIblDa|wN)(9-mL^)DT+ z#^4iXUJ}tBr|{>j)OTS>-t}*Ck`sGz@YUc18}86>Ri{T-HG4&B?ge&3uwu787*a2L zR{syN$(tk`-WeEJHL*Y7!)Dfhi-E;yH*mF4DFyBI^8AY+eQxf^;_<5o3!B*U&rDdzA73QDBqQcbCjYz(Yq5ISb2ZF9>Otafn zYKC^-ye-ZbmfAnVfY%vx)jS~+=_|ZGeuKVvc!QEecX7sWgCZW@pj1>Z@{HG@4Ds*c z!lmQ3-vk$F|jtN1?kw}i6f5~6El&X9SB%t5hyN|k>n;chbf$#jufM}~g5$X_((5u!C@ z=vRSxk_^4g%>bEGWG<7TSD<`xne^f@d&$s2Y~CVsn+!d+COvxQ9Wp^hWR%5;g38DU eItRja9p5+j5sNC5#L7y$Xs&#UWr&-Vv;GT+S&fze delta 3441 zcmZ{mdvMg%6~}+~w~y>2yLoQ1d1sT&V>j;?At4q~3ZfE1f)DPXspb4afF#6U5)=ly zMxydCCGj>AD1k(LLJ^Y%4JvAx7NpSDT2zv8##(1G?B^T|z_ZxTYIp|@z#wMoaZ3-vA>7hKa@!m5Tz{!G$Y)^<<_^OU z=7uzzwnlFCJ(xd&`FJ?mYvA{yVi-nHF@lPFrQ$wRJf}ryW;mvKOmspCiY#|Oil2uU zQ2YXl@0a4W!L7!ifz=DYWs0p6e(PoSu=uxi$li%}iGBx~?HQum8YfQM*0c7Y+dgJs zqruD0a>jN%6ZtoGKKOa$1Y^G!=c4OvbOGJ2D6FGTB*bj8E@#S4BU859#dyr#G_&4B zCA-LMCG!ZGN6BnMBR0oYoBx5(Q7lfxW=Ak5Q>Ro_{nqlBI;D4uFJd2L-C~8SKAtfY zg`-kMO*pflF5IB^h%wib>fp&xOYuV`|2*S5&$+ z^oQK34t$$KS{u^`#QSbA|ANX&v26olF$(lPu_~d#At*C|#;5B0#HoZLSNY5e&Dab6 zO&L{vP+U*=3tJ+tCf;e5>pUnYUXSAziJGKaapIjxg^p!26XTE}Tx5P|fwm#k-9>XA znG2dISQlKLT*0#TOwW%WlZMW1?Kf?MPSX2=BPpq>X*XiG_)Xebwp;uxeWR0xP8v6D z+1TbYVFUk4FEky+P@Bm0ju@qhZTJe+UbQKHl9X2YV_ zn}}mx_GZ~n(+>1e)$wVKC02h1eVlWy0(I!o854CC?`n#eh`w|YX&B=+B4Zcf7 z-y?I5HYfFU#7i^ngo=f$(fB0mlo9QTE^#?$o#k<%e5W-~Yq`i0<^ zev_Iw@01^k?t*;wJK7dARs5ETiv?+68))_V6|tkB1aB8inrJ2_E)>+VKT7`t^o^pR zFn{s1T~R_Z%F8>O&9IOZn3g3eEt*q7zcd6rMVMyP@Ya`v?PXo zMCX$735M)AM~4%^q8OPm%%;-W7{Ag#5&td8#O6{DHK zU0is>`IL#T%lu2{J)dho*bGH)JRfpHolGERe5Vu3Y$p@JBjtV;FJHH(XDh5lqFY9M zR^ckRDc3)pBXPs*hyybtJPX{Fa)itsBmq?mt?baWiURk{Mv3HX?F(Fixv}!qqAHXl zFgw#$HGGTl#1#D{F<5y$ z?YD%o+Y+L;$UH~p4Klsr_`>QyH(?K%y=3;2X(ls3W&@c)GV96ESCvlRKstTl=woDt z$&8a3B|~?#yjS(}M08E*@(!SPT&EXGr&mOm&)tL~ocQm~wyFp_T{z(ui)vvOF;bN% NPE|FtWZ|w}`hU%XM`Zv2 diff --git a/venv/Lib/site-packages/sqlalchemy/util/_collections.py b/venv/Lib/site-packages/sqlalchemy/util/_collections.py index 2e793e8..a0b1977 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/_collections.py +++ b/venv/Lib/site-packages/sqlalchemy/util/_collections.py @@ -189,7 +189,7 @@ class Properties(Generic[_T]): return dir(super()) + [str(k) for k in self._data.keys()] def __add__(self, other: Properties[_F]) -> List[Union[_T, _F]]: - return list(self) + list(other) # type: ignore + return list(self) + list(other) def __setitem__(self, key: str, obj: _T) -> None: self._data[key] = obj @@ -393,16 +393,16 @@ class UniqueAppender(Generic[_T]): self.data = data self._unique = {} if via: - self._data_appender = getattr(data, via) # type: ignore[assignment] # noqa: E501 + self._data_appender = getattr(data, via) elif hasattr(data, "append"): - self._data_appender = cast("List[_T]", data).append # type: ignore[assignment] # noqa: E501 + self._data_appender = cast("List[_T]", data).append elif hasattr(data, "add"): - self._data_appender = cast("Set[_T]", data).add # type: ignore[assignment] # noqa: E501 + self._data_appender = cast("Set[_T]", data).add def append(self, item: _T) -> None: id_ = id(item) if id_ not in self._unique: - self._data_appender(item) # type: ignore[call-arg] + self._data_appender(item) self._unique[id_] = True def __iter__(self) -> Iterator[_T]: @@ -532,8 +532,8 @@ class LRUCache(typing.MutableMapping[_KT, _VT]): def get( self, key: _KT, default: Optional[Union[_VT, _T]] = None ) -> Optional[Union[_VT, _T]]: - item = self._data.get(key, default) - if item is not default and item is not None: + item = self._data.get(key) + if item is not None: item[2][0] = self._inc_counter() return item[1] else: @@ -677,7 +677,7 @@ class ThreadLocalRegistry(ScopedRegistry[_T]): return self.registry.value # type: ignore[no-any-return] except AttributeError: val = self.registry.value = self.createfunc() - return val # type: ignore[no-any-return] + return val def has(self) -> bool: return hasattr(self.registry, "value") diff --git a/venv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py b/venv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py index 2b6ae87..71d10a6 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py +++ b/venv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py @@ -69,7 +69,7 @@ def is_exit_exception(e: BaseException) -> bool: # Issue for context: https://github.com/python-greenlet/greenlet/issues/173 -class _AsyncIoGreenlet(greenlet): # type: ignore +class _AsyncIoGreenlet(greenlet): dead: bool def __init__(self, fn: Callable[..., Any], driver: greenlet): @@ -147,7 +147,7 @@ def await_fallback(awaitable: Awaitable[_T]) -> _T: "loop is already running; can't call await_fallback() here. " "Was IO attempted in an unexpected place?" ) - return loop.run_until_complete(awaitable) # type: ignore[no-any-return] # noqa: E501 + return loop.run_until_complete(awaitable) return current.driver.switch(awaitable) # type: ignore[no-any-return] diff --git a/venv/Lib/site-packages/sqlalchemy/util/_py_collections.py b/venv/Lib/site-packages/sqlalchemy/util/_py_collections.py index 9962493..4f52d3b 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/_py_collections.py +++ b/venv/Lib/site-packages/sqlalchemy/util/_py_collections.py @@ -227,11 +227,11 @@ class OrderedSet(Set[_T]): super().add(e) def __ior__(self, other: AbstractSet[_S]) -> OrderedSet[Union[_T, _S]]: - self.update(other) # type: ignore - return self # type: ignore + self.update(other) + return self def union(self, *other: Iterable[_S]) -> OrderedSet[Union[_T, _S]]: - result: OrderedSet[Union[_T, _S]] = self.copy() # type: ignore + result: OrderedSet[Union[_T, _S]] = self.copy() result.update(*other) return result diff --git a/venv/Lib/site-packages/sqlalchemy/util/compat.py b/venv/Lib/site-packages/sqlalchemy/util/compat.py index da653b8..98a0b65 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/compat.py +++ b/venv/Lib/site-packages/sqlalchemy/util/compat.py @@ -12,6 +12,7 @@ from __future__ import annotations import base64 import dataclasses +import hashlib import inspect import operator import platform @@ -119,6 +120,18 @@ else: return gen.athrow(typ, value, traceback) +if py39: + # python stubs don't have a public type for this. not worth + # making a protocol + def md5_not_for_security() -> Any: + return hashlib.md5(usedforsecurity=False) + +else: + + def md5_not_for_security() -> Any: + return hashlib.md5() + + if typing.TYPE_CHECKING or py38: from importlib import metadata as importlib_metadata else: diff --git a/venv/Lib/site-packages/sqlalchemy/util/deprecations.py b/venv/Lib/site-packages/sqlalchemy/util/deprecations.py index dd5851c..26d9924 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/deprecations.py +++ b/venv/Lib/site-packages/sqlalchemy/util/deprecations.py @@ -246,7 +246,7 @@ def deprecated_params(**specs: Tuple[str, str]) -> Callable[[_F], _F]: # latest mypy has opinions here, not sure if they implemented # Concatenate or something - @decorator # type: ignore + @decorator def warned(fn: _F, *args: Any, **kwargs: Any) -> _F: for m in check_defaults: if (defaults[m] is None and kwargs[m] is not None) or ( @@ -290,9 +290,9 @@ def deprecated_params(**specs: Tuple[str, str]) -> Callable[[_F], _F]: for param, (version, message) in specs.items() }, ) - decorated = warned(fn) # type: ignore + decorated = warned(fn) decorated.__doc__ = doc - return decorated # type: ignore[no-any-return] + return decorated return decorate @@ -334,7 +334,7 @@ def _decorate_cls_with_warning( clsdict["__doc__"] = doc clsdict.pop("__dict__", None) clsdict.pop("__weakref__", None) - cls = type(cls.__name__, cls.__bases__, clsdict) # type: ignore + cls = type(cls.__name__, cls.__bases__, clsdict) if constructor is not None: constructor_fn = clsdict[constructor] @@ -376,7 +376,7 @@ def _decorate_with_warning( else: doc_only = "" - @decorator # type: ignore + @decorator def warned(fn: _F, *args: Any, **kwargs: Any) -> _F: skip_warning = not enable_warnings or kwargs.pop( "_sa_skip_warning", False @@ -393,9 +393,9 @@ def _decorate_with_warning( doc = inject_docstring_text(doc, docstring_header, 1) - decorated = warned(func) # type: ignore + decorated = warned(func) decorated.__doc__ = doc decorated._sa_warn = lambda: _warn_with_version( # type: ignore message, version, wtype, stacklevel=3 ) - return decorated # type: ignore[no-any-return] + return decorated diff --git a/venv/Lib/site-packages/sqlalchemy/util/langhelpers.py b/venv/Lib/site-packages/sqlalchemy/util/langhelpers.py index 6c9afb5..9c56487 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/langhelpers.py +++ b/venv/Lib/site-packages/sqlalchemy/util/langhelpers.py @@ -15,7 +15,6 @@ from __future__ import annotations import collections import enum from functools import update_wrapper -import hashlib import inspect import itertools import operator @@ -87,9 +86,9 @@ else: def md5_hex(x: Any) -> str: x = x.encode("utf-8") - m = hashlib.md5() + m = compat.md5_not_for_security() m.update(x) - return m.hexdigest() + return cast(str, m.hexdigest()) class safe_reraise: @@ -266,6 +265,13 @@ def decorator(target: Callable[..., Any]) -> Callable[[_Fn], _Fn]: metadata.update(format_argspec_plus(spec, grouped=False)) metadata["name"] = fn.__name__ + if inspect.iscoroutinefunction(fn): + metadata["prefix"] = "async " + metadata["target_prefix"] = "await " + else: + metadata["prefix"] = "" + metadata["target_prefix"] = "" + # look for __ positional arguments. This is a convention in # SQLAlchemy that arguments should be passed positionally # rather than as keyword @@ -277,16 +283,16 @@ def decorator(target: Callable[..., Any]) -> Callable[[_Fn], _Fn]: if "__" in repr(spec[0]): code = ( """\ -def %(name)s%(grouped_args)s: - return %(target)s(%(fn)s, %(apply_pos)s) +%(prefix)sdef %(name)s%(grouped_args)s: + return %(target_prefix)s%(target)s(%(fn)s, %(apply_pos)s) """ % metadata ) else: code = ( """\ -def %(name)s%(grouped_args)s: - return %(target)s(%(fn)s, %(apply_kw)s) +%(prefix)sdef %(name)s%(grouped_args)s: + return %(target_prefix)s%(target)s(%(fn)s, %(apply_kw)s) """ % metadata ) @@ -526,12 +532,10 @@ def get_callable_argspec( fn.__init__, no_self=no_self, _is_init=True ) elif hasattr(fn, "__func__"): - return compat.inspect_getfullargspec(fn.__func__) # type: ignore[attr-defined] # noqa: E501 + return compat.inspect_getfullargspec(fn.__func__) elif hasattr(fn, "__call__"): - if inspect.ismethod(fn.__call__): # type: ignore [operator] - return get_callable_argspec( - fn.__call__, no_self=no_self # type: ignore [operator] - ) + if inspect.ismethod(fn.__call__): + return get_callable_argspec(fn.__call__, no_self=no_self) else: raise TypeError("Can't inspect callable: %s" % fn) else: @@ -693,6 +697,7 @@ def create_proxy_methods( classmethods: Sequence[str] = (), methods: Sequence[str] = (), attributes: Sequence[str] = (), + use_intermediate_variable: Sequence[str] = (), ) -> Callable[[_T], _T]: """A class decorator indicating attributes should refer to a proxy class. @@ -1082,7 +1087,7 @@ class generic_fn_descriptor(Generic[_T_co]): __name__: str def __init__(self, fget: Callable[..., _T_co], doc: Optional[str] = None): - self.fget = fget # type: ignore[assignment] + self.fget = fget self.__doc__ = doc or fget.__doc__ self.__name__ = fget.__name__ @@ -1237,12 +1242,11 @@ class HasMemoized: __name__: str def __init__(self, fget: Callable[..., _T], doc: Optional[str] = None): - # https://github.com/python/mypy/issues/708 - self.fget = fget # type: ignore + self.fget = fget self.__doc__ = doc or fget.__doc__ self.__name__ = fget.__name__ - @overload # type: ignore[override] + @overload def __get__(self: _MA, obj: None, cls: Any) -> _MA: ... @@ -1476,7 +1480,7 @@ def assert_arg_type( if isinstance(argtype, tuple): raise exc.ArgumentError( "Argument '%s' is expected to be one of type %s, got '%s'" - % (name, " or ".join("'%s'" % a for a in argtype), type(arg)) # type: ignore # noqa: E501 + % (name, " or ".join("'%s'" % a for a in argtype), type(arg)) ) else: raise exc.ArgumentError( @@ -1527,7 +1531,7 @@ class classproperty(property): self.__doc__ = fget.__doc__ def __get__(self, obj: Any, cls: Optional[type] = None) -> Any: - return self.fget(cls) # type: ignore + return self.fget(cls) class hybridproperty(Generic[_T]): diff --git a/venv/Lib/site-packages/sqlalchemy/util/typing.py b/venv/Lib/site-packages/sqlalchemy/util/typing.py index 597549c..3d15d43 100644 --- a/venv/Lib/site-packages/sqlalchemy/util/typing.py +++ b/venv/Lib/site-packages/sqlalchemy/util/typing.py @@ -8,6 +8,7 @@ from __future__ import annotations +import builtins import re import sys import typing @@ -249,6 +250,12 @@ def eval_name_only( try: return base_globals[name] except KeyError as ke: + # check in builtins as well to handle `list`, `set` or `dict`, etc. + try: + return builtins.__dict__[name] + except KeyError: + pass + raise NameError( f"Could not locate name {name} in module {module_name}" ) from ke diff --git a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/INSTALLER b/venv/Lib/site-packages/wtforms-3.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/METADATA b/venv/Lib/site-packages/wtforms-3.2.1.dist-info/METADATA deleted file mode 100644 index fe8aec6..0000000 --- a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/METADATA +++ /dev/null @@ -1,119 +0,0 @@ -Metadata-Version: 2.3 -Name: WTForms -Version: 3.2.1 -Summary: Form validation and rendering for Python web development. -Project-URL: Documentation, https://wtforms.readthedocs.io -Project-URL: Changes, https://wtforms.readthedocs.io/changes -Project-URL: Source Code, https://github.com/pallets-eco/wtforms/ -Project-URL: Issue Tracker, https://github.com/pallets-eco/wtforms/issues -Project-URL: Chat, https://discord.gg/pallets -Maintainer: WTForms -License: Copyright 2008 WTForms - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -License-File: LICENSE.rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Python: >=3.9 -Requires-Dist: markupsafe -Provides-Extra: email -Requires-Dist: email-validator; extra == 'email' -Description-Content-Type: text/x-rst - -WTForms -======= - -WTForms is a flexible forms validation and rendering library for Python -web development. It can work with whatever web framework and template -engine you choose. It supports data validation, CSRF protection, -internationalization (I18N), and more. There are various community -libraries that provide closer integration with popular frameworks. - - -Installation ------------- - -Install and update using pip: - -.. code-block:: text - - pip install -U WTForms - - -Third-Party Library Integrations --------------------------------- - -WTForms is designed to work with any web framework and template engine. -There are a number of community-provided libraries that make integrating -with frameworks even better. - -- `Flask-WTF`_ integrates with the Flask framework. It can - automatically load data from the request, uses Flask-Babel to - translate based on user-selected locale, provides full-application - CSRF, and more. -- `WTForms-Alchemy`_ provides rich support for generating forms from - SQLAlchemy models, including an expanded set of fields and - validators. -- `WTForms-SQLAlchemy`_ provides ORM-backed fields and form generation - from SQLAlchemy models. -- `WTForms-AppEngine`_ provides ORM-backed fields and form generation - from AppEnding db/ndb schema -- `WTForms-Django`_ provides ORM-backed fields and form generation - from Django models, as well as integration with Django's I18N - support. -- `WTForms-Bootstrap5`_ provides Bootstrap 5 favor renderer with - great customizability. -- `Starlette-WTF`_ integrates with Starlette and the FastAPI - framework, based on the features of Flask-WTF. -- `Bootstrap-Flask`_ Bootstrap-Flask is a collection of Jinja macros - for Bootstrap 4 & 5 and Flask using Flask-WTF. - -.. _Flask-WTF: https://flask-wtf.readthedocs.io/ -.. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/ -.. _WTForms-SQLAlchemy: https://github.com/pallets-eco/wtforms-sqlalchemy -.. _WTForms-AppEngine: https://github.com/pallets-eco/wtforms-appengine -.. _WTForms-Django: https://github.com/pallets-eco/wtforms-django -.. _WTForms-Bootstrap5: https://github.com/LaunchPlatform/wtforms-bootstrap5 -.. _Starlette-WTF: https://github.com/muicss/starlette-wtf -.. _Bootstrap-Flask: https://github.com/helloflask/bootstrap-flask - - -Links ------ - -- Documentation: https://wtforms.readthedocs.io/ -- Releases: https://pypi.org/project/WTForms/ -- Code: https://github.com/pallets-eco/wtforms -- Issue tracker: https://github.com/pallets-eco/wtforms/issues -- Discord Chat: https://discord.gg/F65P7Z9 -- Translation: https://hosted.weblate.org/projects/wtforms/wtforms/ diff --git a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/RECORD b/venv/Lib/site-packages/wtforms-3.2.1.dist-info/RECORD deleted file mode 100644 index 310b42c..0000000 --- a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/RECORD +++ /dev/null @@ -1,109 +0,0 @@ -wtforms-3.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -wtforms-3.2.1.dist-info/METADATA,sha256=oOzlfdk_oSeggHYC7BafQY4eyQKMeCOjXnKXRE998k0,5305 -wtforms-3.2.1.dist-info/RECORD,, -wtforms-3.2.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 -wtforms-3.2.1.dist-info/licenses/LICENSE.rst,sha256=z0DWD_NPaytopT0iD4tmVntayN0RGbN7Yv0V6VGP5Zs,1475 -wtforms/__init__.py,sha256=aQn8cIuZR--RBgakKS49cqNvH2B-BP4Us5oyDpx9C5E,2408 -wtforms/__pycache__/__init__.cpython-310.pyc,, -wtforms/__pycache__/form.cpython-310.pyc,, -wtforms/__pycache__/i18n.cpython-310.pyc,, -wtforms/__pycache__/meta.cpython-310.pyc,, -wtforms/__pycache__/utils.cpython-310.pyc,, -wtforms/__pycache__/validators.cpython-310.pyc,, -wtforms/csrf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -wtforms/csrf/__pycache__/__init__.cpython-310.pyc,, -wtforms/csrf/__pycache__/core.cpython-310.pyc,, -wtforms/csrf/__pycache__/session.cpython-310.pyc,, -wtforms/csrf/core.py,sha256=8Ka3ZATvo9I1WqreP1Y_i1r0t7m8Wcw5cKynVvJNXes,3097 -wtforms/csrf/session.py,sha256=4ajg5ooedVrZxxUOaeIj7WnLRSZVp9jpw_rf3oyeF5U,3092 -wtforms/fields/__init__.py,sha256=L3X1O4pOmLRmACTndbIwFFS2qFvO3oDfI3P6GslTScQ,2255 -wtforms/fields/__pycache__/__init__.cpython-310.pyc,, -wtforms/fields/__pycache__/choices.cpython-310.pyc,, -wtforms/fields/__pycache__/core.cpython-310.pyc,, -wtforms/fields/__pycache__/datetime.cpython-310.pyc,, -wtforms/fields/__pycache__/form.cpython-310.pyc,, -wtforms/fields/__pycache__/list.cpython-310.pyc,, -wtforms/fields/__pycache__/numeric.cpython-310.pyc,, -wtforms/fields/__pycache__/simple.cpython-310.pyc,, -wtforms/fields/choices.py,sha256=zAW-y1s1_sKjNT3qRwWuUKsUrojD9zIR6q5LwfGOwZc,6882 -wtforms/fields/core.py,sha256=a9OyjNpNUXMQq6e3m_9eWEKq1PKJshDmL2CEiH2BUX0,14385 -wtforms/fields/datetime.py,sha256=hImU4WDENQK7upIedBQJ1Y2N2-fwxZCkWOfeRYCibFE,5034 -wtforms/fields/form.py,sha256=_VreNaDy1ea_A7b3m4UdndYdcmJbyokDYYyZW_5jJOE,2897 -wtforms/fields/list.py,sha256=lfn89ankyMgJEgoxf50hplYAe7Zq_VvAp2k_FAMvUN0,6471 -wtforms/fields/numeric.py,sha256=Y39ODDk9eh6Nctb8gOx26u0ioiChIIUczpxAlK8Vyaw,6157 -wtforms/fields/simple.py,sha256=VBp8mRT5n3hRMH5ErgIjZtbqRr3jaRv2lZj4NMgs6XY,4075 -wtforms/form.py,sha256=DJOojlwLuswfhC1zsVSeprMbGqPAXed6fRxung131O4,12619 -wtforms/i18n.py,sha256=8AMTTSpQ5d-hONeVN8rt3RH0gRc3Mvl4zUum8Hyif88,1958 -wtforms/locale/README.md,sha256=Rb-tZdT5rErXDoe9lOmXl8Fj8ZCZPyE9fqpb0kQ2o8Y,1515 -wtforms/locale/ar/LC_MESSAGES/wtforms.mo,sha256=Wks5v3QGlNTRoIu1AKSmKHbatXQzQWYD4o4ieJdokQw,4393 -wtforms/locale/ar/LC_MESSAGES/wtforms.po,sha256=sQYvGsubsfzm1fr3qTuIyUxmkTZ0k7r6e_pzh7_gkzM,6919 -wtforms/locale/bg/LC_MESSAGES/wtforms.mo,sha256=vzeNlmzOzW7YsWfWPqI2Zt6Dgw0bd94QnLyRLhuRJy4,3932 -wtforms/locale/bg/LC_MESSAGES/wtforms.po,sha256=c70xbR04txPVUseRdnBsvg-KVUbUm1SOMMaSw73KHHA,6534 -wtforms/locale/ca/LC_MESSAGES/wtforms.mo,sha256=p0tFvBUip7wCRljw_SqFFeCV4cGNTlu5owphrsuK2Xo,3177 -wtforms/locale/ca/LC_MESSAGES/wtforms.po,sha256=2_ja11SMTPMUuE5Z6Z23sp2lzqv5ZnZGEjDXaOkD0gw,5693 -wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo,sha256=eVPIUOfdIePaoCRPoMFHxi3EuuBya1xUU5jJMf8wi38,3398 -wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po,sha256=RZQgUiBLPdLZtMKd_WqJPTVT0-IDzstiXTgsOaNYW-A,5858 -wtforms/locale/cy/LC_MESSAGES/wtforms.mo,sha256=3gTVlrP7N9hNs9Avm_8dJhYUrMCKyk-VSEFdDEvEM1E,3142 -wtforms/locale/cy/LC_MESSAGES/wtforms.po,sha256=0ChyJkxdCuk7hDaHb7HYu_dfjUsdpW1QePW1zsmwY_o,5647 -wtforms/locale/de/LC_MESSAGES/wtforms.mo,sha256=Lx-Wgk5wbklVDo3PAweOtEyq0-qs50d8UYgwdxfFApQ,3175 -wtforms/locale/de/LC_MESSAGES/wtforms.po,sha256=FNpOXqoAMk5AlvYSWVLCEy4HLS0vQ9l7uBP1Eqx5eCo,5687 -wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo,sha256=1yxa05bj0pdyt7he-x4f8ZV29pwrhh4c3oNNIXjClGs,3169 -wtforms/locale/de_CH/LC_MESSAGES/wtforms.po,sha256=m4nhUhZFBxsVc0TEq_pjM3KUPPhGYB9YamJzp0aI0Vs,5694 -wtforms/locale/el/LC_MESSAGES/wtforms.mo,sha256=Vj6ZE-q3kt_dx4BBDedDCjssbZVRRxnV0Gy1JBsjhBo,3951 -wtforms/locale/el/LC_MESSAGES/wtforms.po,sha256=3V1NhET6p8lwvHbedFDroEe3Fh4k2a0GzksRuB1cFyA,6583 -wtforms/locale/en/LC_MESSAGES/wtforms.mo,sha256=6MIjYtnt36bLr2EOGZCFJx_UntunQUCihf_hnWTNH9o,3323 -wtforms/locale/en/LC_MESSAGES/wtforms.po,sha256=Yn7Pb4rFmGxwp3emJW_aAqCBBZZw-E-JTGClfL78DY8,5046 -wtforms/locale/es/LC_MESSAGES/wtforms.mo,sha256=HQ1SSCbJtjyW8qtA4N96In6LcD3tg0vfG5hyI_KuDUg,3882 -wtforms/locale/es/LC_MESSAGES/wtforms.po,sha256=NtLOPMiz4pbRYup0jITAF7hNYtUDgojFK74l4EqJgzs,5857 -wtforms/locale/et/LC_MESSAGES/wtforms.mo,sha256=xk0veS0BiHnY-7GpFsIZrUC-0Z7UPaXV89WMiWAcLRs,3202 -wtforms/locale/et/LC_MESSAGES/wtforms.po,sha256=w-jnstN_c5s8NtzGwc-xv_16g8wfra6A6Yvdp8Wx2lk,5706 -wtforms/locale/fa/LC_MESSAGES/wtforms.mo,sha256=hrprM-rDJ1MWcRhUZFSn5jDsF9LIJsA0l_553y_qwhY,3796 -wtforms/locale/fa/LC_MESSAGES/wtforms.po,sha256=8ns8sQeTB9H-TeHJ2vSRGhZG4r9hF9aG4QQ1hwMAxvA,6377 -wtforms/locale/fi/LC_MESSAGES/wtforms.mo,sha256=GVCXedqhe-Botom4mMlRr1XKyR1iPnkxqCpUBC57hVw,3152 -wtforms/locale/fi/LC_MESSAGES/wtforms.po,sha256=rnS2nqVVQvaGqPtO4mxX5WAy1AwV8RZ9HEttWHR8ZnY,5661 -wtforms/locale/fr/LC_MESSAGES/wtforms.mo,sha256=ajwVOj920JIbkozJhf5lw63wGq4png3yEsajQ75UsJY,3961 -wtforms/locale/fr/LC_MESSAGES/wtforms.po,sha256=2BJf_hCqhEPGW8yqwv7wveVoP1EocQtRDcSkCZIO1yw,5995 -wtforms/locale/he/LC_MESSAGES/wtforms.mo,sha256=Kpd4x0_Y94JJl7J8AncB8cdmoW48cgKtrqMMpKvBGDA,3265 -wtforms/locale/he/LC_MESSAGES/wtforms.po,sha256=_17cvuiEz-Mbqp5dAa0BYh6pqv-x8JyFc1xFlgnsPZM,5853 -wtforms/locale/hu/LC_MESSAGES/wtforms.mo,sha256=oY_wtIcwQcAwf-6fLq_ZHLyxnj5IuVMzOiQzcgCwO6k,3275 -wtforms/locale/hu/LC_MESSAGES/wtforms.po,sha256=6JoOc56VMYQWEhekeFxdlHlr1qAeP31bFYuZhoYQpWM,5692 -wtforms/locale/it/LC_MESSAGES/wtforms.mo,sha256=gpaOYvoqzhZRYBvus5GOhFqiXba8xc7rgWSkGO9fwhc,3248 -wtforms/locale/it/LC_MESSAGES/wtforms.po,sha256=hBoipFIwf_iCrVEnUEw9KMLRPQdoY-cqHdhIDKYxdo0,5762 -wtforms/locale/ja/LC_MESSAGES/wtforms.mo,sha256=CPHCb9q7ZlSkSfjRvVghL1-SPz4wWBpJDYKOMgO_w80,3481 -wtforms/locale/ja/LC_MESSAGES/wtforms.po,sha256=1u2gjFZ_DVauUt4x-uTlzNOB5jrwqnA24iIsa_81xLQ,5925 -wtforms/locale/kk/LC_MESSAGES/wtforms.mo,sha256=hH-FF6mHH8AcMmQ2YpejeG5sh7xV9WzGr5IYKsT931c,4921 -wtforms/locale/kk/LC_MESSAGES/wtforms.po,sha256=nvWTHiY2xF2zqXm51IIpYGSo2KeJ5OXorZQLWHeB2B4,6898 -wtforms/locale/ko/LC_MESSAGES/wtforms.mo,sha256=qprPrphkxN_xv8nbQuPZtdTYMtfz_tLdddxO4KVMIMc,4291 -wtforms/locale/ko/LC_MESSAGES/wtforms.po,sha256=ztFv6iWLrACRPZrmuKHJ7Q6z2pwQ_QKd6wZJWu5Wl9o,6222 -wtforms/locale/nb/LC_MESSAGES/wtforms.mo,sha256=Gza9rzFM2f4OddYmbCfWbJoRq4h44XmwqgE6SaBGxwM,3080 -wtforms/locale/nb/LC_MESSAGES/wtforms.po,sha256=kczF9khVfrzaQQWGau54zPLemD1dOiMykzcrryPKwkU,5590 -wtforms/locale/nl/LC_MESSAGES/wtforms.mo,sha256=OuHmtAXr-XMlzXb7HAif9qwIuZZGpeuD6tzBy3m3YEY,3732 -wtforms/locale/nl/LC_MESSAGES/wtforms.po,sha256=RVF6zLUzoGXnt8S-GTukCh5cF1s52XG-wjfM3ow5FAo,5702 -wtforms/locale/pl/LC_MESSAGES/wtforms.mo,sha256=mgGAZqiFGPVAlKWaiWw2Y1dwIDYU0h91R_kMqMi2iQw,3428 -wtforms/locale/pl/LC_MESSAGES/wtforms.po,sha256=6CeRI1xqJW7hTsGhfPVMjcLk3470_dqPTHsZ8XKBqVc,5982 -wtforms/locale/pt/LC_MESSAGES/wtforms.mo,sha256=zJO_fssb4UthEuDKAbvePvbbRaqGziUSWcXx1W5MtWg,3892 -wtforms/locale/pt/LC_MESSAGES/wtforms.po,sha256=CVpaus2cfFEJz0hvUlvtQvs-pAzbaU6iI5ezwjFjA6A,5864 -wtforms/locale/ro/LC_MESSAGES/wtforms.mo,sha256=7bDI0iCHH7Zor2C562V44LsMdcxLpotDrNmlN4v97h8,4066 -wtforms/locale/ro/LC_MESSAGES/wtforms.po,sha256=JKyL8AqvI6GVE8fafuQLdfeVjxpL5JpMzYvkqc4HLFs,6398 -wtforms/locale/ru/LC_MESSAGES/wtforms.mo,sha256=3oZzAX1FhUq97FxblEYQRRKS1e8fEi8Mf4A96Ve-Xoo,4712 -wtforms/locale/ru/LC_MESSAGES/wtforms.po,sha256=nqKyMDRunEjnZqmD3-WS0u9sVjme-y6_mZbeYG7A-mM,7298 -wtforms/locale/sk/LC_MESSAGES/wtforms.mo,sha256=iThhdb0IqpjVIMWqgcQbl5-Hpw0Fu71tk8uOsjEcfdI,4054 -wtforms/locale/sk/LC_MESSAGES/wtforms.po,sha256=qg9Gz-k4cXgFj0y4RXyzbyU-jmzM8v7YbiK71junCZ8,6070 -wtforms/locale/sv/LC_MESSAGES/wtforms.mo,sha256=YsnbB0r1qZj7kOTKTYnIDB0xR-7NiKE0ZYBnH32YNjg,3818 -wtforms/locale/sv/LC_MESSAGES/wtforms.po,sha256=-RybPMmY47U8V6SMd6FEJlCc30UWEhYnVMBhf52Zbes,5787 -wtforms/locale/tr/LC_MESSAGES/wtforms.mo,sha256=QL-Cy032r0I4yVl7QflFXPrhy_Z3LXw0AkFgNlOmY1U,3885 -wtforms/locale/tr/LC_MESSAGES/wtforms.po,sha256=-d06BsM5zRIXYo7ZwyOkZY_holg3wDVFSfiP-dar35k,5854 -wtforms/locale/uk/LC_MESSAGES/wtforms.mo,sha256=17MF_xAnTQNjc7q5cUHI3lv9LRniNWEQ2q7MXXHJvR0,5187 -wtforms/locale/uk/LC_MESSAGES/wtforms.po,sha256=xoc7k-1MwCKntuTq0VvVsxzeGTGcKsq9wiQ00SPCKBM,7209 -wtforms/locale/wtforms.pot,sha256=g3_EOPz64hSjq7Ty4zvuoNx4U7LdoA4LoXtmqGIVqhk,4249 -wtforms/locale/zh/LC_MESSAGES/wtforms.mo,sha256=8lDDXliKMno8gBu1kuALzZFJvREJFBttptvfyYJesIQ,3296 -wtforms/locale/zh/LC_MESSAGES/wtforms.po,sha256=AGig61EOm-ir4sOhT0cpr5M10sntLaSng4BK5fvRqgY,5812 -wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo,sha256=9UZ69bwp4CBVQqBpmLuxCUvdleYqGRP-POOzp3qCDIM,3653 -wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po,sha256=bslNzk1KhLiGhd3fQ9ifAmCTzjgAcTtG_z6K2Sii-Pk,5596 -wtforms/meta.py,sha256=SU8A6gDcd2wDkVzNmSGMLBBly_fMBTKVB7BD6GCfxYo,4097 -wtforms/utils.py,sha256=sAELlf-d7oXBqUbbLvRkefmvU-g6qHGVyPZzpFPWoSo,2399 -wtforms/validators.py,sha256=87C3JWB51wrENcx5I6Ap5gILgJbJWZUM7txxC3lANBg,21927 -wtforms/widgets/__init__.py,sha256=1sUdgvy1mW3g2IarCS7Ejvseh2GquBHGTSh_zz7q41s,1687 -wtforms/widgets/__pycache__/__init__.cpython-310.pyc,, -wtforms/widgets/__pycache__/core.cpython-310.pyc,, -wtforms/widgets/core.py,sha256=aalzXHzQqZkpuMZ892bGpDhNfo9Y9lufF-XdxXnhjUY,15509 diff --git a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/WHEEL b/venv/Lib/site-packages/wtforms-3.2.1.dist-info/WHEEL deleted file mode 100644 index cdd68a4..0000000 --- a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.25.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/licenses/LICENSE.rst b/venv/Lib/site-packages/wtforms-3.2.1.dist-info/licenses/LICENSE.rst deleted file mode 100644 index 30cbc2b..0000000 --- a/venv/Lib/site-packages/wtforms-3.2.1.dist-info/licenses/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2008 WTForms - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/wtforms/__init__.py b/venv/Lib/site-packages/wtforms/__init__.py index 358d67d..9af9f29 100644 --- a/venv/Lib/site-packages/wtforms/__init__.py +++ b/venv/Lib/site-packages/wtforms/__init__.py @@ -1,79 +1,7 @@ from wtforms import validators from wtforms import widgets -from wtforms.fields.choices import RadioField -from wtforms.fields.choices import SelectField -from wtforms.fields.choices import SelectFieldBase -from wtforms.fields.choices import SelectMultipleField -from wtforms.fields.core import Field -from wtforms.fields.core import Flags -from wtforms.fields.core import Label -from wtforms.fields.datetime import DateField -from wtforms.fields.datetime import DateTimeField -from wtforms.fields.datetime import DateTimeLocalField -from wtforms.fields.datetime import MonthField -from wtforms.fields.datetime import TimeField -from wtforms.fields.datetime import WeekField -from wtforms.fields.form import FormField -from wtforms.fields.list import FieldList -from wtforms.fields.numeric import DecimalField -from wtforms.fields.numeric import DecimalRangeField -from wtforms.fields.numeric import FloatField -from wtforms.fields.numeric import IntegerField -from wtforms.fields.numeric import IntegerRangeField -from wtforms.fields.simple import BooleanField -from wtforms.fields.simple import ColorField -from wtforms.fields.simple import EmailField -from wtforms.fields.simple import FileField -from wtforms.fields.simple import HiddenField -from wtforms.fields.simple import MultipleFileField -from wtforms.fields.simple import PasswordField -from wtforms.fields.simple import SearchField -from wtforms.fields.simple import StringField -from wtforms.fields.simple import SubmitField -from wtforms.fields.simple import TelField -from wtforms.fields.simple import TextAreaField -from wtforms.fields.simple import URLField +from wtforms.fields import * from wtforms.form import Form from wtforms.validators import ValidationError -__version__ = "3.2.1" - -__all__ = [ - "validators", - "widgets", - "Form", - "ValidationError", - "SelectField", - "SelectMultipleField", - "SelectFieldBase", - "RadioField", - "Field", - "Flags", - "Label", - "DateTimeField", - "DateField", - "TimeField", - "MonthField", - "DateTimeLocalField", - "WeekField", - "FormField", - "FieldList", - "IntegerField", - "DecimalField", - "FloatField", - "IntegerRangeField", - "DecimalRangeField", - "BooleanField", - "TextAreaField", - "PasswordField", - "FileField", - "MultipleFileField", - "HiddenField", - "SearchField", - "SubmitField", - "StringField", - "TelField", - "URLField", - "EmailField", - "ColorField", -] +__version__ = "3.1.1" diff --git a/venv/Lib/site-packages/wtforms/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/wtforms/__pycache__/__init__.cpython-310.pyc index 36e7a41384ce12d10ddd9c52bdae801b52bf8de6..9b51c65e4a13bcf8c34ccfebda784a2a573c9361 100644 GIT binary patch delta 205 zcmX@a*UQY8&&$ij00gVD^)vP`OyrYca$uOKqo5MPkiw9{lEaeA8pX;8VzcJ3<+4Yy z1KDg*94YL<44NF1|1c^tF=|cbW0B7`)HC$c5* literal 1858 zcmb`I-A?016vv&Aki>BaNg#Yf_y~~gZs@jmRaLdSEb2#gRROz|j-pyaJR3%gJ&|po z?c?;W@6spWwpV?HUiF+4Y*V;xqWtwc6PnEPy5%px0&_zz`fX@4 zH}#Ug49mq~m{*WH&|zLh-iB@F zHRK)GVO~exg>Ht#Ct?#u7?p07HeJVU< zPL$LhM%6Q^#qeJiMXulayEKl@k;CSwLM3R21W^&aoURKdacdk55G~PA9id zv=M2y&UZm9$1+UnHSXj8+~T}4MoSSSN%m`_O?r#{#uqB>qH>}#hpOKy&y(qWjm*I; zr}m?WqFWPsNp*Z4A{?bgRL|m21>@}M^@Xp}^_S0OI(6+_{t|x^N|EH2-=7W=E|6>J zQT@YoQz#R>2}2Y9R{XsGS^s6P8`6mo&X9CT_DPB)C6ZZ^0!f(!j}$AU6DD*>sw8!i zIg%R5JV}G3Nzx{1kt~udkt~oblkAdglB|(zkgStzk!+K6NOnl}NLEQ!P~P=kLg_aC zi2X%b6VSdN>VKpi67@%yMvY`N?ScE^mZ&*sJ5-9N0bN5x70 z8NB{t_&&m%;Sc6Q4v%GY6`RTMgA6Ao{$37DJiL*?&2XSDhLMWpi-{OriLs1^_j4Y( lt_oD_y8X$ocjYgA<6Ud{75;x&(K{5!a&rIAw~%-8{{nlj%EJHv diff --git a/venv/Lib/site-packages/wtforms/__pycache__/form.cpython-310.pyc b/venv/Lib/site-packages/wtforms/__pycache__/form.cpython-310.pyc index 705771000b65bbdce69f0d8445aebd6c6c64e4e4..0f05036fa57c2022ba15cc1ffefe894a3db7b5fc 100644 GIT binary patch delta 2350 zcmaJ?O>7%g5Z?Fp*K0eq+x#?c(ge~r*_I}O5+EW;TS)&#c-1BX?GxbSlVA#s5dGjH2Cu_A2k`0c!T z-^`o&W?Vma?OeK?PMZ>ZK7M)V!nV)SCMDnSt@OUdkcN^?0=gu@uN){Lag`;?dP1_S z)}$&4rCDiN3#A&VDl<}54dq##jfV2FfjT&o2-Rg1tP;yf)YJ%(g4A+4B%xZPlhWC) zGqkEz^-!N}sT>Klsu64o4e+YC>Q%Ygp8%*#D1~~MsL53`L?}7b#-xk;XE3C!tDTT6 zz5WZmOt`1?>zgBG&I=s=q4F>3=I^U#%pGv8Owu44<+}FH-VD4(+9jtr@A)f)b-*j@ zUKQJM*RbtE;4#}C;kUH62JyrSjV+U_mg0;sPuX_9Tnd~*$+zuMzMx;)gFe~L4Q!LP zJ>vy{K4;tGxZlrn#?{eHxDyO7F`i2vAh-DG`nh5kza%rfyODJ?Vbd%kZadt-EBO+~5@IZouOkAX=$LOkQn2v)F^CeJFOJz)0C%6oV*` zHw-h(FkO)WwW@e5SP*w(O>RVCu(6m5A_b3+Z-%6h7S-r8lzU$@Y3`+MCZTdm{l$(i zY0Dunvy?~)76846_v9v;tBhfOTECc^pq=aM9~omsXYRb~Onl3~@7lk391J7bEwIS+ zfkT1+N+Gzw9tJHFoEyP?#V@mfJ%dZ#w&z&cwsCe~b#0rygvL*!cpNQYBkvT8wrv^g zSyU(voAKEw8f--&x~>yf&q=_8Qwapj7aiYkW`qq!U+|B*|2~U8jAY#m8iOaaPbvW3e^_>at(q_<5nYDH0rNk-*cNf z58;l;lHfW*LI-$(>rFfJ#egC2nLx%)w$vDT9JTvVppQr^l!}Ft$C}*WiGBRL!I4FA z-4xr15;CG7tz&XDW{4n%7$51o8P9vzPHU1X{E5tJ0Prh3ehvf@Mlq;DN&Ic$mxs2K hE&RsNVe2XMq@oa=ibP|0cnxZtC!QGYmpisj{s+&Y-_`&C delta 2304 zcmaJ?TWl0n7@l)xc4l^VTe|J`8d?^quv4Hd0YRWFf>;qs5m92e4a3fK*}C1WXQpU% zHW+JyFA&XnP(ny{Lt@fLvWYPDCh_uMygeG92qymj87%GExXFC`&woGv z<;?X9jSDT6mKH;T-+4N6>FAvngOV?K4_$xWQ3A;#0R^PKydc59;>QBw#1<%fBp@}l zE>%e&O-nT`km{tW6r^e_kf(Jv7Ra?Y^1#LjVzmTl8MP#G>V!ysORbf^OFQNU9<2isI21zHfV%T*&Vz*Y&=G3n)l1nk+#>^gA$B&o5p>%UI#H=g`0ufIwx)m)s+aB3 zoa-$T)&s9>U{-?xenz{z z`B7BE(9NzBmQ`?l@IGT%Ih1GleeK%rHY7zH`C*(eCbC?`h4-(EgZwkSyz&2{Ic_P6 zHr_ZDcL+)GkB#0eo;s8(7pIvxQ2&23Wuw45!tWbTkk9$P#Nl(fv$U#J^+2tufmV>} zv>Nwe1RNS@H>F$DAq%2$4w)k?7sP9NU|`z=kO1eHABSdZFhs||N>Ej~oPdVME=%lG zqgr#O9i>wEUV;Q&odLETA_~ZcWmEg z+k}xIxATcqAL-|XRMuSCVD>m@y#SAw0ch>gX&Xt?cA6yZjgL~lVUg+`Ye^6Pq+>9H zwFzVHt3I=vI>E4kZ*rQx@fi9y3EKmIi*iVZM@3yjGSy@f8e>i|@8>Hsv$-4moAl@g zY&yeLWE&8g5=Dpa@eQ5ZvqL~R#G!A&I>7Rgx^zfdAYv6M>i`}Na4lsXbdG1EbV5}u zgvSo9;`u4y-Qs_Ajy|b~!HaU}M$I(<=7V`3U&R!8H{tPgfHdq?lE2t>b~*!ZY!G1+ zf{8GUFoJ;NB4S}d?z^=0Y2cVj zsQB~XD8ujd=F&~o%Yeq6#zbF^_O6tK`dG=Hx#-xrFZk`X`?ov`ilOWjS!j4LM85Y* z(Z9rY0+)%Q+l6w)t1zFP;H~}L=g*+%IKn;@!G)2xOC`%Pb@rUlwOPSqdr_emL2Owc zQYQgU$7fi@%9m`>0PV4yDuvXlEizJLg8?h;t6{RW? z%z*x%@OWs=^XB#5EkGCgpq3B^bQ7PN-Hs7UJcA!L5X~`vwx9dCZls#AS84fiQ zo^wE%vB>j&HeTE;8<)8Xzt zq8LfG+JMLyL+nuoDJ)=gQ;1Q?@zhAivaJ>IMWt0x{FUz;*+tTPZe-k?KtsGHqJ5l1 T3U!usC@K&Cd1RB^({tz_q6XQf diff --git a/venv/Lib/site-packages/wtforms/__pycache__/i18n.cpython-310.pyc b/venv/Lib/site-packages/wtforms/__pycache__/i18n.cpython-310.pyc index b1b399d217cf44717391fb99f3fd600c19903ce8..419ae8f8c7c74277c591015295115d6963477cea 100644 GIT binary patch delta 19 ZcmX>pdQy}tpO=@50SH!QZ{*s~1pqPm1oHp@ delta 19 ZcmX>pdQy}tpO=@50SMxlHgfIf0st-~1U>)& diff --git a/venv/Lib/site-packages/wtforms/__pycache__/meta.cpython-310.pyc b/venv/Lib/site-packages/wtforms/__pycache__/meta.cpython-310.pyc index 2d42eae87513d7f926a7c19945cc9fb43ac9ae77..97bf6f4293d5b7f64f6f33ed67de7a4521873362 100644 GIT binary patch delta 19 ZcmeyO@I`?upO=@50SH!QZ{*4n0021G1rPuL delta 19 ZcmeyO@I`?upO=@50SMxlHgaVN001=t1X}97Ixj~!ML!Vmlnr2`?RGUXayy4#0l zKVlFugh+cF0hg$I02kqeWq?IYYFU>ltD!^WjKg+|khTLp)$wdaj5#o;oBTPoklDThncXsi< GUgIZF1Hudd delta 1165 zcmaKr&rj4q6vt<#-EOyCSU`TrZv;`-AP5PO1L994B+C*aMs19fl^L|yZOOEF;2;M$ zd+E`bNIY>g9E=xkCjJe*dh+f;@#1@31te&b`E+L9_q{i-Z~DFcQ^!V7S7#A;9tjI6(-norV2vysn8uw(zm+ENbNNd#v53zWVV@O zh^#QTh?AWmA}6dZBCJj3n9|%FB2ErAZIOq~JZxHm-X+DluaJzC6Xr+zbYP!e+NXo- z_WPF&^h!hp+h(BA%8G(0Aw`yCm0a~IOEM|&()5knv*j6n_u<^l`BIT4w7Nr-6@Q=) zXm8xWUUg!y)}-f#(Na)do$87|vV}f0fnRnxP}NEl)})8}{CET^0?rpuQ3S*Vt1W(K^*ZYJv@a06qdEa6c&)^ex)jppFPj{Qs74w*AF?re-Nf84HMhrqqTFS zM{ta%GOBo<8bRIPA2G>-4KJh<|FDZ2eW*Bt=tm47E+B>w!-!EtdOHpyrL(jrXTf?6 zMpzF>ds2@*NxOo!qMfiHRCO>_mk}l)$>Q(edeTjDbN5P%v!&Vcv?`#v8G(&X>@`1> w5r0wf)}+EvM=CkUpO}-?K&*Lk3jfs*@1RLc+Qf9tqPnerGaKp)Mr)Jy3uOG^Hvj+t diff --git a/venv/Lib/site-packages/wtforms/__pycache__/validators.cpython-310.pyc b/venv/Lib/site-packages/wtforms/__pycache__/validators.cpython-310.pyc index 6c940a76e1b5db81a6e30edc5e1479ae4fb3470b..08072948fc667bc9d4800fab2f5e876180d655ed 100644 GIT binary patch delta 1456 zcmbtUT})eb6u;-*_VQ5%-3An;6AH|6QQO7AL>b)>2%zP2fOCihxEI=jE&CS=W8F-) zkj*)kx#L*GIbrHHh(0VgBs02+$r2M^)R#TfXyQjQ-}hupi09lUllb6^P44giJKz6v zdhWe<9sc+TvZGtJWJ>f~9rFeM?7o$K+69`q;ObGJ2XF1!4zFA*1UO`Z`#1aJhsjU$ zF?2IL#o%Xn&D`*ODLY?hKEN=@FvJP)r?Lzf#s_6*JUS^gyLgptn_^jfg25nvmw997 zysV}w;S1$u5X6D_oGyBPTXNk>aZd~cnu3nLa23BF)vob*2eIlPJfs(?DhzH#$Hm0xzA zV&24HFwEi4&rQRe*;~C|aagu;R*&FPjX&=!)3+I{Zi1gHllu7%jh)zw2 z9qcfc^7?LHt@AWf?<1H)ckKi9B+J%+X1e`X6vri&t^Aky?s&hhve!mBm7aQfVlNUT zG!Vs54x-K1LE+1DCiY`q_A~zu~DLO2}ab?n$P$umOX-Q@8Wzgk$$d^vRNzjxw zEUJInxdMVKuB3_mbcjoM!sSX6mzi6Okr|LB>0uVhS-4t%v7GmCMNZ1z-AS0))Qpex z$&7uYM#Pwz5dK3r(9jHv+<|?8Oue|?&<_iEp{fA)Hs;$ivq9wJFSZ?U(Tp}CIFOvg zlML_T-8#1#q_W~Y^fh_@qkH&2-B&kz9gAG>eFm#pHOf`5;Q3~6)(523Y;EEyow!l| z*jDi&`&n09Vzz9p*2hGTanvW6(^6e}okR_i5dYU`1P|dT``yHF%T9HLGpzDBates{ zvE@_N70^&}@%xrGm^X`FQefL#q}3Er!N$}AT0`ZvJYxo4ejavP8=21b)M67$szziu zsvF6yo=AvEqYzPHy&s|v*8;oLu$2#g4eW<=SkfBH8)3yL!#RfA44>m_Yl(fH=n4Fx zH4o;k%hh(In@U?6*l2eu9$jV)%i8q2tx| zBIu_87u?4C?FZm9banXP4mNch%e_lQXeWh-&TjD)S6}DcE^hQ5kLPP5vs)WNvB9Bn zN_M2M6iYkHz>CeD-t9CY>jP)Ka(<3Z75WCRbv9^sC_cs$N|$Vqu4XBsgal1XeLuR` Y-D>|G%;_4XE~mS0Dy7+_SaPuBZ~U%rivR!s delta 1811 zcmb_dUu;ul6u;-*+uC)d6xg4-72W25b!v-jQxxcg&TWL*ZMva@jk5K2TgPa}*RsLZ z25@97D3fpmCZgLgFlIDJZj6bNfDvcpMW1{qYBZYQ112UUzL*ftxlQJL@Wpr^e)spC zf8Y6YzwiF~F5J8X_SljoR*9ZnvbT4(^{V|?KFsN7@>>|os@UtT`M&`tLF z`s}I`vN^L8K2uf-5e$~yA}n`T!5+h6$X%#9_OeHmA;vJkd+8rNz5%iq3;*==~ z^pjOS*>RM49YZ(682<3o5RB>D*Hwz$IVPl}+y@DHR2Esxq6%XVq?CkmOzH*=H2J6{snkfLFbbkTlU|g@r9L&KCRI(^ zFNxJjdD^5YGmugf=A@cqG3j@%49FBhC5e34DGe8Ijvj36 z_5_2W&i?*j5I^&;z};IObBXipV>JdUs)?u7{zyELRyv~x@koA-S4@)7*hI82GrBs( z%*((7ZQz~kL<%4eZ*MvE2p^$2S-eB9G#pqo2*YKX#BF%mUk~TG@20b~ehL5ZcfeUZ zS>?q3nmkjs9Yh}fq^<)$$C*TMRrYqtW7RW=8jnJ}&e_a1}G894^UJ@y|(pSL-R`L5T|t z|2BsK4ssFK)p=}}$j+?>#4Nqh>wj>WxXhkLB6G~%Gmh&t(G+{Vk9ysD_yF(LIjua8 z5f)xSd;Kc&hirb8C$rQ^w4F6N%bYZy98A;)U_$@AUV-JuN$OTaIV&?K*qAR*>A3#; z)~8{uailG*&)f{e(&lh96w|_KTWd7JF{9NSh66F9#up4-EM zUWOA4*BNeLprNF2g6LsNFm5AakyNmo?O>H{s+izp^{IxXAd9Jmv_8gL&v$Hcwe&{f zMct8bzg86Lj7DRLqONdJSc@dWn#Zjg$6`lztg9~^N(8meL}%u{G5!p@C{{jvf+K-v z;R;?0c;P1A4UFV`K?%5(fGDPSiB?7ulk~ zUtw)ijr%&6#BJk}EM}V`N@(GBXKv*eIJnW1Q>ZufP?HLqFK3n7OYL5}LtTd7H0R-u J&8lpHzW|=2yR85K diff --git a/venv/Lib/site-packages/wtforms/csrf/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/wtforms/csrf/__pycache__/__init__.cpython-310.pyc index be6e62b09983b7223abbf50e738c721d30deb1e1..bbf8abff49babec75989722560a2be6d42ffa723 100644 GIT binary patch delta 18 YcmZ3-xQ>x4pO=@50SH!QPvlwx048+=Pyhe` delta 18 YcmZ3-xQ>x4pO=@50SMxlCUPwS03%fcn*aa+ diff --git a/venv/Lib/site-packages/wtforms/csrf/__pycache__/core.cpython-310.pyc b/venv/Lib/site-packages/wtforms/csrf/__pycache__/core.cpython-310.pyc index 2ab75e922ba9cbeecdcdd9b7cce033a4f67b5c48..d745db2b426ece265ddd2d5d43d05a40beb1a8bd 100644 GIT binary patch delta 19 ZcmbOzKT)15pO=@50SH!QZ{%v{2LLMq1Y`gJ delta 19 ZcmbOzKT)15pO=@50SMxlHgdJ|0{|y21Frx8 diff --git a/venv/Lib/site-packages/wtforms/csrf/__pycache__/session.cpython-310.pyc b/venv/Lib/site-packages/wtforms/csrf/__pycache__/session.cpython-310.pyc index 9f1d94ecaecec9031a2d18cd5faa6724b763828b..aedc9c428c9d8ddcac0c89f99b3cfb0043a82a18 100644 GIT binary patch delta 84 zcmZpXYLVj2=jG*M0D@K7`WeC-d5^O&%5A>NGMkA}X>%dF5fh`$B)gSiv;;N76j5@)FKxjQ*3mx#ly5 jPS)mbV~m`S diff --git a/venv/Lib/site-packages/wtforms/csrf/session.py b/venv/Lib/site-packages/wtforms/csrf/session.py index d7ddd5b..62ba763 100644 --- a/venv/Lib/site-packages/wtforms/csrf/session.py +++ b/venv/Lib/site-packages/wtforms/csrf/session.py @@ -12,7 +12,6 @@ for extra security) is used as the value of the csrf_token. If this token validates with the hmac of the random value + expiration time, and the expiration time is not passed, the CSRF validation will pass. """ - import hmac import os from datetime import datetime diff --git a/venv/Lib/site-packages/wtforms/fields/__init__.py b/venv/Lib/site-packages/wtforms/fields/__init__.py index 64fb6d3..f72189c 100644 --- a/venv/Lib/site-packages/wtforms/fields/__init__.py +++ b/venv/Lib/site-packages/wtforms/fields/__init__.py @@ -1,71 +1,11 @@ -from wtforms.fields.choices import RadioField -from wtforms.fields.choices import SelectField +from wtforms.fields.choices import * from wtforms.fields.choices import SelectFieldBase -from wtforms.fields.choices import SelectMultipleField from wtforms.fields.core import Field from wtforms.fields.core import Flags from wtforms.fields.core import Label -from wtforms.fields.datetime import DateField -from wtforms.fields.datetime import DateTimeField -from wtforms.fields.datetime import DateTimeLocalField -from wtforms.fields.datetime import MonthField -from wtforms.fields.datetime import TimeField -from wtforms.fields.datetime import WeekField -from wtforms.fields.form import FormField -from wtforms.fields.list import FieldList -from wtforms.fields.numeric import DecimalField -from wtforms.fields.numeric import DecimalRangeField -from wtforms.fields.numeric import FloatField -from wtforms.fields.numeric import IntegerField -from wtforms.fields.numeric import IntegerRangeField -from wtforms.fields.simple import BooleanField -from wtforms.fields.simple import ColorField -from wtforms.fields.simple import EmailField -from wtforms.fields.simple import FileField -from wtforms.fields.simple import HiddenField -from wtforms.fields.simple import MultipleFileField -from wtforms.fields.simple import PasswordField -from wtforms.fields.simple import SearchField -from wtforms.fields.simple import StringField -from wtforms.fields.simple import SubmitField -from wtforms.fields.simple import TelField -from wtforms.fields.simple import TextAreaField -from wtforms.fields.simple import URLField +from wtforms.fields.datetime import * +from wtforms.fields.form import * +from wtforms.fields.list import * +from wtforms.fields.numeric import * +from wtforms.fields.simple import * from wtforms.utils import unset_value as _unset_value - -__all__ = [ - "Field", - "Flags", - "Label", - "SelectField", - "SelectMultipleField", - "SelectFieldBase", - "RadioField", - "DateTimeField", - "DateField", - "TimeField", - "MonthField", - "DateTimeLocalField", - "WeekField", - "FormField", - "IntegerField", - "DecimalField", - "FloatField", - "IntegerRangeField", - "DecimalRangeField", - "BooleanField", - "TextAreaField", - "PasswordField", - "FileField", - "MultipleFileField", - "HiddenField", - "SearchField", - "SubmitField", - "StringField", - "TelField", - "URLField", - "EmailField", - "ColorField", - "FieldList", - "_unset_value", -] diff --git a/venv/Lib/site-packages/wtforms/fields/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/wtforms/fields/__pycache__/__init__.cpython-310.pyc index 316f214826440251f06aa949d4f2553c02d6783a..1e0e20dadfe00d11ed40d9a46aa02820fe35958b 100644 GIT binary patch literal 585 zcmZWn!A=4(5N+9ASb1I+r{`vdi8I(dh!=M z*)B^$pp(A$X4>gYo60C^BRjqp!}&Kx=*KzRqhXyJJ9S|pLmB4i#c_ipfeFS=d%Ph$ z;#JzW+9!Uc1FHiPR2uVUm4|t&=CJ02n%fmOc}H|fWOG_$)DM4cRn*5Td~V@r3>;GP zz<_7Bi3S@ADyI@WnQ13R$pp9+oif*8;$^~1c(XFGec#DHM}_L5zhy&z}W?DdeB0u)Qh>CVxbiGl-(HsR7Ru2su* z(T%t6^@&vI`g8C%zPqHa8kD9_asu=o^uox3zJV&Fd4!QPbP4&Aj@X21X5gYo(nT@@ pP3tnl^~((7nB~mG@u2uvg;zpmC5LPKIgsvI2vHZWEyNo;#{VVYq(uM# literal 1716 zcmbuAOK&1a5XWb*F)+*+V+{Chj32usyY@YbqGZ=Wd9YDrdlRXIb~I*samzi^XnOGO zew`?ne45;S%_(0Yr&JZ5!Lg44@z<}qs~`36ZlOKTvGDV*aC-e`*|Pqk;Nho$!PodR zzuT4-TA{71$OhXcE+7}6z`TIG01M2E$cwPZTvWwq36_|bkV{ZvE+Lnp%v@HL$N`7B zf?S0vvxDq{%UnhFz+-limtmRNL#{!Md0DMQb*MAf)N0g#2J?zqi<;16t|Pag#k`8# zhBk8pc^%f7*N``0gSn|Tqb=BCZXs{OHgg+!2X>g(k#}L2c>{S5_Lw)3JJ4a?Lf(gc z=56FIbeVUM58!}#7x@qlnfH*7;E1_{d<@6T`^eAW8FN=Xk9zQ#ZH=w);5QpS4-YS_ z-qGK5em(onIS)dq`%H@j??QbsyrM}`BjLUyr-{|XdX}%18GuR)jbm< z8O>*`-^b@cJkA$)`br0RweI(ED#jwo=BwYw{~6-G(prfi&XSzhTIqa<^KBH!yoyR+ z&K;_LC&N(W+p*g|%ce1ztsy%`zd+nYJd7O`3EESt*qvfFGgJIfw- zaJJc5kjLO<^G;K#OmaZIhbVU?-w%}X{XeYam>Nm`xp@7>@U0Pv8UCoR#PCd*n^aGR zzlda_(;vh@r^8zj-wp@zYG`CCUQUA1O)wT_c)!f)?5IwCU&b=^{gcV3yYiQj4yQ_d Rh5sCu>7%%oYyar+T0$unCBH%w#cC^2ca}6ux7jhmW+_@L zUrh4!TDdPlL6AsD^Z`B?6dCl;L;EEC3q3|3=j_%N&TxNo?>Xn5ueo=o@kOILp{j0) zo+o1sBg2d8yw~TTl|myyBb~yh-h=zX10rL~$QipSTlOp%J1n~nA!!^&rHo?PEZLG4 z?3OJDmULbj6PALSx~Ha&92il?UP8oSs61~Zj5XOl{qmM94^M|WP@Xj4e_{~ zm-sd~c;Ft*sI!ux5Fzc6*3)1$i=yq3s;?wN%kS&>@`8S!=*-INM$ z4OPZ_X_DqDM=01?B?A`Ogrs?KNsuKNK&nDTrS>F>1(w>AcQvJxW@6%E>hK3L{w4?k zX=;C=P5oMxNGCC+wbvD!t3QUgdnl1erp%$?3(2CdQkU0oUF)wX<#g^(PS_m^!4US; z`f;b`aem~S2C0A}S`=qPH~*d^t@=>Uani-Tlj9ph@GU6*fA+pgBfX8_1sUAJN5@qI z4Fs(Oy$XmQKD+oX|DvNCtJH9{dRKKHdk8aPjQ@}7D~D$1t9E~>zGf6)6z_(c;R}8a KKeP1(ntlT#{>6p> delta 927 zcmZ9K-%Aux6vywmGdu2%JL~Fh)9$LNNP!61LnI{yvKF?P8TkuK6PkY6LpeKH$xMn{ zxII+XdFd&3pUQ_I5h@{~dI*ZNUXuv&wLhW6&KVP=S?*`f`OZ1#o;~+2wB%ci%Z8x~ zdWK}vg_SwuVHlSx3~=yScu(E7A?Yce>IGa;P+g@6t{4eilAh*hZXgHtPTU`>#ag4T zvY9H_yBOOEvq9TnyM-`-r;HkW8mq4vB`<3dyt2Me2Y)!q_-`NX_ci`BhbJD9m4^{wYedKfEpdW)&fud*=Ik+PnZCa47S^?HafK@t-jIU}O?Ub;d^S^k~;p~uAVg()D zosc;wDo&{tDui8G1WUgQCKZ?hZls~K)9#`M&j4ZLkz{DJ_%CHsg!94`gCP&{q99z# zONt^qkfW0F!RE}(BeWY?@F&g%@J6!SSR^CMWm95&H%+h+-zGztOQgd*bpIaB!ZLnM zm;oO568=i`_W9dak?U`-d*D(7V_-{%n#lcYz@IyH(ZqFz7^fNjY52!CNbVO}S(Ts( z6Yyj5_QoaaPVI%`crRrhr1Kx9fc0zaCw7zjfmU`0Aq*<$G6JSdfDS>>)}*3>q@M1&)iw1G{z#=$JzR#{wp$sSZ?9LqRkL}rkLUXO_f0T9R$rqUp2sd!a&!QY5>UqR5J)v~}Ymjhr}ig42n2vPd6! z)ZXc*6je2*k%yvA>TZAlDOyM^;5Nxae;61|ism86LsB#-+LxgB(7v^(`x5l2h=H^- zD?3VolDO|?c6MfVzn$6pYxUp0=EY)B0e){>9bQhJxv8bLe+HT@*u)j`dvB5_To>~q zyhT?k%XyigO#)fTD_oY{NVz57!ezx(%dPoVE=SyGxh>zu-gpGZiwUha)cL!>u??o!H*1jp;AI0>e~9Eqx*qJ z9a}F}bh}sxeBG+pdc_NHAXu%sj-S=%mmR(0Yy|q6L;a#x(Y+=8nfW=7mVJG_=(@VK z2wpJmuU4xb4fG|C>PtM&ew2TRa5CEl38Q{s6|TC@n&TD-9^Snl+GTj2g2(RwC<=Aq zd1Z^#;Q*PqBEl}nJnaOFA%EI}dA%}Db0N2l6Kh&+D@?P`9LkpyX6RcLQI6(jfZOAZV zGC8O`0W&^oE+?Om$RNAjZM5Yu$S8ur?sVsX-BfCXj3N_kA=OGgZkAGK#r|*LjClkV zz)u;pX0 zduqWsy8-kxEHU2SLk62;{Wpn<6F7IjA2_N!2g=jUe-3<=sP_HwhmEwd0E*RIF#5^i zGa&M)hQxD)lDAlbCGFRN$g!cdvL`@o}QfQgy@934j|P9NWzi7M|I?2j;N z;&OQvQUy&Zb~)4Y>NW0pOeVwv!>r+A_?kATEeq?sb0dn6W6 z!mZH-ge&ahOoqgnG&D(8*ds&NNgsQEs0Ow7$b-WpyiXG_FO;Bec#eCl(kgm$J3j`T z1O?!gh`$cw^y*&}1 z-+|k(L`ou{1dqHcK|_fbYU!zql|^s0V)LtQaC2)&-#kI@p)n0L`DIMYlMJA=zfyi1 z9EQfGaFLnjO#=OeH6{~{$n3@8o?h;-j9x{As|X0khH8vAHCMb_D!;S%X#7f1e_ z=GD!2eE=umg-!8RrW*i1VqeRBJu-&sH=#mw@)P!6Za9h;zXXrp%kJj7HCx_+Yk!v< z!dpXOL!*}uucHh4L1`XEnP-?~KO9YxpR(JdU)rvvrq%+zBL&J)Z&orf`@p$m{*yGDk=@3Ou-+a~m4rllzCV&=e;S)38Fu8MCwpsP zeO(Myz9+M2hcdsq_Iiz8!|09AOYSXp>!FFnSsX;ad;8*M?3-URd3@~unxl__`8Ti{ zdY#$hAChYV3#L)6>PkB+4Tuq`xZ!_5`(^g##x>RH~j(APIZsq z3XInOAqi%2j%IK^u4uoLc_k&Y85sOIvZ8^2tf(^lrKr>%rD!ucDKIV29Kr;9?bJH| mK++7<;bE3N9q-k_q6+wlXcyb}9s+NoNy4_Ut(7#rBl%yjs$i}F delta 2276 zcmZuxYiv|S6uvX}(cA6r?Y2PKzPl8g$hA=SU`e?MOc>JZP|MF(b>zx zWt$p{N{j?>42c0^`Gbih7+fE}R7gyW(O>@3{i7j9{X+tYAp`?>&MX#U*v)+RJZ8?E z`R1ItoBcIoq&*&&1iyW>`(SVQjL|SV51J)e#FiqZFNqM)sZEn|L?&pHK~^G)kQG}^ zY7tGys$G`UBf5|^yFBTNxP)A0S0vpLw~%#^JrNI)o|CL{%XM6`Tyr#HfL39-LG!yo ztpwF$8K4@Vc|ohRyr6kOtGfErNlF^{etCrW_=oZz1HKu<@#PImO-OU{Ol7`uzV@QD zLE2mK3Z3zSuP!f5>3MJ7n1l4EXQrnuvQsj(!tcs0otpLhj`8QXnsDODY_TjGcVdpi z%&MZ2joTBf1K40I5SkDg5ZVyx5jqhX5&Q_qWU(xoVeyH?QRYKUjV2*tksM|%{D`+% zTL#ALI)2_eqe$)FEzumZ)e_f@M6a2fX5DD{ts!o$Z{%&=Hb_yd86|Pi& zOlxXEj<{JoWyM)^A`!POld?XZTH+^X`ROGce7K{Wf4ih9l&9z53NO$(@&<9}yqu>O z32SzUu+x%#TC=2`aGk(~JeFI@x7D=swKX2H38c+lrKpd`Y&&+qj3dFWD0-$LcmKH|aivvvTHW5=? z!iqWZ9}1OCqqOaLbZI%LRbv0*LLD83n_jUXeAAWp95!zjuQl((`KFeA}E^+r_Ifz zBl5_O>&t zVMdIPcdjR`{G-mcP*HUbWuQ6)(Sn3s7*vppjZt((@nE7%nTjqSf6&>wdjQ4N2*U_# z0E!jkb}XBPRymlq7}l349ERnrTq0?mAuN|>YXCZ{C4jzO`<0R1ywld zaY1E3eV_l;w@vFt$24CPY9Sx+eWC6l84NhGSPE}T6T~7GJ+3>_32BaOfH6ZXd7k9S zMU<30QlVau@nPoILVLQ?7!aeHv`B+JrTZB~MlSFzD+gy;68t&e z@DT?KFB=r4mkn;TW0Tp{Eyr?nW(10loAh&D6SfSb_#QFYYv?TP zgD3ok&xh-KFaxvvF(Xe9@|3PGRogQx0IMz`2L=epfv&(`cFAs+@R`+YEqGWL?;Sj% iA!956b=tNJpHf}YiJQ7hgTR*t{^b$g9O-%?RYN0I@R=7wZ9u8ip)}BF+@X1&kopLdIZ_ z2vd)keFP=qAXV=2-J6rB_**W@fJsMNl{u!W^Sq`Q;`Tz zxJYpFIu?0u4j_|_k%y6sQEc-y79&PRjmeyB_nFy>SSR=L%4}w57hzwy$jIn4 zS&nlWqxs~moNpK-CokgK$`~^_g1dn+aPv)WZAQl8$*jDkjMo-s16Jum- mn!J{O31j)@Ac0AYj0+||6>MXiF*!$QGpCw>6cF-=C;|ZM#64I5 diff --git a/venv/Lib/site-packages/wtforms/fields/__pycache__/form.cpython-310.pyc b/venv/Lib/site-packages/wtforms/fields/__pycache__/form.cpython-310.pyc index e35e168b0a5158bf6b930fb8c93d862fe893b0df..a19ca00e7412499910d5591ae14d960b40cc3e20 100644 GIT binary patch delta 188 zcmaDa@m_*ApO=@50SH!Q>t_T^qAP%#5O&<5}Vv8QCW9XKi6r-|WIB!N_R4IhNgrkDrAhFJdZ1tF@7=&cN8PjESVoS?cewQwZ!r`x0qwfQlAK?Z kTEqfmM)8)Hq~#ao7VDLkWabo4*5~m0PjRHQUCw| delta 187 zcmaDa@m_*ApO=@50SMxl^fLk{@`lK>HZw=Dr*H-{XmY&-NoX?O;x5fAPA!QqOUx-v zotPuHaoz!DMzPKDEb)wtOq2JswlHdJc43oXWVG8H%kIO-=r(y3M;Bx8WK+&6#<0m7 zII9^WC+lz(GR91v$Cb*MFqwrrijieuBj@Bh+u0!4vVVq{2RNny=l&Si;W0kheFY}P1N zAe$kDJ%?>#f~X)%GjkMY3S%&XCihE_DSi{D8uD(TjY8dxTP7uvvJUIEZXgTAN$MC{e^d`G|N9Bll!O2?xz0 xevk-A{VkT{{G!w%RuG>JNJR0Lm!#zvPo5=V&&kLGge*)V%m8&0S)2d> delta 325 zcmaE4_{fkqpO=@50SMxl^fTNi@@i=^q%h?$<}yVwF*2kur?BKO=dwhx0NJc5Y&opC zY*B1rHhT{1!~{_Vwr1ui&J@OA22JjlAXEG_8EGu(KriXQT zk+F0076D6;f_H)k8E0?aAQaEYxM8w@$W)LX5gW#xlOK!JFz%n6AezN^X!2>%a>k>R zoyFEOo|^nw%!l#BWC!t7c^06fqPToAi%Y^YQ_@pQqS(s8bdeBHqKIko5%C;Gp2>z1 z4w_NC5oQ4S C;#uzi diff --git a/venv/Lib/site-packages/wtforms/fields/__pycache__/numeric.cpython-310.pyc b/venv/Lib/site-packages/wtforms/fields/__pycache__/numeric.cpython-310.pyc index e687a9aa6934ba3ae5c61c57d73af4622407fd6c..1070dece50f690079b63cdcb08a38fa9e01718a8 100644 GIT binary patch delta 19 ZcmZ2wxXO?#pO=@50SH!QZ{%7a0RS;21l#}s delta 19 ZcmZ2wxXO?#pO=@50SMxlHgYYH001pe1SbFh diff --git a/venv/Lib/site-packages/wtforms/fields/__pycache__/simple.cpython-310.pyc b/venv/Lib/site-packages/wtforms/fields/__pycache__/simple.cpython-310.pyc index 3f88e671b7913d9bcbf450e1d0e671262336c917..30bdf1f81159551d077f65a17580b92eb8b41cbf 100644 GIT binary patch delta 19 ZcmbQFGf9UlpO=@50SH!QZ{*?-0{|=O1PA~C delta 19 ZcmbQFGf9UlpO=@50SMxlHga)@0RSiz15*G1 diff --git a/venv/Lib/site-packages/wtforms/fields/choices.py b/venv/Lib/site-packages/wtforms/fields/choices.py index 62ed497..2b1fd2e 100644 --- a/venv/Lib/site-packages/wtforms/fields/choices.py +++ b/venv/Lib/site-packages/wtforms/fields/choices.py @@ -121,9 +121,8 @@ class SelectField(SelectFieldBase): _choices = zip(choices, choices) for value, label, *other_args in _choices: - selected = self.coerce(value) == self.data render_kw = other_args[0] if len(other_args) else {} - yield (value, label, selected, render_kw) + yield (value, label, self.coerce(value) == self.data, render_kw) def process_data(self, value): try: @@ -174,9 +173,9 @@ class SelectMultipleField(SelectField): else: _choices = zip(choices, choices) - for value, label, *other_args in _choices: + for value, label, *args in _choices: selected = self.data is not None and self.coerce(value) in self.data - render_kw = other_args[0] if len(other_args) else {} + render_kw = args[0] if len(args) else {} yield (value, label, selected, render_kw) def process_data(self, value): @@ -202,11 +201,9 @@ class SelectMultipleField(SelectField): if self.choices is None: raise TypeError(self.gettext("Choices cannot be None.")) - acceptable = [self.coerce(choice[0]) for choice in self.iter_choices()] - if any(data not in acceptable for data in self.data): - unacceptable = [ - str(data) for data in set(self.data) if data not in acceptable - ] + acceptable = {c[0] for c in self.iter_choices()} + if any(d not in acceptable for d in self.data): + unacceptable = [str(d) for d in set(self.data) - acceptable] raise ValidationError( self.ngettext( "'%(value)s' is not a valid choice for this field.", diff --git a/venv/Lib/site-packages/wtforms/fields/core.py b/venv/Lib/site-packages/wtforms/fields/core.py index 2155a89..2aba500 100644 --- a/venv/Lib/site-packages/wtforms/fields/core.py +++ b/venv/Lib/site-packages/wtforms/fields/core.py @@ -1,5 +1,6 @@ import inspect import itertools +import warnings from markupsafe import escape from markupsafe import Markup @@ -130,6 +131,17 @@ class Field: for v in itertools.chain(self.validators, [self.widget]): flags = getattr(v, "field_flags", {}) + # check for legacy format, remove eventually + if isinstance(flags, tuple): # pragma: no cover + warnings.warn( + "Flags should be stored in dicts and not in tuples. " + "The next version of WTForms will abandon support " + "for flags in tuples.", + DeprecationWarning, + stacklevel=2, + ) + flags = {flag_name: True for flag_name in flags} + for k, v in flags.items(): setattr(self.flags, k, v) @@ -169,14 +181,14 @@ class Field: for validator in validators: if not callable(validator): raise TypeError( - f"{validator} is not a valid validator because it is not " - "callable" + "{} is not a valid validator because it is not " + "callable".format(validator) ) if inspect.isclass(validator): raise TypeError( - f"{validator} is not a valid validator because it is a class, " - "it should be an instance" + "{} is not a valid validator because it is a class, " + "it should be an instance".format(validator) ) def gettext(self, string): @@ -387,10 +399,8 @@ class UnboundField: return self.field_class(*self.args, **kw) def __repr__(self): - return ( - "" + return "".format( + self.field_class.__name__, self.args, self.kwargs ) @@ -415,8 +425,7 @@ class Flags: for name in dir(self) if not name.startswith("_") ) - flags = ", ".join(flags) - return f"" + return "" % ", ".join(flags) class Label: diff --git a/venv/Lib/site-packages/wtforms/fields/datetime.py b/venv/Lib/site-packages/wtforms/fields/datetime.py index ac22951..63e32d7 100644 --- a/venv/Lib/site-packages/wtforms/fields/datetime.py +++ b/venv/Lib/site-packages/wtforms/fields/datetime.py @@ -34,8 +34,7 @@ class DateTimeField(Field): def _value(self): if self.raw_data: return " ".join(self.raw_data) - format = self.format[0] - return self.data and self.data.strftime(format) or "" + return self.data and self.data.strftime(self.format[0]) or "" def process_formdata(self, valuelist): if not valuelist: diff --git a/venv/Lib/site-packages/wtforms/fields/form.py b/venv/Lib/site-packages/wtforms/fields/form.py index 10fb30e..83f5abe 100644 --- a/venv/Lib/site-packages/wtforms/fields/form.py +++ b/venv/Lib/site-packages/wtforms/fields/form.py @@ -1,7 +1,6 @@ -from wtforms.utils import unset_value - from .. import widgets from .core import Field +from wtforms.utils import unset_value __all__ = ("FormField",) diff --git a/venv/Lib/site-packages/wtforms/fields/list.py b/venv/Lib/site-packages/wtforms/fields/list.py index dabd8b4..db52bc0 100644 --- a/venv/Lib/site-packages/wtforms/fields/list.py +++ b/venv/Lib/site-packages/wtforms/fields/list.py @@ -1,10 +1,9 @@ import itertools -from wtforms.utils import unset_value - from .. import widgets from .core import Field from .core import UnboundField +from wtforms.utils import unset_value __all__ = ("FieldList",) diff --git a/venv/Lib/site-packages/wtforms/form.py b/venv/Lib/site-packages/wtforms/form.py index d0a77ba..c6805c7 100644 --- a/venv/Lib/site-packages/wtforms/form.py +++ b/venv/Lib/site-packages/wtforms/form.py @@ -30,7 +30,6 @@ class BaseForm: prefix += "-" self.meta = meta - self._form_error_key = "" self._prefix = prefix self._fields = OrderedDict() @@ -114,7 +113,7 @@ class BaseForm: for name, field in self._fields.items(): field_extra_filters = filters.get(name, []) - inline_filter = getattr(self, f"filter_{name}", None) + inline_filter = getattr(self, "filter_%s" % name, None) if inline_filter is not None: field_extra_filters.append(inline_filter) @@ -156,7 +155,7 @@ class BaseForm: def errors(self): errors = {name: f.errors for name, f in self._fields.items() if f.errors} if self.form_errors: - errors[self._form_error_key] = self.form_errors + errors[None] = self.form_errors return errors diff --git a/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.mo index 21a072514dca22913a7cc7e80e9131fa8b8a0cac..723b02319c2499493acad15ece3b33e502072b78 100644 GIT binary patch delta 38 tcmZ3fv{Gq9C!2t=uAzahfvJL_v6YFDwt>;+nQR4&%tm^Kn|U~7IRVJV2`&Ht delta 38 tcmZ3fv{Gq9C!2tYu7RPhp`n6-g_V(kwt?a1nQR4&%w~E9n|U~7IRVJ92`&Ht diff --git a/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po index 3e9f9e3..4ccef2e 100644 --- a/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2015-04-08 20:59+0100\n" "Last-Translator: Jalal Maqdisi \n" "Language-Team: ar \n" @@ -123,11 +123,11 @@ msgstr "قيمة غير صالحة، يجب أن تكون اي من: %(values)s. #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "هذا الحقل مطلوب." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -146,23 +146,23 @@ msgstr "CSRF قد فشل." msgid "CSRF token expired." msgstr "انتهت صلاحية رمز CSRF." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "اختيار غير صالح: لا يمكن الاجبار." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "اختيار غير صحيح." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "اختيارات غير صالحة: واحدة او اكثر من الادخالات لا يمكن اجبارها." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.mo index 24c7fc50c72835cb4aacea19270fb700678986e8..33cb9fd887566926bc353dd7c74d21f2ec354865 100644 GIT binary patch delta 38 ucmca3cSmkRC!2t=uAzahfvJL_v6YFDwt>;+nQY>W%tm^Kn>VwsWCsA&Kni03 delta 38 ucmca3cSmkRC!2tYu7RPhp`n6-g_V(kwt?a1nQY>W%w~E9n>VwsWCsA&Dhgu& diff --git a/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po index 2398b87..a88b399 100644 --- a/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2017-02-16 11:59+0100\n" "Last-Translator: \n" "Language-Team: Vladimir Kolev \n" @@ -110,11 +110,11 @@ msgstr "Невалидна стойност, не може да бъде едн #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Това поле е задължително" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,25 +133,25 @@ msgstr "CSRF провален" msgid "CSRF token expired." msgstr "CSRF token изтече" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Невалиден избор: не може да бъде преобразувана" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Не е валиден избор" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Невалиден(и) избор(и): една или повече въведени данни не могат да бъдат " "преобразувани" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.mo index 678f0137239a2ce9a2c1d6e0ccb05598ca17a25a..f34b10eb384f7d16d574af8cf4fcc3590988dc66 100644 GIT binary patch delta 38 ucmaDU@ls+#C!2t=uAzahfvJL_v6YFDwt>;+nQShM%tm^Kn;)=uvH$?uvI?jG delta 38 ucmaDU@ls+#C!2tYu7RPhp`n6-g_V(kwt?a1nQShM%w~E9n;)=uvH$?uoC>G_ diff --git a/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po index 8389f77..0015e67 100644 --- a/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2014-01-16 09:58+0100\n" "Last-Translator: Òscar Vilaplana \n" "Language-Team: ca \n" @@ -110,11 +110,11 @@ msgstr "Valor no vàlid, no pot ser cap d'aquests: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Aquest camp és obligatori." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,24 +133,24 @@ msgstr "Ha fallat la comprovació de CSRF" msgid "CSRF token expired." msgstr "Token CSRF caducat" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Opció no vàlida" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Opció no acceptada" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Opció o opcions no vàlides: alguna de les entrades no s'ha pogut processar" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo index b2812bae9b0cdd2b414bb957356807fa06e52241..14684d379d6ec3834fe9227eb78a374a2da01d96 100644 GIT binary patch delta 38 ucmX>mbxdkQH=BU5uAzahfvJL_v6YFDwt>;+*=(VV%tm^Kn?JJ$vjPCp912+g delta 38 ucmX>mbxdkQH=BTou7RPhp`n6-g_V(kwt?a1*=(VV%w~E9n?JJ$vjPCp1`1gK diff --git a/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po index ffa6e3d..a0cfb6f 100644 --- a/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0.2dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Daniil Barabash \n" "Language-Team: cz \n" @@ -113,11 +113,11 @@ msgstr "Neplatná hodnota, nesmí být mezi: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Toto pole je povinné." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -136,23 +136,23 @@ msgstr "Chyba CSRF." msgid "CSRF token expired." msgstr "Hodnota CSRF tokenu." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Neplatná volba: nelze převést." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Neplatná volba." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Neplatná volba: jeden nebo více datových vstupů nemohou být převedeny." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.mo index 3df36bd021801a142c693a6e9e7454f8109369fe..cfd16c32778373814430d91ee39737016b06b3eb 100644 GIT binary patch delta 38 ucmX>maZF-EC!2t=uAzahfvJL_v6YFDwt>;+nQVHD%tm^Kn@_RVumAwhFbXLE delta 38 ucmX>maZF-EC!2tYu7RPhp`n6-g_V(kwt?a1nQVHD%w~E9n@_RVumAwh8VV@@ diff --git a/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po index ce6b802..a13c8a0 100644 --- a/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2015-01-29 14:07+0000\n" "Last-Translator: Josh Rowe josh.rowe@digital.justice.gov.uk\n" "Language-Team: cy \n" @@ -110,11 +110,11 @@ msgstr "Gwerth annilys, ni all fod yn un o'r canlynol: %(values)s" #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Rhaid cwblhau'r maes hwn." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,24 +133,24 @@ msgstr "CSRF wedi methu" msgid "CSRF token expired." msgstr "Tocyn CSRF wedi dod i ben" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Dewis annilys: ddim yn bosib gweithredu" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Nid yw hwn yn ddewis dilys" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Dewis(iadau) annilys: ddim yn bosib gweithredu un neu ragor o fewnbynnau data" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.mo index 0e762fb7cae77a6720f850d9aefae80ac85bfc28..69fa09b68f8de83fd9a6db837e71d15f72d0740c 100644 GIT binary patch delta 38 ucmaDZ@myj<2b+MguAzahfvJL_v6YFDwt>;+8Eoo|%tm^Kn-8%sWdQ)#aSDR~ delta 38 ucmaDZ@myj<2b+M2u7RPhp`n6-g_V(kwt?a18Eoo|%w~E9n-8%sWdQ)#TMB~! diff --git a/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po index ef530ad..f83ed2a 100644 --- a/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.4\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2013-05-13 19:27+0100\n" "Last-Translator: Chris Buergi \n" "Language-Team: de \n" @@ -110,11 +110,11 @@ msgstr "Ungültiger Wert. Wert kann keiner von folgenden sein: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Dieses Feld wird benötigt." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,25 +133,25 @@ msgstr "CSRF fehlgeschlagen." msgid "CSRF token expired." msgstr "CSRF-Code verfallen." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Ungültige Auswahl: Konnte nicht umwandeln." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Keine gültige Auswahl." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Ungültige Auswahl: Einer oder mehrere Eingaben konnten nicht umgewandelt " "werden." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo index af06d6f819a9a6470079d8e10779d50bee538554..9abf433cc91e596a7d9259a4da6eee0f707a1aeb 100644 GIT binary patch delta 38 ucmaDT@lawz2b+MguAzahfvJL_v6YFDwt>;+8Em?Y%tm^Kn@_OMWB~xy_X>9a delta 38 ucmaDT@lawz2b+M2u7RPhp`n6-g_V(kwt?a18Em?Y%w~E9n@_OMWB~xy;R<&E diff --git a/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po index 323f32c..a09f7e5 100644 --- a/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.4\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2013-05-13 19:27+0100\n" "Last-Translator: Chris Buergi \n" "Language-Team: de_CH \n" @@ -110,11 +110,11 @@ msgstr "Ungültiger Wert. Wert kann keiner von folgenden sein: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Dieses Feld wird benötigt." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,25 +133,25 @@ msgstr "CSRF fehlgeschlagen" msgid "CSRF token expired." msgstr "CSRF-Code verfallen" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Ungültige Auswahl: Konnte nicht umwandeln" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Keine gültige Auswahl" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Ungültige Auswahl: Einer oder mehrere Eingaben konnten nicht umgewandelt " "werden." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.mo index 155d06bff83bb6565da64fa5dd81e1d92deb5e2c..6c77216898e2fb529e62b9470f6ee47fa1485451 100644 GIT binary patch delta 38 ucmaDa_g-#8C!2t=uAzahfvJL_v6YFDwt>;+nQU5&%tm^Kn~$-tWCsA;+X}A$ delta 38 ucmaDa_g-#8C!2tYu7RPhp`n6-g_V(kwt?a1nQU5&%w~E9n~$-tWCsA;#R{(g diff --git a/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po index d3035c9..06d5587 100644 --- a/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2014-04-04 20:18+0300\n" "Last-Translator: Daniel Dourvaris \n" "Language-Team: el \n" @@ -110,11 +110,11 @@ msgstr "Λάθος επιλογή, δεν μπορεί να είναι ένα α #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Αυτό το πεδίο είναι υποχρεωτικό" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "Αποτυχία CSRF" msgid "CSRF token expired." msgstr "Έχει λήξει το διακριτικό CSRF" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Λανθασμένη Επιλογή: δεν μετατρέπεται" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Άγνωστη επιλογή" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Λανθασμένη επιλογή(ές): κάποιες τιμές δεν μπορούσαν να μετατραπούν" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.mo index e3658164a34d57697c985a034ee330acf93fcbc4..2e8a0b13d00e186354e4e2ff30757a6b8cf00ad1 100644 GIT binary patch delta 22 dcmew@`CD>BDF=&@o*~y}8>RrJ%_q5xm;hX62J!#^ delta 22 dcmew@`CD>BDF=(0o&ncp8>RrJ%_q5xm;hXo2K4{{ diff --git a/venv/Lib/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.mo index c67cbf1e6b6fec8e8e513bc2746a644858381d93..6f19672dd90d91a7ee4919ec8e4ea21e29f8759b 100644 GIT binary patch delta 445 zcmXZYJxfAi7{>A2-b_u62=cvW3c`+_bIdXkTx@D6^aGUTflgTlN<)iLLwoiGB8X@T zq{bGvmLU89H8cjzP5lo#{hsULeu4Wj@sN00au@ZX9c+YRk$iQ#S{7 zE6OzThS7~qW?iFZ%IH=+7vnKmZ?-J8S3NpuD684(-Kv_^+^_E1b-UI14a7TvVC)}d CQ9zjh delta 450 zcmXZYze_?<6u|ML75>(Up!|_N8iKH=_esx6i3qAKDxo=E_5uYnP#jtWp`qDmZwRC* zaHuf|w;*V!y@p2rfrh>hUGC?e%lW~%-Q+{^aoN>Mh=}G9$>0XgU=`n8B3D=;KJtkK z@C9S|hST_q^Z180Cj27D*v3`-#uUaVws04nd0kw>en46>%Voer6um)_FfL#O4J_go zPT~zZ1Mf$1A5G#<)G-(mnZi6eefQ8=>uNUoRxn8cF>)Tet z&TCnf9p;&uTF\n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.1-dev\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -110,12 +110,12 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Valor inválido, no puede ser ninguno de: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Este campo no se puede editar." +msgid "This field cannot be edited" +msgstr "Este campo no se puede editar" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Este campo está desactivado y no puede tener un valor." +msgid "This field is disabled and cannot have a value" +msgstr "Este campo está deshabilitado y no puede tener un valor" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -133,25 +133,25 @@ msgstr "Fallo CSRF." msgid "CSRF token expired." msgstr "El token CSRF ha expirado." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Elección inválida: no se puede ajustar." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "La elección no puede ser None." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Opción inválida." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Opción(es) inválida(s): una o más entradas de datos no pueden ser " "coaccionadas." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, python-format msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.mo index 5793358a026a83dc09f3143f6d7a727465ff4675..d85f925c9d53ff918c7177800eba08603e85bbe0 100644 GIT binary patch delta 38 tcmZpYY?9p2%_d;1YiOWrV5(qfY-M7kZD6!{Hk&>pvyq0Hk&>pvzea3=CkZuSpdAB3FH6( diff --git a/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po index 8241a60..7d5ff0e 100644 --- a/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.6dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2013-09-22 12:37+0300\n" "Last-Translator: Laur Mõtus \n" "Language-Team: Estonian \n" @@ -110,11 +110,11 @@ msgstr "Vigane väärtus, ei tohi olla ükski järgnevatest: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Kohustuslik väli." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF nurjus" msgid "CSRF token expired." msgstr "CSRF tunnus on aegunud" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Vigane valik: ei saa teisendada" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Pole korrektne valik" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Vigane valik: ühte või rohkemat andmesisendit ei saa teisendada" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.mo index 319928b92172e73f46c9d4de08d2ac93b9b85007..1acf6ef1dbadc33fad0998c91232b90a1c919412 100644 GIT binary patch delta 44 zcmca2dqs9b2b+MguAzahfvJL_v6YFDwt>;+8EgWKtVVi\n" "Language-Team: fa \n" @@ -109,11 +109,11 @@ msgstr "ورودی اشتباه است. نباید یکی از %(values)s باش #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "این فیلد اجباریست." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -132,23 +132,23 @@ msgstr "کلید امنیتی با خطا مواجه شد." msgid "CSRF token expired." msgstr "زمان استفاده از کلید امنیتی به اتمام رسیده است." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "انتخاب شما اشتباه است. ورودی قابل بررسی نیست." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "انتخاب درستی نیست." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "انتخاب شما اشتباه است. یک یا چند تا از ورودی ها قابل بررسی نیست." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.mo index 8286dffbbe009eeaeb47e33a0316c6aa83b803d3..3b62bc432727e8e57d0a63539fbaaeeaa2a8612a 100644 GIT binary patch delta 38 ucmca0aY153C!2t=uAzahfvJL_v6YFDwt>;+nQS_Y%tm^Kn@_NJumAwk4hls8 delta 38 ucmca0aY153C!2tYu7RPhp`n6-g_V(kwt?a1nQS_Y%w~E9n@_NJumAwj_zFb; diff --git a/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po index 2e8c0e5..0bea31b 100644 --- a/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2016-06-13 15:16+0300\n" "Last-Translator: Teijo Mursu \n" "Language-Team: fi \n" @@ -110,11 +110,11 @@ msgstr "Epäkelpo arvo, ei voi olla yksi seuraavista: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Pakollinen." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF epäonnistui" msgid "CSRF token expired." msgstr "CSRF-tunnus vanhentunut" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Virheellinen valinta: ei voida muuntaa" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Virheellinen valinta" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Virheellinen valinta: Yksi tai useampaa syötettä ei voitu muuntaa" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.mo index 3887789d8eabbe6c52b89ced3e5489f4d1e6b7b0..389e4b8e250b77cf224414a828c51b1eaba0f6bd 100644 GIT binary patch delta 435 zcmXZYxk>|36vpv0F2uwvq7p?-xFU#>%s4Yygb=XMMvG{yti&J_G8oq^m5@TkTJi!u zfP#>RNM(~kEPMb9E78Kv|7fb;{m!{?&b>eJ@Ay+vYt4#?@`)Ij$0OS5gKLm1~zdE zZ*d-bxPV_cj?*C#8xwu^afW=?_W>2Ti;MVd+-TCbn_$NtfwTHa~Y iE0(L>|9h^k=yH(lb&N>4sDo\n" "Language-Team: French \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.1-dev\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -112,12 +112,12 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Valeur non valide, ne peut contenir : %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Ce champ n’est pas éditable." +msgid "This field cannot be edited" +msgstr "Ce champ n’est pas éditable" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Ce champ est désactivé et ne peut avoir de valeur." +msgid "This field is disabled and cannot have a value" +msgstr "Ce champ est désactivé et ne peut avoir de valeur" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -135,24 +135,24 @@ msgstr "CSRF a échoué." msgid "CSRF token expired." msgstr "Jeton CSRF expiré." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Choix non valide, ne peut pas être converti." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Vous devez choisir au moins un élément." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "N'est pas un choix valide." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Choix incorrect, une ou plusieurs saisies ne peuvent pas être converties." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, python-format msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.mo index 252f8dcaa7e1e3c6c199a4fcc5bbd46be42e9e55..b16091cb44a80004dd3a4f30c237a8ae359e9e67 100644 GIT binary patch delta 38 tcmX>oc~EjgIGcd6uAzahfvJL_v6YFDwt>;+bT&msW+Oer&E4!~tN_CF2`m5r delta 38 tcmX>oc~EjgIGccpu7RPhp`n6-g_V(kwt?a1bT&msW-~p5&E4!~tN_B^2`m5r diff --git a/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po index 91c19d5..a96f927 100644 --- a/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2017-04-19 00:41+0300\n" "Last-Translator: Tomer Levy \n" "Language-Team: he \n" @@ -110,11 +110,11 @@ msgstr "ערך לא חוקי, לא יכול להיות מתוך: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "חובה למלא שדה זה." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF נכשל" msgid "CSRF token expired." msgstr "מזהה CSRF פג תוקף" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "לא בחירה חוקית" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "בחירה\\ות לא תקינה: לא ניתן לכפות סוג על קלט אחד או יותר" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.mo index d8bdfe295a8971aaa565e4de1cfffe2df75cb5ee..40ddc569a72e67041682ace4bc34d7422f1b5cb9 100644 GIT binary patch delta 38 ucmX>td0KKqC!2t=uAzahfvJL_v6YFDwt>;+nQWSj%tm^Kn~$=yu>t_kvtd0KKqC!2tYu7RPhp`n6-g_V(kwt?a1nQWSj%w~E9n~$=yu>t_ko(Z-9 diff --git a/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po index f914302..577d703 100644 --- a/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2016-09-27 13:09-0400\n" "Last-Translator: Zoltan Fedor \n" "Language-Team: Hungarian <>\n" @@ -110,11 +110,11 @@ msgstr "Érvénytelen adat, a következőek egyike sem lehet: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Ez a mező kötelező." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF hiba" msgid "CSRF token expired." msgstr "Lejárt CSRF token" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Érvénytelen választás: adat nem használható" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Érvénytelen érték" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Érvénytelen választás: egy vagy több adat elem nem használható" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.mo index e7b83f3e94f9ab51aef0216158e3f4a42c0934e8..2095cfd6cad93a92733147b38e7da8ccbdc05d9f 100644 GIT binary patch delta 37 tcmdlWxj}M6C!2t=uAzahfvJL_v6YFDwt>;)nQY&fjr0sRPhyv21pvlD3K0MR delta 37 tcmdlWxj}M6C!2tYu7RPhp`n6-g_V(kwt?Z~nQY&f&GZa5Phyv21pvk_3K0MR diff --git a/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po index 33d9d31..8d2c783 100644 --- a/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2017-03-01 11:53+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -111,11 +111,11 @@ msgstr "Valore non valido, non può essere nessuno tra: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Questo campo è obbligatorio." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -134,24 +134,24 @@ msgstr "CSRF fallito" msgid "CSRF token expired." msgstr "Token CSRF scaduto" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Opzione non valida: valore non convertibile" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Non è una opzione valida" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Opzione(i) non valida(e): uno o pù valori non possono essere convertiti" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.mo index 5f04957babd6506dd52d3f06139726ebc3bc2a5c..91df7aabbf6a24f5825363ae93eb147c43450e2a 100644 GIT binary patch delta 38 ucmbO!JyUwaMm7OsT|)z115*V$O-_\n" "Language-Team: ja \n" @@ -107,11 +107,11 @@ msgstr "無効な値です、次に含まれるものは使えません: %(value #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "このフィールドは必須です。" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -130,23 +130,23 @@ msgstr "CSRF認証に失敗しました。" msgid "CSRF token expired." msgstr "CSRFトークンの期限が切れました。" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "無効な選択: 型変換できません。" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "選択肢が正しくありません。" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "無効な選択: 1つ以上の値を型変換できません。" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.mo deleted file mode 100644 index 5329f6e45bf21afbee4a3315a565e33f13bac535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4921 zcmc(hU2GIp6vqcei1iykAZqlY*0#WIw*{pxln@GN1EozVC<#$#ckgb;&d$`C+0v4j zv?Uk}A%+;%kouy$z*F1MQs@`)(YHHWpNzryV0`mJ`LW<@(*w$#_Jwbl=s1xvit-L zWBeodI=FGIqMQWxfV6%L+zgIq$1eB`#=n5H&!6C9;QEIYWiR+F_#Ai~+yo}U$H7m* zt>7ha3-~Qa`hNq-E@hpfyZ~$hp9gn@dmq&X*M%Vhp7xRT8u?|O)bh<+_ad}i*Ip_>#<~h`B!XCK5g&vf^r3RC744}i?c309c#)Pt?4ckAmE4>RSeQl4 z6aqvsi<;buB4oZqdlyq5V zFs3>x(~SO zco+_rUu+72zg1S&PbO(^iRh8CdJ8Irb2t~La!kRErSpykV=H~*Q7wt&sPHMSn@H&j zA2h?^R7Mp(Roe!c+n1A1B_mkvpR}ZG;F2R{0!h;=D->+`_u|5^S-vnJ+mmZX1#N)G zG>2MA!AG>Lm}aXHv>mA++ev!W0q*rUa%!=>g|hNmQkP|Z#G_82Jr+35En72 zplKy-wmldMhHAQbziByv4m+X60{c=4JJ4f>8P`oMXlVng729j1BDxxkTQyysJ%Kih zs}9rz_9LWW)*Ncy5ePK}nwnUsCEOg^8fprKAQ09!S*jk8&I&W5Uk>fo=3UJDx7A>qTUpbtnvV9419|s0!KrN~64AifhWcTf!v~$l zeqGg!U9zX!+-XfY@jy#nj(ia3R^WgUHF4%dn6*SSr{-;La0}KVGDGB@2-jJ2u<1=~ zQFMWc$;_mfV@ucEVK?oLu*|r7&P|I2CT@rccUVk_c`@alXYQz&$XpRqm^{P8G-jvW zk>b1XepHD$+ND6DY^?6c(q(tl9f2V;3<95L#%O;C!<6g|iit%r3riNrTsNJ$!lY5d zVg?iQZh9pP>6D9^F(xLVY|cF|ZsVYtNq0D?h;Q--_N|;>x=dR!amhU=7GUGBJ0hmD ztFb$L>39HVF1+qW$1!TnR(lu-be@=_*bO`z{cS&WPJt-!9%l?18 z6!Qx9%16OJvG>2x>pv*O4GLKm*UJ1xmdU`})7Qd}e({4NS2~n+6iI{((I1wfy|wE2 zO~Kx|e5) z%`6paL8+JN!}AChOu-J>TgtxEQ)yWNJevvx+;jz-y~k9U>cXScd*zM?mKRAz2_$=q zSL`ynm_iRg?W1nVV4QB0{-g6Pi0e4&44Q#F@clW%y&&d-OxzZWXvk=O_c|Co+H$!F zVOm4&DDQ)8WD5<wqk&Z}2zn=Zz7CNI?kX**xGq@1OaPHBSEM26Qj%JU$Meb8E z@8vGiqjRL0+(@?&UBa?JBv_ZhNU%!F6AIR#LK8xhL#O z@r2X;mDO*=+vQ~f%`$P5{>WE{SK4zj__rt{;F1!>^qi6APs1{@4Ud#@?~0Li>NTLC F@;9&)%jW<9 diff --git a/venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.po deleted file mode 100644 index ce09e44..0000000 --- a/venv/Lib/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.po +++ /dev/null @@ -1,187 +0,0 @@ -# Translations template for WTForms. -# Copyright (C) 2024 WTForms Team -# This file is distributed under the same license as the WTForms project. -# FIRST AUTHOR , 2024. -# -msgid "" -msgstr "" -"Project-Id-Version: WTForms 3.0.0\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-03-11 07:01+0000\n" -"Last-Translator: Baurzhan Muftakhidinov \n" -"Language-Team: Kazakh \n" -"Language: kk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" -"Generated-By: Babel 2.12.1\n" - -#: src/wtforms/validators.py:86 -#, python-format -msgid "Invalid field name '%s'." -msgstr "Жарамсыз '%s' өріс атауы." - -#: src/wtforms/validators.py:99 -#, python-format -msgid "Field must be equal to %(other_name)s." -msgstr "Өріс мәні %(other_name)s өрісімен бірдей болуы тиіс." - -#: src/wtforms/validators.py:145 -#, python-format -msgid "Field must be at least %(min)d character long." -msgid_plural "Field must be at least %(min)d characters long." -msgstr[0] "Өріс ұзындығы кем дегенде %(min)d таңба болуы тиіс." -msgstr[1] "Өріс ұзындығы кем дегенде %(min)d таңба болуы тиіс." - -#: src/wtforms/validators.py:151 -#, python-format -msgid "Field cannot be longer than %(max)d character." -msgid_plural "Field cannot be longer than %(max)d characters." -msgstr[0] "Өріс ұзындығы көп дегенде %(max)d таңба болуы тиіс." -msgstr[1] "Өріс ұзындығы көп дегенде %(max)d таңба болуы тиіс." - -#: src/wtforms/validators.py:157 -#, python-format -msgid "Field must be exactly %(max)d character long." -msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "Өріс ұзындығы дәл %(max)d таңба болуы тиіс." -msgstr[1] "Өріс ұзындығы дәл %(max)d таңба болуы тиіс." - -#: src/wtforms/validators.py:163 -#, python-format -msgid "Field must be between %(min)d and %(max)d characters long." -msgstr "Өріс ұзындығы %(min)d және %(max)d таңба арасында болуы тиіс." - -#: src/wtforms/validators.py:216 -#, python-format -msgid "Number must be at least %(min)s." -msgstr "Сан кем дегенде %(min)s болуы тиіс." - -#: src/wtforms/validators.py:219 -#, python-format -msgid "Number must be at most %(max)s." -msgstr "Сан көп дегенде %(max)s болуы тиіс." - -#: src/wtforms/validators.py:222 -#, python-format -msgid "Number must be between %(min)s and %(max)s." -msgstr "Сан %(min)s және %(max)s аралығында болуы тиіс." - -#: src/wtforms/validators.py:293 src/wtforms/validators.py:323 -msgid "This field is required." -msgstr "Бұл өріс міндетті түрде керек." - -#: src/wtforms/validators.py:358 -msgid "Invalid input." -msgstr "Жарасыз енгізу." - -#: src/wtforms/validators.py:422 -msgid "Invalid email address." -msgstr "Жарамсыз эл. пошта адресі." - -#: src/wtforms/validators.py:460 -msgid "Invalid IP address." -msgstr "Жарамсыз IP адрес." - -#: src/wtforms/validators.py:503 -msgid "Invalid Mac address." -msgstr "Жарамсыз Mac адрес." - -#: src/wtforms/validators.py:540 -msgid "Invalid URL." -msgstr "Жарамсыз URL адресі." - -#: src/wtforms/validators.py:561 -msgid "Invalid UUID." -msgstr "Жарамсыз UUID." - -#: src/wtforms/validators.py:594 -#, python-format -msgid "Invalid value, must be one of: %(values)s." -msgstr "Жарамсыз мән, келесінің біреуі болуы тиіс: %(values)s." - -#: src/wtforms/validators.py:629 -#, python-format -msgid "Invalid value, can't be any of: %(values)s." -msgstr "Жарамсыз мән, келесінің ешқайсысы болмауы тиіс: %(values)s." - -#: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Бұл өрісті өңдеу мүмкін емес." - -#: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Бұл өріс сөндірілген және мәнге ие бола алмайды." - -#: src/wtforms/csrf/core.py:96 -msgid "Invalid CSRF Token." -msgstr "Жарамсыз CSRF токені." - -#: src/wtforms/csrf/session.py:63 -msgid "CSRF token missing." -msgstr "CSRF токені жоқ болып тұр." - -#: src/wtforms/csrf/session.py:71 -msgid "CSRF failed." -msgstr "CSRF сәтсіз аяқталды." - -#: src/wtforms/csrf/session.py:76 -msgid "CSRF token expired." -msgstr "CSRF токенінің мерзімі аяқталды." - -#: src/wtforms/fields/choices.py:142 -msgid "Invalid Choice: could not coerce." -msgstr "Жарамсыз таңдау: Мәнін келтіру мүмкін емес." - -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 -msgid "Choices cannot be None." -msgstr "Таңдаулар мәні Ешнәрсе болмауы тиіс." - -#: src/wtforms/fields/choices.py:155 -msgid "Not a valid choice." -msgstr "Жарамды таңдау емес." - -#: src/wtforms/fields/choices.py:193 -msgid "Invalid choice(s): one or more data inputs could not be coerced." -msgstr "" -"Жарамсыз таңдау(лар): бір немесе бірнеше деректер енгізуін келтіру мүмкін " -"емес." - -#: src/wtforms/fields/choices.py:214 -#, python-format -msgid "'%(value)s' is not a valid choice for this field." -msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "'%(value)s' бұл өріс үшін жарамды таңдау емес." -msgstr[1] "'%(value)s' бұл өріс үшін жарамды таңдаулар емес." - -#: src/wtforms/fields/datetime.py:51 -msgid "Not a valid datetime value." -msgstr "Жарамды күн мен уақыт мәні емес." - -#: src/wtforms/fields/datetime.py:77 -msgid "Not a valid date value." -msgstr "Жарамды күн мәні емес." - -#: src/wtforms/fields/datetime.py:103 -msgid "Not a valid time value." -msgstr "Жарамды уақыт мәні емес." - -#: src/wtforms/fields/datetime.py:148 -msgid "Not a valid week value." -msgstr "Жарамды апта мәні емес." - -#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 -msgid "Not a valid integer value." -msgstr "Жарамды бүтін сан мәні емес." - -#: src/wtforms/fields/numeric.py:168 -msgid "Not a valid decimal value." -msgstr "Жарамды ондық мән емес." - -#: src/wtforms/fields/numeric.py:197 -msgid "Not a valid float value." -msgstr "Жарамды қалқымалы үтірлі сан мәні емес." diff --git a/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.mo index 36a50477c1f2cb984fc581d106b92e4fb1d4f90b..340c9f7970517f910a2962190ffeb5da084d2240 100644 GIT binary patch delta 762 zcmZ9|-%C?r9LMoTxAeF*rCM#+s-va-urtot+*qfAEjKdEer%8zNo6KBYC8DC z_3jzLXk&($JL+WmH}=*Gv6iUe1~eUyVSs!d&){{(PiT@8E+IN`3x`>}*E ze2TmA8}?9N_&l|XPC8DaY|$LH<2;_m?-<5IULm4bLivD)IDiY7!w%Xg_a|`|&N;qz z{OO#BXtORqNVAX@up4iqEc6Bs;xF8a3Hn}rU;ox+zi7B>Uu(?xGX1F|N0X^^I-AMm z><^8BL{u|$O^>NY)a;IQ=@DJ`oH(v!N3P_@@>Wqx4~>tQYD71pnjX=Nn5yfh!FT&? zRq?kTo+u7jmfCaC%Bu(Bv3PuRqL>^l4COD|y-IuVl6AH(``AJ>Bxi{_RoL{g}DAT)DG+@7B^(Woha`So{G8R&?J0 delta 1297 zcmaLUUr19?90%}YnzQvsO;fX|W1!P)+ugL#^>5H$h%oHmgB9Fu$98kumEG$WL~Pg! zNhsPrr-b3E#2V4wI^9gaoWv~h!f;BJ*m%wwd87ARcI0<*l>IES*(2%2EPe8PFhqcM#>b6#^ z;IKLzRA_TKg=WDa2lipy^I%L<=7%FtP5HaUFU-W!%rFt4iEqbgPr zoUuo?YbQ-tV;gLOdG;Rl^H-=ba^Dz=(~tLtjFC9iAI9~E31cKdjZ`9&ybscu>$ft= z6g3j*%$X5{Q{(D6%RtZ2D(KT^swW=y*lRs{$=*t{VTgAYE8H zGsEZvCcT`EPbT!iA??EAd*umTOYzQ`3y+MOmomw;mMU2;{Ju5%?-g9UX*-vc{{m{}UgiJ* diff --git a/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po index ca0064f..a8b301c 100644 --- a/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po @@ -6,18 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.3\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-09-29 13:15+0000\n" -"Last-Translator: simmon \n" -"Language-Team: Korean \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2013-02-15 00:12+0900\n" +"Last-Translator: GunWoo Choi <6566gun@gmail.com>\n" +"Language-Team: ko_KR <6566gun@gmail.com>\n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8-dev\n" +"Plural-Forms: nplurals=1; plural=0\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -46,7 +44,7 @@ msgstr[0] "이 항목은 %(max)d자 보다 많을 수 없습니다." #, python-format msgid "Field must be exactly %(max)d character long." msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "이 항목은 정확히 %(max)d자이어야 합니다." +msgstr[0] "이 항목은 정확히 %(max)d자이어야 합니다" #: src/wtforms/validators.py:163 #, python-format @@ -107,12 +105,14 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "올바르지 않은 값입니다, 다음 값은 사용할 수 없습니다: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "이 필드는 편집할 수 없습니다." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "이 항목은 필수입니다." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "이 필드는 사용할 수 없으므로 값을 가질 수 없습니다." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -130,30 +130,28 @@ msgstr "CSRF 인증에 실패하였습니다." msgid "CSRF token expired." msgstr "CSRF 토큰이 만료되었습니다." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "올바르지 않은 선택값입니다: 변환할 수 없습니다." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "선택값이 None일 수 없습니다." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "올바르지 않은 선택값입니다." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "올바르지 않은 선택값입니다: 한개 이상의 값을 변화할 수 없습니다." -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "" -"'%(value)s'는 이와 같은 부분을 위해 유효한 선택이 없습니다.\n" -"\n" -"'%(value)s'는 이와 같은 부분을 위해 유효한 선택들이 없습니다." +msgstr[0] "'%(value)s'는 이 항목에 유효하지 않은 선택 값입니다." #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." @@ -168,8 +166,10 @@ msgid "Not a valid time value." msgstr "올바르지 않은 시간 값입니다." #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "유효한 주 값이 아닙니다." +msgstr "올바르지 않은 날짜 값입니다." #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." diff --git a/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.mo index 71b8e25dbac3f1d055543d25898d54e63f479b71..bb7c89e273d5b20342caf4eab8a0cc525ffb613f 100644 GIT binary patch delta 38 tcmeB>=#bdZ$tGZ|YiOWrV5(qfY-M7kZD6!{CYur?vyq=#bdZ$tGZ;Yhb8rXsBRdVP#~XZD6>0CYur?vzea3=6&p5EC9R~31a{N diff --git a/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po index 8e687cc..2f53eb7 100644 --- a/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2014-05-05 16:18+0100\n" "Last-Translator: Frode Danielsen \n" "Language-Team: nb \n" @@ -110,11 +110,11 @@ msgstr "Ugyldig verdi, den kan ikke være en av følgende: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Dette feltet er påkrevd." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF-sjekk feilet" msgid "CSRF token expired." msgstr "Utløpt CSRF-pollett" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Ugyldig valg: Kunne ikke oversette" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Ikke et gyldig valg" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Ugyldig(e) valg: En eller flere dataverdier kunne ikke oversettes" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.mo index cda6255bc3abfdcc4cb8cc30f2c8d3830966e7b5..c80e7635ef60d26fa5f59ee7aa6b8bcfc94ceb2a 100644 GIT binary patch delta 804 zcmajc&ubGw6u|MZN$WOETdl3FKN>eEVvQSi)3nB*kYHjfRt>F)N-S>MMS>x<$@-&3 z2;TITvU>3-cv29I;6LD{;Gq`}dQcE=UfNSH9{fJDP;V|QpLuU*=FPl)HvDQ|{aat~ zx#EfP9^^f;L!#~HM4M7!LId|;+V>I;63^i*uK0ezG;u1R)KRQq5nrIJ-$JR?75p35 zmBFB&L>8scRqV!j%-|C4#dkP_YuJN7Fov6W9EaOm1tw7rR>TA7;(lzPtbgstA8}CC zmHN&==ff5r!l91V#wnDI7VraId4#)&lUggE#{uG-D4na}Eo`84WD`?Z=u~P1pW-!a zqFgu}B2Rr4WzdHgP+ByLa>FY2;$xh|Rg{8XF@hVo8+*HyI*C!=>nI0Z^?ix5u8Go# zHI$3}L{kdA(D&h;IfB;yIKPH?XTW7@f2s{K39N*bnRSmU~R zDm^wHGc7Nw^~ZCi>K*+?$#tD-&2^S5`soES@s;gN=B~Y5Uc6nJk309gf)>#$<^N22 sqaD_cRrKf?-5T*eYqek^ZiSj}JAVb*Cmh!hw^n*8Pe_C1@!aMXIGzYw;lBWHZf9v)PsXNTg6A zh$84MdeG9NXN7_%FP?horKq4H-n@wg@gxZTUtOxzK=|$3oj32zo2R=T?yG-l-|&dx z*NgvN{PXK5`tx(wGiD>Kzzkf1+u^6gZ?F?_OA}+)V0YpS%pv{=55Ue1j9rC;kn(3? z4`X%qEP1g6JMiH%q(VPnD@-*rHUxLTop1tn!3x|0@4|lg2p)#7AQkumsWH~V*dEXY zcf$cl`J*dwoiPUwwD5M~EaZsi;ePlAQi1P~Cd5;W8SoUOyb4^v)b79n;*m{^ZG+Dt zeSZaa!1s{ym*I7oNn>KD&nkF00TU}vK@ZXiJ}`}&M+K5q@&g(T8*Uc2PFd= zO-VZnjar1+RsQI?#$fuQ8wbK|JWlOt@p#WEZZ%$}!um1YOs}~M%u7m-`(6pxq)L*P zWjrl;)yHjMy1e?|?M!#hKtHo*p^G~X+ z-0$AZ%y3zF+*2~*H6I^6Ty#wa\n" -"Language-Team: Dutch \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2014-01-16 09:56+0100\n" +"Last-Translator: Dirk Zittersteyn \n" +"Language-Team: nl \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -110,12 +108,14 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Ongeldige waarde, kan geen waarde zijn uit: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Dit veld kan niet worden bewerkt." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "Dit veld is vereist." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Dit veld is uitgeschakeld en kan geen waarde hebben." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -133,29 +133,30 @@ msgstr "CSRF is gefaald." msgid "CSRF token expired." msgstr "CSRF-token is verlopen." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Ongeldige keuze: kon niet omgezet worden." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Keuzes mogen niet None zijn." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Ongeldige keuze." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Ongeldige keuze(s): een of meer van de invoeren kon niet omgezet worden." -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." msgstr[0] "'%(value)s' is een ongeldige keuze voor dit veld." -msgstr[1] "'%(value)s' zijn ongeldige keuzes voor dit veld." +msgstr[1] "'%(value)s' is een ongeldige keuze voor dit veld." #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." @@ -170,8 +171,10 @@ msgid "Not a valid time value." msgstr "Ongeldige waarde." #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Ongeldige waarde voor week." +msgstr "Ongeldige datum." #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." diff --git a/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.mo index 622f4c906390f2cadb2be16c7f1afc95e7f3be5d..72da9e205feaeb9d1a736a72c0c7c1167d99706f 100644 GIT binary patch delta 38 tcmaDN^+akz8=HW!uAzahfvJL_v6YFDwt>;+X>2)+%tm^Kn^`&HSpnBV3BdpW delta 38 tcmaDN^+akz8=HWMu7RPhp`n6-g_V(kwt?a1X>2)+%w~E9n^`&HSpnB93BdpW diff --git a/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po index d14a157..572d5e0 100644 --- a/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: 2012-05-05 23:20+0200\n" "Last-Translator: Aleksander Nitecki \n" "Language-Team: pl \n" @@ -114,11 +114,11 @@ msgstr "Wartość nie może być żadną z: %(values)s." #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "To pole jest wymagane." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -137,24 +137,24 @@ msgstr "błąd CSRF" msgid "CSRF token expired." msgstr "Wygasł token CSRF" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Nieprawidłowy wybór: nie można skonwertować" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Nieprawidłowy wybór" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Nieprawidłowy wybór: nie można skonwertować przynajmniej jednej wartości" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.mo index 42dfea02dcc42a4670bc86e115240a058ae552d2..dc1e902db69e8f94a14e8d48f1497c16deebc47e 100644 GIT binary patch delta 762 zcmZ9}&ubGw7{>8Q6Prz%q@hNwsiqs1P@8Vt-NXcAlvLA-pcqm?4^@dF+JH?;lSc8< zixgI^&so)uB z9AHFTD*b%|140CdLEMc|#}r;CpK*MKd9}?gL;_CYJl;gL?+wQBvy*>eM2J=4^YjbE zFvx-=7V!k`#rrslk1>R6n8a5&iQiEb2=5YNA0ELmEMOF`qT1hf@*~vAFL9ju;sX

    LkxF z!VvYv4wGRF`h_@$2QiFwRKKK)BPg+eFEEGSocCix{fnnied1ZvaRE(y=;YU!B!9(8 z^wM2;iiyocb#?>g$AN4w=Dy{Y>w|aYJ@4%N%*E;R7mCxRQe|dt&R@QC**LpguXY-( zrctVP>UrHZ?X+Q;hIw4K()o;?G;Pylp;4)K8|{DBSsBB$3@fW!W-j-Li#Qvque{UD7jXSAYYf-+{4r>!lJ$_2Jj>?}}+heCJ lzx?9M^^W;XmptvcCf^V3^xg#$E|)I1f`?=|^g!yvk>86caLoV! delta 1486 zcmZwF+iO%u90%~(nBC28Y^%{+P;1AC@sjM>vrAa*Hjyps1+zvH_`&K6H?_2rWgS^hrzlP#-maLBN8b2nq!s3W60MghIcQ-CVpZET1!T<~P6J z{O0`I_s7=8ldksb1iu~lZ^8dS#Ee#c)iy%P7}~Kdhla-6%NAd za1Xo(O@e=*DU8Gj*$n#NCO8aD{Mh2SK}ZD;X5p2VHz37$4t@q7K$GAVG##RGLeg*) znm7+WLf5{9moR3D<^di-bD-zY6!ahb6s}Ja;=?p7AwT&E55q9hNysjkgC%$lcEkJ7 zf)C+hN6;SAiEd~*Fa$q=U%&RQ}Dx5m06QPa(rweRSY;&uJBU_nBsYwwX?%1JCn*}sJ$%+m)?9d98OR@6(V7(B}ZTWI(WixS2IGjozG;cTBk&SE`YbK)(#|0_8;uo1> z9`}_#-_fi0cO>+kj$~r>Y)^7RT;M(}o;ZF;uTO5!zbBqXthw)!0}*|@~ diff --git a/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po index ab66d24..aed1d2e 100644 --- a/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po @@ -6,24 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 2.0dev\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-06-17 21:09+0000\n" -"Last-Translator: Josimar Gabriel \n" -"Language-Team: Portuguese \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2014-01-16 10:36+0100\n" +"Last-Translator: Rui Pacheco \n" +"Language-Team: pt \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 #, python-format msgid "Invalid field name '%s'." -msgstr "Nome do campo inválido '%s'." +msgstr "Nome do campo inválido '%s'" #: src/wtforms/validators.py:99 #, python-format @@ -48,8 +46,8 @@ msgstr[1] "Os campos não podem ter mais do que %(max)d caracteres." #, python-format msgid "Field must be exactly %(max)d character long." msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "O campo deve ter exatamente %(max)d caracteres." -msgstr[1] "Os campos devem ter exatamente %(max)d caracteres." +msgstr[0] "" +msgstr[1] "" #: src/wtforms/validators.py:163 #, python-format @@ -110,12 +108,14 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Valor inválido, não deve ser um dos seguintes: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Este campo não pode ser editado." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "Campo obrigatório." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Campo desativado: não pode ter um valor." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -133,28 +133,29 @@ msgstr "CSRF falhou." msgid "CSRF token expired." msgstr "Token CSRF expirado." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Escolha inválida: não é possível calcular." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." -msgstr "A escolha não pode ser None." +msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Escolha inválida." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Escolha(s) inválida(s): não é possível calcular alguns dos valores." -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." msgstr[0] "‘%(value)s’ não é uma escolha válida para este campo." -msgstr[1] "‘%(value)s’ não são escolhas válidas para este campo." +msgstr[1] "‘%(value)s’ não é uma escolha válida para este campo." #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." @@ -166,11 +167,13 @@ msgstr "A data não é válida." #: src/wtforms/fields/datetime.py:103 msgid "Not a valid time value." -msgstr "Não é um valor de tempo válido." +msgstr "" #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Não é um valor de semana válido." +msgstr "A data não é válida." #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." @@ -182,4 +185,4 @@ msgstr "O valor decimal não é válido." #: src/wtforms/fields/numeric.py:197 msgid "Not a valid float value." -msgstr "O valor com vírgula flutuante não é válido." +msgstr "O valor com vírgula flutuante não é válido. " diff --git a/venv/Lib/site-packages/wtforms/locale/ro/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ro/LC_MESSAGES/wtforms.mo index d04f1f29c7d5bd570052288867f97f7124e0d3e3..06ea164f7dbc1d503e14549e8c1baef30321b69b 100644 GIT binary patch delta 871 zcmYMx%WD%+6u{xrhY5|ZqSZcp^j59a*2cb6sM=QS!j)1e-DriI%+w4{W=b+C_#%r+ zLBWls3+=8O5fPRA1tLhd1rY`5LUGrXhzmFMcbWl*nfd12+;h*pC*Rv&bd=Zk)GrBF zC(l8i@fwZ(Uw*AfmN1Vya1Hn3dh9Q3CQj6e+{DAN4{(_H8y?5zdXXDAf||dK9U^6U z6A!Fm6F>Y!E%X<6Vse|v81BRUIE5{k$6dI9J-CG3_#U;u2I|HnA#wm(unmV$^RI2i zWsw{oI&nUB84Ym-+wl`>f#0YLnWRV>FQDe##s<1DkFSZJG*knc7*{VTuXQT!9zM!R&K z5j=-?u&gbA$44iA#6!4&da~5+>IROW#v^zPr?40A;VFEH-S`=Yu%@xP!Lz7^CQ#RX zgwoY{V$S*{_hhllc*V-~+PC$iSsMglWHPRC9WQbnnap`bGvm3w!yMyyMVs+m$JoFz z@!Xu9bB#4yOD%3DCYoG7^wI@y&K8`ppp@}#dZw^AoosF#?CtOC?K@-o2Zx6Sdin+` z50g)8>ITyNmDYw=iN#E+X=IPP7WjaV--tIs?Wl+0{s8PA5n h>arKOCe-4gEx2+iONPm6b~QK5_}(oWg$1vamVd)3jJE&) delta 657 zcmYMx&nrYx6u|K_W6W#(8Zj|`lOGEVZ#2!w24#ve7Fc3Kl$`|&7B)7Llu60X1|?-0 zODRQ>DJ5B0NR#*r{3wy{X>NJF_dfUBckey-p0{6@u33I6a%~A$Jx?W1$f42yHRu$X zB#dDmCa@UKjCWW{{E8F!YaGuK=^{SGCj7)PtafGQFJYa?vTT@+1o{|oiJIsU^YIOP z@EuDqoGs$V7#83(w%|NA<1Xq3Q>Ytz#tQtxa`d?~^V_kU{L)WD2TmH7u$DNEHF$!W z;NE-}OT@`3{dh!wg(tJ%wJ~k{MosL?5!pf8c!S-<)43w;UIM^ms*DF@jp^DGcET>N*$R\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" @@ -114,15 +114,11 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Valoare invalidă, nu trebuie să fie una din: %(values)s." #: src/wtforms/validators.py:698 -#, fuzzy -#| msgid "This field cannot be edited" -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "Câmpul nu poate fi editat" #: src/wtforms/validators.py:714 -#, fuzzy -#| msgid "This field is disabled and cannot have a value" -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "Câmpul este dezactivat și nu poate conține o valoare" #: src/wtforms/csrf/core.py:96 @@ -141,24 +137,24 @@ msgstr "Validarea CSRF a eșuat." msgid "CSRF token expired." msgstr "Token-ul CSRF a expirat." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Selecție invalidă: valoarea nu a putut fi transformată." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Selecția nu poate fi None." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Selecție invalidă." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Selecție(ii) invalidă: una sau mai multe valori nu au putut fi transformate." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, python-format msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.mo index 88d323873a969939b56ecfb8a08f74eea7aea103..27cb64efb003cf422021cf488fddf444d6d1a211 100644 GIT binary patch delta 744 zcmYMwPiPZC7>D7pscE#PHStf1TDnP#igCm2rb=9^B$^bhQEOX-LbPtR*qEBtO;St| za`z;xB8Vriq6d5RBwj@HUJ)yWLa%~Q5D&g%791F!`R&Z^x8H0Gy-&2hM?0SiMx1$o zIkZKk|Kn(f5IcxE?n2A=62{20cpaB~SI{D70zw?b8kX=ms`och)#~p2ms>(-v6}}u zRE4f$7;j=0@8e#4i+%VJdvFbt_!Ey{|JHVabEtl-g!{3M`|vTU_h0$>1I9#4h*cIE z8=E+QeZlsJGpIgv3x9Ac4>3x<77}6*@8KbQf`{=P_Hb_9_t&;|=Yeh^PO^UkKj8~h zH!x4PSEw%@u~3D-p@x5O5B75ns`E5H!!bOKYnZ|~*O0(*oW>eX;b+t^(c5n1ES@4e zXy9w#RZOW4B0Jj~C-6AA;`T3@&+JgJ;5pi@Ec~Y%ZUlC`?Xz zvMY8cts7F8$222t4Vy`6O1XXfvOY1lSgw_ws-Cy&bCzaG!_;L)mxg9Y%SCG#hTkp2?Q0v(5wWO;7@m01p;!LYn1!0hzTnB-DXB_gv;dj1s|L6HJ{Hu2KTd?dg!FLF4 zA6ml}kv6~15<<2kcEKI+Vo@E2kaO@dd|LDmj3b{fCFBTn;Uzc=#r#kiAqQbSL>?tw z=+t0Lva4j;i?@C)1xSD_b{lw%PXfOW7HiVadw9PB3C3&-IeI041{)sw`$|{d|L@QihKedgZ$g8jo-o|rC@B<9P zHFyCAeT4MEG^B6|iVOXKtRm--BwGMZ&+ElEdI^_sg@K1P$8#S&>XNtvFc15DRZlww(Rqta2`L`6@H znl?1a)UwP>w(CwJ&7?uoU8)E*HAIwXBpRhkQ#_{BD^W%9bf1azs9DX@3_Ws+*=n4| zlo;w7BC$pqi^i3c^@`&9D{Dr>y+$UbskApGg=tG#vocq#Orm|5X=%xH+B}_1A9C0b zRxq9aA=0O^;W+JaEK6fLZAsa7#)`{w%CKxTDUGN&ovliSIV5LH2|HkpQVkGGSy!dsB&NX0`7OOubT1&KF!~t&G8xcg}>H);CK7R`2@xn_#&UC z{5_ZxoyB~P&+@ta!~9*;<1ghih53}vqvkE2&gUqf%-_rB^7rwNzr(mFEEK!@1Bd?s DzIoy~ diff --git a/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po index 4b0f168..bb87e8e 100644 --- a/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po @@ -6,19 +6,17 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.3\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-04-26 21:07+0000\n" -"Last-Translator: \"Sophie Sh.\" \n" -"Language-Team: Russian \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2012-08-01 10:23+0400\n" +"Last-Translator: Yuriy Khomyakov <_yurka_@inbox.ru>\n" +"Language-Team: ru \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.5.1\n" +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -116,12 +114,12 @@ msgstr "Неверное значение, не должно быть одним #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." -msgstr "Данное поле не может быть изменено." +msgid "This field cannot be edited" +msgstr "Обязательное поле." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Данное поле отключено и не может быть изменено." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -139,25 +137,25 @@ msgstr "Ошибка CSRF." msgid "CSRF token expired." msgstr "CSRF токен просрочен." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Неверный вариант: невозможно преобразовать." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Выбор не может быть None" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Неверный вариант." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" "Неверный вариант(варианты): одно или несколько значений невозможно " "преобразовать." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." @@ -179,8 +177,10 @@ msgid "Not a valid time value." msgstr "Неверное значение времени." #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Неверное значение недели." +msgstr "Неверное значение даты." #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." diff --git a/venv/Lib/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.mo index 13f4242df3ec79e23bd6b2011757b37de3e9f2a7..836e6f3f2d8ff0bad180dc9da226f54e669e611c 100644 GIT binary patch delta 432 zcmXZWu}cDB7{~EPG4w9;D$R^H-@dAjj4b3z&}?2 delta 462 zcmXZWO(=tL9KiA4M0+tC^3oW4LTb(C|2$rrX%TX9AUP{)ql zv~pynoVA0IlT38(Ok0jy#Wzi}CV zu^$)OM4W>+u^kU_0xxh1%h-W696%4tMsO5|aRsAjHS$-1xq9ORi4cV<4q*+Qfe=^3 zFpbV46BS-!4?dR6rb@FbVb8k9d9&`LsmZv~\n" "Language-Team: Slovak \n" @@ -16,8 +16,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 5.1-dev\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -113,12 +113,12 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Neplatná hodnota, nesmie byť jedna z: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Toto pole nie je možné upravovať." +msgid "This field cannot be edited" +msgstr "Toto pole nie je možné upravovať" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Toto pole je zakázané a nemôže mať hodnotu." +msgid "This field is disabled and cannot have a value" +msgstr "Toto pole je zakázané a nemôže mať hodnotu" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -136,23 +136,23 @@ msgstr "Chyba CSRF." msgid "CSRF token expired." msgstr "CSRF token expiroval." -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Neplatná voľba: hodnotu sa nepodarilo previesť." -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Výbery nemôžu byť žiadne." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Neplatná voľba." -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Neplatná voľba: jeden alebo viacero vstupov sa nepodarilo previesť." -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, python-format msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.mo index b5984940cabe91552fbcc6094cef1d0b7bdf076f..51605e05caf438d65831427e4eb20c70a6bbd461 100644 GIT binary patch delta 731 zcmZ9}O-K}B9LMoTooroG>;+dVYkVO}o8_5VrDZ7Er8TU435}pws#$lCf!w8aw1{Bo z(xpo@bg+xZf^ONllNT$ZtCyk<9=hd42&BIMc0p+1;q&}vp4b2U?AhwBem!8kP&~b~ zqqKnrNxRSKMy2)5v#^Zn?--itRzC$g8uGud2jdUR$c zes$`ab)n*WVNfnvIWP2G)6q`KvbCj0OgrTcJ44#hnt|4|zZ5L|H%_N5$1!c~j-;Yv zvBbdmV#zZv`;}6`ugsZein948V_7ZG+q=>dN3p=;E99rKWzmX-DLCIH+^s3%R_aX zkOQC{?uTKh>PHK4o{%IyRO0=TbC4olfQR4*s2co&YC<$X$SF7sRb3i>#MB-@f%w`^ zLUzNqP+jO#DPDyt|2O2YwT=*m{^SlmhT#fSH|VS<Z zU>AH3`{4JI%{YaII0Dt=1RR2o;8FMvlHTs)Ic8^hpVv!;cZE6`Ng2hGu&9~L2$R!9 z#-%bTJem;PwzRSm=JGYSgLH=w(%{_Q~uBDdr^})s$rZ{ZVAb;`NU=; z9EV!MV{w~XlsPy~F*(U{ym-Vc_v1C=H@Te=nk#b5wW3ZoZZj?6)?FT*2*zB_q{ukI z5hi(rhV)Q4s2f4Up!#4Wr1$HFt|Kux#&g2^H!l>Xh7r*XzcJ9(8y8Xv$FM9j93HR+ zL*dimv+)oeDy~OeF49@evHeSdjr9nw=n3ihBG_m-~r508h zKId&&KHSZ+VoBj|`A\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2023-08-22 10:53+0000\n" +"Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.0-dev\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -110,12 +110,14 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Felaktigt värde, får inte vara något av: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Detta fält kan inte redigeras." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "Det här fältet är obligatoriskt." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Det här fältet är inaktiverat och kan inte ha ett värde." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -133,28 +135,29 @@ msgstr "CSRF misslyckades" msgid "CSRF token expired." msgstr "CSRF-token utdaterat" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "Felaktigt val; kunde inte ceorce:a" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "Val kan inte vara Inga." -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "Inte ett giltigt val" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "Felaktigt val; ett eller flera inputfält kunde inte coerca:s" -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "'%(value)s' är inte ett giltigt val för detta fält." -msgstr[1] "'%(value)s' är inte giltiga val för detta fält." +msgstr[0] "'%(value)s' är inte ett giltigt värde för det här fältet" +msgstr[1] "'%(value)s' är inte ett giltigt värde för det här fältet" #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." @@ -169,8 +172,10 @@ msgid "Not a valid time value." msgstr "Inte ett giltigt tidsvärde." #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Inte ett giltigt veckovärde." +msgstr "Inte ett giltigt datum" #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." diff --git a/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.mo index 3becb5ab6548753237e59a726f4c2f8d1d275b74..493c4712fb44d59c1e6d2388890a757a3f6b1011 100644 GIT binary patch delta 880 zcmY+>&ubGw6bJBW6Z1Q1v}qG#Nhd~&8aHe<*0!;gL=#1{L=r_0RoJF$v$#oMlc?m9 zgWy2~kxfU8zJO_7W+7w@oPcw19`d?X7=>TV_%{p? z(jiW((I5i7NQlD>oPxu!4MXq|^ubp!4&T5d@F(OA{JRJV!UJ$0oQ7d|74rIq89#s& zaTkuFKly+K-*5}^4FWbop5YXZLO%INyHW5R@(=n0&qKe1kTRTudH5Fc$!$(!asl$j z_u)bK5@KSq4u{|-^r1ibg~b50xNvN65blKqQx*CV--Q$KF`R;*Apd1Hw~-$+oq_xD z{EBHC@}qwWDO`my_yhVyEUXxlAK^G;pZkxmL@YNf?6vJSyJOFL^RwA=7c$vgu9z>C z*oHkgnG%wsAdb^yDt%0fi;^h1E*6BMa!YNf^_q~An@XBWVsZjWf;34*DJ`YqVv12m zfX*tKTA`QMy0T8Et2}6xWj(W4l~pZKu2)&X5gBf7zuWn0$q{oLs?q2SO&(_79F5&l zBIzQhOT{y^A~$8Nx6IxVkh zuQt1#$=bD81*Z#(cg|KX~YknhdDgj&!!+9b%V! Q9Z$Qiw`y8zp`|CtU!I1Y!~g&Q literal 3885 zcmb`JO^g&p6vtach~o!FKtM$c$+FXjsD6f*aXo1G9KBnwsgF>2kWO$ExmS zcM?xV51zbmk;7h0@Mbo~i{YZXBqYWIiATf1#6*o=j3*Dqe^qx+&(6#u7$>{=O;x?B z_v(Gs+p(3ZUyhA`~%#9@ur6@>n-qwl<$EK z#y^1jz#SVc>rLirkfu?K3o_fuX63C3T5FM{8L`usmZ?H{t) zvc|y)Q11)C+wj>3U<>1!M-#ih0`>iFgIexaQ0w1Nu&md?-C!N$;3W7RxDVX=7|sM8 za2NO)sOP@{wSRsAw}XF!`u^MCtS#VP@HqGisQ0x~egr;+@u%Rc;FsW0@ON-GI0`4f z1WtmZpa+hDAE&$tYW+WhT5b!JYF0o3&VhTud9Vb20_r$@3myi41a&-iX(LBR_Rmv4 zW(U+L;fjbbB9vf;yQJ=gyv|4?lqB-7*5J%{i)(gJ$;_7C4G`?xapv-+bEHAJ&#>JL zqOipTVGC_8`{n|!6cc@5w~#y?=2vRKCWds|=3FPN%{hyuq=)fOo=4YCWuuX#G=)mGXZl*J&X|`9kY7KWE~;P zB&KEwbzR96%*^JdX?<{V?$U)^Vs38gY(7eoa=$v@5TpY^rUfCA(4`S2T(si|8PhcY zNt4)syvr1_0EsxL(j+(0P9&ovYBZNOhvq|5EC+S|jV2i)7D?D};9#?&bOxefNRA;(4L?Lm4_V+MV!DimEUl*oncM2h z$3YFdvzzvn4O}uaAP|H}S)pJD*Vh(?B6(pzw%Tn*J#B!wJkqVCXAv#S<%-tOcFX~3 zC-LY!OM0Ak>RNe;vPxRgtPI~_^~j!b?JGR6JC;#M+^Z>}l2H zu6;UgD!Upwg!v&aN6fU4A*;Pq}@@W)Ghg@7;iaTUdDs+?MVKeTW zgwd$ZAY>;XEt)ZHLTeeMxEDoj<&2MehzlHfmBIFi6+_t^ZzsM` z<5wfJ_8?~@$4?Yy{a8}pHm-4qXq%y$s2n57*9k%POpx-i!t~ViWbRBjv2Z3t+6mlb zv8|0`3(O>(7WgA-7X3tD$!LGz9s1_lJab-G6@Cs3 zT!i343gWp=cXb)BczWyJmyYQD?A8*G`pk=Hp#1>P3?ARLqDMn|`h#yfZ}La+4l!{* zl|{N}O~4qy40ii`PK31znQ`8HmaZEb?nz_%7!8s>Fby)Y;x(YF(>)l8)NA;AizIL~OlXKHm6d?CfgHU{FjSq_0isI=?3|U7mMCKrXEu!cm zyz#%u>h!yhBRl8<;@(<4+CT{V4ZCd2?JZrE)lE`jU4bN1k`^;mCg~N*6ksN{PTihP z8?L)@v%`ds2n7sHtUJx-^>4S;Sp4`=nVe= DR~yqB diff --git a/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po index 8ef4c56..ae95292 100644 --- a/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po @@ -6,18 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.4\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-01-22 19:01+0000\n" -"Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2017-05-28 02:23+0300\n" +"Last-Translator: Melih Uçar \n" +"Language-Team: tr \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -48,8 +46,8 @@ msgstr[1] "Alan %(max)d karakterden uzun olamaz." #, python-format msgid "Field must be exactly %(max)d character long." msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "Alan tam olarak %(max)d karakter uzunluğunda olmalı." -msgstr[1] "Alan tam olarak %(max)d karakter uzunluğunda olmalı." +msgstr[0] "" +msgstr[1] "" #: src/wtforms/validators.py:163 #, python-format @@ -110,76 +108,81 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Geçersiz değer, değerlerden biri olamaz: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Bu alan düzenlenemez." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "Bu alan zorunludur." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Bu alan devre dışıdır ve bir değere sahip olamaz." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." -msgstr "Geçersiz CSRF Anahtarı." +msgstr "Geçersiz CSRF Anahtarı" #: src/wtforms/csrf/session.py:63 msgid "CSRF token missing." -msgstr "CSRF anahtarı gerekli." +msgstr "CSRF anahtarı gerekli" #: src/wtforms/csrf/session.py:71 msgid "CSRF failed." -msgstr "CSRF hatalı." +msgstr "CSRF hatalı" #: src/wtforms/csrf/session.py:76 msgid "CSRF token expired." -msgstr "CSRF anahtarının süresi doldu." +msgstr "CSRF anahtarının süresi doldu" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." -msgstr "Geçersiz seçim: tip uyuşmazlığı." +msgstr "Geçersiz seçim: tip uyuşmazlığı" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." -msgstr "Seçimler Hiçbiri olamaz." +msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." -msgstr "Geçerli bir seçenek değil." +msgstr "Geçerli bir seçenek değil" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." -msgstr "Geçersiz seçenek: bir yada daha fazla tip uyuşmazlığı." +msgstr "Geçersiz seçenek: bir yada daha fazla tip uyuşmazlığı" -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "'%(value)s' bu alan için geçerli bir seçim değil." -msgstr[1] "'%(value)s' bu alan için geçerli bir seçim değil." +msgstr[0] "'%(value)s' bu alan için geçerli değil" +msgstr[1] "'%(value)s' bu alan için geçerli değil" #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." -msgstr "Geçerli bir tarih-saat değeri değil." +msgstr "Geçerli bir zaman değil" #: src/wtforms/fields/datetime.py:77 msgid "Not a valid date value." -msgstr "Geçerli bir tarih değeri değil." +msgstr "Geçerli bir tarih değil" #: src/wtforms/fields/datetime.py:103 msgid "Not a valid time value." -msgstr "Geçerli bir zaman değeri değil." +msgstr "" #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Geçerli bir hafta değeri değil." +msgstr "Geçerli bir tarih değil" #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." -msgstr "Geçerli bir tam sayı değeri değil." +msgstr "Geçerli bir sayı değeri değil" #: src/wtforms/fields/numeric.py:168 msgid "Not a valid decimal value." -msgstr "Geçerli bir ondalık sayı değeri değil." +msgstr "Geçerli bir ondalık sayı değil" #: src/wtforms/fields/numeric.py:197 msgid "Not a valid float value." -msgstr "Geçerli bir ondalık sayı değeri değil." +msgstr "Geçerli bir ondalık sayı değil" diff --git a/venv/Lib/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.mo index 8c6c12ee86cf90d77e536614dd97e4d4ad0d9eb7..d6e6de93cc615663aff0444cc3fedb713826f644 100644 GIT binary patch delta 921 zcmaLU%TE(g6bIl#JK$K5wopa1)Tw|#>(rT2kyIol6cYjpDRl>!#x__*+VIjQMno4T z7$5N>iHR=w2Z+c+UIvSyCu<|@MIOmI3xmjQW}*YI4R*spDE4hYH~f&zb0s1N z(HNB?5Dk2A2RsTxuodot6L2@2hJ|n$df_YRf#0BLpyU#jzyRC}+uYhRc{b>WiJ}hiP@nBotpMnPX6Q>b{qCuxjR1M>BKfDFYaQ`tZfv>j{^3y*3!|do{nN zp-_z^Mw3HZ>-2!C>8f6*=vq(~f8q|8L22`HSTD=@vF^aj->84SR1XXJ7N1=Q8;dCe|qRu(#$y)-IJY zt0c2ug=vp%fM18x-gC)fhJx`L2* zz}6x^03)z}1`mKOm4v(vo&e?fYv4XYQsicFLx9iX!+lUDdIW9k233&n71wIeV<8>WMP36b>t=!2p;A`@r8oIqSX9T{iF*co@74 z4uRi;Qiv3?3e!zZv9u}GiuD`GQC(HWEdS}j;lO~! zR7W$7z)96%5!xN#FSphAq{w zb=5Jg2<2b!B{9P@VxE6PkJ-!`*WOpgO(Pmtt>lCf?jKL6nyy66gxle3eRX8QQZ++U z4SFo@IFoiH7>t{?>~NZ)LWe1)H6EO_%y(JTv4hhNWK3)_IT3WDzTZ>5O2}U_1HQ(W zsJKG;ZCQvo4?D|qlrQoHF@voIz9ug4yxh9YSH&C^m&7dW49`>kEf&}-o$9|uO#S~M z|9eD!o$o*+=x>#;@C7<>X6TgSMr%6D6nD0!?XW`l<&v(m)awOD^8AiSiwk0w@>_Dj zv)%<%GB<1Pl}8X5IzUHHkVPa|!w>r85Kj6+x;zxUBfp3=^@LrNF7AVxrW0ZwnV%*^ z^YQFcMrd+>@%!A`Iula7S9iZm$(-BXR|ey=hW)ju-fKf~*Xw(*_prY0%@wa9c~iuP zJd10yij5qq_?$0oxk|WNPd-z=EIUt&i_(?n#U~VFC@vLOZ)o@O9m4;5eVbnj2gTOJ zoEvJ~hUDJk>GyAW5o+6HAhMFTjwgBb7Eec XmmY;_Ez9UAd\n" -"Language-Team: Ukrainian \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2014-01-16 10:04+0100\n" +"Last-Translator: Oleg Pidsadnyi \n" +"Language-Team: uk \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 @@ -51,9 +49,9 @@ msgstr[2] "Значення поля має містити не більше н #, python-format msgid "Field must be exactly %(max)d character long." msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "Поле повинно мати довжину рівно %(max)d символі." -msgstr[1] "Поле повинно мати довжину рівно %(max)d символи." -msgstr[2] "Поле повинно мати довжину рівно %(max)d символів." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #: src/wtforms/validators.py:163 #, python-format @@ -114,12 +112,14 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "Значення невірне, не може бути одним з: %(values)s." #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "Це поле не можна редагувати." +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "Це поле є обов'язковим." #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "Це поле неактивне і не може містити значення." +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -127,64 +127,67 @@ msgstr "Невірний CSRF токен." #: src/wtforms/csrf/session.py:63 msgid "CSRF token missing." -msgstr "CSRF токен відсутній." +msgstr "CSRF токен відсутній" #: src/wtforms/csrf/session.py:71 msgid "CSRF failed." -msgstr "Помилка CSRF." +msgstr "Помилка CSRF" #: src/wtforms/csrf/session.py:76 msgid "CSRF token expired." -msgstr "CSRF токен прострочений." +msgstr "CSRF токен прострочений" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." -msgstr "Недійсний варіант: перетворення неможливе." +msgstr "Недійсний варіант: перетворення неможливе" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." -msgstr "Варіанти не можуть бути None." +msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." -msgstr "Недійсний варіант." +msgstr "Недійсний варіант" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." -msgstr "Недійсний варіант: одне чи більше значень неможливо перетворити." +msgstr "Недійсний варіант: одне чи більше значень неможливо перетворити" -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "'%(value)s' не є дійсним варіантом для цього поля." -msgstr[1] "'%(value)s' не є дійсним варіантом для цього поля." -msgstr[2] "'%(value)s' не є дійсним варіантом для цього поля." +msgstr[0] "'%(value)s' не є дійсним варіантом для цього поля" +msgstr[1] "'%(value)s' не є дійсним варіантом для цього поля" +msgstr[2] "'%(value)s' не є дійсним варіантом для цього поля" #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." -msgstr "Недійсне значення дати/часу." +msgstr "Недійсне значення дати/часу" #: src/wtforms/fields/datetime.py:77 msgid "Not a valid date value." -msgstr "Не дійсне значення дати." +msgstr "Не дійсне значення дати" #: src/wtforms/fields/datetime.py:103 msgid "Not a valid time value." -msgstr "Не дійсне значення часу." +msgstr "Не дійсне значення часу" #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "Недійсне значення тижня." +msgstr "Не дійсне значення дати" #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." -msgstr "Недійсне ціле число." +msgstr "Недійсне ціле число" #: src/wtforms/fields/numeric.py:168 msgid "Not a valid decimal value." -msgstr "Не є дійсним десятковим числом." +msgstr "Не є дійсним десятичним числом" #: src/wtforms/fields/numeric.py:197 msgid "Not a valid float value." -msgstr "Недійсне число з рухомою комою." +msgstr "Недійсне десятичне дробове число" diff --git a/venv/Lib/site-packages/wtforms/locale/wtforms.pot b/venv/Lib/site-packages/wtforms/locale/wtforms.pot index e849881..9bdf80f 100644 --- a/venv/Lib/site-packages/wtforms/locale/wtforms.pot +++ b/venv/Lib/site-packages/wtforms/locale/wtforms.pot @@ -1,14 +1,14 @@ # Translations template for WTForms. -# Copyright (C) 2024 WTForms Team +# Copyright (C) 2023 WTForms Team # This file is distributed under the same license as the WTForms project. -# FIRST AUTHOR , 2024. +# FIRST AUTHOR , 2023. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: WTForms 3.0.0\n" +"Project-Id-Version: WTForms 3.0.1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -107,11 +107,11 @@ msgid "Invalid value, can't be any of: %(values)s." msgstr "" #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -130,23 +130,23 @@ msgstr "" msgid "CSRF token expired." msgstr "" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, python-format msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.mo index e314b6d296f503fcd36126af2f38cc9643cc4b9d..f407328eb1baa1dde3830c92697614bfe95bb916 100644 GIT binary patch delta 38 ucmaDL`9N~R4K@K|T|)z115*V\n" "Language-Team: zh_CN \n" @@ -110,11 +110,11 @@ msgstr "无效的值,不能是下列任何一个: %(values)s。" #: src/wtforms/validators.py:698 #, fuzzy #| msgid "This field is required." -msgid "This field cannot be edited." +msgid "This field cannot be edited" msgstr "该字段是必填字段。" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." +msgid "This field is disabled and cannot have a value" msgstr "" #: src/wtforms/csrf/core.py:96 @@ -133,23 +133,23 @@ msgstr "CSRF 验证失败。" msgid "CSRF token expired." msgstr "CSRF 验证令牌过期。" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "选择无效:无法转化类型。" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "选择不能是空值。" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "不是有效的选择。" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "选择无效:至少一个数据输入无法被转化类型。" -#: src/wtforms/fields/choices.py:214 +#: src/wtforms/fields/choices.py:204 #, fuzzy, python-format #| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." diff --git a/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo b/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo index 570695cdda107ab67e02140f438a8ced76897016..09e7f308bbe6540cdb9f4c93aed5be285aa10c38 100644 GIT binary patch delta 1020 zcmYk(T}V@57zgl^&N+{pHI~o}r7tT{s~a)q9PWTla`O{mCW?Yt z+KV&oCL!y>J|sg{TXjy*Y zU@`m!3!y$u&OZ)KSf6RYfSzyw(uM@?go`i}M&Jp!3iDwGi_=0LX2Emt7;I7uLb{<< z#W6zCPXFrWniNE_c#T%iewKf_%x1^;LHW73CY@?70RdQ+=))#oeE z)Ho`us_Lri>&d6oT$`0Q3%qcIGh6NDmQukY2yE>|zRuk(`os<|U*+_>?VLq0TX~_J zHNml`o!{REI7Lnxe*ObNUvw&LocJ@g=lCz8V*N8gBy{#qT+66TbJ8c z;`=!`#B4R$s*{)ezmD{3Pm+0UURq*oG&Vc59wdme$sestPg}&ML(=0JxlFqM5CA|xVeP0OnaI(3%&qF{uFE`WPr@sFYd!yY?x3KdI)zy=MF+ba39RL7jCOYJn9oa9$tj+z*cxwY``C(NO%Z6 zaIf2%z;jR>*aK_eY4|ui3&lAf!zTDMr0`ED;&x-KUGRYIn{YrB7{`Mc(F}YFE<@Z6 zDL`?M3-=)QJ+?=n$U6xsJY)L>6pb&~`@ciccqQ&h#2*y*+wt-=Ik~ zMP-UtN|Z)osuE$eSJh}Lrs%X+VezPMONy+qwUo^X2;7=6e{lOx6}vYb+|Ss%e07Hr zipWV(Fw7{6Dk+A;kFOU(J2a~3ayZVSR8FEDD>x=+nAKvM@vx((mc>=Yrzsg(i-wZv za9sBFYJAyI*WKln0^UG?O5MQ@sa*<4QuS-cyge+V=!%;39+gupNIRqs#2xZ>N>u6$ zc6PT*65r#j4aCx?R5>1_&)W~7w9Yi$msB;@7k|$eQ+3gAKSR9~^Qqb?9&$Fnek7(O zna*hIaZSb-p^O}F!x^bmpC0u4|C{CS)6~-}lG6SCDU2<#;rp?ZugJ-ipKH#`&mQtg z)nvsOU%#ytVhx6Z!l|SRW?CP{DSVx%`rp%coexT~2qj>vU^NPW9Rq4j!$TjpO z8eHqt{A8jydrN$czGCo~tD9dnjm6c)ajQx6k-s~W&yAr(K4+{hPTC)>w;_CptRH42 zS#>uj@rCM__+fV)-{am@fgs-G&YXZE*`C?joX}6%xMgn?vN`c#|2Ge-?7su9PogIO z!R_hWn2%1av4~3R_hNt5o!Qdj+?I{fmtUEK)5S}(`5f-&k`;$5eALmSi^V02zNQT{ HEDrbw{0;za diff --git a/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po b/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po index 5d68e40..8e918a7 100644 --- a/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po +++ b/venv/Lib/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po @@ -6,24 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: WTForms 1.0.3\n" -"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n" -"POT-Creation-Date: 2024-01-11 08:20+0100\n" -"PO-Revision-Date: 2024-06-30 03:38+0000\n" -"Last-Translator: hugoalh \n" -"Language-Team: Chinese (Traditional) \n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2023-10-05 13:42+0200\n" +"PO-Revision-Date: 2013-04-14 00:26+0800\n" +"Last-Translator: Grey Li \n" +"Language-Team: zh_TW \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=1; plural=0\n" "Generated-By: Babel 2.8.0\n" #: src/wtforms/validators.py:86 #, python-format msgid "Invalid field name '%s'." -msgstr "無效的欄位名稱「%s」。" +msgstr "'%s' 是無效的欄位名。" #: src/wtforms/validators.py:99 #, python-format @@ -34,43 +32,43 @@ msgstr "欄位必須與 %(other_name)s 相同。" #, python-format msgid "Field must be at least %(min)d character long." msgid_plural "Field must be at least %(min)d characters long." -msgstr[0] "欄位長度必須至少為 %(min)d 個字元。" +msgstr[0] "欄位必須超過 %(min)d 個字元。" #: src/wtforms/validators.py:151 #, python-format msgid "Field cannot be longer than %(max)d character." msgid_plural "Field cannot be longer than %(max)d characters." -msgstr[0] "欄位長度不能超過 %(max)d 個字元。" +msgstr[0] "欄位必須少於 %(max)d 個字元。" #: src/wtforms/validators.py:157 #, python-format msgid "Field must be exactly %(max)d character long." msgid_plural "Field must be exactly %(max)d characters long." -msgstr[0] "欄位長度必須剛好為 %(max)d 個字元。" +msgstr[0] "欄位必須為 %(max)d 個字元。" #: src/wtforms/validators.py:163 #, python-format msgid "Field must be between %(min)d and %(max)d characters long." -msgstr "欄位長度必須介於 %(min)d 和 %(max)d 個字元之間。" +msgstr "欄位必須介於 %(min)d 至 %(max)d 個字元。" #: src/wtforms/validators.py:216 #, python-format msgid "Number must be at least %(min)s." -msgstr "數字必須至少為 %(min)s。" +msgstr "數字必須大於 %(min)s。" #: src/wtforms/validators.py:219 #, python-format msgid "Number must be at most %(max)s." -msgstr "數字必須至多為 %(max)s。" +msgstr "數字必須小於 %(max)s。" #: src/wtforms/validators.py:222 #, python-format msgid "Number must be between %(min)s and %(max)s." -msgstr "數字必須介於 %(min)s 和 %(max)s 之間。" +msgstr "數字必須介於 %(min)s 至 %(max)s 之間。" #: src/wtforms/validators.py:293 src/wtforms/validators.py:323 msgid "This field is required." -msgstr "此欄位是必需的。" +msgstr "此欄位為必填。" #: src/wtforms/validators.py:358 msgid "Invalid input." @@ -90,7 +88,7 @@ msgstr "無效的 MAC 位址。" #: src/wtforms/validators.py:540 msgid "Invalid URL." -msgstr "無效的網址。" +msgstr "無效的 URL。" #: src/wtforms/validators.py:561 msgid "Invalid UUID." @@ -99,20 +97,22 @@ msgstr "無效的 UUID。" #: src/wtforms/validators.py:594 #, python-format msgid "Invalid value, must be one of: %(values)s." -msgstr "無效的值,必須為以下之一:%(values)s。" +msgstr "無效的資料,必須為以下任一:%(values)s。" #: src/wtforms/validators.py:629 #, python-format msgid "Invalid value, can't be any of: %(values)s." -msgstr "無效的值,不能為以下之一:%(values)s。" +msgstr "無效的資料,不得為以下任一:%(values)s。" #: src/wtforms/validators.py:698 -msgid "This field cannot be edited." -msgstr "此欄位不能編輯。" +#, fuzzy +#| msgid "This field is required." +msgid "This field cannot be edited" +msgstr "此欄位為必填。" #: src/wtforms/validators.py:714 -msgid "This field is disabled and cannot have a value." -msgstr "此欄位被停用並且不能有值。" +msgid "This field is disabled and cannot have a value" +msgstr "" #: src/wtforms/csrf/core.py:96 msgid "Invalid CSRF Token." @@ -130,43 +130,46 @@ msgstr "CSRF 驗證失敗。" msgid "CSRF token expired." msgstr "CSRF 憑證過期。" -#: src/wtforms/fields/choices.py:142 +#: src/wtforms/fields/choices.py:135 msgid "Invalid Choice: could not coerce." msgstr "無效的選擇:無法強制轉化。" -#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203 +#: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192 msgid "Choices cannot be None." msgstr "選擇不能為空值。" -#: src/wtforms/fields/choices.py:155 +#: src/wtforms/fields/choices.py:148 msgid "Not a valid choice." msgstr "不是有效的選擇。" -#: src/wtforms/fields/choices.py:193 +#: src/wtforms/fields/choices.py:185 msgid "Invalid choice(s): one or more data inputs could not be coerced." msgstr "無效的選擇:至少有一筆資料無法被強制轉化。" -#: src/wtforms/fields/choices.py:214 -#, python-format +#: src/wtforms/fields/choices.py:204 +#, fuzzy, python-format +#| msgid "'%(value)s' is not a valid choice for this field." msgid "'%(value)s' is not a valid choice for this field." msgid_plural "'%(value)s' are not valid choices for this field." -msgstr[0] "「%(value)s」不是此欄位的有效選擇。" +msgstr[0] "'%(value)s' 對此欄位為無效的選項。" #: src/wtforms/fields/datetime.py:51 msgid "Not a valid datetime value." -msgstr "不是有效的日期與時間值。" +msgstr "不是有效的日期與時間。" #: src/wtforms/fields/datetime.py:77 msgid "Not a valid date value." -msgstr "不是有效的日期值。" +msgstr "不是有效的日期。" #: src/wtforms/fields/datetime.py:103 msgid "Not a valid time value." -msgstr "不是有效的時間值。" +msgstr "不是有效的時間。" #: src/wtforms/fields/datetime.py:148 +#, fuzzy +#| msgid "Not a valid date value." msgid "Not a valid week value." -msgstr "不是有效的週值。" +msgstr "不是有效的日期。" #: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92 msgid "Not a valid integer value." diff --git a/venv/Lib/site-packages/wtforms/utils.py b/venv/Lib/site-packages/wtforms/utils.py index 51bbe8a..4911afa 100644 --- a/venv/Lib/site-packages/wtforms/utils.py +++ b/venv/Lib/site-packages/wtforms/utils.py @@ -1,11 +1,9 @@ -import os import re -_LEADING_SYMBOL = "#" if os.name == "nt" else "-" # https://docs.python.org/3/library/datetime.html#technical-detail (see NOTE #9) _DATETIME_STRIP_ZERO_PADDING_FORMATS_RE = re.compile( - f"%{_LEADING_SYMBOL}[" + "%-[" "d" # day of month "m" # month "H" # hour (24-hour) @@ -28,7 +26,7 @@ def clean_datetime_format_for_strptime(formats): return [ re.sub( _DATETIME_STRIP_ZERO_PADDING_FORMATS_RE, - lambda m: m[0].replace(_LEADING_SYMBOL, ""), + lambda m: m[0].replace("-", ""), format, ) for format in formats diff --git a/venv/Lib/site-packages/wtforms/validators.py b/venv/Lib/site-packages/wtforms/validators.py index 3536963..59134f2 100644 --- a/venv/Lib/site-packages/wtforms/validators.py +++ b/venv/Lib/site-packages/wtforms/validators.py @@ -586,8 +586,7 @@ class AnyOf: self.values_formatter = values_formatter def __call__(self, form, field): - data = field.data if isinstance(field.data, list) else [field.data] - if any(d in self.values for d in data): + if field.data in self.values: return message = self.message @@ -622,8 +621,7 @@ class NoneOf: self.values_formatter = values_formatter def __call__(self, form, field): - data = field.data if isinstance(field.data, list) else [field.data] - if not any(d in self.values for d in data): + if field.data not in self.values: return message = self.message @@ -697,7 +695,7 @@ class ReadOnly: def __call__(self, form, field): if field.data != field.object_data: - raise ValidationError(field.gettext("This field cannot be edited.")) + raise ValidationError(field.gettext("This field cannot be edited")) class Disabled: @@ -713,7 +711,7 @@ class Disabled: def __call__(self, form, field): if field.raw_data is not None: raise ValidationError( - field.gettext("This field is disabled and cannot have a value.") + field.gettext("This field is disabled and cannot have a value") ) diff --git a/venv/Lib/site-packages/wtforms/widgets/__init__.py b/venv/Lib/site-packages/wtforms/widgets/__init__.py index ad29ea5..c87f108 100644 --- a/venv/Lib/site-packages/wtforms/widgets/__init__.py +++ b/venv/Lib/site-packages/wtforms/widgets/__init__.py @@ -1,57 +1,3 @@ -from wtforms.widgets.core import CheckboxInput -from wtforms.widgets.core import ColorInput -from wtforms.widgets.core import DateInput -from wtforms.widgets.core import DateTimeInput -from wtforms.widgets.core import DateTimeLocalInput -from wtforms.widgets.core import EmailInput -from wtforms.widgets.core import FileInput -from wtforms.widgets.core import HiddenInput +from wtforms.widgets.core import * from wtforms.widgets.core import html_params from wtforms.widgets.core import Input -from wtforms.widgets.core import ListWidget -from wtforms.widgets.core import MonthInput -from wtforms.widgets.core import NumberInput -from wtforms.widgets.core import Option -from wtforms.widgets.core import PasswordInput -from wtforms.widgets.core import RadioInput -from wtforms.widgets.core import RangeInput -from wtforms.widgets.core import SearchInput -from wtforms.widgets.core import Select -from wtforms.widgets.core import SubmitInput -from wtforms.widgets.core import TableWidget -from wtforms.widgets.core import TelInput -from wtforms.widgets.core import TextArea -from wtforms.widgets.core import TextInput -from wtforms.widgets.core import TimeInput -from wtforms.widgets.core import URLInput -from wtforms.widgets.core import WeekInput - -__all__ = [ - "CheckboxInput", - "ColorInput", - "DateInput", - "DateTimeInput", - "DateTimeLocalInput", - "EmailInput", - "FileInput", - "HiddenInput", - "ListWidget", - "MonthInput", - "NumberInput", - "Option", - "PasswordInput", - "RadioInput", - "RangeInput", - "SearchInput", - "Select", - "SubmitInput", - "TableWidget", - "TextArea", - "TextInput", - "TelInput", - "TimeInput", - "URLInput", - "WeekInput", - "html_params", - "Input", -] diff --git a/venv/Lib/site-packages/wtforms/widgets/__pycache__/__init__.cpython-310.pyc b/venv/Lib/site-packages/wtforms/widgets/__pycache__/__init__.cpython-310.pyc index 45203294bd158d584e3d3c0df400133c7d220820..98aac8f3e9fd063e539a2db5cf22feb7a5a4987a 100644 GIT binary patch delta 165 zcmcc1IfaQYpO=@50SH!Q>t~cROyrZPR{`=;7*ZH>7(zfaQw~EeV-zDJh|LUSGet20 z*(|{fnyfED8Z{YjF=_z`?u?S$ocMyoqQu-{AeYrMub{NVPm?)Hq`V|8zbLm@uRJp) uJ+-7*FFC&`wTKz0wTJ~stYj!+1+hWIuMlUe$qp=uTx>uN2LlhI03!fFrzM>L literal 1245 zcmbW%%Wl&^6b4{BS6|}X?`ga5qU{zTgg`BbODI*7Qt8OTa^fMeVtcHy)0QV;&yH8> zmKCqSigSkAEjv_4`SqRgjD5z6!!65D@c3LfT7Ro3%1HkbT|$?jBwa?Ap)6fNSD+$YMOUFJt)Vs0q;<3oy0n2dz>qf4CYaJS zbPa0K7TN+!x{j_xUAlp8KtsBTZbDPKg>FGhx{Yo_Te^epKu5ZZ?m}0(hwed7x{vNd zUwVKZz(9J49>P$1gdV|2dW;^!SbBn+z<1Cb~Z5OOE<`-8LvXu&nx}4ALI+nH@@ewD4S`n z(=c#iSGZwv%r9D*v4Abmo$WzOA2!17kKImCVxGQZQ=ZyaEV{C%{=!cDlpVzG ua^tR8V&84`=x(b=j^jsu>Ntn-*IVsb$h~dAp5q^ml03nvDK+&GpTZw~LmXuQ diff --git a/venv/Lib/site-packages/wtforms/widgets/__pycache__/core.cpython-310.pyc b/venv/Lib/site-packages/wtforms/widgets/__pycache__/core.cpython-310.pyc index 638f50cfbe5f64c491b61a329a3b263f569ffded..b082d1b25a25b749bde3b80a05063ff56c4d1e27 100644 GIT binary patch delta 4050 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 diff --git a/venv/Lib/site-packages/wtforms/widgets/core.py b/venv/Lib/site-packages/wtforms/widgets/core.py index 832918e..62d86e9 100644 --- a/venv/Lib/site-packages/wtforms/widgets/core.py +++ b/venv/Lib/site-packages/wtforms/widgets/core.py @@ -1,3 +1,5 @@ +import warnings + from markupsafe import escape from markupsafe import Markup @@ -109,7 +111,7 @@ class ListWidget: html.append(f"

  1. {subfield.label} {subfield()}
  2. ") else: html.append(f"
  3. {subfield()} {subfield.label}
  4. ") - html.append(f"") + html.append("" % self.html_tag) return Markup("".join(html)) @@ -132,15 +134,15 @@ class TableWidget: html = [] if self.with_table_tag: kwargs.setdefault("id", field.id) - table_params = html_params(**kwargs) - html.append(f"
") + html.append("
" % html_params(**kwargs)) hidden = "" for subfield in field: if subfield.type in ("HiddenField", "CSRFTokenField"): hidden += str(subfield) else: html.append( - f"" + "" + % (str(subfield.label), hidden, str(subfield)) ) hidden = "" if self.with_table_tag: @@ -161,6 +163,7 @@ class Input: """ html_params = staticmethod(html_params) + validation_attrs = ["required", "disabled"] def __init__(self, input_type=None): if input_type is not None: @@ -175,8 +178,7 @@ class Input: for k in dir(flags): if k in self.validation_attrs and k not in kwargs: kwargs[k] = getattr(flags, k) - input_params = self.html_params(name=field.name, **kwargs) - return Markup(f"") + return Markup("" % self.html_params(name=field.name, **kwargs)) class TextInput(Input): @@ -229,7 +231,6 @@ class HiddenInput(Input): """ input_type = "hidden" - validation_attrs = ["disabled"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -244,7 +245,6 @@ class CheckboxInput(Input): """ input_type = "checkbox" - validation_attrs = ["required", "disabled"] def __call__(self, field, **kwargs): if getattr(field, "checked", field.data): @@ -261,7 +261,6 @@ class RadioInput(Input): """ input_type = "radio" - validation_attrs = ["required", "disabled"] def __call__(self, field, **kwargs): if field.checked: @@ -301,7 +300,6 @@ class SubmitInput(Input): """ input_type = "submit" - validation_attrs = ["required", "disabled"] def __call__(self, field, **kwargs): kwargs.setdefault("value", field.label.text) @@ -323,10 +321,9 @@ class TextArea: for k in dir(flags): if k in self.validation_attrs and k not in kwargs: kwargs[k] = getattr(flags, k) - textarea_params = html_params(name=field.name, **kwargs) - textarea_innerhtml = escape(field._value()) return Markup( - f"" + "" + % (html_params(name=field.name, **kwargs), escape(field._value())) ) @@ -359,19 +356,37 @@ class Select: for k in dir(flags): if k in self.validation_attrs and k not in kwargs: kwargs[k] = getattr(flags, k) - select_params = html_params(name=field.name, **kwargs) - html = [f"" % html_params(name=field.name, **kwargs)] if field.has_groups(): for group, choices in field.iter_groups(): - optgroup_params = html_params(label=group) - html.append(f"") + html.append("" % html_params(label=group)) for choice in choices: - val, label, selected, render_kw = choice + if len(choice) == 4: + val, label, selected, render_kw = choice + else: + warnings.warn( + "'iter_groups' is expected to return 4 items tuple since " + "wtforms 3.1, this will be mandatory in wtforms 3.2", + DeprecationWarning, + stacklevel=2, + ) + val, label, selected = choice + render_kw = {} html.append(self.render_option(val, label, selected, **render_kw)) html.append("") else: for choice in field.iter_choices(): - val, label, selected, render_kw = choice + if len(choice) == 4: + val, label, selected, render_kw = choice + else: + warnings.warn( + "'iter_groups' is expected to return 4 items tuple since " + "wtforms 3.1, this will be mandatory in wtforms 3.2", + DeprecationWarning, + stacklevel=2, + ) + val, label, selected = choice + render_kw = {} html.append(self.render_option(val, label, selected, **render_kw)) html.append("") return Markup("".join(html)) @@ -549,7 +564,7 @@ class RangeInput(Input): """ input_type = "range" - validation_attrs = ["disabled", "max", "min", "step"] + validation_attrs = ["required", "disabled", "max", "min", "step"] def __init__(self, step=None): self.step = step @@ -566,4 +581,3 @@ class ColorInput(Input): """ input_type = "color" - validation_attrs = ["disabled"]
{subfield.label}{hidden}{subfield}
%s%s%s