Skip to content

Commit d19f534

Browse files
ryuwdclaude
andcommitted
refactor(cli): remove legacy dirac jobs command group
Move search utilities into job/search.py and remove jobs.py entirely. dirac job search is now the only search entry point. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 700504c commit d19f534

File tree

3 files changed

+101
-155
lines changed

3 files changed

+101
-155
lines changed

diracx-cli/pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ dirac-cwl-run = "diracx.cli.executor.__main__:cli"
4040

4141
[project.entry-points."diracx.cli"]
4242
job = "diracx.cli.job:app"
43-
jobs = "diracx.cli.jobs:app"
4443
config = "diracx.cli.config:app"
4544

4645
[project.entry-points."diracx.cli.hidden"]

diracx-cli/src/diracx/cli/job/search.py

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,115 @@
22

33
__all__: list[str] = []
44

5+
import json
6+
import re
57
from typing import Annotated, cast
68

9+
from rich.console import Console
10+
from rich.table import Table
711
from typer import Option
812

913
from diracx.client.aio import AsyncDiracClient
14+
from diracx.core.models.search import (
15+
ScalarSearchOperator,
16+
SearchSpec,
17+
VectorSearchOperator,
18+
)
19+
from diracx.core.preferences import OutputFormats, get_diracx_preferences
1020

11-
from ..jobs import ContentRange, available_operators, display, parse_condition
1221
from . import app
1322

23+
available_operators = (
24+
f"Scalar operators: {', '.join([op.value for op in ScalarSearchOperator])}. "
25+
f"Vector operators: {', '.join([op.value for op in VectorSearchOperator])}."
26+
)
27+
28+
29+
def parse_condition(value: str) -> SearchSpec:
30+
parameter, operator, rest = value.split(" ", 2)
31+
if operator in set(ScalarSearchOperator):
32+
return {
33+
"parameter": parameter,
34+
"operator": ScalarSearchOperator(operator),
35+
"value": rest,
36+
}
37+
elif operator in set(VectorSearchOperator):
38+
return {
39+
"parameter": parameter,
40+
"operator": VectorSearchOperator(operator),
41+
"values": json.loads(rest),
42+
}
43+
else:
44+
raise ValueError(f"Unknown operator {operator}")
45+
46+
47+
class ContentRange:
48+
unit: str | None = None
49+
start: int | None = None
50+
end: int | None = None
51+
total: int | None = None
52+
53+
def __init__(self, header: str):
54+
if match := re.fullmatch(r"(\w+) (\d+-\d+|\*)/(\d+|\*)", header):
55+
self.unit, range, total = match.groups()
56+
self.total = int(total)
57+
if range != "*":
58+
self.start, self.end = map(int, range.split("-"))
59+
elif match := re.fullmatch(r"\w+", header):
60+
self.unit = match.group()
61+
62+
@property
63+
def caption(self):
64+
if self.start is None and self.end is None:
65+
range_str = "all"
66+
else:
67+
range_str = (
68+
f"{self.start if self.start is not None else 'unknown'}-"
69+
f"{self.end if self.end is not None else 'unknown'} "
70+
f"of {self.total or 'unknown'}"
71+
)
72+
return f"Showing {range_str} {self.unit}"
73+
74+
75+
def display(data, content_range: ContentRange):
76+
output_format = get_diracx_preferences().output_format
77+
match output_format:
78+
case OutputFormats.JSON:
79+
print(json.dumps(data, indent=2))
80+
case OutputFormats.RICH:
81+
display_rich(data, content_range)
82+
case _:
83+
raise NotImplementedError(output_format)
84+
85+
86+
def display_rich(data, content_range: ContentRange) -> None:
87+
if not data:
88+
print(f"No {content_range.unit} found")
89+
return
90+
91+
console = Console()
92+
columns = [str(c) for c in data[0].keys()]
93+
if sum(map(len, columns)) > 0.75 * console.width:
94+
table = Table(
95+
"Parameter",
96+
"Value",
97+
caption=content_range.caption,
98+
caption_justify="right",
99+
)
100+
for job in data:
101+
for k, v in job.items():
102+
table.add_row(k, str(v))
103+
table.add_section()
104+
else:
105+
table = Table(
106+
*columns,
107+
caption=content_range.caption,
108+
caption_justify="right",
109+
)
110+
for job in data:
111+
table.add_row(*map(str, job.values()))
112+
console.print(table)
113+
14114

15115
@app.async_command()
16116
async def search(

diracx-cli/src/diracx/cli/jobs.py

Lines changed: 0 additions & 153 deletions
This file was deleted.

0 commit comments

Comments
 (0)