google / google/python-fire

Test suite fails on Windows: unescaped path regex in testArgPassing, NamedTemporaryFile reopen in testFileNameFire

未关闭 适合新手
#693 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
28.2k
派生
1.5k
PR 合并指标
30 天内没有已合并 PR

描述

On a fresh clone on Windows, the test suite fails 2 of 261 tests, both in `fire/main_test.py` and both Windows-specific. CI currently runs `macos-latest` + `ubuntu-latest` only, so neither can be caught there.

```
FAILED fire/main_test.py::MainModuleTest::testArgPassing - re.PatternError: bad escape \p at position 5
FAILED fire/main_test.py::MainModuleFileTest::testFileNameFire - PermissionError: [Errno 13] Permission denied: 'C:\\...\\tmponwjvj2u.py'
2 failed, 259 passed in 6.30s
```

Environment: Windows 11, Python 3.13.13, `pip install -e . pytest hypothesis`, clone at current master.

**1. `testArgPassing` — unescaped path in a regex.** `assertOutputMatches` treats its argument as a regex, and the test interpolates `os.path.join('part1', 'part2', 'part3')` unescaped. On Windows that's `part1\part2\part3`, and `\p` has been a hard error (`re.PatternError`) since Python 3.12. POSIX never sees it because `/` needs no escaping. The open PR #679 fixes exactly this with `re.escape()`; applying its change locally takes the suite to 1 failed / 260 passed, so it would be lovely to see it merged.

**2. `testFileNameFire` — `NamedTemporaryFile` can't be reopened while open on Windows.** `MainModuleFileTest.setUp` keeps the temp `.py` file open, and `fire.__main__.import_from_file_path` → `exec_module` then opens it a second time for import. That second open is the documented Windows limitation of `NamedTemporaryFile` ("the name cannot be used to open the file a second time while it is still open"), and it surfaces as `PermissionError` inside the import machinery. This is test-harness-only: `python -m fire somefile.py` itself works fine on Windows.

Fix I verified locally for (2) — with it (plus #679's change), the whole suite passes on this machine, `261 passed in 1.65s`, and it stays green on POSIX semantics:

```diff
def setUp(self):
super().setUp()
- self.file = tempfile.NamedTemporaryFile(suffix='.py') # pylint: disable=consider-using-with
+ self.file = tempfile.NamedTemporaryFile(suffix='.py', delete=False) # pylint: disable=consider-using-with
self.file.write(b'class Foo:\n def double(self, n):\n return 2 * n\n')
- self.file.flush()
+ self.file.close()
+ self.addCleanup(os.unlink, self.file.name)

- self.file2 = tempfile.NamedTemporaryFile() # pylint: disable=consider-using-with
+ self.file2 = tempfile.NamedTemporaryFile(delete=False) # pylint: disable=consider-using-with
+ self.file2.close()
+ self.addCleanup(os.unlink, self.file2.name)
```

(`delete_on_close=False` would be tidier but is 3.12+, and setup.py still advertises 3.7 support.)

I'm reporting this as an issue rather than sending the patch because I haven't signed the Google CLA yet. Happy for anyone — including the author of #679 — to fold the diff above into a PR. Also happy to follow up with a `windows-latest` line for the CI matrix discussion if that's of interest, though I understand that's a bigger decision than these two fixes.

贡献指南

打开贡献指南

调研方向

Start in fire/main_test.py at MainModuleTest.testArgPassing and MainModuleFileTest.setUp/testFileNameFire, then run the Windows test suite with pytest. Check the existing PR #679 context for the regex failure and verify the temporary files can be reopened during import. Done means all 261 tests pass on Windows and POSIX.

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
testing-qa
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
冷清
描述清晰度
描述清楚
新手友好度
85/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。