deepctl-cmd-requests 0.0.2__tar.gz → 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepctl-cmd-requests
3
- Version: 0.0.2
3
+ Version: 0.1.0
4
4
  Summary: Requests history command for deepctl
5
5
  Author-email: Deepgram <devrel@deepgram.com>
6
6
  Maintainer-email: Deepgram <devrel@deepgram.com>
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
- Requires-Dist: deepctl-core>=0.1.10
17
+ Requires-Dist: deepctl-core>=0.2.16
18
18
  Requires-Dist: click>=8.0.0
19
19
  Requires-Dist: rich>=13.0.0
20
20
  Requires-Dist: pydantic>=2.0.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "deepctl-cmd-requests"
7
- version = "0.0.2" # x-release-please-version
7
+ version = "0.1.0" # x-release-please-version
8
8
  description = "Requests history command for deepctl"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -21,7 +21,7 @@ classifiers = [
21
21
  keywords = ["deepgram", "cli", "requests", "history"]
22
22
  requires-python = ">=3.10"
23
23
  dependencies = [
24
- "deepctl-core>=0.1.10",
24
+ "deepctl-core>=0.2.16",
25
25
  "click>=8.0.0",
26
26
  "rich>=13.0.0",
27
27
  "pydantic>=2.0.0",
@@ -11,13 +11,18 @@ from deepctl_core import (
11
11
  BaseResult,
12
12
  Config,
13
13
  DeepgramClient,
14
+ get_output_format,
15
+ get_status_console,
14
16
  )
15
17
  from rich.console import Console
16
18
  from rich.table import Table
17
19
 
18
- from .models import RequestInfo, RequestsResult
20
+ from .models import RequestDetailResult, RequestInfo, RequestsResult
19
21
 
20
22
  console = Console()
23
+ # Status/progress chrome must never touch stdout, or it corrupts JSON/CSV
24
+ # output that callers pipe into jq and friends.
25
+ status_console = get_status_console()
21
26
 
22
27
 
23
28
  class RequestsCommand(BaseCommand):
@@ -144,7 +149,7 @@ class RequestsCommand(BaseCommand):
144
149
  last_day=kwargs.get("last_day", False),
145
150
  )
146
151
  except Exception as e:
147
- console.print(f"[red]Error:[/red] {e}")
152
+ status_console.print(f"[red]Error:[/red] {e}")
148
153
  return BaseResult(status="error", message=str(e))
149
154
 
150
155
  def _list_requests(
@@ -176,7 +181,7 @@ class RequestsCommand(BaseCommand):
176
181
  start_dt = datetime.fromisoformat(start_date)
177
182
  end_dt = datetime.fromisoformat(end_date) if end_date else datetime.now()
178
183
 
179
- console.print("[blue]Fetching request history...[/blue]")
184
+ status_console.print("[blue]Fetching request history...[/blue]")
180
185
 
181
186
  result = client.list_requests(
182
187
  project_id=project_id,
@@ -191,18 +196,10 @@ class RequestsCommand(BaseCommand):
191
196
 
192
197
  requests_raw = result.get("requests", [])
193
198
  if not requests_raw:
194
- console.print("[yellow]No requests found[/yellow]")
199
+ status_console.print("[yellow]No requests found[/yellow]")
195
200
  return RequestsResult(status="info", message="No requests found")
196
201
 
197
202
  req_models: list[RequestInfo] = []
198
- table = Table(title="API Requests", show_header=True, header_style="bold blue")
199
- table.add_column("Time", style="dim")
200
- table.add_column("Endpoint", style="cyan")
201
- table.add_column("Method")
202
- table.add_column("Status")
203
- table.add_column("Duration")
204
- table.add_column("Request ID", style="dim")
205
-
206
203
  for r in requests_raw:
207
204
  req_data = (
208
205
  r
@@ -222,20 +219,35 @@ class RequestsCommand(BaseCommand):
222
219
  )
223
220
  req_models.append(info)
224
221
 
225
- status_style = "green" if info.status == "succeeded" else "red"
226
- table.add_row(
227
- info.created[:19] if info.created else "-",
228
- info.path or "-",
229
- info.method or "-",
230
- f"[{status_style}]{info.status}[/{status_style}]",
231
- f"{info.duration:.2f}s" if info.duration else "-",
232
- info.request_id[:12] + "..."
233
- if len(info.request_id) > 12
234
- else info.request_id,
222
+ # Render the human table only in default mode. For json/yaml/csv the
223
+ # framework serialises the returned result to stdout, so printing the
224
+ # table here would prepend non-parseable text to that output.
225
+ if get_output_format() == "default":
226
+ table = Table(
227
+ title="API Requests", show_header=True, header_style="bold blue"
235
228
  )
229
+ table.add_column("Time", style="dim")
230
+ table.add_column("Endpoint", style="cyan")
231
+ table.add_column("Method")
232
+ table.add_column("Status")
233
+ table.add_column("Duration")
234
+ table.add_column("Request ID", style="dim")
235
+
236
+ for info in req_models:
237
+ status_style = "green" if info.status == "succeeded" else "red"
238
+ table.add_row(
239
+ info.created[:19] if info.created else "-",
240
+ info.path or "-",
241
+ info.method or "-",
242
+ f"[{status_style}]{info.status}[/{status_style}]",
243
+ f"{info.duration:.2f}s" if info.duration else "-",
244
+ info.request_id[:12] + "..."
245
+ if len(info.request_id) > 12
246
+ else info.request_id,
247
+ )
236
248
 
237
- console.print(table)
238
- console.print(f"\n[dim]{len(req_models)} request(s) shown[/dim]")
249
+ console.print(table)
250
+ console.print(f"\n[dim]{len(req_models)} request(s) shown[/dim]")
239
251
 
240
252
  return RequestsResult(
241
253
  status="success", requests=req_models, count=len(req_models)
@@ -247,16 +259,20 @@ class RequestsCommand(BaseCommand):
247
259
  request_id: str,
248
260
  project_id: str | None,
249
261
  ) -> BaseResult:
250
- console.print(f"[blue]Fetching request details:[/blue] {request_id}")
262
+ status_console.print(f"[blue]Fetching request details:[/blue] {request_id}")
251
263
  result = client.get_request(request_id, project_id=project_id)
252
264
 
253
- console.print("[green]Request Details:[/green]")
254
- for key, value in result.items():
255
- if isinstance(value, dict):
256
- console.print(f" {key}:")
257
- for k, v in value.items():
258
- console.print(f" {k}: {v}")
259
- else:
260
- console.print(f" {key}: {value}")
265
+ if get_output_format() == "default":
266
+ console.print("[green]Request Details:[/green]")
267
+ for key, value in result.items():
268
+ if isinstance(value, dict):
269
+ console.print(f" {key}:")
270
+ for k, v in value.items():
271
+ console.print(f" {k}: {v}")
272
+ else:
273
+ console.print(f" {key}: {value}")
261
274
 
262
- return BaseResult(status="success", message="Request details displayed")
275
+ return RequestDetailResult(
276
+ status="success",
277
+ detail=dict(result) if isinstance(result, dict) else {"value": result},
278
+ )
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from typing import Any
6
+
5
7
  from deepctl_core import BaseResult
6
8
  from pydantic import BaseModel, Field
7
9
 
@@ -18,3 +20,11 @@ class RequestInfo(BaseModel):
18
20
  class RequestsResult(BaseResult):
19
21
  requests: list[RequestInfo] = Field(default_factory=list)
20
22
  count: int = 0
23
+
24
+
25
+ class RequestDetailResult(BaseResult):
26
+ # Returned by `--show`; carries the full request detail so json/yaml
27
+ # output is useful instead of a bare success message. Kept separate from
28
+ # RequestsResult so single-request output doesn't emit an empty
29
+ # `requests: []` / `count: 0` alongside the detail.
30
+ detail: dict[str, Any] = Field(default_factory=dict)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepctl-cmd-requests
3
- Version: 0.0.2
3
+ Version: 0.1.0
4
4
  Summary: Requests history command for deepctl
5
5
  Author-email: Deepgram <devrel@deepgram.com>
6
6
  Maintainer-email: Deepgram <devrel@deepgram.com>
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
- Requires-Dist: deepctl-core>=0.1.10
17
+ Requires-Dist: deepctl-core>=0.2.16
18
18
  Requires-Dist: click>=8.0.0
19
19
  Requires-Dist: rich>=13.0.0
20
20
  Requires-Dist: pydantic>=2.0.0
@@ -1,4 +1,4 @@
1
- deepctl-core>=0.1.10
1
+ deepctl-core>=0.2.16
2
2
  click>=8.0.0
3
3
  rich>=13.0.0
4
4
  pydantic>=2.0.0