generated from coulomb/repo-seed
Workplan dependencies and prio for text research lab workplans
This commit is contained in:
@@ -16,6 +16,7 @@ from markitect_tool.contract import (
|
||||
load_contract_file,
|
||||
validate_contract,
|
||||
)
|
||||
from markitect_tool.query import InvalidQueryError, extract_document, query_document
|
||||
from markitect_tool.schema import load_schema_file, validate_markdown_file, validate_schema
|
||||
|
||||
|
||||
@@ -65,6 +66,60 @@ def metrics(file: Path, output_format: str) -> None:
|
||||
_emit_metrics(data, output_format)
|
||||
|
||||
|
||||
@main.command()
|
||||
@click.argument("file", type=click.Path(exists=True, dir_okay=False, path_type=Path))
|
||||
@click.argument("selector")
|
||||
@click.option(
|
||||
"--format",
|
||||
"output_format",
|
||||
type=click.Choice(["json", "yaml", "text"], case_sensitive=False),
|
||||
default="json",
|
||||
show_default=True,
|
||||
)
|
||||
def query(file: Path, selector: str, output_format: str) -> None:
|
||||
"""Query structured Markdown content with a small selector."""
|
||||
|
||||
document = parse_markdown_file(file)
|
||||
try:
|
||||
matches = query_document(document, selector)
|
||||
except InvalidQueryError as exc:
|
||||
raise click.ClickException(str(exc)) from exc
|
||||
data = {
|
||||
"selector": selector,
|
||||
"document_path": str(file),
|
||||
"count": len(matches),
|
||||
"matches": [match.to_dict() for match in matches],
|
||||
}
|
||||
_emit_query(data, output_format)
|
||||
|
||||
|
||||
@main.command()
|
||||
@click.argument("file", type=click.Path(exists=True, dir_okay=False, path_type=Path))
|
||||
@click.argument("selector")
|
||||
@click.option(
|
||||
"--format",
|
||||
"output_format",
|
||||
type=click.Choice(["text", "json", "yaml"], case_sensitive=False),
|
||||
default="text",
|
||||
show_default=True,
|
||||
)
|
||||
def extract(file: Path, selector: str, output_format: str) -> None:
|
||||
"""Extract text or Markdown content from structured Markdown."""
|
||||
|
||||
document = parse_markdown_file(file)
|
||||
try:
|
||||
items = extract_document(document, selector)
|
||||
except InvalidQueryError as exc:
|
||||
raise click.ClickException(str(exc)) from exc
|
||||
data = {
|
||||
"selector": selector,
|
||||
"document_path": str(file),
|
||||
"count": len(items),
|
||||
"items": items,
|
||||
}
|
||||
_emit_extract(data, output_format)
|
||||
|
||||
|
||||
@main.command()
|
||||
@click.argument("file", type=click.Path(exists=True, dir_okay=False, path_type=Path))
|
||||
@click.option(
|
||||
@@ -214,5 +269,28 @@ def _emit_metrics(data: dict, output_format: str) -> None:
|
||||
)
|
||||
|
||||
|
||||
def _emit_query(data: dict, output_format: str) -> None:
|
||||
if output_format == "json":
|
||||
click.echo(json.dumps(data, indent=2, ensure_ascii=False))
|
||||
elif output_format == "yaml":
|
||||
click.echo(yaml.safe_dump(data, sort_keys=False))
|
||||
else:
|
||||
click.echo(f"{data['count']} match(es)")
|
||||
for match in data["matches"]:
|
||||
location = f":{match['line']}" if match.get("line") else ""
|
||||
click.echo(f"- {match['kind']} {match['path']}{location}")
|
||||
if match.get("text"):
|
||||
click.echo(f" {match['text'].splitlines()[0]}")
|
||||
|
||||
|
||||
def _emit_extract(data: dict, output_format: str) -> None:
|
||||
if output_format == "json":
|
||||
click.echo(json.dumps(data, indent=2, ensure_ascii=False))
|
||||
elif output_format == "yaml":
|
||||
click.echo(yaml.safe_dump(data, sort_keys=False))
|
||||
else:
|
||||
click.echo("\n\n".join(data["items"]))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user