fix: let explicit --push override config ollama_push and test caller paths (#6242)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
MervinPraisonandClaude Opus 5.5 committed 2026-11-05 08:09:17 +00:00
1 parent ffa3068203
commit 8da80d1890
2 files changed
+72 -4

No files matched your search

@@ -717,8 +717,8 @@ def train_export(
mtp_draft: bool = typer.Option(
False, "--mtp-draft/--no-mtp-draft",
help="Also download the stock MTP drafter (Gemma-4 only) for fast inference"),
push: bool = typer.Option(
True, "--push/--no-push",
push: Optional[bool] = typer.Option(
None, "--push/--no-push",
help="ollama: push to ollama.com after `ollama create` (--no-push keeps it local)"),
):
"""
@@ -769,8 +769,9 @@ def train_export(
cfg["hf_model_name"] = hf
if ollama:
cfg["ollama_model"] = ollama
if not push:
cfg["ollama_push"] = False
# Either explicit flag overrides the config; unset keeps config/default (push).
if isinstance(push, bool):
cfg["ollama_push"] = push
# Recover the model name (drives chat-template selection) from --base-model or
# the trained model's config.json (_name_or_path), falling back to the dir name.
@@ -430,3 +430,70 @@ def test_ollama_no_push_skips_push(monkeypatch, tmp_path):
"my-model", "latest", "FROM ./model\n", push=False)
assert [c[1] for c in calls] == ["create"]
assert not any("push" in c for c in calls)
def _ollama_export_cfg(monkeypatch, tmp_path, push, config_push=None):
"""Run `export ollama` with a fake trainer; return the config it received."""
import praisonai_train.cli.commands.train as cli
seen = {}
class _FakeTrainer:
@classmethod
def for_export(cls, cfg):
obj = cls()
obj.config = cfg
obj.model = None
obj.hf_tokenizer = None
return obj
def load_model(self):
return ("MODEL", "TOK")
def create_and_push_ollama_model(self):
seen.update(self.config)
monkeypatch.setattr(trainer_mod, "TrainModel", _FakeTrainer)
config = None
if config_push is not None:
config = tmp_path / "cfg.yaml"
config.write_text(f"ollama_push: {config_push}\n")
cli.train_export(
target="ollama", model_dir=str(tmp_path), config=str(config) if config else None,
ollama="my-model", hf=None, quant=None, base_model="unsloth/gemma-2-2b",
mtp_draft=False, push=push,
)
return seen
def test_export_ollama_no_push_flag_sets_config(monkeypatch, tmp_path):
assert _ollama_export_cfg(monkeypatch, tmp_path, push=False)["ollama_push"] is False
def test_export_ollama_explicit_push_overrides_config(monkeypatch, tmp_path):
cfg = _ollama_export_cfg(monkeypatch, tmp_path, push=True, config_push="false")
assert cfg["ollama_push"] is True
def test_export_ollama_unset_push_keeps_config(monkeypatch, tmp_path):
cfg = _ollama_export_cfg(monkeypatch, tmp_path, push=None, config_push="false")
assert cfg["ollama_push"] is False # YAML bool preserved, not overridden
assert "ollama_push" not in _ollama_export_cfg(monkeypatch, tmp_path, push=None)
@pytest.mark.parametrize("value, expected", [
(False, False), ("false", False), (True, True), ("true", True), (None, True),
])
def test_llm_trainer_forwards_ollama_push(monkeypatch, value, expected):
"""TrainModel forwards `ollama_push` (bool or string) to the helper."""
captured = {}
monkeypatch.setattr(
ollama_mod, "create_and_push_ollama_model",
lambda *a, **k: captured.update(k))
fake = types.SimpleNamespace(
config={"ollama_model": "m", "ollama_push": value},
prepare_modelfile_content=lambda: "FROM ./model\n",
_flag=trainer_mod.TrainModel._flag,
)
trainer_mod.TrainModel.create_and_push_ollama_model(fake)
assert captured["push"] is expected