Skip to content

Commit 8651224

Browse files
committed
Add support for "one of..." patterns
1 parent 08a00aa commit 8651224

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

bpystubgen/parser.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@
3434
_dictionary_pattern: Final = re.compile(
3535
"^(?:[Aa]\\s)?dict(?:ionary)?\\s*[\\[(](?P<key>[^,\\s]+)\\s*,\\s*(?P<value>[^])]+)[])].*$")
3636

37-
_reference_type_pattern: Final = re.compile(
37+
_reference_pattern: Final = re.compile(
3838
"^:class:`[~!]?(?P<name>[a-zA-Z_0-9.\\s]+)(?:\\s*<(?P<target>[a-zA-Z_0-9.]+)>)?`(?:[,.\\s].*)?$")
3939

40+
_reference_item_pattern: Final = re.compile(
41+
"^[-\\s]*:class:`[~!]?(?P<name>[a-zA-Z_0-9.\\s]+)(?:\\s*<(?P<target>[a-zA-Z_0-9.]+)>)?`$")
42+
4043
_union_pattern: Final = re.compile(
4144
"^(?::class:`[~!]?[^`]+`|[a-zA-Z]+)(:?\\sor\\s(?::class:`[~!]?[^`]+`|[a-zA-Z]+))+(?:[,.\\s].*)?$")
4245

@@ -110,7 +113,7 @@ def parse_simple(text: str) -> Optional[str]:
110113

111114

112115
def parse_reference(text: str) -> Optional[str]:
113-
result = _reference_type_pattern.match(text)
116+
result = _reference_pattern.match(text)
114117

115118
type_info = result.group("target") or result.group("name") if result else None
116119

@@ -358,6 +361,27 @@ def parse_union(text: str) -> Optional[str]:
358361
return f"typing.Union[{', '.join(parsed_types)}]"
359362

360363

364+
def parse_union_types(text: str) -> Optional[str]:
365+
lines = text.split("\n")
366+
367+
if len(lines) < 3:
368+
return None
369+
370+
parsed_types = []
371+
372+
for line in filter(lambda l: any(l.strip()), lines[1:]):
373+
result = _reference_item_pattern.match(line)
374+
375+
if not result:
376+
return None
377+
378+
type_info = result.group("target") or result.group("name") if result else None
379+
380+
parsed_types.append(type_info)
381+
382+
return f"typing.Union[{', '.join(parsed_types)}]"
383+
384+
361385
def parse_special_cases(text: str) -> Optional[str]:
362386
text = text.lower()
363387

@@ -391,6 +415,7 @@ def parse_type(text: str) -> Optional[str]:
391415
parse_exp_list_value_of,
392416
parse_dictionary,
393417
parse_union,
418+
parse_union_types,
394419
parse_reference,
395420
parse_simple,
396421
parse_matrix,

tests/test_parser.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,26 @@ def test_parse_matrix(text):
268268
def test_parse_union(args):
269269
(text, types) = args
270270
assert parse_type(text) == f"typing.Union[{', '.join(types)}]"
271+
272+
273+
@mark.parametrize("prefix", ("one of...", "integer"))
274+
@mark.parametrize("bullet", ("", "- "))
275+
@mark.parametrize("blank_lines", (True, False))
276+
def test_parse_union_types(prefix, bullet, blank_lines):
277+
types = (
278+
"bge.texture.FilterBGR24",
279+
"bge.texture.FilterBlueScreen",
280+
"bge.texture.FilterColor"
281+
)
282+
283+
lines = [prefix]
284+
285+
for tpe in types:
286+
lines.append(f"{bullet}:class:`~{tpe}`")
287+
288+
if blank_lines:
289+
lines.append("")
290+
291+
text = "\n".join(lines)
292+
293+
assert parse_type(text) == f"typing.Union[{', '.join(types)}]"

0 commit comments

Comments
 (0)