hud-python 0.6.0__py3-none-any.whl → 0.6.2__py3-none-any.whl

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.
hud/cli/init.py CHANGED
@@ -1,19 +1,29 @@
1
1
  """``hud init``: scaffold a new HUD environment package.
2
2
 
3
- Purely local writes the v6 template files into a fresh directory. No
4
- network, no API key, no prompts.
3
+ By default (or in a non-interactive shell) it writes a minimal local scaffold —
4
+ no network, no API key. With ``--preset`` (or via the interactive picker) it
5
+ downloads one of the starter environments from GitHub instead — the same set the
6
+ platform's *environments/new* flow offers. See :mod:`hud.cli.presets`.
5
7
  """
6
8
 
7
9
  from __future__ import annotations
8
10
 
11
+ import shutil
12
+ import sys
13
+ import tarfile
9
14
  from pathlib import Path
15
+ from typing import Any
10
16
 
17
+ import httpx
11
18
  import typer
12
19
 
13
20
  from hud.utils.hud_console import HUDConsole
14
21
 
22
+ from .presets import ENVIRONMENT_PRESETS, PRESETS_BY_ID, EnvironmentPreset, materialize_preset
15
23
  from .templates import DOCKERFILE_HUD, ENV_PY, PYPROJECT_TOML, TASKS_PY
16
24
 
25
+ _LOCAL_SCAFFOLD = "__local__"
26
+
17
27
 
18
28
  def _python_name(name: str) -> str:
19
29
  """Normalize a package name into a Python-identifier-ish env name."""
@@ -21,19 +31,66 @@ def _python_name(name: str) -> str:
21
31
  return "".join(c if c.isalnum() or c == "_" else "_" for c in name)
22
32
 
23
33
 
34
+ def _resolve_preset(preset: str | None, hud_console: HUDConsole) -> EnvironmentPreset | None:
35
+ """Pick the starter: an explicit ``--preset`` id, an interactive choice, or
36
+ ``None`` for the minimal local scaffold."""
37
+ if preset is not None:
38
+ chosen = PRESETS_BY_ID.get(preset)
39
+ if chosen is None:
40
+ available = ", ".join(PRESETS_BY_ID)
41
+ hud_console.error(f"Unknown preset {preset!r}. Available: {available}")
42
+ raise typer.Exit(1)
43
+ return chosen
44
+
45
+ # No flag: pick interactively when we have a TTY, else the local scaffold.
46
+ if not (sys.stdin.isatty() and sys.stdout.isatty()):
47
+ return None
48
+
49
+ choices: list[str | dict[str, Any]] = [
50
+ {"name": "Minimal (local scaffold, no download)", "value": _LOCAL_SCAFFOLD},
51
+ *({"name": f"{p.name} — {p.description}", "value": p.id} for p in ENVIRONMENT_PRESETS),
52
+ ]
53
+ selected = hud_console.select("Choose a starter", choices, default=0)
54
+ return None if selected == _LOCAL_SCAFFOLD else PRESETS_BY_ID[selected]
55
+
56
+
57
+ def _write_local_scaffold(target: Path, env_name: str, hud_console: HUDConsole) -> None:
58
+ """Write the bundled minimal env package into ``target``."""
59
+ files = {
60
+ "pyproject.toml": PYPROJECT_TOML.format(name=env_name.replace("_", "-")),
61
+ "env.py": ENV_PY.format(env_name=env_name),
62
+ "tasks.py": TASKS_PY.format(env_name=env_name),
63
+ "Dockerfile.hud": DOCKERFILE_HUD,
64
+ }
65
+ target.mkdir(parents=True, exist_ok=True)
66
+ for filename, content in files.items():
67
+ (target / filename).write_text(content)
68
+ hud_console.status_item(filename, "✓")
69
+
70
+
24
71
  def init_command(
25
72
  name: str = typer.Argument(..., help="Environment name (directory to create)"),
26
73
  directory: str = typer.Option(".", "--dir", "-d", help="Parent directory"),
27
74
  force: bool = typer.Option(False, "--force", "-f", help="Overwrite existing files"),
75
+ preset: str | None = typer.Option(
76
+ None,
77
+ "--preset",
78
+ "-p",
79
+ help="Starter preset to download from GitHub (e.g. blank, coding, browser, "
80
+ "deepresearch, rubrics, remote-browser). Omit for an interactive picker; in a "
81
+ "non-interactive shell, omitting it writes the minimal local scaffold.",
82
+ ),
28
83
  ) -> None:
29
84
  """🚀 Create a new HUD environment package.
30
85
 
31
- [not dim]Writes env.py (tasks + capabilities), tasks.py, Dockerfile.hud, and
32
- pyproject.toml into a new directory.
86
+ [not dim]With no --preset, writes a minimal local scaffold (env.py, tasks.py,
87
+ Dockerfile.hud, pyproject.toml) or, in a TTY, lets you pick a starter. With
88
+ --preset, downloads that starter from GitHub.
33
89
 
34
90
  Examples:
35
- hud init my-env # create ./my-env
36
- hud init my-env --dir envs # create ./envs/my-env[/not dim]
91
+ hud init my-env # interactive picker (or local scaffold)
92
+ hud init my-env --preset coding # download the coding starter
93
+ hud init my-env --dir envs # create ./envs/my-env[/not dim]
37
94
  """
38
95
  hud_console = HUDConsole()
39
96
 
@@ -42,35 +99,49 @@ def init_command(
42
99
  hud_console.error(f"{target} already exists and is not empty (use --force)")
43
100
  raise typer.Exit(1)
44
101
 
45
- env_name = _python_name(name)
46
- files = {
47
- "pyproject.toml": PYPROJECT_TOML.format(name=env_name.replace("_", "-")),
48
- "env.py": ENV_PY.format(env_name=env_name),
49
- "tasks.py": TASKS_PY.format(env_name=env_name),
50
- "Dockerfile.hud": DOCKERFILE_HUD,
51
- }
52
-
53
- hud_console.header(f"HUD Init: {env_name}")
54
- target.mkdir(parents=True, exist_ok=True)
55
- for filename, content in files.items():
56
- (target / filename).write_text(content)
57
- hud_console.status_item(filename, "✓")
102
+ chosen = _resolve_preset(preset, hud_console)
103
+
104
+ hud_console.header(f"HUD Init: {name}")
105
+ if chosen is not None:
106
+ hud_console.info(f"Downloading {chosen.owner}/{chosen.repo} …")
107
+ created = not target.exists()
108
+ try:
109
+ materialize_preset(chosen, target)
110
+ except (httpx.HTTPError, tarfile.TarError, ValueError, OSError) as exc:
111
+ # Don't leave a half-written tree behind — it would trip the
112
+ # non-empty-directory guard on the next run. Only remove a directory
113
+ # this run created (never a dir the user already had).
114
+ if created and target.exists():
115
+ shutil.rmtree(target, ignore_errors=True)
116
+ hud_console.error(f"Failed to fetch preset {chosen.id!r}: {exc}")
117
+ raise typer.Exit(1) from exc
118
+ hud_console.status_item(f"{chosen.owner}/{chosen.repo}", "✓")
119
+ else:
120
+ _write_local_scaffold(target, _python_name(name), hud_console)
58
121
 
59
122
  hud_console.section_title("Next Steps")
60
123
  hud_console.info("")
61
124
  hud_console.command_example(f"cd {target}", "1. Enter the package")
62
125
  hud_console.info("")
63
- hud_console.info("2. Define task definitions in env.py")
64
- hud_console.info(" A @env.template is an async generator: it yields a prompt, then")
65
- hud_console.info(" (after the agent answers) yields a reward.")
66
- hud_console.info("")
67
- hud_console.info("3. List the tasks to run in tasks.py")
68
- hud_console.info(" Call a task with args to bind a runnable Task.")
69
- hud_console.info("")
70
- hud_console.command_example("hud eval tasks.py claude", "4. Run an agent over them")
71
- hud_console.info("")
72
- hud_console.info("5. Deploy for scale")
73
- hud_console.info(" hud deploy, then run many evals in parallel.")
126
+ if chosen is not None:
127
+ hud_console.info("2. Read the README for this starter's setup + tasks.")
128
+ hud_console.info("")
129
+ hud_console.command_example("hud eval tasks.py claude", "3. Run an agent over the tasks")
130
+ hud_console.info("")
131
+ hud_console.info("4. Deploy for scale")
132
+ hud_console.info(" hud deploy, then run many evals in parallel.")
133
+ else:
134
+ hud_console.info("2. Define task definitions in env.py")
135
+ hud_console.info(" A @env.template is an async generator: it yields a prompt, then")
136
+ hud_console.info(" (after the agent answers) yields a reward.")
137
+ hud_console.info("")
138
+ hud_console.info("3. List the tasks to run in tasks.py")
139
+ hud_console.info(" Call a task with args to bind a runnable Task.")
140
+ hud_console.info("")
141
+ hud_console.command_example("hud eval tasks.py claude", "4. Run an agent over them")
142
+ hud_console.info("")
143
+ hud_console.info("5. Deploy for scale")
144
+ hud_console.info(" hud deploy, then run many evals in parallel.")
74
145
  hud_console.info("")
75
146
  hud_console.info("Tip: Install the HUD skill so your coding agent can help you build:")
76
147
  hud_console.command_example("npx skills add docs.hud.ai", "Install HUD skill")
hud/cli/models.py CHANGED
@@ -56,14 +56,18 @@ def list_models(
56
56
  table = Table()
57
57
  table.add_column("Name", style="cyan")
58
58
  table.add_column("Model (API)", style="green")
59
+ table.add_column("ID", style="blue", no_wrap=True)
59
60
  table.add_column("Provider", style="yellow")
60
61
  table.add_column("Agent", style="magenta")
62
+ table.add_column("Trainable", style="green", justify="center")
61
63
  for model in models_list:
62
64
  table.add_row(
63
65
  model.name or model.id or "-",
64
66
  model.model_name or model.id or "-",
67
+ model.id or "-",
65
68
  model.provider.name or "-",
66
69
  model.sdk_agent_type or "-",
70
+ "✓" if model.is_trainable else "",
67
71
  )
68
72
  console.print(table)
69
73
  console.print(f"\n[dim]Gateway: {settings.hud_gateway_url}[/dim]")
hud/cli/presets.py ADDED
@@ -0,0 +1,139 @@
1
+ """Starter presets for ``hud init`` — the same set offered by the platform's
2
+ *environments/new* flow.
3
+
4
+ Each preset is a standalone public GitHub repo under ``hud-evals``. ``hud init``
5
+ downloads the repo tarball (no ``git`` required) and extracts it into the target
6
+ directory. Keep this list in sync with the frontend's ``ENVIRONMENT_TEMPLATES``
7
+ (``app/(auth)/environments/components/EnvironmentTemplates.tsx``).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import io
13
+ import os
14
+ import tarfile
15
+ from dataclasses import dataclass
16
+ from typing import TYPE_CHECKING
17
+
18
+ import httpx
19
+
20
+ if TYPE_CHECKING:
21
+ from pathlib import Path
22
+
23
+
24
+ @dataclass(frozen=True, slots=True)
25
+ class EnvironmentPreset:
26
+ """A starter environment sourced from a public GitHub repo."""
27
+
28
+ id: str
29
+ name: str
30
+ description: str
31
+ owner: str
32
+ repo: str
33
+
34
+
35
+ ENVIRONMENT_PRESETS: tuple[EnvironmentPreset, ...] = (
36
+ EnvironmentPreset(
37
+ "blank",
38
+ "Blank",
39
+ "Minimal starting point for a custom environment.",
40
+ "hud-evals",
41
+ "hud-blank",
42
+ ),
43
+ EnvironmentPreset(
44
+ "browser",
45
+ "Browser",
46
+ "Local browser automation environment.",
47
+ "hud-evals",
48
+ "hud-browser",
49
+ ),
50
+ EnvironmentPreset(
51
+ "deepresearch",
52
+ "Deep Research",
53
+ "Deep research environment with Exa search integration.",
54
+ "hud-evals",
55
+ "hud-deepresearch",
56
+ ),
57
+ EnvironmentPreset(
58
+ "cua",
59
+ "Computer Use",
60
+ "Computer-use agent (CUA) desktop environment.",
61
+ "hud-evals",
62
+ "cua-template",
63
+ ),
64
+ EnvironmentPreset(
65
+ "autonomous-businesses",
66
+ "Autonomous Businesses",
67
+ "Autonomous business simulation environment.",
68
+ "hud-evals",
69
+ "autonomous-businesses-template",
70
+ ),
71
+ EnvironmentPreset(
72
+ "verilog",
73
+ "Verilog",
74
+ "Verilog hardware-design environment.",
75
+ "hud-evals",
76
+ "verilog-template",
77
+ ),
78
+ )
79
+
80
+ PRESETS_BY_ID: dict[str, EnvironmentPreset] = {p.id: p for p in ENVIRONMENT_PRESETS}
81
+
82
+ _TARBALL_TIMEOUT = 60.0
83
+
84
+
85
+ def _is_within(root: Path, path: Path) -> bool:
86
+ try:
87
+ path.relative_to(root)
88
+ return True
89
+ except ValueError:
90
+ return False
91
+
92
+
93
+ def _download_tarball(preset: EnvironmentPreset) -> bytes:
94
+ """Fetch the repo's ``main`` archive from codeload (no API rate limit)."""
95
+ headers: dict[str, str] = {}
96
+ token = os.environ.get("GITHUB_TOKEN")
97
+ if token:
98
+ headers["Authorization"] = f"Bearer {token}"
99
+
100
+ url = f"https://codeload.github.com/{preset.owner}/{preset.repo}/tar.gz/refs/heads/main"
101
+ with httpx.Client(follow_redirects=True, timeout=_TARBALL_TIMEOUT) as client:
102
+ resp = client.get(url, headers=headers)
103
+ resp.raise_for_status()
104
+ return resp.content
105
+
106
+
107
+ def materialize_preset(preset: EnvironmentPreset, target: Path) -> None:
108
+ """Download ``preset``'s repo archive and extract it into ``target``.
109
+
110
+ Uses ``codeload.github.com`` (not the rate-limited API) for the repo's
111
+ ``main`` branch — no ``git`` required. Strips the archive's top-level
112
+ ``<repo>-main/`` component and refuses any entry that would escape ``target``
113
+ (path-traversal guard). Honors ``GITHUB_TOKEN`` if set.
114
+ """
115
+ payload = _download_tarball(preset)
116
+
117
+ target.mkdir(parents=True, exist_ok=True)
118
+ target_root = target.resolve()
119
+ with tarfile.open(fileobj=io.BytesIO(payload), mode="r:gz") as tar:
120
+ for member in tar.getmembers():
121
+ # GitHub wraps everything in a "<repo>-<sha>/" top-level dir; drop it.
122
+ parts = member.name.split("/", 1)
123
+ if len(parts) < 2 or not parts[1]:
124
+ continue
125
+ dest = (target_root / parts[1]).resolve()
126
+ if not _is_within(target_root, dest):
127
+ raise ValueError(f"unsafe path in archive: {member.name!r}")
128
+ if member.isdir():
129
+ dest.mkdir(parents=True, exist_ok=True)
130
+ elif member.isfile():
131
+ dest.parent.mkdir(parents=True, exist_ok=True)
132
+ source = tar.extractfile(member)
133
+ if source is not None:
134
+ dest.write_bytes(source.read())
135
+ # Preserve the archive's executable bits so entrypoints and
136
+ # scripts stay runnable (no-op on Windows).
137
+ if member.mode & 0o111:
138
+ dest.chmod(dest.stat().st_mode | (member.mode & 0o111))
139
+ # Symlinks and other special members are intentionally skipped.
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
14
14
 
15
15
 
16
16
  def test_init_scaffolds_a_runnable_package(tmp_path: Path) -> None:
17
- init_command(name="my-cool-env", directory=str(tmp_path), force=False)
17
+ init_command(name="my-cool-env", directory=str(tmp_path), force=False, preset=None)
18
18
 
19
19
  target = tmp_path / "my-cool-env"
20
20
  assert {p.name for p in target.iterdir()} == {
@@ -36,7 +36,7 @@ def test_init_refuses_to_clobber_nonempty_directory(tmp_path: Path) -> None:
36
36
  (target / "precious.txt").write_text("data")
37
37
 
38
38
  with pytest.raises(typer.Exit):
39
- init_command(name="taken", directory=str(tmp_path), force=False)
39
+ init_command(name="taken", directory=str(tmp_path), force=False, preset=None)
40
40
 
41
41
  assert (target / "precious.txt").read_text() == "data"
42
42
 
@@ -46,6 +46,6 @@ def test_init_force_overwrites_existing_files(tmp_path: Path) -> None:
46
46
  target.mkdir()
47
47
  (target / "env.py").write_text("old")
48
48
 
49
- init_command(name="env", directory=str(tmp_path), force=True)
49
+ init_command(name="env", directory=str(tmp_path), force=True, preset=None)
50
50
 
51
51
  assert "Environment" in (target / "env.py").read_text()
hud/utils/gateway.py CHANGED
@@ -35,6 +35,7 @@ class GatewayModelInfo(BaseModel):
35
35
  name: str | None = None
36
36
  model_name: str | None = None
37
37
  sdk_agent_type: str | None = None
38
+ is_trainable: bool = False
38
39
  provider: GatewayProviderInfo = Field(default_factory=GatewayProviderInfo)
39
40
 
40
41
 
hud/version.py CHANGED
@@ -4,4 +4,4 @@ Version information for the HUD SDK.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- __version__ = "0.5.41"
7
+ __version__ = "0.6.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: SDK for the HUD platform.
5
5
  Project-URL: Homepage, https://github.com/hud-evals/hud-python
6
6
  Project-URL: Bug Tracker, https://github.com/hud-evals/hud-python/issues
@@ -5,7 +5,7 @@ hud/conftest.py,sha256=HKbHvmFXLPX6KFSJgPFUAM22auclNNdFmHGwilNzg98,1012
5
5
  hud/server.py,sha256=NtSHIjBFr9lYvryfXrCa-VhwqnwkRy7n5fp_OuNhNOI,1235
6
6
  hud/settings.py,sha256=crfeQArM_8JnwmMdx0fcwL5xCvJMjeofGrGbpn0nW3c,6393
7
7
  hud/types.py,sha256=yOBFED8Ii7KA-8EzvmE3CU16LCXVigPnNjjl3kB8aRo,15326
8
- hud/version.py,sha256=naWlJd_xTGFOyiFYQITHg6lq2h2dyn0RtpT4oyuuLgY,105
8
+ hud/version.py,sha256=oJ08yq_IrzFrsTHVgSPsBzDrwos8KumqvTVB-J2A0aM,104
9
9
  hud/agents/__init__.py,sha256=ISruomRkEw1-cWCncyCgqKeeueYZFeBvFJ62RBIBQI8,4866
10
10
  hud/agents/base.py,sha256=WgEOWUmMioXTxYe6cOvbqnbM4n989Z9kFEZIN6xJ3pU,659
11
11
  hud/agents/tool_agent.py,sha256=a0xsh2d8IwvmiPGMs9LCzghi61FHt4vMK_9sW8eNFbA,12557
@@ -95,9 +95,10 @@ hud/cli/cancel.py,sha256=MHRdZ6IoFy3iac9NtTT_c91IB_iQbYISsCb7ph7u298,3785
95
95
  hud/cli/client.py,sha256=cC23TUTo7w4S63jtk8SWkFWzG9h8Z2AKwYEqaefBWqg,2946
96
96
  hud/cli/deploy.py,sha256=QytQKmGY60YKNnQnhv0gXjMl9BVdwsvMRq0yZypVgpY,26082
97
97
  hud/cli/eval.py,sha256=GKvncjJ1AhMiBwsCn8jndAP_IdOe14HYC5AMnsAg3PE,33801
98
- hud/cli/init.py,sha256=_wLWnbREPYQpS1lfofdaxRfAKCY407O78EhYJBsjfQg,2974
98
+ hud/cli/init.py,sha256=6k3svrqeX19VuQ9cRuTTIojq5L5yRS51YscnXRuayRc,6464
99
99
  hud/cli/login.py,sha256=3DhM_FfvfjP-cdfCj596kPo0bE9L3eQdz520X0oWqbc,7961
100
- hud/cli/models.py,sha256=WuRFExVt8rbqXGvDgJOi0mw8Uqq-VKYmSEBEDyEnJJE,8570
100
+ hud/cli/models.py,sha256=NInyi2I5x-GFBpcTdjvfTI3f3eWC_U-E-SgWJUxbQz8,8770
101
+ hud/cli/presets.py,sha256=qZmc_GKwdnRNJqxRqrg-MDUhN1Vh1JcDB4nJ94_AXLw,4523
101
102
  hud/cli/serve.py,sha256=074y6dGh1yPxr6m8MScKpYPXo2SX38zWbq2uZUrXl9k,3757
102
103
  hud/cli/sync.py,sha256=rvbcAM7ZfXOrlxRT3Zpp25Y-UkFbPqTuOzrcHAH1tK4,16927
103
104
  hud/cli/task.py,sha256=eYByPZHCqSy1GFiyZOVHNNqDFxvHaSLUGNQZ7o9kdz4,8111
@@ -109,7 +110,7 @@ hud/cli/tests/test_cli_more_wrappers.py,sha256=EEFrqTMg3yknQdmb8hWcHJAbinGAOGyqx
109
110
  hud/cli/tests/test_deploy.py,sha256=1b_2iviob4b_RFVun01cwCl3i4FmO2MaCrFs7PfzOSI,13983
110
111
  hud/cli/tests/test_eval_bedrock.py,sha256=UBGakgIV4kzXUj0Jtbr3t05xBss66YPqruKsovUYyoo,1900
111
112
  hud/cli/tests/test_eval_config.py,sha256=Cl4kHc6qykaFt_lmsjyzKZRjsoTdomQBgZ5pYKQLMLQ,7932
112
- hud/cli/tests/test_init.py,sha256=nzQagJmavThJqd3pgbCDalaW2wyveoVuLEQH1n-CLYw,1440
113
+ hud/cli/tests/test_init.py,sha256=s8ipywnOztV_E4WHuBAqeGGEzcbW2jbIM1RUvEF-yr8,1479
113
114
  hud/cli/tests/test_main_module.py,sha256=PyfuSdqI-4Zt-kd16FMj2XHEHrw7SQ75YLJbQPdcIco,1223
114
115
  hud/cli/tests/test_sync_export.py,sha256=wd4ICZlNr_7XMw8MfNJuC8v0-lhywsjG7DnZE1zpJek,735
115
116
  hud/cli/utils/__init__.py,sha256=L6s0oNzY2LugGp9faodCPnjzM-ZUorUH05-HmYOq5hY,35
@@ -204,7 +205,7 @@ hud/train/client.py,sha256=_CiUXwHmx_E6vvmpZFAxInz8Nxur0_oJjN6BnLix18U,8260
204
205
  hud/train/types.py,sha256=QEc_cC0UDCjvHOpFqIyEzuK5IUCBPY33mc6zokfqUDk,6598
205
206
  hud/utils/__init__.py,sha256=Tr7Zf9j-MW-mWw7SOezTI7cyp6MpG9vErZ9jEWTujAo,295
206
207
  hud/utils/exceptions.py,sha256=eP8nLMltYe4BvnHzqaG5uq-1EPaAkZ2tCjzuxHugC8s,6938
207
- hud/utils/gateway.py,sha256=NVXe6sYIGxKrevGInOfUF_usfEkMuvQqJIp9aubBUEI,2913
208
+ hud/utils/gateway.py,sha256=CbhrzWi9Nf-woqqrZ8tsEf36QEjzOOIJEcI9Go4jHFg,2944
208
209
  hud/utils/hints.py,sha256=HrwAbMjjsCGgvR2bJTXmMeabMV5P__uHCb0lID6Jp04,5607
209
210
  hud/utils/hud_console.py,sha256=bzVxUjWq6Np7ZOV8TR8ASXkVAw81O8MsfDaismds0AE,15860
210
211
  hud/utils/modules.py,sha256=iUfoIAFdEf_2JAE9I0qsC0ODWz4ILOgDzRy8kcmVDTE,2463
@@ -220,8 +221,8 @@ hud/utils/tests/test_platform.py,sha256=mwhyFkUBvgmHRc43vQ_JgAAW2N9fIaxkQhVo-GB4
220
221
  hud/utils/tests/test_requests.py,sha256=ENK6P5xLTuSgWDcCau4zCj_5zPV_EooGwU4P8YYl5Gw,9109
221
222
  hud/utils/tests/test_serialization.py,sha256=GY4NiFUJtwLSYQWA0n1zme-Ul4DnBLByHCOOkxn2kLM,819
222
223
  hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
- hud_python-0.6.0.dist-info/METADATA,sha256=IySjNzZJmuHvDVz0w5uEa-HrP4ZLqgODk9OMKu2rupg,12304
224
- hud_python-0.6.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
225
- hud_python-0.6.0.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
226
- hud_python-0.6.0.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
227
- hud_python-0.6.0.dist-info/RECORD,,
224
+ hud_python-0.6.2.dist-info/METADATA,sha256=3vYSE1DBNZV7N4pIXSiZzbJejgOR196u8V40EpkvX2g,12304
225
+ hud_python-0.6.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
226
+ hud_python-0.6.2.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
227
+ hud_python-0.6.2.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
228
+ hud_python-0.6.2.dist-info/RECORD,,