|
34 | 34 | _dictionary_pattern: Final = re.compile( |
35 | 35 | "^(?:[Aa]\\s)?dict(?:ionary)?\\s*[\\[(](?P<key>[^,\\s]+)\\s*,\\s*(?P<value>[^])]+)[])].*$") |
36 | 36 |
|
37 | | -_reference_type_pattern: Final = re.compile( |
| 37 | +_reference_pattern: Final = re.compile( |
38 | 38 | "^:class:`[~!]?(?P<name>[a-zA-Z_0-9.\\s]+)(?:\\s*<(?P<target>[a-zA-Z_0-9.]+)>)?`(?:[,.\\s].*)?$") |
39 | 39 |
|
| 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 | + |
40 | 43 | _union_pattern: Final = re.compile( |
41 | 44 | "^(?::class:`[~!]?[^`]+`|[a-zA-Z]+)(:?\\sor\\s(?::class:`[~!]?[^`]+`|[a-zA-Z]+))+(?:[,.\\s].*)?$") |
42 | 45 |
|
@@ -110,7 +113,7 @@ def parse_simple(text: str) -> Optional[str]: |
110 | 113 |
|
111 | 114 |
|
112 | 115 | def parse_reference(text: str) -> Optional[str]: |
113 | | - result = _reference_type_pattern.match(text) |
| 116 | + result = _reference_pattern.match(text) |
114 | 117 |
|
115 | 118 | type_info = result.group("target") or result.group("name") if result else None |
116 | 119 |
|
@@ -358,6 +361,27 @@ def parse_union(text: str) -> Optional[str]: |
358 | 361 | return f"typing.Union[{', '.join(parsed_types)}]" |
359 | 362 |
|
360 | 363 |
|
| 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 | + |
361 | 385 | def parse_special_cases(text: str) -> Optional[str]: |
362 | 386 | text = text.lower() |
363 | 387 |
|
@@ -391,6 +415,7 @@ def parse_type(text: str) -> Optional[str]: |
391 | 415 | parse_exp_list_value_of, |
392 | 416 | parse_dictionary, |
393 | 417 | parse_union, |
| 418 | + parse_union_types, |
394 | 419 | parse_reference, |
395 | 420 | parse_simple, |
396 | 421 | parse_matrix, |
|
0 commit comments