Files
aci-sim/pyproject.toml
T
dtzp555-maxandClaude Fable 5 867c05c9c5 feat: APIC-style write validation, query-target=children, contract shadow mirroring (v0.21.0)
Three fidelity gaps surfaced by one broken TN2 var file (missing firewall
block), all fixed:
- writes: reject malformed fvSubnet/l3extSubnet/vnsRedirectDest ip values
  with an APIC-style 400 before any store mutation (deletes exempt)
- query engine: support query-target=children (direct children, flat
  imdata, root excluded) — was silently returning empty
- deploy mirror: materialize vzFilter/vzEntry, vzBrCP/vzSubj (+ filter and
  service-graph subject bindings) and vnsAbsGraph shadows per target site;
  undeploy removes them

E2E-verified through the real pipeline (aci-py hidden push): a TN2 var
missing the fw block now fails with 'Invalid value "." for property ip of
vnsRedirectDest ... -> 400' and nothing lands; a complete var set builds
both MS tenants with contract shadows + sgt-FW graph binding on both sites.
Suite: 914 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 18:11:59 +10:00

71 lines
2.1 KiB
TOML

[project]
name = "aci-sim"
version = "0.21.0"
description = "Faithful REST simulator of a 2-site Cisco ACI fabric (per-site APIC + ND/NDO)"
readme = "README.md"
license = "PolyForm-Noncommercial-1.0.0"
authors = [
{ name = "aci-sim contributors" },
]
requires-python = ">=3.11"
classifiers = [
# No license classifier: the SPDX `license` field above supersedes
# license classifiers (PEP 639)
# and modern setuptools rejects having both.
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: System :: Networking",
"Topic :: Software Development :: Testing",
"Typing :: Typed",
]
# Runtime dependencies are declared statically here (NOT `dynamic`) so that a
# plain `pip install aci-sim` / `pip install .` pulls them in. requirements.txt
# is kept as a dev convenience (it also lists the test-only extras below).
dependencies = [
"fastapi>=0.110",
"uvicorn[standard]>=0.29",
"pydantic>=2.6",
"pyyaml>=6.0",
]
[project.optional-dependencies]
# Test/dev-only — not needed to run the simulator. `pip install -e '.[dev]'`.
dev = [
"httpx>=0.27",
"pytest>=8.0",
"pytest-asyncio>=0.23",
]
[project.urls]
Homepage = "https://github.com/dtzp555-max/aci-sim"
Repository = "https://github.com/dtzp555-max/aci-sim"
Changelog = "https://github.com/dtzp555-max/aci-sim/blob/main/CHANGELOG.md"
[project.scripts]
aci-sim = "aci_sim.cli:main"
[tool.setuptools.packages.find]
# Auto-discover ALL subpackages (aci_sim.topology/build/rest_aci/ndo/
# mit/runtime/query/control/...) — a bare `packages = ["aci_sim"]` would
# ship only the top-level module and omit every subpackage.
include = ["aci_sim*"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
[tool.ruff]
line-length = 100
target-version = "py311"
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]
ignore = ["E501"]