[project] name = "vmssailor" version = "0.1.0.dev0" description = "VMS-Sailor — Vessel Management System integrado (IAS) para buques 30-40m. Studio + Runtime + Mobile + Firmware." readme = "README.md" requires-python = ">=3.11,<3.12" license = { text = "Proprietary — Álvaro" } authors = [ { name = "Álvaro (Aerom)" } ] keywords = ["marine", "vessel-management", "ias", "automation", "nmea2000", "modbus", "ecdis"] dependencies = [ "pydantic>=2.5,<3.0", "pyyaml>=6.0", "python-dateutil>=2.8", ] [project.optional-dependencies] studio = [ "PySide6>=6.6,<7.0", ] runtime = [ "fastapi>=0.110", "uvicorn[standard]>=0.27", "websockets>=12.0", "duckdb>=0.10", "pymodbus>=3.5,<4.0", "python-can>=4.3", "httpx>=0.27", ] dev = [ "pytest>=7.4", "pytest-cov>=4.1", "pytest-asyncio>=0.23", "pytest-qt>=4.4", "ruff>=0.4.0", "mypy>=1.10", "types-PyYAML", "types-python-dateutil", "PySide6>=6.6,<7.0", "fastapi>=0.110", "uvicorn[standard]>=0.27", "duckdb>=0.10", "httpx>=0.27", ] [project.scripts] vms-validate-library = "vmssailor.tools.validate_library:main" vms-generate-test-project = "vmssailor.tools.generate_test_project:main" vms-studio = "vmssailor.studio.app:run_studio" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["vmssailor"] # ---------- ruff ---------- [tool.ruff] line-length = 100 target-version = "py311" extend-exclude = ["projects", "firmware", "mobile", "docs/mockups"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # bugbear "C4", # comprehensions "UP", # pyupgrade "SIM", # simplify "RUF", # ruff-specific ] ignore = [ "E501", # handled by formatter ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["B011"] "tools/**" = ["E402"] "vmssailor/studio/**" = ["RUF001", "E402"] # caracteres tipograficos intencionales en UI ES; imports diferidos de Signal/Property en QWizard [tool.ruff.format] quote-style = "double" # ---------- mypy ---------- [tool.mypy] python_version = "3.11" strict = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true warn_return_any = true warn_unreachable = true exclude = ["^build/", "^dist/", "^projects/", "^firmware/", "^mobile/", "^docs/"] [[tool.mypy.overrides]] module = ["tests.*", "tools.*"] disallow_untyped_defs = false [[tool.mypy.overrides]] module = ["yaml.*", "dateutil.*"] ignore_missing_imports = true # ---------- pytest ---------- [tool.pytest.ini_options] minversion = "7.4" testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-ra", "--strict-markers", "--strict-config", "--tb=short", ] markers = [ "slow: marks tests as slow", "integration: cross-module integration tests", ] asyncio_mode = "auto" [tool.coverage.run] source = ["vmssailor"] omit = [ "vmssailor/studio/*", "vmssailor/runtime/*", "vmssailor/__init__.py", "vmssailor/version.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] fail_under = 80 show_missing = true