Implement complete WebDAV file serving compatible with various clients from Windows File Explorer to more specialized sync tools. The old control WebSocket has been updated to part-DAV, part REST API instead. Implemented user:pass BASIC auth. Added UI and backend for creating tokens that avoid the need to use actual username and password for requests from CLI or DAV.
162 lines
3.5 KiB
TOML
162 lines
3.5 KiB
TOML
[build-system]
|
|
requires = ["hatchling", "hatch-vcs"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "cista"
|
|
dynamic = ["version"]
|
|
description = "Dropbox-like file server with modern web interface"
|
|
readme = "README.md"
|
|
authors = [
|
|
{ name = "Vasanko" },
|
|
]
|
|
maintainers = [
|
|
{ name = "Vasanko" },
|
|
]
|
|
keywords = ["file-server", "web-interface", "dropbox", "storage"]
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Environment :: Web Environment",
|
|
"Intended Audience :: End Users/Desktop",
|
|
"Intended Audience :: System Administrators",
|
|
"License :: Public Domain",
|
|
"License :: OSI Approved :: MIT License",
|
|
]
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"argon2-cffi>=25.1.0",
|
|
"av>=15.0.0",
|
|
"blake3>=1.0.5",
|
|
"docopt-ng>=0.9.0",
|
|
"fastapi-vue>=0.5.2",
|
|
"fastapi[standard]>=0.128.0",
|
|
"html5tagger>=1.3.0",
|
|
"httpx>=0.28.0",
|
|
"inotify>=0.2.12",
|
|
"msgspec>=0.19.0",
|
|
"natsort>=8.4.0",
|
|
"numpy>=2.3.2",
|
|
"pathvalidate>=3.3.1",
|
|
"pillow>=11.3.0",
|
|
"pillow-heif>=1.1.0",
|
|
"pyjwt>=2.10.1",
|
|
"pymupdf>=1.26.3",
|
|
"pyvips[binary]>=3.1.1",
|
|
"sanic>=25.12.0",
|
|
"setproctitle>=1.3.6",
|
|
"stream-zip>=0.0.83",
|
|
"tomli_w>=1.2.0",
|
|
"tracerite>=2.3.1",
|
|
"zstandard>=0.24.0",
|
|
]
|
|
|
|
[project.urls]
|
|
Homepage = "https://git.zi.fi/Vasanko/cista-storage"
|
|
|
|
[project.scripts]
|
|
cista = "cista.__main__:main"
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=8.4.1",
|
|
"ruff>=0.8.0",
|
|
"mypy>=1.13.0",
|
|
"pre-commit>=4.0.0",
|
|
]
|
|
test = [
|
|
"pytest>=8.4.1",
|
|
"pytest-cov>=6.0.0",
|
|
"pytest-asyncio>=0.25.0",
|
|
]
|
|
docs = [
|
|
"sphinx>=8.0.0",
|
|
"sphinx-rtd-theme>=3.0.0",
|
|
]
|
|
|
|
[tool.hatch.version]
|
|
source = "vcs"
|
|
|
|
[tool.hatch.build]
|
|
artifacts = ["cista/frontend-build"]
|
|
targets.sdist.hooks.custom.path = "scripts/fastapi-vue/build-frontend.py"
|
|
targets.sdist.include = [
|
|
"/cista",
|
|
]
|
|
hooks.vcs.version-file = "cista/_version.py"
|
|
hooks.vcs.template = """
|
|
# This file is automatically generated by hatch build.
|
|
__version__ = {version!r}
|
|
"""
|
|
only-packages = true
|
|
packages = ["cista"]
|
|
|
|
[tool.pytest.ini_options]
|
|
addopts = [
|
|
"--import-mode=importlib",
|
|
"--verbosity=2",
|
|
"--strict-markers",
|
|
"--strict-config",
|
|
"--cov=cista",
|
|
"--cov-report=term-missing",
|
|
"--cov-report=html",
|
|
"--cov-branch",
|
|
]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py", "*_test.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
markers = [
|
|
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
"integration: marks tests as integration tests",
|
|
]
|
|
filterwarnings = [
|
|
"error",
|
|
"ignore::UserWarning",
|
|
"ignore::DeprecationWarning",
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
extend-select = ["E402"]
|
|
isort.known-first-party = ["cista"]
|
|
per-file-ignores."tests/*" = ["S", "ANN", "D", "INP", "PLR2004"]
|
|
per-file-ignores."scripts/*" = ["T20"]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest>=8.4.1",
|
|
"pytest-asyncio>=0.25.0",
|
|
"pytest-cov>=7.0.0",
|
|
"ruff>=0.8.0",
|
|
"mypy>=1.13.0",
|
|
"pre-commit>=4.0.0",
|
|
"httpx>=0.28.1",
|
|
"sanic-testing>=24.6.0",
|
|
]
|
|
|
|
[tool.coverage.run]
|
|
source = ["cista"]
|
|
branch = true
|
|
omit = [
|
|
"*/tests/*",
|
|
"*/test_*",
|
|
"*/__pycache__/*",
|
|
"cista/_version.py",
|
|
]
|
|
|
|
[tool.coverage.report]
|
|
exclude_lines = [
|
|
"pragma: no cover",
|
|
"def __repr__",
|
|
"if self.debug:",
|
|
"if settings.DEBUG",
|
|
"raise AssertionError",
|
|
"raise NotImplementedError",
|
|
"if 0:",
|
|
"if __name__ == .__main__.:",
|
|
"class .*\\bProtocol\\):",
|
|
"@(abc\\.)?abstractmethod",
|
|
]
|
|
show_missing = true
|
|
skip_covered = false
|
|
precision = 2
|