Stop Click from crashing Black on invalid environments

Fixes #277
This commit is contained in:
Łukasz Langa 2018-06-19 22:40:26 -07:00
parent e1ef57a29e
commit 2dfa69bb7f
3 changed files with 49 additions and 0 deletions

View File

@ -833,6 +833,10 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
* they now work when an indentation block starts with empty lines or misaligned
comments (#334)
* made Click not fail on invalid environments; note that Click is right but the
likelihood we'll need to access non-ASCII file paths when dealing with Python source
code is low (#277)
* fixed improper formatting of f-strings with quotes inside interpolated
expressions (#322)

View File

@ -3482,5 +3482,28 @@ def write_cache(
pass
def patch_click() -> None:
"""Make Click not crash.
On certain misconfigured environments, Python 3 selects the ASCII encoding as the
default which restricts paths that it can access during the lifetime of the
application. Click refuses to work in this scenario by raising a RuntimeError.
In case of Black the likelihood that non-ASCII characters are going to be used in
file paths is minimal since it's Python source code. Moreover, this crash was
spurious on Python 3.7 thanks to PEP 538 and PEP 540.
"""
try:
from click import core
from click import _unicodefun # type: ignore
except ModuleNotFoundError:
return
for module in (core, _unicodefun):
if hasattr(module, "_verify_python3_env"):
module._verify_python3_env = lambda: None
if __name__ == "__main__":
patch_click()
main()

View File

@ -1213,6 +1213,28 @@ def test_symlink_out_of_root_directory(self) -> None:
child.is_symlink.assert_called()
self.assertEqual(child.is_symlink.call_count, 2)
def test_shhh_click(self) -> None:
try:
from click import _unicodefun # type: ignore
except ModuleNotFoundError:
self.skipTest("Incompatible Click version")
if not hasattr(_unicodefun, "_verify_python3_env"):
self.skipTest("Incompatible Click version")
# First, let's see if Click is crashing with a preferred ASCII charset.
with patch("locale.getpreferredencoding") as gpe:
gpe.return_value = "ASCII"
with self.assertRaises(RuntimeError):
_unicodefun._verify_python3_env()
# Now, let's silence Click...
black.patch_click()
# ...and confirm it's silent.
with patch("locale.getpreferredencoding") as gpe:
gpe.return_value = "ASCII"
try:
_unicodefun._verify_python3_env()
except RuntimeError as re:
self.fail(f"`patch_click()` failed, exception still raised: {re}")
if __name__ == "__main__":
unittest.main(module="test_black")