Visitar URL original
accept None as empty string · googleapis/python-bigtable@54e3007 · GitHub
Skip to content
This repository was archived by the owner on Aug 30, 2026. It is now read-only.

Commit 54e3007

Browse files
committed
accept None as empty string
1 parent 6be8180 commit 54e3007

2 files changed

Lines changed: 15 additions & 7 deletions

File tree

‎google/cloud/bigtable/data/_cross_sync/_decorators.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,18 @@ def __init__(
201201
sync_name: str | None = None,
202202
*,
203203
replace_symbols: dict[str, str] | None = None,
204-
docstring_format_vars: dict[str, tuple[str, str]] | None = None,
204+
docstring_format_vars: dict[str, tuple[str | None, str | None]] | None = None,
205205
rm_aio: bool = False,
206206
add_mapping_for_name: str | None = None,
207207
):
208208
self.sync_name = sync_name
209209
self.replace_symbols = replace_symbols
210210
docstring_format_vars = docstring_format_vars or {}
211211
self.async_docstring_format_vars = {
212-
k: v[0] for k, v in docstring_format_vars.items()
212+
k: v[0] or "" for k, v in docstring_format_vars.items()
213213
}
214214
self.sync_docstring_format_vars = {
215-
k: v[1] for k, v in docstring_format_vars.items()
215+
k: v[1] or "" for k, v in docstring_format_vars.items()
216216
}
217217
self.rm_aio = rm_aio
218218
self.add_mapping_for_name = add_mapping_for_name

‎tests/unit/data/_cross_sync/test_cross_sync_decorators.py‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ def test_class_decorator_adds_mapping(self):
108108
["{A}", {"A": (1, 2)}, "1"],
109109
["{A} {B}", {"A": (1, 2), "B": (3, 4)}, "1 3"],
110110
["hello {world_var}", {"world_var": ("world", "moon")}, "hello world"],
111+
["{empty}", {"empty": ("", "")}, ""],
112+
["{empty}", {"empty": (None, None)}, ""],
113+
["maybe{empty}", {"empty": (None, "yes")}, "maybe"],
114+
["maybe{empty}", {"empty": (" no", None)}, "maybe no"]
111115
],
112116
)
113117
def test_class_decorator_docstring_update(self, docstring, format_vars, expected):
@@ -123,8 +127,8 @@ class Class:
123127
assert Class.__doc__ == expected
124128
# check internal state
125129
instance = self._get_class()(sync_name="s", docstring_format_vars=format_vars)
126-
async_replacements = {k: v[0] for k, v in format_vars.items()}
127-
sync_replacements = {k: v[1] for k, v in format_vars.items()}
130+
async_replacements = {k: v[0] or "" for k, v in format_vars.items()}
131+
sync_replacements = {k: v[1] or "" for k, v in format_vars.items()}
128132
assert instance.async_docstring_format_vars == async_replacements
129133
assert instance.sync_docstring_format_vars == sync_replacements
130134

@@ -299,6 +303,10 @@ def test_async_decorator_no_docstring(self):
299303
["{A}", {"A": (1, 2)}, "1"],
300304
["{A} {B}", {"A": (1, 2), "B": (3, 4)}, "1 3"],
301305
["hello {world_var}", {"world_var": ("world", "moon")}, "hello world"],
306+
["{empty}", {"empty": ("", "")}, ""],
307+
["{empty}", {"empty": (None, None)}, ""],
308+
["maybe{empty}", {"empty": (None, "yes")}, "maybe"],
309+
["maybe{empty}", {"empty": (" no", None)}, "maybe no"]
302310
],
303311
)
304312
def test_async_decorator_docstring_update(self, docstring, format_vars, expected):
@@ -314,8 +322,8 @@ class Class:
314322
assert Class.__doc__ == expected
315323
# check internal state
316324
instance = self._get_class()(docstring_format_vars=format_vars)
317-
async_replacements = {k: v[0] for k, v in format_vars.items()}
318-
sync_replacements = {k: v[1] for k, v in format_vars.items()}
325+
async_replacements = {k: v[0] or "" for k, v in format_vars.items()}
326+
sync_replacements = {k: v[1] or "" for k, v in format_vars.items()}
319327
assert instance.async_docstring_format_vars == async_replacements
320328
assert instance.sync_docstring_format_vars == sync_replacements
321329

0 commit comments

Comments
 (0)