wxPython 4.3.2__cp315-cp315-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wx/WebView2Loader.dll +0 -0
- wx/__init__.py +22 -0
- wx/__init__.pyi +10 -0
- wx/__version__.py +9 -0
- wx/__version__.pyi +15 -0
- wx/_adv.cp315-win_amd64.pyd +0 -0
- wx/_aui.cp315-win_amd64.pyd +0 -0
- wx/_core.cp315-win_amd64.pyd +0 -0
- wx/_dataview.cp315-win_amd64.pyd +0 -0
- wx/_glcanvas.cp315-win_amd64.pyd +0 -0
- wx/_grid.cp315-win_amd64.pyd +0 -0
- wx/_html.cp315-win_amd64.pyd +0 -0
- wx/_html2.cp315-win_amd64.pyd +0 -0
- wx/_media.cp315-win_amd64.pyd +0 -0
- wx/_msw.cp315-win_amd64.pyd +0 -0
- wx/_propgrid.cp315-win_amd64.pyd +0 -0
- wx/_ribbon.cp315-win_amd64.pyd +0 -0
- wx/_richtext.cp315-win_amd64.pyd +0 -0
- wx/_stc.cp315-win_amd64.pyd +0 -0
- wx/_xml.cp315-win_amd64.pyd +0 -0
- wx/_xrc.cp315-win_amd64.pyd +0 -0
- wx/adv.py +127 -0
- wx/adv.pyi +5931 -0
- wx/aui.py +70 -0
- wx/aui.pyi +4805 -0
- wx/core.py +3417 -0
- wx/core.pyi +62949 -0
- wx/dataview.py +176 -0
- wx/dataview.pyi +3828 -0
- wx/gizmos.py +18 -0
- wx/glcanvas.py +13 -0
- wx/glcanvas.pyi +544 -0
- wx/grid.py +237 -0
- wx/grid.pyi +5678 -0
- wx/html.py +38 -0
- wx/html.pyi +3283 -0
- wx/html2.py +46 -0
- wx/html2.pyi +1301 -0
- wx/include/wxPython/sip.h +1938 -0
- wx/include/wxPython/wxpy_api.h +418 -0
- wx/lib/CDate.py +201 -0
- wx/lib/ClickableHtmlWindow.py +57 -0
- wx/lib/__init__.py +0 -0
- wx/lib/activex.py +178 -0
- wx/lib/activexwrapper.py +153 -0
- wx/lib/agw/__init__.py +128 -0
- wx/lib/agw/advancedsplash.py +563 -0
- wx/lib/agw/aquabutton.py +1127 -0
- wx/lib/agw/artmanager.py +2110 -0
- wx/lib/agw/aui/__init__.py +295 -0
- wx/lib/agw/aui/aui_constants.py +2616 -0
- wx/lib/agw/aui/aui_switcherdialog.py +1232 -0
- wx/lib/agw/aui/aui_utilities.py +648 -0
- wx/lib/agw/aui/auibar.py +4045 -0
- wx/lib/agw/aui/auibook.py +6288 -0
- wx/lib/agw/aui/dockart.py +1198 -0
- wx/lib/agw/aui/framemanager.py +10485 -0
- wx/lib/agw/aui/tabart.py +2749 -0
- wx/lib/agw/aui/tabmdi.py +679 -0
- wx/lib/agw/balloontip.py +1157 -0
- wx/lib/agw/buttonpanel.py +2787 -0
- wx/lib/agw/cubecolourdialog.py +3529 -0
- wx/lib/agw/customtreectrl.py +9908 -0
- wx/lib/agw/data/ShortcutEditor_1.png +0 -0
- wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
- wx/lib/agw/data/default_help_text.html +105 -0
- wx/lib/agw/flatmenu.py +7392 -0
- wx/lib/agw/flatnotebook.py +6669 -0
- wx/lib/agw/floatspin.py +1820 -0
- wx/lib/agw/fmcustomizedlg.py +535 -0
- wx/lib/agw/fmresources.py +407 -0
- wx/lib/agw/foldpanelbar.py +2282 -0
- wx/lib/agw/fourwaysplitter.py +1130 -0
- wx/lib/agw/genericmessagedialog.py +1549 -0
- wx/lib/agw/gradientbutton.py +731 -0
- wx/lib/agw/hyperlink.py +664 -0
- wx/lib/agw/hypertreelist.py +5756 -0
- wx/lib/agw/infobar.py +885 -0
- wx/lib/agw/knobctrl.py +944 -0
- wx/lib/agw/labelbook.py +3028 -0
- wx/lib/agw/multidirdialog.py +581 -0
- wx/lib/agw/peakmeter.py +1028 -0
- wx/lib/agw/persist/__init__.py +188 -0
- wx/lib/agw/persist/persist_constants.py +283 -0
- wx/lib/agw/persist/persist_handlers.py +2614 -0
- wx/lib/agw/persist/persistencemanager.py +863 -0
- wx/lib/agw/piectrl.py +1082 -0
- wx/lib/agw/pybusyinfo.py +399 -0
- wx/lib/agw/pycollapsiblepane.py +940 -0
- wx/lib/agw/pygauge.py +570 -0
- wx/lib/agw/pyprogress.py +916 -0
- wx/lib/agw/ribbon/__init__.py +198 -0
- wx/lib/agw/ribbon/art.py +219 -0
- wx/lib/agw/ribbon/art_aui.py +1283 -0
- wx/lib/agw/ribbon/art_default.py +81 -0
- wx/lib/agw/ribbon/art_internal.py +248 -0
- wx/lib/agw/ribbon/art_msw.py +2735 -0
- wx/lib/agw/ribbon/art_osx.py +52 -0
- wx/lib/agw/ribbon/bar.py +1259 -0
- wx/lib/agw/ribbon/buttonbar.py +1317 -0
- wx/lib/agw/ribbon/control.py +205 -0
- wx/lib/agw/ribbon/gallery.py +973 -0
- wx/lib/agw/ribbon/page.py +946 -0
- wx/lib/agw/ribbon/panel.py +1170 -0
- wx/lib/agw/ribbon/toolbar.py +1441 -0
- wx/lib/agw/rulerctrl.py +1885 -0
- wx/lib/agw/scrolledthumbnail.py +2116 -0
- wx/lib/agw/shapedbutton.py +1809 -0
- wx/lib/agw/shortcuteditor.py +2642 -0
- wx/lib/agw/speedmeter.py +1800 -0
- wx/lib/agw/supertooltip.py +1443 -0
- wx/lib/agw/thumbnailctrl.py +529 -0
- wx/lib/agw/toasterbox.py +1327 -0
- wx/lib/agw/ultimatelistctrl.py +13671 -0
- wx/lib/agw/xlsgrid.py +2111 -0
- wx/lib/agw/zoombar.py +1336 -0
- wx/lib/analogclock/__init__.py +140 -0
- wx/lib/analogclock/analogclock.py +630 -0
- wx/lib/analogclock/helpers.py +986 -0
- wx/lib/analogclock/lib_setup/__init__.py +0 -0
- wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
- wx/lib/analogclock/lib_setup/fontselect.py +57 -0
- wx/lib/analogclock/setup.py +490 -0
- wx/lib/analogclock/styles.py +47 -0
- wx/lib/anchors.py +103 -0
- wx/lib/art/__init__.py +4 -0
- wx/lib/art/flagart.py +1583 -0
- wx/lib/art/img2pyartprov.py +56 -0
- wx/lib/busy.py +152 -0
- wx/lib/buttons.py +1140 -0
- wx/lib/calendar.py +1596 -0
- wx/lib/checkbox.py +837 -0
- wx/lib/colourchooser/__init__.py +36 -0
- wx/lib/colourchooser/canvas.py +145 -0
- wx/lib/colourchooser/intl.py +24 -0
- wx/lib/colourchooser/pycolourbox.py +89 -0
- wx/lib/colourchooser/pycolourchooser.py +626 -0
- wx/lib/colourchooser/pycolourslider.py +98 -0
- wx/lib/colourchooser/pypalette.py +208 -0
- wx/lib/colourdb.py +740 -0
- wx/lib/colourselect.py +385 -0
- wx/lib/colourutils.py +118 -0
- wx/lib/combotreebox.py +944 -0
- wx/lib/delayedresult.py +420 -0
- wx/lib/dialogs.py +510 -0
- wx/lib/docview.py +3210 -0
- wx/lib/dragscroller.py +79 -0
- wx/lib/editor/README.txt +77 -0
- wx/lib/editor/__init__.py +24 -0
- wx/lib/editor/editor.py +974 -0
- wx/lib/editor/images.py +15 -0
- wx/lib/editor/selection.py +44 -0
- wx/lib/embeddedimage.py +76 -0
- wx/lib/eventStack.py +136 -0
- wx/lib/eventwatcher.py +440 -0
- wx/lib/evtmgr.py +521 -0
- wx/lib/expando.py +393 -0
- wx/lib/fancytext.py +494 -0
- wx/lib/filebrowsebutton.py +461 -0
- wx/lib/flashwin.py +262 -0
- wx/lib/flashwin_old.py +651 -0
- wx/lib/floatcanvas/FCEvents.py +53 -0
- wx/lib/floatcanvas/FCObjects.py +2910 -0
- wx/lib/floatcanvas/FloatCanvas.py +1025 -0
- wx/lib/floatcanvas/GUIMode.py +396 -0
- wx/lib/floatcanvas/NavCanvas.py +162 -0
- wx/lib/floatcanvas/Resources.py +319 -0
- wx/lib/floatcanvas/ScreenShot.py +1788 -0
- wx/lib/floatcanvas/Utilities/BBox.py +313 -0
- wx/lib/floatcanvas/Utilities/Colors.py +137 -0
- wx/lib/floatcanvas/Utilities/GUI.py +91 -0
- wx/lib/floatcanvas/Utilities/__init__.py +7 -0
- wx/lib/floatcanvas/__init__.py +124 -0
- wx/lib/foldmenu.py +89 -0
- wx/lib/gestures.py +310 -0
- wx/lib/gizmos/__init__.py +18 -0
- wx/lib/gizmos/dynamicsash.py +1202 -0
- wx/lib/gizmos/ledctrl.py +299 -0
- wx/lib/gizmos/treelistctrl.py +87 -0
- wx/lib/graphics.py +1942 -0
- wx/lib/gridmovers.py +516 -0
- wx/lib/iewin.py +249 -0
- wx/lib/iewin_old.py +894 -0
- wx/lib/imagebrowser.py +853 -0
- wx/lib/imageutils.py +163 -0
- wx/lib/infoframe.py +490 -0
- wx/lib/inspection.py +1254 -0
- wx/lib/intctrl.py +990 -0
- wx/lib/itemspicker.py +256 -0
- wx/lib/langlistctrl.py +480 -0
- wx/lib/layoutf.py +271 -0
- wx/lib/masked/__init__.py +27 -0
- wx/lib/masked/combobox.py +839 -0
- wx/lib/masked/ctrl.py +108 -0
- wx/lib/masked/ipaddrctrl.py +241 -0
- wx/lib/masked/maskededit.py +7262 -0
- wx/lib/masked/numctrl.py +2000 -0
- wx/lib/masked/textctrl.py +465 -0
- wx/lib/masked/timectrl.py +1465 -0
- wx/lib/mixins/__init__.py +17 -0
- wx/lib/mixins/grid.py +47 -0
- wx/lib/mixins/gridlabelrenderer.py +277 -0
- wx/lib/mixins/imagelist.py +77 -0
- wx/lib/mixins/inspection.py +184 -0
- wx/lib/mixins/listctrl.py +893 -0
- wx/lib/mixins/rubberband.py +403 -0
- wx/lib/mixins/treemixin.py +678 -0
- wx/lib/msgpanel.py +95 -0
- wx/lib/multisash.py +746 -0
- wx/lib/myole4ax.idl +178 -0
- wx/lib/myole4ax.tlb +0 -0
- wx/lib/newevent.py +229 -0
- wx/lib/newevent.pyi +25 -0
- wx/lib/nvdlg.py +156 -0
- wx/lib/ogl/__init__.py +13 -0
- wx/lib/ogl/basic.py +3989 -0
- wx/lib/ogl/bmpshape.py +86 -0
- wx/lib/ogl/canvas.py +467 -0
- wx/lib/ogl/composit.py +1576 -0
- wx/lib/ogl/diagram.py +230 -0
- wx/lib/ogl/divided.py +482 -0
- wx/lib/ogl/drawn.py +898 -0
- wx/lib/ogl/lines.py +1809 -0
- wx/lib/ogl/oglmisc.py +607 -0
- wx/lib/pdfviewer/__init__.py +113 -0
- wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
- wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
- wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
- wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
- wx/lib/pdfviewer/bitmaps/Save.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
- wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
- wx/lib/pdfviewer/buttonpanel.py +285 -0
- wx/lib/pdfviewer/images.py +240 -0
- wx/lib/pdfviewer/viewer.py +1118 -0
- wx/lib/pdfwin.py +295 -0
- wx/lib/pdfwin_old.py +789 -0
- wx/lib/platebtn.py +789 -0
- wx/lib/plot/CHANGELOG.md +150 -0
- wx/lib/plot/README.md +16 -0
- wx/lib/plot/__init__.py +46 -0
- wx/lib/plot/__main__.py +5 -0
- wx/lib/plot/examples/__init__.py +0 -0
- wx/lib/plot/examples/demo.py +1010 -0
- wx/lib/plot/examples/simple_example.py +56 -0
- wx/lib/plot/plotcanvas.py +2985 -0
- wx/lib/plot/polyobjects.py +1524 -0
- wx/lib/plot/utils.py +334 -0
- wx/lib/popupctl.py +251 -0
- wx/lib/printout.py +1155 -0
- wx/lib/progressindicator.py +151 -0
- wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
- wx/lib/pubsub/README_WxPython.txt +22 -0
- wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
- wx/lib/pubsub/__init__.py +25 -0
- wx/lib/pubsub/core/__init__.py +92 -0
- wx/lib/pubsub/core/arg1/__init__.py +16 -0
- wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
- wx/lib/pubsub/core/arg1/publisher.py +40 -0
- wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
- wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
- wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
- wx/lib/pubsub/core/callables.py +198 -0
- wx/lib/pubsub/core/imp2.py +62 -0
- wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
- wx/lib/pubsub/core/kwargs/__init__.py +16 -0
- wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
- wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
- wx/lib/pubsub/core/kwargs/publisher.py +77 -0
- wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
- wx/lib/pubsub/core/kwargs/topicargspecimpl.py +216 -0
- wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
- wx/lib/pubsub/core/listener.py +40 -0
- wx/lib/pubsub/core/listenerbase.py +185 -0
- wx/lib/pubsub/core/notificationmgr.py +185 -0
- wx/lib/pubsub/core/publisherbase.py +189 -0
- wx/lib/pubsub/core/topicargspec.py +77 -0
- wx/lib/pubsub/core/topicdefnprovider.py +631 -0
- wx/lib/pubsub/core/topicexc.py +72 -0
- wx/lib/pubsub/core/topicmgr.py +454 -0
- wx/lib/pubsub/core/topicobj.py +472 -0
- wx/lib/pubsub/core/topictreetraverser.py +143 -0
- wx/lib/pubsub/core/topicutils.py +119 -0
- wx/lib/pubsub/core/treeconfig.py +21 -0
- wx/lib/pubsub/core/validatedefnargs.py +29 -0
- wx/lib/pubsub/core/weakmethod.py +102 -0
- wx/lib/pubsub/policies.py +24 -0
- wx/lib/pubsub/pub.py +199 -0
- wx/lib/pubsub/setuparg1.py +47 -0
- wx/lib/pubsub/setupkwargs.py +29 -0
- wx/lib/pubsub/utils/__init__.py +27 -0
- wx/lib/pubsub/utils/exchandling.py +100 -0
- wx/lib/pubsub/utils/misc.py +99 -0
- wx/lib/pubsub/utils/notification.py +331 -0
- wx/lib/pubsub/utils/topictreeprinter.py +195 -0
- wx/lib/pubsub/utils/xmltopicdefnprovider.py +286 -0
- wx/lib/pydocview.py +3300 -0
- wx/lib/rcsizer.py +227 -0
- wx/lib/resizewidget.py +357 -0
- wx/lib/scrolledpanel.py +243 -0
- wx/lib/sheet.py +350 -0
- wx/lib/sized_controls.py +691 -0
- wx/lib/softwareupdate.py +355 -0
- wx/lib/splitter.py +925 -0
- wx/lib/statbmp.py +199 -0
- wx/lib/stattext.py +321 -0
- wx/lib/throbber.py +424 -0
- wx/lib/ticker.py +306 -0
- wx/lib/ticker_xrc.py +48 -0
- wx/lib/utils.py +89 -0
- wx/lib/wordwrap.py +97 -0
- wx/lib/wxcairo/__init__.py +139 -0
- wx/lib/wxcairo/wx_cairocffi.py +200 -0
- wx/lib/wxcairo/wx_pycairo.py +455 -0
- wx/lib/wxpTag.py +274 -0
- wx/libcairo-2.dll +0 -0
- wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/co/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
- wx/media.py +30 -0
- wx/media.pyi +272 -0
- wx/msw.py +16 -0
- wx/msw.pyi +91 -0
- wx/propgrid.py +498 -0
- wx/propgrid.pyi +7427 -0
- wx/py/CHANGES.txt +796 -0
- wx/py/Py.ico +0 -0
- wx/py/PyAlaCarte.py +34 -0
- wx/py/PyAlaMode.py +34 -0
- wx/py/PyAlaModeTest.py +33 -0
- wx/py/PyCrust.ico +0 -0
- wx/py/PyCrust.py +78 -0
- wx/py/PyCrust_16.png +0 -0
- wx/py/PyCrust_32.png +0 -0
- wx/py/PyFilling.py +35 -0
- wx/py/PyShell.py +78 -0
- wx/py/PySlices.ico +0 -0
- wx/py/PySlices.py +98 -0
- wx/py/PySlicesShell.py +94 -0
- wx/py/PySlices_16.png +0 -0
- wx/py/PySlices_32.png +0 -0
- wx/py/PyWrap.py +52 -0
- wx/py/README.txt +77 -0
- wx/py/__init__.py +20 -0
- wx/py/buffer.py +136 -0
- wx/py/crust.py +403 -0
- wx/py/crustslices.py +403 -0
- wx/py/dispatcher.py +259 -0
- wx/py/document.py +37 -0
- wx/py/editor.py +844 -0
- wx/py/editwindow.py +316 -0
- wx/py/filling.py +358 -0
- wx/py/frame.py +976 -0
- wx/py/images.py +212 -0
- wx/py/interpreter.py +161 -0
- wx/py/introspect.py +402 -0
- wx/py/magic.py +98 -0
- wx/py/parse.py +134 -0
- wx/py/path.py +36 -0
- wx/py/pseudo.py +99 -0
- wx/py/shell.py +1579 -0
- wx/py/sliceshell.py +3805 -0
- wx/py/tests/test_interpreter.py +71 -0
- wx/py/tests/test_introspect.py +810 -0
- wx/py/tests/test_pseudo.py +70 -0
- wx/py/tests/test_version.py +36 -0
- wx/py/tests/testall.py +22 -0
- wx/py/version.py +7 -0
- wx/py.typed +0 -0
- wx/ribbon.py +48 -0
- wx/ribbon.pyi +3099 -0
- wx/richtext.py +141 -0
- wx/richtext.pyi +13581 -0
- wx/siplib.cp315-win_amd64.pyd +0 -0
- wx/siplib.pyi +19 -0
- wx/stc.py +59 -0
- wx/stc.pyi +9918 -0
- wx/svg/__init__.py +363 -0
- wx/svg/_nanosvg.cp315-win_amd64.pyd +0 -0
- wx/tools/__init__.py +18 -0
- wx/tools/dbg.py +268 -0
- wx/tools/genaxmodule.py +50 -0
- wx/tools/helpviewer.py +92 -0
- wx/tools/img2img.py +85 -0
- wx/tools/img2png.py +54 -0
- wx/tools/img2py.py +306 -0
- wx/tools/img2xpm.py +54 -0
- wx/tools/pywxrc.py +951 -0
- wx/tools/wxget.py +254 -0
- wx/tools/wxget_docs_demo.py +183 -0
- wx/wxbase334u_net_vc140_x64.dll +0 -0
- wx/wxbase334u_vc140_x64.dll +0 -0
- wx/wxbase334u_xml_vc140_x64.dll +0 -0
- wx/wxmsw334u_adv_vc140_x64.dll +0 -0
- wx/wxmsw334u_aui_vc140_x64.dll +0 -0
- wx/wxmsw334u_core_vc140_x64.dll +0 -0
- wx/wxmsw334u_gl_vc140_x64.dll +0 -0
- wx/wxmsw334u_html_vc140_x64.dll +0 -0
- wx/wxmsw334u_media_vc140_x64.dll +0 -0
- wx/wxmsw334u_propgrid_vc140_x64.dll +0 -0
- wx/wxmsw334u_qa_vc140_x64.dll +0 -0
- wx/wxmsw334u_ribbon_vc140_x64.dll +0 -0
- wx/wxmsw334u_richtext_vc140_x64.dll +0 -0
- wx/wxmsw334u_stc_vc140_x64.dll +0 -0
- wx/wxmsw334u_webview_vc140_x64.dll +0 -0
- wx/wxmsw334u_xrc_vc140_x64.dll +0 -0
- wx/xml.py +18 -0
- wx/xml.pyi +728 -0
- wx/xrc.py +68 -0
- wx/xrc.pyi +896 -0
- wxpython-4.3.2.dist-info/METADATA +71 -0
- wxpython-4.3.2.dist-info/RECORD +472 -0
- wxpython-4.3.2.dist-info/WHEEL +5 -0
- wxpython-4.3.2.dist-info/entry_points.txt +13 -0
- wxpython-4.3.2.dist-info/licenses/LICENSE.txt +610 -0
- wxpython-4.3.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Output various aspects of topic tree to string or file.
|
|
3
|
+
|
|
4
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
5
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from textwrap import TextWrapper
|
|
9
|
+
|
|
10
|
+
from ..core.topictreetraverser import (ITopicTreeVisitor, TopicTreeTraverser)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TopicTreePrinter(ITopicTreeVisitor):
|
|
14
|
+
"""
|
|
15
|
+
Example topic tree visitor that prints a prettified representation
|
|
16
|
+
of topic tree by doing a depth-first traversal of topic tree and
|
|
17
|
+
print information at each (topic) node of tree. Extra info to be
|
|
18
|
+
printed is specified via the 'extra' kwarg. Its value must be a
|
|
19
|
+
list of characters, the order determines output order:
|
|
20
|
+
- D: print description of topic
|
|
21
|
+
- a: print kwarg names only
|
|
22
|
+
- A: print topic kwargs and their description
|
|
23
|
+
- L: print listeners currently subscribed to topic
|
|
24
|
+
|
|
25
|
+
E.g. TopicTreePrinter(extra='LaDA') would print, for each topic,
|
|
26
|
+
the list of subscribed listeners, the topic's list of kwargs, the
|
|
27
|
+
topic description, and the description for each kwarg,
|
|
28
|
+
|
|
29
|
+
>>> Topic "delTopic"
|
|
30
|
+
>> Listeners:
|
|
31
|
+
> listener1_2880 (from yourModule)
|
|
32
|
+
> listener2_3450 (from yourModule)
|
|
33
|
+
>> Names of Message arguments:
|
|
34
|
+
> arg1
|
|
35
|
+
> arg2
|
|
36
|
+
>> Description: whenever a topic is deleted
|
|
37
|
+
>> Descriptions of Message arguments:
|
|
38
|
+
> arg1: (required) its description
|
|
39
|
+
> arg2: some other description
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
allowedExtras = frozenset('DAaL') # must NOT change
|
|
44
|
+
ALL_TOPICS_NAME = 'ALL_TOPICS' # output for name of 'all topics' topic
|
|
45
|
+
|
|
46
|
+
def __init__(self, extra=None, width=70, indentStep=4,
|
|
47
|
+
bulletTopic='\\--', bulletTopicItem='|==', bulletTopicArg='-', fileObj=None):
|
|
48
|
+
"""Topic tree printer will print listeners for each topic only
|
|
49
|
+
if printListeners is True. The width will be used to limit
|
|
50
|
+
the width of text output, while indentStep is the number of
|
|
51
|
+
spaces added each time the text is indented further. The
|
|
52
|
+
three bullet parameters define the strings used for each
|
|
53
|
+
item (topic, topic items, and kwargs). """
|
|
54
|
+
self.__contentMeth = dict(
|
|
55
|
+
D = self.__printTopicDescription,
|
|
56
|
+
A = self.__printTopicArgsAll,
|
|
57
|
+
a = self.__printTopicArgNames,
|
|
58
|
+
L = self.__printTopicListeners)
|
|
59
|
+
assert self.allowedExtras == set(self.__contentMeth)
|
|
60
|
+
import sys
|
|
61
|
+
self.__destination = fileObj or sys.stdout
|
|
62
|
+
self.__output = []
|
|
63
|
+
|
|
64
|
+
self.__content = extra or ''
|
|
65
|
+
unknownSel = set(self.__content) - self.allowedExtras
|
|
66
|
+
if unknownSel:
|
|
67
|
+
msg = 'These extra chars not known: %s' % ','.join(unknownSel)
|
|
68
|
+
raise ValueError(msg)
|
|
69
|
+
|
|
70
|
+
self.__width = width
|
|
71
|
+
self.__wrapper = TextWrapper(width)
|
|
72
|
+
self.__indent = 0
|
|
73
|
+
self.__indentStep = indentStep
|
|
74
|
+
self.__topicsBullet = bulletTopic
|
|
75
|
+
self.__topicItemsBullet = bulletTopicItem
|
|
76
|
+
self.__topicArgsBullet = bulletTopicArg
|
|
77
|
+
|
|
78
|
+
def getOutput(self):
|
|
79
|
+
return '\n'.join( self.__output )
|
|
80
|
+
|
|
81
|
+
def _doneTraversal(self):
|
|
82
|
+
if self.__destination is not None:
|
|
83
|
+
self.__destination.write(self.getOutput())
|
|
84
|
+
|
|
85
|
+
def _onTopic(self, topicObj):
|
|
86
|
+
"""This gets called for each topic. Print as per specified content."""
|
|
87
|
+
|
|
88
|
+
# topic name
|
|
89
|
+
self.__wrapper.width = self.__width
|
|
90
|
+
indent = self.__indent
|
|
91
|
+
if topicObj.isAll():
|
|
92
|
+
topicName = self.ALL_TOPICS_NAME
|
|
93
|
+
else:
|
|
94
|
+
topicName = topicObj.getNodeName()
|
|
95
|
+
head = '%s Topic "%s"' % (self.__topicsBullet, topicName)
|
|
96
|
+
self.__output.append( self.__formatDefn(indent, head) )
|
|
97
|
+
indent += self.__indentStep
|
|
98
|
+
|
|
99
|
+
# each extra content (assume constructor verified that chars are valid)
|
|
100
|
+
for item in self.__content:
|
|
101
|
+
function = self.__contentMeth[item]
|
|
102
|
+
function(indent, topicObj)
|
|
103
|
+
|
|
104
|
+
def _startChildren(self):
|
|
105
|
+
"""Increase the indent"""
|
|
106
|
+
self.__indent += self.__indentStep
|
|
107
|
+
|
|
108
|
+
def _endChildren(self):
|
|
109
|
+
"""Decrease the indent"""
|
|
110
|
+
self.__indent -= self.__indentStep
|
|
111
|
+
|
|
112
|
+
def __formatDefn(self, indent, item, defn='', sep=': '):
|
|
113
|
+
"""Print a definition: a block of text at a certain indent,
|
|
114
|
+
has item name, and an optional definition separated from
|
|
115
|
+
item by sep. """
|
|
116
|
+
if defn:
|
|
117
|
+
prefix = '%s%s%s' % (' '*indent, item, sep)
|
|
118
|
+
self.__wrapper.initial_indent = prefix
|
|
119
|
+
self.__wrapper.subsequent_indent = ' '*(indent+self.__indentStep)
|
|
120
|
+
return self.__wrapper.fill(defn)
|
|
121
|
+
else:
|
|
122
|
+
return '%s%s' % (' '*indent, item)
|
|
123
|
+
|
|
124
|
+
def __printTopicDescription(self, indent, topicObj):
|
|
125
|
+
# topic description
|
|
126
|
+
defn = '%s Description' % self.__topicItemsBullet
|
|
127
|
+
self.__output.append(
|
|
128
|
+
self.__formatDefn(indent, defn, topicObj.getDescription()) )
|
|
129
|
+
|
|
130
|
+
def __printTopicArgsAll(self, indent, topicObj, desc=True):
|
|
131
|
+
# topic kwargs
|
|
132
|
+
args = topicObj.getArgDescriptions()
|
|
133
|
+
if args:
|
|
134
|
+
#required, optional, complete = topicObj.getArgs()
|
|
135
|
+
headName = 'Names of Message arguments:'
|
|
136
|
+
if desc:
|
|
137
|
+
headName = 'Descriptions of message arguments:'
|
|
138
|
+
head = '%s %s' % (self.__topicItemsBullet, headName)
|
|
139
|
+
self.__output.append( self.__formatDefn(indent, head) )
|
|
140
|
+
tmpIndent = indent + self.__indentStep
|
|
141
|
+
required = topicObj.getArgs()[0]
|
|
142
|
+
for key, arg in args.items(): # iter in 3, list in 2 ok
|
|
143
|
+
if not desc:
|
|
144
|
+
arg = ''
|
|
145
|
+
elif key in required:
|
|
146
|
+
arg = '(required) %s' % arg
|
|
147
|
+
msg = '%s %s' % (self.__topicArgsBullet,key)
|
|
148
|
+
self.__output.append( self.__formatDefn(tmpIndent, msg, arg) )
|
|
149
|
+
|
|
150
|
+
def __printTopicArgNames(self, indent, topicObj):
|
|
151
|
+
self.__printTopicArgsAll(indent, topicObj, False)
|
|
152
|
+
|
|
153
|
+
def __printTopicListeners(self, indent, topicObj):
|
|
154
|
+
if topicObj.hasListeners():
|
|
155
|
+
item = '%s Listeners:' % self.__topicItemsBullet
|
|
156
|
+
self.__output.append( self.__formatDefn(indent, item) )
|
|
157
|
+
tmpIndent = indent + self.__indentStep
|
|
158
|
+
for listener in topicObj.getListenersIter():
|
|
159
|
+
item = '%s %s (from %s)' % (self.__topicArgsBullet, listener.name(), listener.module())
|
|
160
|
+
self.__output.append( self.__formatDefn(tmpIndent, item) )
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def printTreeDocs(rootTopic=None, topicMgr=None, **kwargs):
|
|
164
|
+
"""Print out the topic tree to a file (or file-like object like a
|
|
165
|
+
StringIO), starting at rootTopic. If root topic should be root of
|
|
166
|
+
whole tree, get it from pub.getDefaultTopicTreeRoot().
|
|
167
|
+
The treeVisitor is an instance of pub.TopicTreeTraverser.
|
|
168
|
+
|
|
169
|
+
Printing the tree docs would normally involve this::
|
|
170
|
+
|
|
171
|
+
from pubsub import pub
|
|
172
|
+
from pubsub.utils.topictreeprinter import TopicTreePrinter
|
|
173
|
+
traverser = pub.TopicTreeTraverser( TopicTreePrinter(**kwargs) )
|
|
174
|
+
traverser.traverse( pub.getDefaultTopicTreeRoot() )
|
|
175
|
+
|
|
176
|
+
With printTreeDocs, it looks like this::
|
|
177
|
+
|
|
178
|
+
from pubsub import pub
|
|
179
|
+
from pubsub.utils import printTreeDocs
|
|
180
|
+
printTreeDocs()
|
|
181
|
+
|
|
182
|
+
The kwargs are the same as for TopicTreePrinter constructor:
|
|
183
|
+
extra(None), width(70), indentStep(4), bulletTopic, bulletTopicItem,
|
|
184
|
+
bulletTopicArg, fileObj(stdout). If fileObj not given, stdout is used."""
|
|
185
|
+
if rootTopic is None:
|
|
186
|
+
if topicMgr is None:
|
|
187
|
+
from .. import pub
|
|
188
|
+
topicMgr = pub.getDefaultTopicMgr()
|
|
189
|
+
rootTopic = topicMgr.getRootAllTopics()
|
|
190
|
+
|
|
191
|
+
printer = TopicTreePrinter(**kwargs)
|
|
192
|
+
traverser = TopicTreeTraverser(printer)
|
|
193
|
+
traverser.traverse(rootTopic)
|
|
194
|
+
|
|
195
|
+
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Contributed by Joshua R English, adapted by Oliver Schoenborn to be
|
|
3
|
+
consistent with pubsub API.
|
|
4
|
+
|
|
5
|
+
An extension for pubsub (http://pubsub.sourceforge.net) so topic tree
|
|
6
|
+
specification can be encoded in XML format rather than pubsub's default
|
|
7
|
+
Python nested class format.
|
|
8
|
+
|
|
9
|
+
To use:
|
|
10
|
+
|
|
11
|
+
xml = '''
|
|
12
|
+
<topicdefntree>
|
|
13
|
+
<description>Test showing topic hierarchy and inheritance</description>
|
|
14
|
+
<topic id="parent">
|
|
15
|
+
<description>Parent with a parameter and subtopics</description>
|
|
16
|
+
<listenerspec>
|
|
17
|
+
<arg id="name" optional="true">given name</arg>
|
|
18
|
+
<arg id="lastname">surname</arg>
|
|
19
|
+
</listenerspec>
|
|
20
|
+
|
|
21
|
+
<topic id="child">
|
|
22
|
+
<description>This is the first child</description>
|
|
23
|
+
<listenerspec>
|
|
24
|
+
<arg id="nick">A nickname</arg>
|
|
25
|
+
</listenerspec>
|
|
26
|
+
</topic>
|
|
27
|
+
</topic>
|
|
28
|
+
</topicdefntree>
|
|
29
|
+
'''
|
|
30
|
+
|
|
31
|
+
These topic definitions are loaded through an XmlTopicDefnProvider:
|
|
32
|
+
|
|
33
|
+
pub.addTopicDefnProvider( XmlTopicDefnProvider(xml) )
|
|
34
|
+
|
|
35
|
+
The XmlTopicDefnProvider also accepts a filename instead of XML string:
|
|
36
|
+
|
|
37
|
+
provider = XmlTopicDefnProvider("path/to/XMLfile.xml", TOPIC_TREE_FROM_FILE)
|
|
38
|
+
pub.addTopicDefnProvider( provider )
|
|
39
|
+
|
|
40
|
+
Topics can be exported to an XML file using the exportTopicTreeSpecXml function.
|
|
41
|
+
This will create a text file for the XML and return the string representation
|
|
42
|
+
of the XML tree.
|
|
43
|
+
|
|
44
|
+
:copyright: Copyright since 2013 by Oliver Schoenborn, all rights reserved.
|
|
45
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
__author__ = 'Joshua R English'
|
|
49
|
+
__revision__ = 6
|
|
50
|
+
__date__ = '2013-07-27'
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
from ..core.topictreetraverser import ITopicTreeVisitor
|
|
54
|
+
from ..core.topicdefnprovider import (
|
|
55
|
+
ITopicDefnProvider,
|
|
56
|
+
ArgSpecGiven,
|
|
57
|
+
TOPIC_TREE_FROM_STRING,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
from elementtree import ElementTree as ET
|
|
62
|
+
except ImportError:
|
|
63
|
+
try: # for Python 2.4, must use cElementTree:
|
|
64
|
+
from xml.etree import ElementTree as ET
|
|
65
|
+
except ImportError:
|
|
66
|
+
from cElementTree import ElementTree as ET
|
|
67
|
+
|
|
68
|
+
__all__ = [
|
|
69
|
+
'XmlTopicDefnProvider',
|
|
70
|
+
'exportTopicTreeSpecXml',
|
|
71
|
+
'TOPIC_TREE_FROM_FILE'
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _get_elem(elem):
|
|
76
|
+
"""Assume an ETree.Element object or a string representation.
|
|
77
|
+
Return the ETree.Element object"""
|
|
78
|
+
if not ET.iselement(elem):
|
|
79
|
+
try:
|
|
80
|
+
elem = ET.fromstring(elem)
|
|
81
|
+
except:
|
|
82
|
+
print("Value Error", elem)
|
|
83
|
+
raise ValueError("Cannot convert to element")
|
|
84
|
+
return elem
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
TOPIC_TREE_FROM_FILE = 'file'
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class XmlTopicDefnProvider(ITopicDefnProvider):
|
|
91
|
+
|
|
92
|
+
class XmlParserError(RuntimeError): pass
|
|
93
|
+
|
|
94
|
+
class UnrecognizedSourceFormatError(ValueError): pass
|
|
95
|
+
|
|
96
|
+
def __init__(self, xml, format=TOPIC_TREE_FROM_STRING):
|
|
97
|
+
self._topics = {}
|
|
98
|
+
self._treeDoc = ''
|
|
99
|
+
if format == TOPIC_TREE_FROM_FILE:
|
|
100
|
+
with open(xml, mode="r") as fid:
|
|
101
|
+
self._parse_tree(_get_elem(fid.read()))
|
|
102
|
+
elif format == TOPIC_TREE_FROM_STRING:
|
|
103
|
+
self._parse_tree(_get_elem(xml))
|
|
104
|
+
else:
|
|
105
|
+
raise UnrecognizedSourceFormatError()
|
|
106
|
+
|
|
107
|
+
def _parse_tree(self, tree):
|
|
108
|
+
doc_node = tree.find('description')
|
|
109
|
+
|
|
110
|
+
if doc_node is None:
|
|
111
|
+
self._treeDoc = "UNDOCUMENTED"
|
|
112
|
+
else:
|
|
113
|
+
self._treeDoc = ' '.join(doc_node.text.split())
|
|
114
|
+
|
|
115
|
+
for node in tree.findall('topic'):
|
|
116
|
+
self._parse_topic(node)
|
|
117
|
+
|
|
118
|
+
def _parse_topic(self, node, parents=None, specs=None, reqlist=None):
|
|
119
|
+
parents = parents or []
|
|
120
|
+
specs = specs or {}
|
|
121
|
+
reqlist = reqlist or []
|
|
122
|
+
|
|
123
|
+
descNode = node.find('description')
|
|
124
|
+
|
|
125
|
+
if descNode is None:
|
|
126
|
+
desc = "UNDOCUMENTED"
|
|
127
|
+
else:
|
|
128
|
+
desc = ' '.join(descNode.text.split())
|
|
129
|
+
|
|
130
|
+
node_id = node.get('id')
|
|
131
|
+
if node_id is None:
|
|
132
|
+
raise XmlParserError("topic element must have an id attribute")
|
|
133
|
+
|
|
134
|
+
for this in (node.findall('listenerspec/arg')):
|
|
135
|
+
this_id = this.get('id')
|
|
136
|
+
if this_id is None:
|
|
137
|
+
raise XmlParserError("arg element must have an id attribute")
|
|
138
|
+
|
|
139
|
+
this_desc = this.text.strip()
|
|
140
|
+
this_desc = this_desc or "UNDOCUMENTED"
|
|
141
|
+
this_desc = ' '.join(this_desc.split())
|
|
142
|
+
|
|
143
|
+
specs[this_id] = this_desc
|
|
144
|
+
|
|
145
|
+
if this.get('optional', '').lower() not in ['true', 't','yes','y']:
|
|
146
|
+
reqlist.append(this_id)
|
|
147
|
+
|
|
148
|
+
defn = ArgSpecGiven(specs, tuple(reqlist))
|
|
149
|
+
|
|
150
|
+
parents.append(node.get('id'))
|
|
151
|
+
|
|
152
|
+
self._topics[tuple(parents)] = desc, defn
|
|
153
|
+
|
|
154
|
+
for subtopic in node.findall('topic'):
|
|
155
|
+
self._parse_topic(subtopic, parents[:], specs.copy(), reqlist[:])
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def getDefn(self, topicNameTuple):
|
|
159
|
+
return self._topics.get(topicNameTuple, (None, None))
|
|
160
|
+
|
|
161
|
+
def topicNames(self):
|
|
162
|
+
return iter(self._topics.keys())
|
|
163
|
+
|
|
164
|
+
def getTreeDoc(self):
|
|
165
|
+
return self._treeDoc
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class XmlVisitor(ITopicTreeVisitor):
|
|
169
|
+
def __init__(self, elem):
|
|
170
|
+
self.tree = elem
|
|
171
|
+
self.known_topics = []
|
|
172
|
+
|
|
173
|
+
def _startTraversal(self):
|
|
174
|
+
self.roots = [self.tree]
|
|
175
|
+
|
|
176
|
+
def _onTopic(self, topicObj):
|
|
177
|
+
if topicObj.isAll():
|
|
178
|
+
self.last_elem = self.tree
|
|
179
|
+
return
|
|
180
|
+
if self.roots:
|
|
181
|
+
this_elem = ET.SubElement(self.roots[-1], 'topic',
|
|
182
|
+
{'id':topicObj.getNodeName()})
|
|
183
|
+
else:
|
|
184
|
+
this_elem = ET.Element('topic', {'id':topicObj.getNodeName()})
|
|
185
|
+
req, opt = topicObj.getArgs()
|
|
186
|
+
req = req or ()
|
|
187
|
+
opt = opt or ()
|
|
188
|
+
desc_elem = ET.SubElement(this_elem, 'description')
|
|
189
|
+
topicDesc = topicObj.getDescription()
|
|
190
|
+
if topicDesc:
|
|
191
|
+
desc_elem.text = ' '.join(topicDesc.split())
|
|
192
|
+
else:
|
|
193
|
+
desc_elem.text = "UNDOCUMENTED"
|
|
194
|
+
argDescriptions = topicObj.getArgDescriptions()
|
|
195
|
+
|
|
196
|
+
# pubsub way of getting known_args
|
|
197
|
+
known_args = []
|
|
198
|
+
parent = topicObj.getParent()
|
|
199
|
+
while parent:
|
|
200
|
+
if parent in self.known_topics:
|
|
201
|
+
p_req, p_opt = parent.getArgs()
|
|
202
|
+
if p_req:
|
|
203
|
+
known_args.extend(p_req)
|
|
204
|
+
if p_opt:
|
|
205
|
+
known_args.extend(p_opt)
|
|
206
|
+
parent = parent.getParent()
|
|
207
|
+
|
|
208
|
+
# there is probably a cleaner way to do this
|
|
209
|
+
if req or opt:
|
|
210
|
+
spec = ET.SubElement(this_elem, 'listenerspec')
|
|
211
|
+
for arg in req:
|
|
212
|
+
if arg in known_args:
|
|
213
|
+
continue
|
|
214
|
+
arg_elem = ET.SubElement(spec, 'arg', {'id': arg})
|
|
215
|
+
arg_elem.text = ' '.join(argDescriptions.get(arg, 'UNDOCUMENTED').split())
|
|
216
|
+
for arg in opt:
|
|
217
|
+
if arg in known_args:
|
|
218
|
+
continue
|
|
219
|
+
arg_elem = ET.SubElement(spec, 'arg', {'id': arg, 'optional':'True'})
|
|
220
|
+
arg_elem.text = ' '.join(argDescriptions.get(arg, 'UNDOCUMENTED').split())
|
|
221
|
+
|
|
222
|
+
self.last_elem = this_elem
|
|
223
|
+
self.known_topics.append(topicObj)
|
|
224
|
+
|
|
225
|
+
def _startChildren(self):
|
|
226
|
+
self.roots.append(self.last_elem)
|
|
227
|
+
|
|
228
|
+
def _endChildren(self):
|
|
229
|
+
self.roots.pop()
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
## http://infix.se/2007/02/06/gentlemen-indent-your-xml
|
|
233
|
+
def indent(elem, level=0):
|
|
234
|
+
i = "\n" + level*" "
|
|
235
|
+
if len(elem):
|
|
236
|
+
if not elem.text or not elem.text.strip():
|
|
237
|
+
elem.text = i + " "
|
|
238
|
+
for e in elem:
|
|
239
|
+
indent(e, level+1)
|
|
240
|
+
if not e.tail or not e.tail.strip():
|
|
241
|
+
e.tail = i + " "
|
|
242
|
+
if not e.tail or not e.tail.strip():
|
|
243
|
+
e.tail = i
|
|
244
|
+
else:
|
|
245
|
+
if level and (not elem.tail or not elem.tail.strip()):
|
|
246
|
+
elem.tail = i
|
|
247
|
+
else:
|
|
248
|
+
elem.tail="\n"
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def exportTopicTreeSpecXml(moduleName=None, rootTopic=None, bak='bak', moduleDoc=None):
|
|
252
|
+
"""
|
|
253
|
+
If rootTopic is None, then pub.getDefaultTopicTreeRoot() is assumed.
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
if rootTopic is None:
|
|
257
|
+
from .. import pub
|
|
258
|
+
rootTopic = pub.getDefaultTopicTreeRoot()
|
|
259
|
+
elif isinstance(rootTopic, str):
|
|
260
|
+
from .. import pub
|
|
261
|
+
rootTopic = pub.getTopic(rootTopic)
|
|
262
|
+
|
|
263
|
+
tree = ET.Element('topicdefntree')
|
|
264
|
+
if moduleDoc:
|
|
265
|
+
mod_desc = ET.SubElement(tree, 'description')
|
|
266
|
+
mod_desc.text = ' '.join(moduleDoc.split())
|
|
267
|
+
|
|
268
|
+
traverser = pub.TopicTreeTraverser(XmlVisitor(tree))
|
|
269
|
+
traverser.traverse(rootTopic)
|
|
270
|
+
|
|
271
|
+
indent(tree)
|
|
272
|
+
|
|
273
|
+
if moduleName:
|
|
274
|
+
|
|
275
|
+
filename = '%s.xml' % moduleName
|
|
276
|
+
if bak:
|
|
277
|
+
pub._backupIfExists(filename, bak)
|
|
278
|
+
|
|
279
|
+
fulltree= ET.ElementTree(tree)
|
|
280
|
+
fulltree.write(filename, "utf-8", True)
|
|
281
|
+
|
|
282
|
+
return ET.tostring(tree)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|