feat: initialize XAS test console with native execution
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
"""Project a file inventory into reviewed, runnable test entry points."""
|
||||
import fnmatch
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def relative_path(settings, item):
|
||||
source = next((s for s in settings.sources if s["id"] == item["source_group"]), None)
|
||||
if not source:
|
||||
return None
|
||||
try:
|
||||
return Path(item["source_path"]).relative_to(Path(source["path"])).as_posix()
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
|
||||
def definition(settings, item):
|
||||
if item["kind"] == "managed":
|
||||
return next((d for d in settings.test_definitions
|
||||
if d.get("managed_profile") == item["config"]["profile"]), {})
|
||||
path = relative_path(settings, item)
|
||||
return next((d for d in settings.test_definitions
|
||||
if d.get("source_group") == item["source_group"] and d.get("entry") == path), None)
|
||||
|
||||
|
||||
def is_entry(settings, item):
|
||||
return definition(settings, item) is not None
|
||||
|
||||
|
||||
def members(settings, item, inventory):
|
||||
spec = definition(settings, item)
|
||||
if spec is None:
|
||||
raise ValueError("此文件是内部源码,请从测试项目入口查看相关文件")
|
||||
result = []
|
||||
for candidate in inventory:
|
||||
path = relative_path(settings, candidate)
|
||||
match = next((m for m in spec.get("members", [])
|
||||
if candidate["source_group"] == m["source_group"] and path is not None
|
||||
and (m["pattern"] == "**/*" or fnmatch.fnmatchcase(path, m["pattern"]))), None)
|
||||
if candidate["id"] != item["id"] and match is None:
|
||||
continue
|
||||
role = "entry" if candidate["id"] == item["id"] else (match or {}).get("role", "support")
|
||||
if role == "support" and path and ("tests" in Path(path).parts or Path(path).name.startswith("release-")):
|
||||
role = "self_test"
|
||||
result.append({"id": candidate["id"], "name": Path(candidate["source_path"]).name,
|
||||
"source_path": candidate["source_path"], "relative_path": path or Path(candidate["source_path"]).name,
|
||||
"source_group": candidate["source_group"], "role": role, "status": candidate["status"]})
|
||||
return sorted(result, key=lambda f: (f["role"] != "entry", f["source_group"], f["relative_path"]))
|
||||
|
||||
|
||||
def describe(settings, item, inventory):
|
||||
from .native_plans import public_execution
|
||||
result = dict(item)
|
||||
spec = definition(settings, item)
|
||||
result["is_test"] = spec is not None
|
||||
result["execution"] = public_execution(settings, item)
|
||||
if spec is None:
|
||||
result.update(test_kind="source", category="source", file_count=1, enabled=False)
|
||||
return result
|
||||
example = item.get("synthetic", False) or item["id"] in settings.example_script_ids
|
||||
result.update(test_kind=spec.get("kind", "test"), category="example" if example else "test",
|
||||
file_count=len(members(settings, item, inventory)))
|
||||
if item["kind"] == "external" and item["name"] == Path(item["source_path"]).name:
|
||||
result["name"] = spec.get("name", item["name"])
|
||||
if not item.get("description"):
|
||||
result["description"] = spec.get("description", "")
|
||||
return result
|
||||
|
||||
|
||||
def tests(settings, inventory, include_examples=False):
|
||||
result = [describe(settings, item, inventory) for item in inventory if is_entry(settings, item)]
|
||||
result = [item for item in result if include_examples or item["category"] != "example"]
|
||||
return sorted(result, key=lambda s: (not s["enabled"], s["category"] == "example", s["source_group"], s["name"]))
|
||||
Reference in New Issue
Block a user