[build-system] requires = ["setuptools>=64.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "syft" dynamic = ["version"] description = "PySyft : privacy-preserving data science over file-based transports." readme = "README.md" authors = [ {name = "OpenMined", email = "info@openmined.org"} ] license = {text = "Apache-2.0"} requires-python = ">=3.10" keywords = ["privacy", "federated-learning", "google-drive", "communication"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Security :: Cryptography", "Topic :: Communications :: File Sharing" ] dependencies = [ "google-api-python-client>=2.95.0", "google-auth[pyjwt]>=2.22.0", "google-auth-oauthlib>=1.0.0", "rich>=13.0.0", "pydantic-settings>=2.11.0", "portalocker>=2.8.0", "syft-permissions==0.1.15", "syft-perms==0.1.15", "syft-migration==0.1.1", "syft-crypto-python>=0.1.2b2", "syft-dataset==0.1.21", ] [tool.uv] default-groups = ["dev", "test"] [tool.uv.workspace] members = ["packages/*"] [tool.uv.sources] "syft-job" = { workspace = true } "syft-notebook-ui" = { workspace = true } "syft-dataset" = { workspace = true } "syft-bg" = { workspace = true } "syft-permissions" = { workspace = true } "syft-perms" = { workspace = true } "syft-enclave" = { workspace = true } "enclave-model-api-example" = { workspace = true } "syft-restrict" = { workspace = true } "syft-migration" = { workspace = true } [project.urls] Homepage = "https://github.com/OpenMined/PySyft" Repository = "https://github.com/OpenMined/PySyft" Documentation = "https://github.com/OpenMined/PySyft#readme" "Bug Tracker" = "https://github.com/OpenMined/PySyft/issues" [tool.setuptools.dynamic] version = {attr = "syft.version.SYFT_VERSION"} [tool.setuptools.packages.find] where = ["."] # Exact names, no namespace discovery: a stale `syft_client/` or `__pycache__` # tree left in a checkout must never end up in the wheel. include = ["syft", "syft.*"] namespaces = false [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_functions = ["test_*"] markers = [ "unit: Unit tests (fast, mocked)", "integration: Integration tests (slow, real API)", "cleanup: Tests that require cleanup", "slow: Tests that take a long time to run", "flaky: Tests that may fail intermittently and should be retried" ] addopts = [ "--strict-markers", "--strict-config" ] filterwarnings = [ "ignore::DeprecationWarning", "ignore::PendingDeprecationWarning" ] [tool.coverage.run] source = ["syft"] omit = [ "*/tests/*", "*/test_*.py", "setup.py" ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:" ] [tool.ruff] # Obfuscator output is deliberately not valid Python; keep it out of lint/format. extend-exclude = ["*.obfuscated.py"] [tool.isort] profile = "black" multi_line_output = 3 line_length = 88 known_first_party = ["syft"] skip_glob = ["**/__pycache__/**"] [tool.prettier] single_quote = true [tool.flake8] max-line-length = 88 extend-ignore = [ "E203", # whitespace before ':' "E501", # line too long (handled by black) "W503", # line break before binary operator "W504" # line break after binary operator ] exclude = [ ".git", "__pycache__", "build", "dist", "*.egg-info", ".venv", ".tox" ] [tool.bandit] exclude_dirs = ["tests", "build", "dist", ".venv", "venv"] skips = ["B101"] # Skip assert_used (needed in tests) [tool.bandit.assert_used] skips = ["*/test_*.py", "*/tests/*"] [dependency-groups] dev = [ "pre-commit>=4.3.0", "jupyter>=1.0.0", "notebook>=6.5.0", "tornado>=6.5.5", "ipython>=8.0.0", # needed by the jupyter MCP server (stateful cell execution from Claude Code) "jupyter-collaboration>=4.0.0", "jupyter-mcp-tools>=0.1.4", ] test = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", "pytest-xdist>=3.0.0", "pytest-rerunfailures>=14.0", "black>=26.3.1", "flake8>=6.0.0", "mypy>=1.0.0", "isort>=5.12.0", "coverage>=7.0.0", "enclave-model-api-example[test]", # pulls fastapi/httpx for the inference server tests "syft-bg==0.3.12", # tests/unit/syft_bg/ lives under this package's testpaths and imports syft_bg "syft-enclave==0.1.1", "syft-restrict==0.1.0", "syft-migration==0.1.1", "pyarrow", # only used by parquet test fixtures (tests/unit/utils.py) ]