Files
AR-VMS-Seaman/pyproject.toml
T
alro65 deb04c9315 sprint-0: fundaciones VMS-Sailor
Sprint 0 completo del producto VMS-Sailor (Vessel Management System
integrado para buques 30-40m). Brief de referencia en
VMS_Sailor_v2_Parte_*.md (intacto).

Core (vmssailor.core, 95.17% coverage, 99 tests verde):
- ShipCoord: sistema naval x_pp/y_cl/z_bl frozen
- Vessel, Deck, Bulkhead
- Equipment, EquipmentModel, Sensor, EquipmentSpec
- Tag, AlarmConfig, TagBinding, Scaling
- CardInstance, Bus, Topology con validacion 21 puntos I/O AR-NMEA-IO-v1.0
- Alarm, PermissiveRule, Condition
- Project agregado raiz con validacion cross-entity
- Persistencia portable .vmsproj (SQLite) con roundtrip verificable

Biblioteca curada seed (vmssailor.library):
- systems_catalog.json completo (catalogo maestro Parte 1 sec 7)
- 2 vessels: Sunseeker 76, Ferretti 850
- 2 motores: MTU 12V 2000 M96, Volvo D13-900
- 1 genset: Northern Lights M65C13
- yacht_motor_planeo.yaml (reglas heuristicas)
- TODO marcado data_source=seed_estimate - requiere validacion datasheets

Tools:
- vms-validate-library: CLI valida biblioteca completa
- vms-generate-test-project: CLI demo + verificacion roundtrip persistencia

Design System + 8 mockups HTML estaticos:
- docs/design_system.md (paleta Deep Ocean, gradientes, typography, motion)
- docs/brand/ (logo + variantes SVG)
- docs/mockups/splash, studio_main, runtime_overview,
  runtime_mimic_fuel (P&ID animado), runtime_alarms, runtime_trim (panel
  estrella con horizonte artificial), mobile_overview, mobile_trim
- docs/mockups/index.html (galeria)

Firmware (Sprint 12+ implementacion):
- firmware/ar_nmea_io_v1/src/config/pinout.h con macros GPIO

Decisiones autonomas documentadas en docs/decisions_sprint0.md.

Stack: Python 3.11 + uv + Pydantic v2 + SQLite stdlib + hatchling +
pytest 9 + ruff + mypy. Sin PySide6, FastAPI, Flutter ni firmware
funcional (entran en sprints siguientes).

Criterio de aceptacion Sprint 0: cumplido.
- uv sync: OK
- pytest: 99/99 verde
- cov vmssailor.core: 95.17% (objetivo >=80%)
- ruff: clean
- vms-validate-library: OK
- vms-generate-test-project: INTEGRIDAD OK

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 07:26:06 -04:00

130 lines
2.9 KiB
TOML

[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]
dev = [
"pytest>=7.4",
"pytest-cov>=4.1",
"pytest-asyncio>=0.23",
"ruff>=0.4.0",
"mypy>=1.10",
"types-PyYAML",
"types-python-dateutil",
]
[project.scripts]
vms-validate-library = "vmssailor.tools.validate_library:main"
vms-generate-test-project = "vmssailor.tools.generate_test_project:main"
[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"]
[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