Files
wehub-resource-sync 3454a55636
cffconvert / validate (push) Has been cancelled
ci-workflow / pre-commit (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (macos-latest) (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (ubuntu-latest) (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (windows-latest) (push) Has been cancelled
ci-workflow / Python 3.10 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.11 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.12 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.13 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.14 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.14t on macos-latest (push) Has been cancelled
ci-workflow / Python 3.10 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.11 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.12 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.13 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.14 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.14t on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.10 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.11 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.12 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.13 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.14 on windows-latest (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:46:15 +08:00

100 lines
3.0 KiB
Python

import os
from pathlib import Path
import pytest
import nltk.parse.malt as malt
from nltk.parse.malt import MaltParser
def _minimal_malt_parser(tmp_path):
model_dir = tmp_path / "model"
model_dir.mkdir()
model_file = model_dir / "model.mco"
model_file.write_text("dummy model\n", encoding="utf-8")
working_dir = tmp_path / "work"
working_dir.mkdir()
parser = MaltParser.__new__(MaltParser)
parser._trained = True
parser.model = str(model_file)
parser.working_dir = str(working_dir)
parser.malt_jars = ["dummy-malt.jar"]
parser.additional_java_args = []
return parser, model_dir
def _write_minimal_parse(cmd):
output_path = Path(cmd[cmd.index("-o") + 1])
output_path.write_text(
"1\thello\t_\tNN\tNN\t_\t0\tnull\t_\t_\n",
encoding="utf-8",
)
def test_malt_parse_uses_subprocess_cwd_without_changing_process_cwd(
monkeypatch, tmp_path
):
parser, model_dir = _minimal_malt_parser(tmp_path)
service_dir = tmp_path / "service"
service_dir.mkdir()
monkeypatch.chdir(service_dir)
def forbidden_chdir(path):
raise AssertionError(f"os.chdir() should not be called with {path!r}")
monkeypatch.setattr(malt.os, "chdir", forbidden_chdir)
captured = {}
def fake_execute(cmd, verbose=False, cwd=None):
captured["cwd"] = cwd
captured["process_cwd"] = os.getcwd()
captured["input_file"] = Path(cmd[cmd.index("-i") + 1])
captured["output_file"] = Path(cmd[cmd.index("-o") + 1])
_write_minimal_parse(cmd)
return 0
parser._execute = fake_execute
graphs = list(parser.parse_tagged_sents([[("hello", "NN")]]))
assert len(graphs) == 1
assert captured["cwd"] == str(model_dir)
assert captured["process_cwd"] == str(service_dir)
assert os.getcwd() == str(service_dir)
assert not captured["input_file"].exists()
assert not captured["output_file"].exists()
def test_malt_parse_cleans_temp_files_and_preserves_cwd_on_execute_exception(
monkeypatch, tmp_path
):
parser, model_dir = _minimal_malt_parser(tmp_path)
service_dir = tmp_path / "service"
service_dir.mkdir()
monkeypatch.chdir(service_dir)
captured = {}
def fake_execute(cmd, verbose=False, cwd=None):
captured["cwd"] = cwd
captured["process_cwd"] = os.getcwd()
captured["input_file"] = Path(cmd[cmd.index("-i") + 1])
captured["output_file"] = Path(cmd[cmd.index("-o") + 1])
assert captured["input_file"].exists()
assert captured["output_file"].exists()
raise RuntimeError("forced parser failure")
parser._execute = fake_execute
with pytest.raises(RuntimeError, match="forced parser failure"):
list(parser.parse_tagged_sents([[("hello", "NN")]]))
assert captured["cwd"] == str(model_dir)
assert captured["process_cwd"] == str(service_dir)
assert os.getcwd() == str(service_dir)
assert not captured["input_file"].exists()
assert not captured["output_file"].exists()