[build-system] requires = ["setuptools>=68", "wheel"] build-backend = "setuptools.build_meta" [project] name = "ispconfig" version = "0.2.0" description = "Python SDK for the ISPConfig remote SOAP API." readme = "README.md" license = { text = "MIT" } requires-python = ">=3.10" authors = [ { name = "Sulkta Coop" }, ] # Zero runtime deps on purpose. ISPConfig's SOAP endpoint disables WSDL # generation (?wsdl returns a fault), so zeep can't help us anyway — we # hand-roll envelopes with the stdlib. dependencies = [] [project.optional-dependencies] dev = [ "pytest>=7", "mypy>=1.8", "ruff>=0.3", ] [project.urls] Homepage = "https://git.sulkta.com/Sulkta-Coop/ispconfig-py" [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] ispconfig = ["py.typed"] # ---- mypy ----------------------------------------------------------- [tool.mypy] python_version = "3.10" packages = ["ispconfig"] mypy_path = "src" strict_optional = true warn_unused_ignores = true warn_redundant_casts = true warn_return_any = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true no_implicit_optional = true # We intentionally don't enable `disallow_any_expr` — SOAP responses are # dicts of Any and forcing typing everywhere would create fake certainty. [[tool.mypy.overrides]] module = "ispconfig.types" disallow_untyped_defs = false # ---- ruff ----------------------------------------------------------- [tool.ruff] line-length = 110 target-version = "py310" src = ["src"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # pyflakes "W", # pycodestyle warnings "I", # isort "B", # bugbear "UP", # pyupgrade "N", # pep8-naming "SLF", # flake8-self (private access) "RUF", ] ignore = [ "E501", # line length — handled by formatter when it cares "N818", # exception suffix — our hierarchy predates this rule "B008", # function calls in argument defaults — not our style anyway ] [tool.ruff.lint.per-file-ignores] "tests/*" = ["SLF001", "N802"] # Submodules call back into the client's dispatcher (`_call`) by design — # it's the single chokepoint for session management and retry logic. # Every submodule needs this waiver; generator output follows the same pattern. "src/ispconfig/admin.py" = ["SLF001"] "src/ispconfig/aps.py" = ["SLF001"] "src/ispconfig/backups.py" = ["SLF001"] "src/ispconfig/clients.py" = ["SLF001"] "src/ispconfig/cron.py" = ["SLF001"] "src/ispconfig/databases.py" = ["SLF001"] "src/ispconfig/dns.py" = ["SLF001"] "src/ispconfig/domains.py" = ["SLF001"] "src/ispconfig/ftp.py" = ["SLF001"] "src/ispconfig/mail.py" = ["SLF001"] "src/ispconfig/misc.py" = ["SLF001"] "src/ispconfig/monitor.py" = ["SLF001"] "src/ispconfig/openvz.py" = ["SLF001"] "src/ispconfig/server.py" = ["SLF001"] "src/ispconfig/shell.py" = ["SLF001"] "src/ispconfig/sites.py" = ["SLF001"] "src/ispconfig/webdav.py" = ["SLF001"] # ---- pytest --------------------------------------------------------- [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra"