parent
e1ef57a29e
commit
2dfa69bb7f
@ -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)
|
||||
|
||||
|
23
black.py
23
black.py
@ -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()
|
||||
|
@ -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")
|
||||
|
Loading…
Reference in New Issue
Block a user