[build-system] build-backend = "setuptools.build_meta" requires = [ "setuptools>=61.0", "cython>=3; platform_python_implementation == 'CPython'", # Skip cython when using pypy ] [project] name = "SQLAlchemy" description = "Database Abstraction Library" readme = "README.rst" authors = [{name = "Mike Bayer", email = "mike_mp@zzzcomputing.com"}] license = {text = "MIT"} classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", ] requires-python = ">=3.9" dependencies = [ "typing-extensions >= 4.6.0", ] dynamic = ["version"] [project.urls] Homepage = "https://www.sqlalchemy.org" Documentation = "https://docs.sqlalchemy.org" Changelog = "https://docs.sqlalchemy.org/latest/changelog/index.html" "Source Code" = "https://github.com/sqlalchemy/sqlalchemy" "Issue Tracker" = "https://github.com/sqlalchemy/sqlalchemy/issues" Discussions = "https://github.com/sqlalchemy/sqlalchemy/discussions" [project.optional-dependencies] asyncio = ["greenlet>=1"] mypy = [ "mypy >= 1.7", "types-greenlet >= 2" ] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] mysql = ["mysqlclient>=1.4.0"] mysql-connector = ["mysql-connector-python"] mariadb-connector = ["mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10"] oracle = ["cx_oracle>=8"] oracle-oracledb = ["oracledb>=1.0.1"] postgresql = ["psycopg2>=2.7"] postgresql-pg8000 = ["pg8000>=1.29.3"] postgresql-asyncpg = [ "greenlet>=1", # same as ".[asyncio]" if this syntax were supported "asyncpg", ] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopg = ["psycopg>=3.0.7,!=3.1.15"] postgresql-psycopgbinary = ["psycopg[binary]>=3.0.7,!=3.1.15"] pymysql = ["pymysql"] aiomysql = [ "greenlet>=1", # same as ".[asyncio]" if this syntax were supported "aiomysql", ] aioodbc = [ "greenlet>=1", # same as ".[asyncio]" if this syntax were supported "aioodbc", ] asyncmy = [ "greenlet>=1", # same as ".[asyncio]" if this syntax were supported "asyncmy>=0.2.3,!=0.2.4,!=0.2.6", ] aiosqlite = [ "greenlet>=1", # same as ".[asyncio]" if this syntax were supported "aiosqlite", ] sqlcipher = ["sqlcipher3_binary"] # legacy pre-pep-685 names. These are ignored by pip >= 23.3.0 mssql_pymssql = ["sqlalchemy[mssql-pymssql]"] mssql_pyodbc = ["sqlalchemy[mssql-pyodbc]"] mysql_connector = ["sqlalchemy[mysql-connector]"] mariadb_connector = ["sqlalchemy[mariadb-connector]"] oracle_oracledb = ["sqlalchemy[oracle-oracledb]"] postgresql_pg8000 = ["sqlalchemy[postgresql-pg8000]"] postgresql_asyncpg = ["sqlalchemy[postgresql-asyncpg]"] postgresql_psycopg2binary = ["sqlalchemy[postgresql-psycopg2binary]"] postgresql_psycopg2cffi = ["sqlalchemy[postgresql-psycopg2cffi]"] postgresql_psycopg = ["sqlalchemy[postgresql-psycopg]"] postgresql_psycopgbinary = ["sqlalchemy[postgresql-psycopgbinary]"] [tool.setuptools] include-package-data = true license-files = ["LICENSE"] [tool.setuptools.packages.find] where = ["lib"] namespaces = false [tool.setuptools.dynamic] version = {attr = "sqlalchemy.__version__"} [tool.distutils.egg_info] # ref https://github.com/pypa/setuptools/discussions/3348#discussioncomment-6556887 tag-build = "dev" [tool.black] line-length = 79 target-version = ['py39'] [tool.zimports] black-line-length = 79 [tool.slotscheck] exclude-modules = ''' ^sqlalchemy\.testing ''' # disable isort, for IDEs that just default isort to be turned on, e.g. vscode. # we use flake8-import-order for import sorting, using zimports to actually # reformat code. isort is nicer in many ways but doesn't have our # "import *" fixer and also is not 100% compatible with flake8-import-order. [tool.isort] skip_glob=['*'] [tool.pytest.ini_options] addopts = "--tb native -v -r sfxX --maxfail=250 -p warnings -p logging --strict-markers" norecursedirs = "examples build doc lib" python_files = "test_*.py" minversion = "6.2" filterwarnings = [ # NOTE: additional SQLAlchemy specific filters in # sqlalchemy/testing/warnings.py. SQLAlchemy modules cannot be named # here as pytest loads them immediately, which breaks coverage as well # as sys.path adjustments in conftest.py "error::DeprecationWarning:test", "error::DeprecationWarning:sqlalchemy", # sqlite3 warnings due to test/dialect/test_sqlite.py->test_native_datetime, # which is asserting that these deprecated-in-py312 handlers are functional "ignore:The default (date)?(time)?(stamp)? (adapter|converter):DeprecationWarning", ] markers = [ "memory_intensive: memory / CPU intensive suite tests", "mypy: mypy integration / plugin tests", "timing_intensive: time-oriented tests that are sensitive to race conditions", "backend: tests that should run on all backends; typically dialect-sensitive", "sparse_backend: tests that should run on multiple backends, not necessarily all", ] [tool.pyright] reportPrivateUsage = "none" reportUnusedClass = "none" reportUnusedFunction = "none" reportTypedDictNotRequiredAccess = "warning" [tool.mypy] mypy_path = "./lib/" show_error_codes = true incremental = true # would be nice to enable this but too many error are surfaceds # enable_error_code = "ignore-without-code" [[tool.mypy.overrides]] module = [ "sqlalchemy.*" ] warn_unused_ignores = true strict = true [[tool.mypy.overrides]] module = ["cython", "cython.*"] ignore_missing_imports = true [tool.cibuildwheel] test-requires = "pytest pytest-xdist" # remove user site, otherwise the local checkout has precedence, disabling cyextensions test-command = "python -s -m pytest -c {project}/pyproject.toml -n4 -q --nomemory --notimingintensive --nomypy {project}/test" build = "*" # python 3.6, 3.7 are no longer supported by sqlalchemy # pypy uses the universal wheel fallback, since it does not use any compiled extension skip = "cp36-* cp37-* pp*" # TODO: remove this skip once action support arm macs test-skip = "*-macosx_arm64" [tool.cibuildwheel.macos] archs = ["x86_64", "arm64"] # On an Linux Intel runner with qemu installed, build Intel and ARM wheels # NOTE: this is overriden in the pipeline using the CIBW_ARCHS_LINUX env variable to speed up the build [tool.cibuildwheel.linux] archs = ["x86_64", "aarch64"]