Repository URLs, version strings, and example creds normalized for the public git.sulkta.com endpoint. No code-behavior change. Audit-applied by the public-flip rolling-audit pass — see kayos/openclaw-workspace memory/2026-05-27 logs for the campaign context.
109 lines
3 KiB
TOML
109 lines
3 KiB
TOML
[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"
|