наблюдаемость: ввести безопасный контракт метрик
CI / Rust Checks (pull_request) Successful in 6m15s
CI / UI Checks (pull_request) Successful in 5s
CI / Community Image Smoke (pull_request) Successful in 4m25s
CI / Frontend E2E (pull_request) Successful in 5m17s
CI / Deploy (pull_request) Has been skipped
CI / Rust Checks (push) Successful in 6m9s
CI / UI Checks (push) Successful in 5s
CI / Community Image Smoke (push) Successful in 1m3s
CI / Frontend E2E (push) Successful in 3m47s
CI / Deploy (push) Failing after 3s

This commit is contained in:
2026-07-31 05:04:01 +03:00
parent ec2453c00f
commit 9b1a739e39
50 changed files with 3066 additions and 433 deletions
+59
View File
@@ -27,6 +27,10 @@ def package(root: Path, name: str, rel_dir: str, dependencies: list[str] | None
}
def dependency(name: str, kind: str | None = None) -> dict:
return {"name": name, "kind": kind}
def metadata(packages: list[dict], root: Path | None = None) -> dict:
root = root or Path("/tmp/crank")
return {
@@ -124,6 +128,44 @@ class RustBoundaryCheckTests(unittest.TestCase):
self.assertEqual(violations[0].source, "crank-observability")
self.assertEqual(violations[0].dependency, dependency)
def test_allows_observability_and_product_crates_to_depend_on_metrics_contract(self) -> None:
packages = [
package(
self.root,
"crank-observability",
"crates/crank-observability",
["crank-metrics"],
),
package(
self.root,
"crank-runtime",
"crates/crank-runtime",
["crank-metrics"],
),
package(self.root, "crank-metrics", "crates/crank-metrics"),
]
violations = self.checker.find_violations(metadata(packages, self.root))
self.assertEqual(violations, [])
def test_rejects_metrics_contract_dependency_on_workspace_crates(self) -> None:
packages = [
package(
self.root,
"crank-metrics",
"crates/crank-metrics",
["crank-core"],
),
package(self.root, "crank-core", "crates/crank-core"),
]
violations = self.checker.find_violations(metadata(packages, self.root))
self.assertEqual(len(violations), 1)
self.assertEqual(violations[0].source, "crank-metrics")
self.assertEqual(violations[0].dependency, "crank-core")
def test_rejects_domain_and_runtime_dependencies_on_observability(self) -> None:
for source in ("crank-core", "crank-registry", "crank-runtime"):
packages = [
@@ -146,6 +188,23 @@ class RustBoundaryCheckTests(unittest.TestCase):
self.assertEqual(violations[0].source, source)
self.assertEqual(violations[0].dependency, "crank-observability")
def test_rejects_direct_production_metrics_dependency_outside_contract(self) -> None:
app = package(self.root, "admin-api", "apps/admin-api")
app["dependencies"] = [dependency("metrics")]
violations = self.checker.find_violations(metadata([app], self.root))
self.assertEqual(len(violations), 1)
self.assertEqual(violations[0].dependency, "metrics")
def test_allows_metrics_as_test_only_dependency(self) -> None:
app = package(self.root, "admin-api", "apps/admin-api")
app["dependencies"] = [dependency("metrics", "dev")]
violations = self.checker.find_violations(metadata([app], self.root))
self.assertEqual(violations, [])
if __name__ == "__main__":
unittest.main()