diff --git a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py index 5c916a61943..dc808d0c6ea 100644 --- a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py +++ b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py @@ -96,11 +96,7 @@ def _safe_issubclass(cls: Any, cls_check: Any | tuple[Any, ...]) -> bool: DEFAULT_TYPING_IMPORTS = { "Any", - "Callable", "Dict", - # "List", - "Sequence", - "Mapping", "Literal", "Optional", "Union", @@ -109,6 +105,7 @@ def _safe_issubclass(cls: Any, cls_check: Any | tuple[Any, ...]) -> bool: # TODO: fix import ordering and unused imports with ruff later DEFAULT_IMPORTS = { + "collections.abc": ["Callable", "Mapping", "Sequence"], "typing": sorted(DEFAULT_TYPING_IMPORTS), "reflex_components_core.core.breakpoints": ["Breakpoints"], "reflex_base.event": [ @@ -124,6 +121,7 @@ def _safe_issubclass(cls: Any, cls_check: Any | tuple[Any, ...]) -> bool: } # These pre-0.9 imports might be present in the file and should be removed since the pyi generator will handle them separately. EXCLUDED_IMPORTS = { + "typing": ["Callable", "Mapping", "Sequence"], # moved to collections.abc "reflex.components.core.breakpoints": ["Breakpoints"], "reflex.event": [ "EventChain", @@ -316,28 +314,76 @@ def _get_class_prop_comments(clz: type[Component]) -> Mapping[str, tuple[str, .. """ props_comments: dict[str, tuple[str, ...]] = {} comments = [] + last_prop = "" + in_docstring = False + docstring_lines: list[str] = [] for line in _get_source(clz).splitlines(): + stripped = line.strip() + + # Handle triple-quoted docstrings after prop definitions. + # This must be checked before the `def ` boundary so that + # docstring prose containing "def " doesn't break the loop. + if in_docstring: + if '"""' in stripped or "'''" in stripped: + # End of multi-line docstring. + if '"""' in stripped: + end_text = stripped.partition('"""')[0].strip() + else: + end_text = stripped.partition("'''")[0].strip() + if end_text: + docstring_lines.append(end_text) + if last_prop and docstring_lines: + props_comments[last_prop] = tuple(docstring_lines) + in_docstring = False + docstring_lines = [] + last_prop = "" + else: + docstring_lines.append(stripped) + continue + reached_functions = re.search(r"def ", line) if reached_functions: # We've reached the functions, so stop. break + # Check for start of a docstring right after a prop. + if last_prop and (stripped.startswith(('"""', "'''"))): + quote = '"""' if stripped.startswith('"""') else "'''" + content_after_open = stripped[3:] + if quote in content_after_open: + # Single-line docstring: """text""" + doc_text = content_after_open.partition(quote)[0].strip() + if doc_text: + props_comments[last_prop] = (doc_text,) + last_prop = "" + else: + # Multi-line docstring starts here. + in_docstring = True + docstring_lines = [] + first_line = content_after_open.strip() + if first_line: + docstring_lines.append(first_line) + continue + if line == "": # We hit a blank line, so clear comments to avoid commented out prop appearing in next prop docs. comments.clear() + last_prop = "" continue # Get comments for prop - if line.strip().startswith("#"): + if stripped.startswith("#"): # Remove noqa from the comments. line = line.partition(" # noqa")[0] comments.append(line) + last_prop = "" continue # Check if this line has a prop. match = re.search(r"\w+:", line) if match is None: # This line doesn't have a var, so continue. + last_prop = "" continue # Get the prop. @@ -347,6 +393,7 @@ def _get_class_prop_comments(clz: type[Component]) -> Mapping[str, tuple[str, .. comment.strip().lstrip("#").strip() for comment in comments ) comments.clear() + last_prop = prop return MappingProxyType(props_comments) @@ -629,11 +676,13 @@ def _get_visible_type_name( if type_hint_globals is None: return None + type_module = getattr(typ, "__module__", None) type_name = getattr(typ, "__name__", None) - if ( - type_name is not None - and type_name in type_hint_globals - and type_hint_globals[type_name] is typ + + if type_name is not None and ( + type_hint_globals.get(type_name) is typ + or type_name in DEFAULT_IMPORTS.get(str(type_module), set()) + or type_name in EXCLUDED_IMPORTS.get(str(type_module), set()) ): return type_name @@ -688,11 +737,6 @@ def type_to_ast( return ast.Name(id=typ.__name__) if visible_name := _get_visible_type_name(typ, type_hint_globals): return ast.Name(id=visible_name) - if ( - typ.__module__ in DEFAULT_IMPORTS - and typ.__name__ in DEFAULT_IMPORTS[typ.__module__] - ): - return ast.Name(id=typ.__name__) return ast.Name(id=typ.__module__ + "." + typ.__name__) return ast.Name(id=typ.__name__) if hasattr(typ, "_name"): @@ -1291,6 +1335,23 @@ def visit_Assign(self, node: ast.Assign) -> ast.Assign | None: return node + def visit_Expr(self, node: ast.Expr) -> ast.Expr | None: + """Remove bare string expressions (attribute docstrings) in component classes. + + Args: + node: The Expr node to visit. + + Returns: + The modified Expr node (or None). + """ + if ( + self._current_class_is_component() + and isinstance(node.value, ast.Constant) + and isinstance(node.value.value, str) + ): + return None + return node + def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AnnAssign | None: """Visit an AnnAssign node (Annotated assignment). diff --git a/pyi_hashes.json b/pyi_hashes.json index 01d72078c49..6f93a2554e3 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -1,124 +1,124 @@ { - "packages/reflex-components-code/src/reflex_components_code/code.pyi": "714688c5b43deb05a65ff66e042c8c09", - "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "1aaa72237f8f000967a34bc3e2196b5e", + "packages/reflex-components-code/src/reflex_components_code/code.pyi": "a879ccd253e901964a7ab7ea7154f904", + "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "d3e0c33fdc34f5c154ac387d550c0d29", "packages/reflex-components-core/src/reflex_components_core/__init__.pyi": "82b29d23f2490161d42fd21021bd39c3", "packages/reflex-components-core/src/reflex_components_core/base/__init__.pyi": "7009187aaaf191814d031e5462c48318", - "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "c0c6564e0f3f025551e02b3e9458200b", - "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "9c572ab4973b716b023bb26711292389", - "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "9b66e0cc4579a406dfc6a671025c84b1", - "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "ee2b2b4997eb87649bf571c28b8c7f2f", - "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "4330310dc8a32ec823c69105aa9445ef", - "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "fd3eb0f9943cb52b65c226f6efdbd211", - "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "2e21e059ac87dc9897e09e5dff248fd6", - "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "d94c585877539b4c0f35973fa30ca92a", - "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "b42bd1c1978454d06d783d630e1d6a63", + "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "ecccfd8a9b0e8b2f4128ff13ff27a9da", + "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "2535814d409e5feaf57da63dcf0abeaf", + "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "a2e67a9814dc61853ca2299d9d9c698d", + "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "59170074a1a228ce58685f3f207954f2", + "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "e4cbfc46eabb904596be4372392add35", + "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "629a483c570b04ca3d83ecdc53914770", + "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "0cfa2d8c52321ce7440e887d03007d5b", + "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "bfc7fb609b822f597d1141595f8090fe", + "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "8ee129808abb4389cbd77a1736190eae", "packages/reflex-components-core/src/reflex_components_core/core/__init__.pyi": "dd5142b3c9087bf2bf22651adf6f2724", - "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "5bd2e4aa0d32b6f76fdca5ecdd208922", - "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "e2c488332e3f0accf1cf3a1a8e9e6419", - "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "ec0e3f6c104520b3621559c833cb9ed2", - "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "e2233bf39fdcf74a795b7e3ff6736b5d", - "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "257b7d1ff394d7dfb79fc6e9bf583463", - "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "0515ecd0f7a1e6175b5781ee2a15a519", - "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "c13b4c9ddeccc854f7d4f735b6b8bf35", - "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "f5529c6cb678c5287d5b06c7e288bce6", - "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "ccbd7f4c55eb499a058b4822db3639a3", + "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "918dfad4d5925addd0f741e754b3b076", + "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "6040fbada9b96c55637a9c8cc21a5e10", + "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "e3950e0963a6d04299ff58294687e407", + "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "dd221754c5e076a3a833c8584da72dc5", + "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "7fd81a99bde5b0ff94bb52523597fd5c", + "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "753d6ae315369530dad450ed643f5be6", + "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "ba60a7d9cba75b27a1133bd63a9fbd59", + "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "17775edb94cc804686ae4cd873584810", + "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "cab827931770be082cd1598a9908abbc", "packages/reflex-components-core/src/reflex_components_core/datadisplay/__init__.pyi": "c96fed4da42a13576d64f84e3c7cb25c", "packages/reflex-components-core/src/reflex_components_core/el/__init__.pyi": "f09129ddefb57ab4c7769c86dc9a3153", - "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "3250cce0348494dac0075468bdc6daae", + "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "ff68d843c5987d3f0d773a6367eb9c63", "packages/reflex-components-core/src/reflex_components_core/el/elements/__init__.pyi": "e6c845f2f29eb079697a2e31b0c2f23a", - "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "b494fbc3c0127645c8ec26bb3433f649", - "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "2b245f1839036fe0df71074ab84f98c0", - "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "07cb9aea9d31875fc8dcaf29eb1ffd4b", - "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "ff3a9d9046048b282dd70aa4d7402e3c", - "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "ea0643eae0be461db99618fea05967e2", - "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "9e9a63318f10cc160ae9e5b6697babb4", - "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "239b3e3c1a9f8602de1cff1987eda874", - "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "db2ab8f3fff84d638516bf2d49de703d", - "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "5ec710535671e9fab2ff7761fd0b980d", - "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "611a3addf30eed59b53d0a08c3e13662", - "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "2b039f5a8661c2664921e145bbae9a65", - "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "19d114e89d15fd4e7549c12f00da3cdb", - "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "2813be430faa16707e1dba1523248035", - "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "1ff690ec1e210d74e1b110a53e2c2be7", - "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "b055fb85e46a7f7b3222d3946fc5e1c5", - "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "0080f856cb7385d2a60d262475aa9b55", - "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "109f735eaa418fd88821775111ed4f0e", + "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "d2500a39e6e532bb90c83438343905bf", + "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "ca840a20c8e1c1f5335fb815a25b6c32", + "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "c38a432d1fd0c3208c4fc3a546c67e4d", + "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "b794f4f4f7ad17c6939d5526b9c63397", + "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "f9e51feebda79fb063bc264a235df0c3", + "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "c86abf00384b5f15725a0daf2533848d", + "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "222176bffc14191018fd0e3af3741aff", + "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "fbbe0bf222d4196c32c88d05cb077997", + "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "cba93678248925c981935a251379aa7c", + "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "4abedc6f98f6d54194ff9e7f1f76314e", + "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "1074a512195ae23d479c4a2d553954e1", + "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "07de150d57e16f66b62d66a94da98d74", + "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "d2dc211d707c402eb24678a4cba945f7", + "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "3892ce64fef33649813a25f63c0ba43b", + "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "da02f81678d920a68101c08fe64483a5", + "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "d6a02e447dfd3c91bba84bcd02722aed", + "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "91e956633778c6992f04940c69ff7140", "packages/reflex-components-radix/src/reflex_components_radix/__init__.pyi": "19216eb3618f68c8a76e5e43801cf4af", "packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.pyi": "5404a8da97e8b5129133d7f300e3f642", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "f43b5cd28126ec0290f7054f73251fc8", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "02044350cb13430f4ed2ee731251a066", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "0c4df70b06d647a3ddd5dba70c43f34f", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "ce7fc5bce729b8e114d0655cd4994f9d", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "96a11cfd7262e4b5d3d92d5bcbec7c96", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "8e4f2567cfdedae599426af7caecc05a", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "4c6187c3e8b6b3a6be362ffba61fa8ad", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "e8ef2b44f2afe3e9b8d678d523673882", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "e779c6739baee98c8a588768a88de45a", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "ffb06f3aa8722c2345a952869118e224", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "cc724f697e62efba294e19b58c6f1bd8", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "4d6121ccc963c64e33c49acd4295eb7a", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "b3b66ec57525c53ea741897e2bc8370e", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "c86bc8d4604e3d8c8d40baad2ac6dc17", "packages/reflex-components-radix/src/reflex_components_radix/themes/__init__.pyi": "b433b9a099dc5b0ab008d02c85d38059", - "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "06d8d8014eba38c1ea173c53002a63e3", - "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "b6c9fcb1a2ff029d05b9d658b50b4d11", + "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "e75cbf2a34620721432b1556f3c875cd", + "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "ed020269e4728cc6abe72354193146b7", "packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.pyi": "f10f0169f81c78290333da831915762f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "f3026c5404ccb481cc46d4526d19e825", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "48a00650a3a155e7f1bd09a09bd89543", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "3f5e46fb7bae6b22c54b2134bd78a568", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "a7fd56b738b2b07ae5596836da6ede3c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "4b0481818b2d37243a00d5120abeca01", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "8973b229d7bc67f8c2f596478b527231", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "4daa42eb9d6757ff4e8478cff3b30e6b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "cfe85ecd154bf85333f895760171fa08", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "71ace8982a9f93d9fbbfcff669a4ad4b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "f4e107e9330f7959ccf37dc39f50fb38", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "f71d1088345d3f48eb2dd754ee604e25", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "8c476b1a25f3fa95e1bdf32b83881e2b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "63715a2a2eb4f5d1517f162f005918dd", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "14cf319ffe4044ea9b989b900676aa20", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "1e5fbafb9e8c1b39f126a9040a77c178", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "1e92d503ba0c3bbe294ccb116363333f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "493e6b10e8f8fc4c64ee9741860c1d73", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "bffd2325fdc29f3ecef53c409098e6a9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "d80868e4dee2554fd1c85a0ae68ea975", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "9004f1d4d6b3f480b07e7728e5c344e0", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "1461c1348f86c318fc369fd11e04f1f1", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "8735fa2ad839bdcb41ee2abfc4ab6f42", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "a2226bf54f66fe605168a9644ae81607", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "5664c0d090767a4f938662b5adc8479a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "4192712f54ca0388c26a757b2d062fd4", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "d7c8626d43e079b102b1e1c2f4b5740f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "5ccf7896dffcc17c9520e0a1aeb9d8c2", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "ddcd9afeebdf49aa2ed2b34f4f2e7ad4", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "c0f13b8f32600813135be9bc2b78b98f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "216e9f6fd48bf34b116827bc7813b867", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "82ccd17b638e717e05b6850c457d4756", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "e8588a7a5754684d1587d54bdce4ce08", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "adc91a1ba5d549b3900c6cd97089be93", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "17ba0d974f3a2595140a9f803fef2aaf", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "e619ef44dcd6121a88f21ec5eb0bcb76", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "d5e0419729df4ddf2caf214f40ae7845", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "613abb9870259547c99eb434a3a17512", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "1671e796449b236386d8f53d33e42b2f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "9fde9929ca5197e0e1880bce9a08e926", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "e5d6387a93c74dafaa0d6f1719e08bac", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "09487ef45cf26edb0b7c1d6da5f097f0", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "76afb58340c6be1f26b7b110473efa55", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "6cbf013e21d7280118dfd7383998b3bf", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "63b4134246f68f9f556896d6ce194462", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "ec3f89e7d187303344d4127a83522b22", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "99541ee46f112eb4096f903a99f5ffb8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "1dfd91741ff402b3ed93b6daca4939f3", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "ed9198da4a7950a8579e50ad970c34ef", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "15f9cee0584414f2d2e0fb82c167f216", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "3f328bb0ba5225e4478febf8c7623833", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "be8eed28e19221a406e554829809ff0d", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "9b2adf18f7d239b8e7431f39042ed301", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "4d5813a47b8f8b6ac317ca01d87d9afb", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "1ab01f45a4c5ef4211eacc00cc99e4a5", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "38a7412205a98617f98218a5b213ada1", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "d84b16ac16083a534199fd23659aaa06", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "51fda6313f1ce86d5b1ffdfd68ae8b74", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "bba40e5eae75314157378c9e8b0eea73", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "bf9f751a701137bfedc254657d4c5be4", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "605479e11d19dd7730c90125b198c9b6", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "519781d33b99c675a12014d400e54d08", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "f4848f7d89abb4c78f6db52c624cdabf", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "61a08374fa19a0bb3f52b8654effc0f2", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "530c51742031389d4b2ae43548ff0f03", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "23b21bc11a0012e13ce9bb79b47ba146", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "8364f40600870bafa585528d9cadedf8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "3a52910c327f55656eb59309f9362361", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "fcf562b2f61ecdcc2de6f70d2ebf9907", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "250b7e77b67e7d8cd3fff2b40526c04c", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "799acce0af81899a3a310bdcd43c403b", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.pyi": "9e452af27229b676ad0146e40f75bed5", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "59dfdd4b2237a4a97c58e70476fb53cd", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "fa8f815127a06070d8315e2607c8914a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "05d3f0df46dd16d16f343fbcde0738c3", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "422f06113f95e1f529b0c5fb063a924a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "6974d7234d20ab3962ea3f214621f0fa", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "d3fc6e269dad51d58ef216f4f1383161", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "562a81aa0ecdb5e1df3ffeac627f1fac", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "8fc9ace12dc2203ac03f4e1eb40b0524", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "9465d40e37799336ab293bd9f573239d", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "86bd2f0438888594ed2c27f33b1de618", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "5b262189e235cac17182e79188b1681a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "e06c8fd64132765d61b9edb87a48558b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "5aa934d7c6ba3889fa943eabee7dc05f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "c67fafd1aec105cb5a9927ff0e6d2071", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "aa68061a8e5dfd4adf336d1d1cb000fb", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "06b92d31331c6f08b5083fcc811b754a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "e7cd3a9cea1c34e21f731f1bd05c1ceb", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "8c968fead3155b2d51c687459811b5df", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "cfc8a927642e5b68feabc80080aeb8dc", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "cf88cf870eefaacaf765ead10fb4593b", "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.pyi": "de7ee994f66a4c1d1a6ac2ad3370c30e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "cab479bcd17a1de02a160a128d6c79c8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "bba3d1b425aa8b6cc33a40efa0dcb771", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "db7f5d1ee9840c362088387383e2ee1b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "168df16b7901bf3618745c1e9177e354", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "9bb6cc58f1ab188708e8b65189bddcaa", - "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "dde60f9e0b7a2427570d88ae579d984a", - "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "2cd9d0cb2f6acd5bd0223fbdd74df232", - "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "18e673fcb6ef62d17f9b06d38d713b43", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "92d5a2df77a69a28a4d591000ee46bd1", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "8a1e4376cadf4961212d39a5128a0e4f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "34c7ed3fe1e5f702a98d72751b0052fa", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "619a9d8351748fffe76136002931e583", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "4919daa4483b7c12f6fafd02a2275e0f", + "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "0817c9232a6e4790cff8ea8aa6001950", + "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "6c1c26149d57c708fab04b82de0eb515", + "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "75207a9fe4f37ec2a2f1becbbbd5237b", "packages/reflex-components-recharts/src/reflex_components_recharts/__init__.pyi": "7b8b69840a3637c1f1cac45ba815cccf", - "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "2f1ada2312a4e9109a880df6097d4a52", - "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "331c78673d708334233676cab327d15d", - "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "28717f060c6cff577e9a7e556c395019", - "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "ce8813c1bfdd3b60e07f2dc8373ea8d8", - "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "7d1f8a97e8bdad9fbcd8543a9d9d37d7", - "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "94fd94b9e127bbc98b7bf0011d6305fa", + "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "277bbf09d72e0c450241f0b7d39ebb60", + "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "be20d1d71c3b16f7e973a0329c3d81d6", + "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "c051ab3a26c23107043e203b060e1412", + "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "1979bb6c22bb7a0d3342b2d63fb19d74", + "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "234407dbd466bf9c87d75ce979ab0e2d", + "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "2c5fadcc014056f041cd4d916137d9e7", "reflex/__init__.pyi": "3a9bb8544cbc338ffaf0a5927d9156df", "reflex/components/__init__.pyi": "f39a2af77f438fa243c58c965f19d42e", - "reflex/experimental/memo.pyi": "5912c6017337c852fff42cdfcf95cd6c" + "reflex/experimental/memo.pyi": "2c119a0dfea362dcd8193786363cbc02" } diff --git a/tests/units/reflex_base/utils/pyi_generator/dataset/simple_component.py b/tests/units/reflex_base/utils/pyi_generator/dataset/simple_component.py index 7687d780a07..4f18d8e6740 100644 --- a/tests/units/reflex_base/utils/pyi_generator/dataset/simple_component.py +++ b/tests/units/reflex_base/utils/pyi_generator/dataset/simple_component.py @@ -6,6 +6,7 @@ - Default event handlers inherited from Component - Props with doc strings (via field(doc=...)) - Props with comment-based docs (# comment above prop) +- Props with inline docstrings (triple-quoted string after prop) - Module docstring removal in stubs - visit_Assign: assignment to `Any` is preserved - visit_Assign: non-annotated assignments are removed @@ -41,6 +42,18 @@ class SimpleComponent(Component): doc="An optional label with a default value.", ) + description: Var[str] + """A detailed description of the component.""" + + tooltip: Var[str] + """A tooltip that appears on hover + with additional details.""" + + callback: Var[str] + """ + The def of the callback to use when the component is clicked. + """ + def _private_method(self): """This should not appear in the stub. diff --git a/tests/units/reflex_base/utils/pyi_generator/dataset/var_types.py b/tests/units/reflex_base/utils/pyi_generator/dataset/var_types.py index dc858c690d1..fcd4e30cbee 100644 --- a/tests/units/reflex_base/utils/pyi_generator/dataset/var_types.py +++ b/tests/units/reflex_base/utils/pyi_generator/dataset/var_types.py @@ -4,10 +4,12 @@ - Var[T] expansion: Var[str] -> Var[str] | str - Var with Union args: Var[str | int] -> Var[str | int] | str | int - Complex nested types: Var[list[str]], Var[dict[str, Any]], Var[list[dict[str, Any]]] +- Callable prop: Var[Callable[[], bool]] (should NOT expand inner type) - Component with no custom props (just inherited defaults) - Component with only event handlers (no data props) """ +from collections.abc import Callable from typing import Any from reflex_base.components.component import Component, field @@ -43,3 +45,6 @@ class VarTypesComponent(Component): items: Var[list[str]] = field(doc="A list of string items.") metadata: Var[dict[str, Any]] = field(doc="Metadata dictionary.") nested: Var[list[dict[str, Any]]] = field(doc="Nested structures.") + + # Callable prop — the inner Callable type should not be expanded. + on_check: Var[Callable[[], bool]] = field(doc="A callable that returns bool.") diff --git a/tests/units/reflex_base/utils/pyi_generator/golden/simple_component.pyi b/tests/units/reflex_base/utils/pyi_generator/golden/simple_component.pyi index cc88208502c..a6930f4dc36 100644 --- a/tests/units/reflex_base/utils/pyi_generator/golden/simple_component.pyi +++ b/tests/units/reflex_base/utils/pyi_generator/golden/simple_component.pyi @@ -25,6 +25,9 @@ class SimpleComponent(Component): is_active: Var[bool] | bool | None = None, opacity: Var[float] | float | None = None, label: Var[str] | str | None = None, + description: Var[str] | str | None = None, + tooltip: Var[str] | str | None = None, + callback: Var[str] | str | None = None, style: Sequence[Mapping[str, Any]] | Mapping[str, Any] | Var[Mapping[str, Any]] @@ -62,6 +65,9 @@ class SimpleComponent(Component): is_active: Whether the component is active. opacity: The opacity of the component. label: An optional label with a default value. + description: A detailed description of the component. + tooltip: A tooltip that appears on hover with additional details. + callback: The def of the callback to use when the component is clicked. style: The style of the component. key: A unique key for the component. id: The id for the component. diff --git a/tests/units/reflex_base/utils/pyi_generator/golden/var_types.pyi b/tests/units/reflex_base/utils/pyi_generator/golden/var_types.pyi index f8a98a19ce3..b4340b3461e 100644 --- a/tests/units/reflex_base/utils/pyi_generator/golden/var_types.pyi +++ b/tests/units/reflex_base/utils/pyi_generator/golden/var_types.pyi @@ -3,7 +3,7 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from collections.abc import Mapping, Sequence +from collections.abc import Callable, Mapping, Sequence from typing import Any from reflex_base.components.component import Component @@ -156,6 +156,7 @@ class VarTypesComponent(Component): items: Var[list[str]] | list[str] | None = None, metadata: Var[dict[str, Any]] | dict[str, Any] | None = None, nested: Var[list[dict[str, Any]]] | list[dict[str, Any]] | None = None, + on_check: Callable[[], bool] | Var[Callable[[], bool]] | None = None, style: Sequence[Mapping[str, Any]] | Mapping[str, Any] | Var[Mapping[str, Any]] @@ -196,6 +197,7 @@ class VarTypesComponent(Component): items: A list of string items. metadata: Metadata dictionary. nested: Nested structures. + on_check: A callable that returns bool. style: The style of the component. key: A unique key for the component. id: The id for the component.