From abe57e3d92727f1b26c717fad3978159b987fe79 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 16 Oct 2023 10:51:51 -0700 Subject: [PATCH] Treat raw strings like other docstrings (#3947) Fixes #3944 --- CHANGES.md | 1 + src/black/lines.py | 15 ++++++++++----- src/black/mode.py | 1 + tests/data/raw_docstring.py | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tests/data/raw_docstring.py diff --git a/CHANGES.md b/CHANGES.md index d1c4a07..1f6a008 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,6 +21,7 @@ multiple lines (#3899) - Magic trailing commas are now respected in return types. (#3916) - Require one empty line after module-level docstrings. (#3932) +- Treat raw triple-quoted strings as docstrings (#3947) ### Configuration diff --git a/src/black/lines.py b/src/black/lines.py index 14754d7..48fde88 100644 --- a/src/black/lines.py +++ b/src/black/lines.py @@ -193,11 +193,16 @@ class Line: @property def is_triple_quoted_string(self) -> bool: """Is the line a triple quoted string?""" - return ( - bool(self) - and self.leaves[0].type == token.STRING - and self.leaves[0].value.startswith(('"""', "'''")) - ) + if not self or self.leaves[0].type != token.STRING: + return False + value = self.leaves[0].value + if value.startswith(('"""', "'''")): + return True + if Preview.accept_raw_docstrings in self.mode and value.startswith( + ("r'''", 'r"""', "R'''", 'R"""') + ): + return True + return False @property def opens_block(self) -> bool: diff --git a/src/black/mode.py b/src/black/mode.py index a57fa37..309f22d 100644 --- a/src/black/mode.py +++ b/src/black/mode.py @@ -188,6 +188,7 @@ class Preview(Enum): dummy_implementations = auto() walrus_subscript = auto() module_docstring_newlines = auto() + accept_raw_docstrings = auto() fix_power_op_line_length = auto() diff --git a/tests/data/raw_docstring.py b/tests/data/raw_docstring.py new file mode 100644 index 0000000..751fd32 --- /dev/null +++ b/tests/data/raw_docstring.py @@ -0,0 +1,32 @@ +# flags: --preview --skip-string-normalization +class C: + + r"""Raw""" + +def f(): + + r"""Raw""" + +class SingleQuotes: + + + r'''Raw''' + +class UpperCaseR: + R"""Raw""" + +# output +class C: + r"""Raw""" + + +def f(): + r"""Raw""" + + +class SingleQuotes: + r'''Raw''' + + +class UpperCaseR: + R"""Raw""" -- 2.39.2