dh-cli 0.12.0__tar.gz → 0.12.2__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.
Files changed (110) hide show
  1. {dh_cli-0.12.0 → dh_cli-0.12.2}/PKG-INFO +1 -1
  2. {dh_cli-0.12.0 → dh_cli-0.12.2}/pyproject.toml +1 -1
  3. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/protmpnn.py +10 -2
  4. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/rfd3.py +5 -3
  5. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_rfd3_command.py +16 -0
  6. {dh_cli-0.12.0 → dh_cli-0.12.2}/.gitignore +0 -0
  7. {dh_cli-0.12.0 → dh_cli-0.12.2}/LICENSE +0 -0
  8. {dh_cli-0.12.0 → dh_cli-0.12.2}/README.md +0 -0
  9. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/__init__.py +0 -0
  10. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/_identity.py +0 -0
  11. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/__init__.py +0 -0
  12. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/aws_batch.py +0 -0
  13. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/__init__.py +0 -0
  14. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/boltz.py +0 -0
  15. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/cancel.py +0 -0
  16. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/clean.py +0 -0
  17. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/disco.py +0 -0
  18. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/embed_t5.py +0 -0
  19. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/equilibrator.py +0 -0
  20. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/esmfold2.py +0 -0
  21. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/finalize.py +0 -0
  22. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/list_jobs.py +0 -0
  23. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/local.py +0 -0
  24. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/logs.py +0 -0
  25. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/orca.py +0 -0
  26. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
  27. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/retry.py +0 -0
  28. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/status.py +0 -0
  29. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/submit.py +0 -0
  30. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/commands/wait_for.py +0 -0
  31. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/fasta_utils.py +0 -0
  32. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/h5_utils.py +0 -0
  33. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/job_id.py +0 -0
  34. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/manifest.py +0 -0
  35. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/batch/s3_transport.py +0 -0
  36. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/__init__.py +0 -0
  37. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/commands.py +0 -0
  38. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/cost_report.py +0 -0
  39. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/bedrock/pricing.yaml +0 -0
  40. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/cloud_commands.py +0 -0
  41. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/codeartifact.py +0 -0
  42. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/__init__.py +0 -0
  43. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/api_client.py +0 -0
  44. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/auth.py +0 -0
  45. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/engine_commands.py +0 -0
  46. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/progress.py +0 -0
  47. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/ssh_config.py +0 -0
  48. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/engines_studios/studio_commands.py +0 -0
  49. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/github_commands.py +0 -0
  50. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/__init__.py +0 -0
  51. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/deploy.py +0 -0
  52. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/local.py +0 -0
  53. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/test.py +0 -0
  54. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/tf.py +0 -0
  55. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/hz/users.py +0 -0
  56. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/main.py +0 -0
  57. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/utility_commands.py +0 -0
  58. {dh_cli-0.12.0 → dh_cli-0.12.2}/src/dh_cli/warehouse.py +0 -0
  59. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/__init__.py +0 -0
  60. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_aws_batch_resources.py +0 -0
  61. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_image_override.py +0 -0
  62. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_no_train_command.py +0 -0
  63. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_cpu_only.py +0 -0
  64. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_image_validation.py +0 -0
  65. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_merge.py +0 -0
  66. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/batch/test_submit_mlflow_env.py +0 -0
  67. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/conftest.py +0 -0
  68. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/A_cache_write.json +0 -0
  69. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/B_cache_read.json +0 -0
  70. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/C_plain.json +0 -0
  71. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
  72. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/E_service_role.json +0 -0
  73. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
  74. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
  75. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_build_report.py +0 -0
  76. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_classify_arn.py +0 -0
  77. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cli_exit_codes.py +0 -0
  78. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cost_calc.py +0 -0
  79. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cost_command.py +0 -0
  80. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_cur_reconciliation.py +0 -0
  81. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_key_command.py +0 -0
  82. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_render_formats.py +0 -0
  83. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_resolve_base_model.py +0 -0
  84. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_rotate.py +0 -0
  85. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/bedrock/test_s3_walker.py +0 -0
  86. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/__init__.py +0 -0
  87. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/conftest.py +0 -0
  88. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
  89. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_identity.py +0 -0
  90. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login.py +0 -0
  91. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login_error_paths.py +0 -0
  92. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_login_security.py +0 -0
  93. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_logout.py +0 -0
  94. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_rotate.py +0 -0
  95. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/github/test_status.py +0 -0
  96. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_init.py +0 -0
  97. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_suites.py +0 -0
  98. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/hz/test_users.py +0 -0
  99. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_cloud_gcp.py +0 -0
  100. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_disco_command.py +0 -0
  101. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_disco_jobdef.py +0 -0
  102. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_equilibrator_command.py +0 -0
  103. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_esmfold2_cli.py +0 -0
  104. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_boltz_tar.py +0 -0
  105. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_disco.py +0 -0
  106. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_disco_dispatch.py +0 -0
  107. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_equilibrator.py +0 -0
  108. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_esmfold2.py +0 -0
  109. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_protmpnn.py +0 -0
  110. {dh_cli-0.12.0 → dh_cli-0.12.2}/tests/test_finalize_rfd3.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dh-cli
3
- Version: 0.12.0
3
+ Version: 0.12.2
4
4
  Summary: Dayhoff Labs developer CLI
5
5
  Author-email: Dayhoff Labs <dev@dayhofflabs.com>
6
6
  License: # PolyForm Noncommercial License 1.0.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dh-cli"
7
- version = "0.12.0"
7
+ version = "0.12.2"
8
8
  description = "Dayhoff Labs developer CLI"
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -71,6 +71,11 @@ DEFAULT_IMAGE_URI = "074735440724.dkr.ecr.us-east-1.amazonaws.com/dayhoff:protmp
71
71
  is_flag=True,
72
72
  help="Save per-residue log probabilities to scores/ directory",
73
73
  )
74
+ @click.option(
75
+ "--image",
76
+ default=None,
77
+ help="Override the container image URI or digest (e.g. repo@sha256:...)",
78
+ )
74
79
  def protmpnn(
75
80
  input_dir,
76
81
  workers,
@@ -83,6 +88,7 @@ def protmpnn(
83
88
  after,
84
89
  auto_validate_top,
85
90
  save_score,
91
+ image,
86
92
  ):
87
93
  """Design protein sequences with ProtMPNN/LigandMPNN.
88
94
 
@@ -136,7 +142,7 @@ def protmpnn(
136
142
  _run_local_mode(input_path, auto_validate_top, base_path, save_score)
137
143
  return
138
144
 
139
- _submit_batch_job(input_path, workers, queue, dry_run, base_path, after, auto_validate_top, save_score)
145
+ _submit_batch_job(input_path, workers, queue, dry_run, base_path, after, auto_validate_top, save_score, image)
140
146
 
141
147
 
142
148
  def _has_local_gpu() -> bool:
@@ -184,6 +190,7 @@ def _submit_batch_job(
184
190
  after: tuple[str, ...] = (),
185
191
  auto_validate_top: int | None = None,
186
192
  save_score: bool = False,
193
+ image: str | None = None,
187
194
  ):
188
195
  """Submit ProtMPNN job to AWS Batch."""
189
196
  click.echo(f"Scanning {input_path} for YAML files...")
@@ -236,7 +243,7 @@ def _submit_batch_job(
236
243
  user=job_id.split("-")[0],
237
244
  pipeline="protmpnn",
238
245
  status=JobStatus.PENDING,
239
- image_uri=DEFAULT_IMAGE_URI,
246
+ image_uri=image or DEFAULT_IMAGE_URI,
240
247
  input=InputConfig(
241
248
  source=str(input_path),
242
249
  num_sequences=num_files,
@@ -282,6 +289,7 @@ def _submit_batch_job(
282
289
  retry_attempts=5,
283
290
  depends_on=depends_on,
284
291
  share_identifier=get_aws_username(),
292
+ image_override=image,
285
293
  )
286
294
 
287
295
  manifest.status = JobStatus.SUBMITTED
@@ -95,13 +95,13 @@ def rfd3(
95
95
  input_path = Path(input_dir).resolve()
96
96
 
97
97
  if run_local:
98
- _run_local_mode(input_path, base_path)
98
+ _run_local_mode(input_path, base_path, num_designs)
99
99
  return
100
100
 
101
101
  if not run_remote and not dry_run:
102
102
  if _has_local_gpu():
103
103
  click.echo("GPU detected — running locally (use --remote to override)")
104
- _run_local_mode(input_path, base_path)
104
+ _run_local_mode(input_path, base_path, num_designs)
105
105
  return
106
106
 
107
107
  _submit_batch_job(input_path, workers, queue, dry_run, base_path, after, num_designs)
@@ -343,7 +343,7 @@ def _submit_batch_job(
343
343
  raise SystemExit(1)
344
344
 
345
345
 
346
- def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE):
346
+ def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE, num_designs: int = 1):
347
347
  """Run RFD3 locally in a Docker container after host-side fast-fail checks."""
348
348
  machine = platform.machine()
349
349
  if machine not in {"x86_64", "amd64"}:
@@ -395,6 +395,8 @@ def _run_local_mode(input_path: Path, base_path: str = BATCH_JOBS_BASE):
395
395
  f"FOUNDRY_CHECKPOINT_DIRS={CHECKPOINT_SUBTREE}",
396
396
  "-e",
397
397
  f"{OFFLINE_ENV_VAR}=1",
398
+ "-e",
399
+ f"NUM_DESIGNS={num_designs}",
398
400
  DEFAULT_IMAGE_URI,
399
401
  ]
400
402
 
@@ -228,6 +228,22 @@ class TestLocalRun:
228
228
  assert "all" in cmd
229
229
  assert rfd3_cmd.DEFAULT_IMAGE_URI in cmd
230
230
 
231
+ def test_local_passes_num_designs(self, runner, input_dir):
232
+ """A local run with --num-designs N sets NUM_DESIGNS=N in the docker env."""
233
+ _write_config(input_dir, "design1")
234
+ result, run_mock = _run_local_directly(runner, input_dir, extra_args=["--num-designs", "4"])
235
+ assert result.exit_code == 0, result.output
236
+ cmd = run_mock.call_args[0][0]
237
+ assert "NUM_DESIGNS=4" in cmd
238
+
239
+ def test_local_default_num_designs_is_one(self, runner, input_dir):
240
+ """With no --num-designs flag, the local run defaults NUM_DESIGNS=1."""
241
+ _write_config(input_dir, "design1")
242
+ result, run_mock = _run_local_directly(runner, input_dir)
243
+ assert result.exit_code == 0, result.output
244
+ cmd = run_mock.call_args[0][0]
245
+ assert "NUM_DESIGNS=1" in cmd
246
+
231
247
 
232
248
  class TestLocalFastFail:
233
249
  def test_local_nonx86_fails_fast(self, runner, input_dir):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes