blob: b238e049e33c0401520f72ffdf485a9ec62fe9e7 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
[build-system]
requires = ["maturin>=1.8.1"]
build-backend = "maturin"
[project]
name = "datafusion"
description = "Build and run queries against data"
readme = "README.md"
license = { file = "LICENSE.txt" }
requires-python = ">=3.10"
keywords = ["dataframe", "datafusion", "query-engine", "rust"]
classifiers = [
"Development Status :: 2 - Pre-Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"License :: OSI Approved",
"Operating System :: MacOS",
"Operating System :: Microsoft :: Windows",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python",
"Programming Language :: Rust",
]
dependencies = [
"pyarrow>=16.0.0;python_version<'3.14'",
"pyarrow>=22.0.0;python_version>='3.14'",
"typing-extensions;python_version<'3.13'",
]
dynamic = ["version"]
[project.urls]
homepage = "https://datafusion.apache.org/python"
documentation = "https://datafusion.apache.org/python"
repository = "https://github.com/apache/datafusion-python"
[tool.isort]
profile = "black"
[tool.maturin]
python-source = "python"
module-name = "datafusion._internal"
include = [{ path = "Cargo.lock", format = "sdist" }]
exclude = [".asf.yaml", ".github/**", "ci/**"]
# Require Cargo.lock is up to date
locked = true
features = ["substrait"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
addopts = "--doctest-modules"
doctest_optionflags = ["NORMALIZE_WHITESPACE", "ELLIPSIS"]
testpaths = ["python/tests", "python/datafusion"]
# Enable docstring linting using the google style guide
[tool.ruff.lint]
select = ["ALL"]
ignore = [
"A001", # Allow using words like min as variable names
"A002", # Allow using words like filter as variable names
"A005", # Allow module named io
"ANN401", # Allow Any for wrapper classes
"COM812", # Recommended to ignore these rules when using with ruff-format
"FBT001", # Allow boolean positional args
"FBT002", # Allow boolean positional args
"FIX002", # Allow TODO lines - consider removing at some point
"ISC001", # Recommended to ignore these rules when using with ruff-format
"N812", # Allow importing functions as `F`
"PD901", # Allow variable name df
"PLR0913", # Allow many arguments in function definition
"SLF001", # Allow accessing private members
"TD002", # Do not require author names in TODO statements
"TD003", # Allow TODO lines
]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.lint.pycodestyle]
max-doc-length = 88
[tool.ruff.lint.flake8-boolean-trap]
extend-allowed-calls = ["datafusion.lit", "lit"]
# Disable docstring checking for these directories
[tool.ruff.lint.per-file-ignores]
"python/tests/*" = [
"ANN",
"ARG",
"BLE001",
"D",
"PD",
"PLC0415",
"PLR0913",
"PLR2004",
"PT004",
"PT011",
"RUF015",
"S101",
"S608",
"SLF",
]
"examples/*" = [
"ANN001",
"ANN202",
"D",
"DTZ007",
"E501",
"INP001",
"PLR2004",
"RUF015",
"S101",
"T201",
"W505",
]
"dev/*" = [
"ANN001",
"C",
"D",
"E",
"ERA001",
"EXE",
"N817",
"PLR",
"S",
"SIM",
"T",
"UP",
]
"benchmarks/*" = [
"ANN001",
"BLE",
"D",
"E",
"ERA001",
"EXE",
"F",
"FURB",
"INP001",
"PLR",
"S",
"SIM",
"T",
"TD",
"TRY",
"UP",
]
"docs/*" = ["D"]
"docs/source/conf.py" = ["ANN001", "ERA001", "INP001"]
[tool.codespell]
skip = ["./python/tests/test_functions.py", "./target", "uv.lock"]
count = true
ignore-words-list = ["IST", "ans"]
[dependency-groups]
dev = [
"arro3-core==0.6.5",
"codespell==2.4.1",
"maturin>=1.8.1",
"nanoarrow==0.8.0",
"numpy>1.25.0;python_version<'3.14'",
"numpy>=2.3.2;python_version>='3.14'",
"pre-commit>=4.3.0",
"pyarrow>=19.0.0",
"pygithub==2.5.0",
"pytest-asyncio>=0.23.3",
"pytest>=7.4.4",
"pyyaml>=6.0.3",
"ruff>=0.9.1",
"toml>=0.10.2",
]
docs = [
"ipython>=8.12.3",
"jinja2>=3.1.5",
"myst-parser>=3.0.1",
"pandas>=2.0.3",
"pickleshare>=0.7.5",
"pydata-sphinx-theme==0.8.0",
"setuptools>=75.3.0",
"sphinx-autoapi>=3.4.0",
"sphinx>=7.1.2",
]