-
-
Notifications
You must be signed in to change notification settings - Fork 62
Description
Hey, thanks for your work on griffe! It's been working really great, so I haven't had much to raise here 😁, but I stumbled on an issue that might be related to setuptools putting annotations in its editable install artifacts.
Description of the bug
Recently, while debugging a doc build for py-shiny, I noticed that the editable finder code was using ast.AnnAssign, while griffe looks for ast.Assign. As best I can tell, this led to griffe not finding the editable shiny install. It appears that griffe looks for an ast.Assign node, which is not a parent of ast.AnnAssign 😢 .
Below are the relevant lines of site-packages/__editable___shiny_0_9_0_9000_finder.py:
from __future__ import annotations
import sys
from importlib.machinery import ModuleSpec, PathFinder
from importlib.machinery import all_suffixes as module_suffixes
from importlib.util import spec_from_file_location
from itertools import chain
from pathlib import Path
# NOTE THE ANNOTATION BELOW ----
MAPPING: dict[str, str] = {'shiny': '/Users/machow/repos/py-shiny/shiny'}
NAMESPACES: dict[str, list[str]] = {'shiny.api-examples': ['/Users/machow/repos/py-shiny/shiny/api-examples'], 'shiny.www': ['/Users/machow/repos/py-shiny/shiny/www'], 'shiny.templates': ['/Users/machow/repos/py-shiny/shiny/templates'], 'shiny.experimental.api-examples': ['/Users/machow/repos/py-shiny/shiny/experimental/api-examples'], 'shiny.experimental.api-examples.card_image': ['/Users/machow/repos/py-shiny/shiny/experimental/api-examples/card_image'], 'shiny.experimental.api-examples.card_title': ['/Users/machow/repos/py-shiny/shiny/experimental/api-examples/card_title'], 'shiny.express.display_decorator': ['/Users/machow/repos/py-shiny/shiny/express/display_decorator'], 'shiny.api-examples.as_fillable_container': ['/Users/machow/repos/py-shiny/shiny/api-examples/as_fillable_container'], 'shiny.api-examples.sidebar': ['/Users/machow/repos/py-shiny/shiny/api-examples/sidebar'], 'shiny.api-examples.input_selectize': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_selectize'], 'shiny.api-examples.insert_ui': ['/Users/machow/repos/py-shiny/shiny/api-examples/insert_ui'], 'shiny.api-examples.notification_show': ['/Users/machow/repos/py-shiny/shiny/api-examples/notification_show'], 'shiny.api-examples.invalidate_later': ['/Users/machow/repos/py-shiny/shiny/api-examples/invalidate_later'], 'shiny.api-examples.Renderer': ['/Users/machow/repos/py-shiny/shiny/api-examples/Renderer'], 'shiny.api-examples.tooltip': ['/Users/machow/repos/py-shiny/shiny/api-examples/tooltip'], 'shiny.api-examples.card_body': ['/Users/machow/repos/py-shiny/shiny/api-examples/card_body'], 'shiny.api-examples.input_password': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_password'], 'shiny.api-examples.SilentException': ['/Users/machow/repos/py-shiny/shiny/api-examples/SilentException'], 'shiny.api-examples.card': ['/Users/machow/repos/py-shiny/shiny/api-examples/card'], 'shiny.api-examples.update_checkbox_group': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_checkbox_group'], 'shiny.api-examples.close': ['/Users/machow/repos/py-shiny/shiny/api-examples/close'], 'shiny.api-examples.output_image': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_image'], 'shiny.api-examples.Progress': ['/Users/machow/repos/py-shiny/shiny/api-examples/Progress'], 'shiny.api-examples.input_text_area': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_text_area'], 'shiny.api-examples.input_radio_buttons': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_radio_buttons'], 'shiny.api-examples.layout_columns': ['/Users/machow/repos/py-shiny/shiny/api-examples/layout_columns'], 'shiny.api-examples.download_link': ['/Users/machow/repos/py-shiny/shiny/api-examples/download_link'], 'shiny.api-examples.input_dark_mode': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_dark_mode'], 'shiny.api-examples.on_flushed': ['/Users/machow/repos/py-shiny/shiny/api-examples/on_flushed'], 'shiny.api-examples.input_date_range': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_date_range'], 'shiny.api-examples.isolate': ['/Users/machow/repos/py-shiny/shiny/api-examples/isolate'], 'shiny.api-examples.input_action_button': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_action_button'], 'shiny.api-examples.navset_hidden': ['/Users/machow/repos/py-shiny/shiny/api-examples/navset_hidden'], 'shiny.api-examples.SilentCancelOutputException': ['/Users/machow/repos/py-shiny/shiny/api-examples/SilentCancelOutputException'], 'shiny.api-examples.showcase_left_center': ['/Users/machow/repos/py-shiny/shiny/api-examples/showcase_left_center'], 'shiny.api-examples.accordion': ['/Users/machow/repos/py-shiny/shiny/api-examples/accordion'], 'shiny.api-examples.markdown': ['/Users/machow/repos/py-shiny/shiny/api-examples/markdown'], 'shiny.api-examples.update_navs': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_navs'], 'shiny.api-examples.update_numeric': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_numeric'], 'shiny.api-examples.Module': ['/Users/machow/repos/py-shiny/shiny/api-examples/Module'], 'shiny.api-examples.card_footer': ['/Users/machow/repos/py-shiny/shiny/api-examples/card_footer'], 'shiny.api-examples.todo_list': ['/Users/machow/repos/py-shiny/shiny/api-examples/todo_list'], 'shiny.api-examples.data_frame': ['/Users/machow/repos/py-shiny/shiny/api-examples/data_frame'], 'shiny.api-examples.output_ui': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_ui'], 'shiny.api-examples.update_popover': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_popover'], 'shiny.api-examples.include_js': ['/Users/machow/repos/py-shiny/shiny/api-examples/include_js'], 'shiny.api-examples.panel_absolute': ['/Users/machow/repos/py-shiny/shiny/api-examples/panel_absolute'], 'shiny.api-examples.input_checkbox': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_checkbox'], 'shiny.api-examples.Value': ['/Users/machow/repos/py-shiny/shiny/api-examples/Value'], 'shiny.api-examples.template': ['/Users/machow/repos/py-shiny/shiny/api-examples/template'], 'shiny.api-examples.input_text': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_text'], 'shiny.api-examples.dynamic_route': ['/Users/machow/repos/py-shiny/shiny/api-examples/dynamic_route'], 'shiny.api-examples.effect': ['/Users/machow/repos/py-shiny/shiny/api-examples/effect'], 'shiny.api-examples.panel_title': ['/Users/machow/repos/py-shiny/shiny/api-examples/panel_title'], 'shiny.api-examples.update_date': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_date'], 'shiny.api-examples.remove_accordion_panel': ['/Users/machow/repos/py-shiny/shiny/api-examples/remove_accordion_panel'], 'shiny.api-examples.input_slider': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_slider'], 'shiny.api-examples.output_text': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_text'], 'shiny.api-examples.page_fixed': ['/Users/machow/repos/py-shiny/shiny/api-examples/page_fixed'], 'shiny.api-examples.update_select': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_select'], 'shiny.api-examples.update_accordion_panel': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_accordion_panel'], 'shiny.api-examples.update_checkbox': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_checkbox'], 'shiny.api-examples.layout_column_wrap': ['/Users/machow/repos/py-shiny/shiny/api-examples/layout_column_wrap'], 'shiny.api-examples.showcase_top_right': ['/Users/machow/repos/py-shiny/shiny/api-examples/showcase_top_right'], 'shiny.api-examples.extended_task': ['/Users/machow/repos/py-shiny/shiny/api-examples/extended_task'], 'shiny.api-examples.calc': ['/Users/machow/repos/py-shiny/shiny/api-examples/calc'], 'shiny.api-examples.popover': ['/Users/machow/repos/py-shiny/shiny/api-examples/popover'], 'shiny.api-examples.req': ['/Users/machow/repos/py-shiny/shiny/api-examples/req'], 'shiny.api-examples.insert_accordion_panel': ['/Users/machow/repos/py-shiny/shiny/api-examples/insert_accordion_panel'], 'shiny.api-examples.download_button': ['/Users/machow/repos/py-shiny/shiny/api-examples/download_button'], 'shiny.api-examples.row': ['/Users/machow/repos/py-shiny/shiny/api-examples/row'], 'shiny.api-examples.output_plot': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_plot'], 'shiny.api-examples.accordion_panel': ['/Users/machow/repos/py-shiny/shiny/api-examples/accordion_panel'], 'shiny.api-examples.SafeException': ['/Users/machow/repos/py-shiny/shiny/api-examples/SafeException'], 'shiny.api-examples.include_css': ['/Users/machow/repos/py-shiny/shiny/api-examples/include_css'], 'shiny.api-examples.render_express': ['/Users/machow/repos/py-shiny/shiny/api-examples/render_express'], 'shiny.api-examples.input_file': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_file'], 'shiny.api-examples.nav_panel': ['/Users/machow/repos/py-shiny/shiny/api-examples/nav_panel'], 'shiny.api-examples.data_frame_data_view': ['/Users/machow/repos/py-shiny/shiny/api-examples/data_frame_data_view'], 'shiny.api-examples.page_fluid': ['/Users/machow/repos/py-shiny/shiny/api-examples/page_fluid'], 'shiny.api-examples.theme': ['/Users/machow/repos/py-shiny/shiny/api-examples/theme'], 'shiny.api-examples.download': ['/Users/machow/repos/py-shiny/shiny/api-examples/download'], 'shiny.api-examples.output_transformer': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_transformer'], 'shiny.api-examples.as_fill_item': ['/Users/machow/repos/py-shiny/shiny/api-examples/as_fill_item'], 'shiny.api-examples.update_action_button': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_action_button'], 'shiny.api-examples.data_frame_set_patches': ['/Users/machow/repos/py-shiny/shiny/api-examples/data_frame_set_patches'], 'shiny.api-examples.on_flush': ['/Users/machow/repos/py-shiny/shiny/api-examples/on_flush'], 'shiny.api-examples.input_switch': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_switch'], 'shiny.api-examples.card_header': ['/Users/machow/repos/py-shiny/shiny/api-examples/card_header'], 'shiny.api-examples.update_selectize': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_selectize'], 'shiny.api-examples.input_numeric': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_numeric'], 'shiny.api-examples.render_image': ['/Users/machow/repos/py-shiny/shiny/api-examples/render_image'], 'shiny.api-examples.input_action_link': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_action_link'], 'shiny.api-examples.update_tooltip': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_tooltip'], 'shiny.api-examples.output_table': ['/Users/machow/repos/py-shiny/shiny/api-examples/output_table'], 'shiny.api-examples.page_opts': ['/Users/machow/repos/py-shiny/shiny/api-examples/page_opts'], 'shiny.api-examples.update_slider': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_slider'], 'shiny.api-examples.on_ended': ['/Users/machow/repos/py-shiny/shiny/api-examples/on_ended'], 'shiny.api-examples.input_select': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_select'], 'shiny.api-examples.update_radio_buttons': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_radio_buttons'], 'shiny.api-examples.update_sidebar': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_sidebar'], 'shiny.api-examples.modal': ['/Users/machow/repos/py-shiny/shiny/api-examples/modal'], 'shiny.api-examples.input_checkbox_group': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_checkbox_group'], 'shiny.api-examples.value_box': ['/Users/machow/repos/py-shiny/shiny/api-examples/value_box'], 'shiny.api-examples.busy_indicators': ['/Users/machow/repos/py-shiny/shiny/api-examples/busy_indicators'], 'shiny.api-examples.www_dir': ['/Users/machow/repos/py-shiny/shiny/api-examples/www_dir'], 'shiny.api-examples.page_sidebar': ['/Users/machow/repos/py-shiny/shiny/api-examples/page_sidebar'], 'shiny.api-examples.panel_conditional': ['/Users/machow/repos/py-shiny/shiny/api-examples/panel_conditional'], 'shiny.api-examples.event': ['/Users/machow/repos/py-shiny/shiny/api-examples/event'], 'shiny.api-examples.showcase_bottom': ['/Users/machow/repos/py-shiny/shiny/api-examples/showcase_bottom'], 'shiny.api-examples.file_reader': ['/Users/machow/repos/py-shiny/shiny/api-examples/file_reader'], 'shiny.api-examples.update_text': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_text'], 'shiny.api-examples.poll': ['/Users/machow/repos/py-shiny/shiny/api-examples/poll'], 'shiny.api-examples.send_custom_message': ['/Users/machow/repos/py-shiny/shiny/api-examples/send_custom_message'], 'shiny.api-examples.remove_ui': ['/Users/machow/repos/py-shiny/shiny/api-examples/remove_ui'], 'shiny.api-examples.input_date': ['/Users/machow/repos/py-shiny/shiny/api-examples/input_date'], 'shiny.api-examples.update_accordion': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_accordion'], 'shiny.api-examples.update_date_range': ['/Users/machow/repos/py-shiny/shiny/api-examples/update_date_range'], 'shiny.api-examples.layout_sidebar': ['/Users/machow/repos/py-shiny/shiny/api-examples/layout_sidebar'], 'shiny.api-examples.include_js.js': ['/Users/machow/repos/py-shiny/shiny/api-examples/include_js/js'], 'shiny.api-examples.include_css.css': ['/Users/machow/repos/py-shiny/shiny/api-examples/include_css/css'], 'shiny.api-examples.theme.css': ['/Users/machow/repos/py-shiny/shiny/api-examples/theme/css'], 'shiny.api-examples.www_dir.www': ['/Users/machow/repos/py-shiny/shiny/api-examples/www_dir/www'], 'shiny.api-examples.www_dir.www.css': ['/Users/machow/repos/py-shiny/shiny/api-examples/www_dir/www/css'], 'shiny.api-examples.www_dir.www.js': ['/Users/machow/repos/py-shiny/shiny/api-examples/www_dir/www/js'], 'shiny.www.shared': ['/Users/machow/repos/py-shiny/shiny/www/shared'], 'shiny.www.shared.selectize': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize'], 'shiny.www.shared.jqueryui': ['/Users/machow/repos/py-shiny/shiny/www/shared/jqueryui'], 'shiny.www.shared.htmltools': ['/Users/machow/repos/py-shiny/shiny/www/shared/htmltools'], 'shiny.www.shared.bootstrap': ['/Users/machow/repos/py-shiny/shiny/www/shared/bootstrap'], 'shiny.www.shared.highlight': ['/Users/machow/repos/py-shiny/shiny/www/shared/highlight'], 'shiny.www.shared.bslib': ['/Users/machow/repos/py-shiny/shiny/www/shared/bslib'], 'shiny.www.shared.strftime': ['/Users/machow/repos/py-shiny/shiny/www/shared/strftime'], 'shiny.www.shared.datepicker': ['/Users/machow/repos/py-shiny/shiny/www/shared/datepicker'], 'shiny.www.shared.jquery': ['/Users/machow/repos/py-shiny/shiny/www/shared/jquery'], 'shiny.www.shared.requirejs': ['/Users/machow/repos/py-shiny/shiny/www/shared/requirejs'], 'shiny.www.shared.ionrangeslider': ['/Users/machow/repos/py-shiny/shiny/www/shared/ionrangeslider'], 'shiny.www.shared.py-shiny': ['/Users/machow/repos/py-shiny/shiny/www/shared/py-shiny'], 'shiny.www.shared.showdown': ['/Users/machow/repos/py-shiny/shiny/www/shared/showdown'], 'shiny.www.shared.busy-indicators': ['/Users/machow/repos/py-shiny/shiny/www/shared/busy-indicators'], 'shiny.www.shared.selectize.css': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/css'], 'shiny.www.shared.selectize.js': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/js'], 'shiny.www.shared.selectize.scss': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/scss'], 'shiny.www.shared.selectize.accessibility': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/accessibility'], 'shiny.www.shared.selectize.scss.plugins': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/scss/plugins'], 'shiny.www.shared.selectize.accessibility.js': ['/Users/machow/repos/py-shiny/shiny/www/shared/selectize/accessibility/js'], 'shiny.www.shared.jqueryui.images': ['/Users/machow/repos/py-shiny/shiny/www/shared/jqueryui/images'], 'shiny.www.shared.htmltools.fill': ['/Users/machow/repos/py-shiny/shiny/www/shared/htmltools/fill'], 'shiny.www.shared.bootstrap.fonts': ['/Users/machow/repos/py-shiny/shiny/www/shared/bootstrap/fonts'], 'shiny.www.shared.bootstrap.fonts.bootstrap': ['/Users/machow/repos/py-shiny/shiny/www/shared/bootstrap/fonts/bootstrap'], 'shiny.www.shared.bslib.components': ['/Users/machow/repos/py-shiny/shiny/www/shared/bslib/components'], 'shiny.www.shared.bslib.components.webComponents': ['/Users/machow/repos/py-shiny/shiny/www/shared/bslib/components/webComponents'], 'shiny.www.shared.datepicker.css': ['/Users/machow/repos/py-shiny/shiny/www/shared/datepicker/css'], 'shiny.www.shared.datepicker.js': ['/Users/machow/repos/py-shiny/shiny/www/shared/datepicker/js'], 'shiny.www.shared.datepicker.js.locales': ['/Users/machow/repos/py-shiny/shiny/www/shared/datepicker/js/locales'], 'shiny.www.shared.ionrangeslider.css': ['/Users/machow/repos/py-shiny/shiny/www/shared/ionrangeslider/css'], 'shiny.www.shared.ionrangeslider.js': ['/Users/machow/repos/py-shiny/shiny/www/shared/ionrangeslider/js'], 'shiny.www.shared.py-shiny.data-frame': ['/Users/machow/repos/py-shiny/shiny/www/shared/py-shiny/data-frame'], 'shiny.www.shared.py-shiny.page-output': ['/Users/machow/repos/py-shiny/shiny/www/shared/py-shiny/page-output'], 'shiny.www.shared.py-shiny.text-area': ['/Users/machow/repos/py-shiny/shiny/www/shared/py-shiny/text-area'], 'shiny.www.shared.py-shiny.spin': ['/Users/machow/repos/py-shiny/shiny/www/shared/py-shiny/spin'], 'shiny.www.shared.showdown.compressed': ['/Users/machow/repos/py-shiny/shiny/www/shared/showdown/compressed'], 'shiny.www.shared.showdown.src': ['/Users/machow/repos/py-shiny/shiny/www/shared/showdown/src'], 'shiny.www.shared.busy-indicators.spinners': ['/Users/machow/repos/py-shiny/shiny/www/shared/busy-indicators/spinners'], 'shiny.templates.package-templates': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates'], 'shiny.templates.app-templates': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates'], 'shiny.templates.package-templates.js-output': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-output'], 'shiny.templates.package-templates.js-input': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-input'], 'shiny.templates.package-templates.js-react': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-react'], 'shiny.templates.package-templates.js-output.example-app': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-output/example-app'], 'shiny.templates.package-templates.js-output.srcts': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-output/srcts'], 'shiny.templates.package-templates.js-input.example-app': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-input/example-app'], 'shiny.templates.package-templates.js-input.srcts': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-input/srcts'], 'shiny.templates.package-templates.js-input.custom_component.distjs': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-input/custom_component/distjs'], 'shiny.templates.package-templates.js-react.example-app': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-react/example-app'], 'shiny.templates.package-templates.js-react.srcts': ['/Users/machow/repos/py-shiny/shiny/templates/package-templates/js-react/srcts'], 'shiny.templates.app-templates.basic-app': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates/basic-app'], 'shiny.templates.app-templates.basic-navigation': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates/basic-navigation'], 'shiny.templates.app-templates.dashboard': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates/dashboard'], 'shiny.templates.app-templates.dashboard-tips': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates/dashboard-tips'], 'shiny.templates.app-templates.basic-sidebar': ['/Users/machow/repos/py-shiny/shiny/templates/app-templates/basic-sidebar']}
PATH_PLACEHOLDER = '__editable__.shiny-0.9.0.9000.finder' + ".__path_hook__"To Reproduce
- install python 3.12 with the latest version of setuptools (v70.0.0)
- pip install something as editable
- if you want to recreate with shiny...
- clone https://github.com/posit-dev/py-shiny
- cd docs, then
- make venv
- make deps
- the finder should be in the root:
venv/lib/.../__editable__....py
Full traceback
No error was printed, but griffe found the shiny binary, as that was first on sys.path.
Expected behavior
The shiny module is found from the editable install.