Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/build-docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ def load_all_contracts() -> dict[str, Contract]:
for node in ast.get("nodes", []):
if node.get("nodeType") != "ContractDefinition":
continue
if node["name"] != jf.stem:
continue
cid = node["id"]
by_id[cid] = {
"name": node["name"],
Expand Down
51 changes: 51 additions & 0 deletions scripts/test_build_docs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""Regression coverage for source files that declare multiple contracts."""

import importlib.util
import json
from pathlib import Path
import sys
import tempfile
import unittest
from unittest.mock import patch

SPEC = importlib.util.spec_from_file_location(
"build_docs", Path(__file__).with_name("build-docs.py")
)
build_docs = importlib.util.module_from_spec(SPEC)
sys.modules[SPEC.name] = build_docs
SPEC.loader.exec_module(build_docs)


class LoadContractsTests(unittest.TestCase):
def test_each_contract_uses_its_own_artifact(self):
nodes = [
{
"nodeType": "ContractDefinition",
"id": index,
"name": name,
"linearizedBaseContracts": [index],
"nodes": [],
}
for index, name in enumerate(("First", "Second"), 1)
]
with tempfile.TemporaryDirectory() as directory:
out = Path(directory)
source = out / "Multiple.sol"
source.mkdir()
for name in ("First", "Second"):
artifact = {
"ast": {"absolutePath": "src/Multiple.sol", "nodes": nodes},
"rawMetadata": json.dumps(
{"output": {"devdoc": {"details": name + " documentation"}}}
),
}
(source / (name + ".json")).write_text(json.dumps(artifact))
with patch.object(build_docs, "OUT_DIR", out):
contracts = build_docs.load_all_contracts()
self.assertEqual(set(contracts), {"First", "Second"})
for name in ("First", "Second"):
self.assertEqual(contracts[name].notice, name + " documentation")


if __name__ == "__main__":
unittest.main()