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

Offen Anfängerfreundlich
#693 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
85/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Ruhig
Tech-Stack
python
Bereich
testing-qa

Rechercherichtung

Beginne in fire/main_test.py bei MainModuleTest.testArgPassing und MainModuleFileTest.setUp/testFileNameFire und führe dann die Windows-Test-Suite mit pytest aus. Prüfe den bestehenden Kontext von PR #679 bezüglich des Regex-Fehlers und verifiziere, dass die temporären Dateien während des Imports erneut geöffnet werden können. Erledigt ist die Aufgabe, wenn alle 261 Tests unter Windows und POSIX bestehen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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. testFileNameFireNamedTemporaryFile can't be reopened while open on Windows. MainModuleFileTest.setUp keeps the temp .py file open, and fire.__main__.import_from_file_pathexec_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:

   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.

Vorherrschende Sprache
Python
Sterne
28.2k
Forks
1.5k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus google/python-fire

Alle Issues in google/python-fire

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.