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.
Files changed (472) hide show
  1. wx/WebView2Loader.dll +0 -0
  2. wx/__init__.py +22 -0
  3. wx/__init__.pyi +10 -0
  4. wx/__version__.py +9 -0
  5. wx/__version__.pyi +15 -0
  6. wx/_adv.cp315-win_amd64.pyd +0 -0
  7. wx/_aui.cp315-win_amd64.pyd +0 -0
  8. wx/_core.cp315-win_amd64.pyd +0 -0
  9. wx/_dataview.cp315-win_amd64.pyd +0 -0
  10. wx/_glcanvas.cp315-win_amd64.pyd +0 -0
  11. wx/_grid.cp315-win_amd64.pyd +0 -0
  12. wx/_html.cp315-win_amd64.pyd +0 -0
  13. wx/_html2.cp315-win_amd64.pyd +0 -0
  14. wx/_media.cp315-win_amd64.pyd +0 -0
  15. wx/_msw.cp315-win_amd64.pyd +0 -0
  16. wx/_propgrid.cp315-win_amd64.pyd +0 -0
  17. wx/_ribbon.cp315-win_amd64.pyd +0 -0
  18. wx/_richtext.cp315-win_amd64.pyd +0 -0
  19. wx/_stc.cp315-win_amd64.pyd +0 -0
  20. wx/_xml.cp315-win_amd64.pyd +0 -0
  21. wx/_xrc.cp315-win_amd64.pyd +0 -0
  22. wx/adv.py +127 -0
  23. wx/adv.pyi +5931 -0
  24. wx/aui.py +70 -0
  25. wx/aui.pyi +4805 -0
  26. wx/core.py +3417 -0
  27. wx/core.pyi +62949 -0
  28. wx/dataview.py +176 -0
  29. wx/dataview.pyi +3828 -0
  30. wx/gizmos.py +18 -0
  31. wx/glcanvas.py +13 -0
  32. wx/glcanvas.pyi +544 -0
  33. wx/grid.py +237 -0
  34. wx/grid.pyi +5678 -0
  35. wx/html.py +38 -0
  36. wx/html.pyi +3283 -0
  37. wx/html2.py +46 -0
  38. wx/html2.pyi +1301 -0
  39. wx/include/wxPython/sip.h +1938 -0
  40. wx/include/wxPython/wxpy_api.h +418 -0
  41. wx/lib/CDate.py +201 -0
  42. wx/lib/ClickableHtmlWindow.py +57 -0
  43. wx/lib/__init__.py +0 -0
  44. wx/lib/activex.py +178 -0
  45. wx/lib/activexwrapper.py +153 -0
  46. wx/lib/agw/__init__.py +128 -0
  47. wx/lib/agw/advancedsplash.py +563 -0
  48. wx/lib/agw/aquabutton.py +1127 -0
  49. wx/lib/agw/artmanager.py +2110 -0
  50. wx/lib/agw/aui/__init__.py +295 -0
  51. wx/lib/agw/aui/aui_constants.py +2616 -0
  52. wx/lib/agw/aui/aui_switcherdialog.py +1232 -0
  53. wx/lib/agw/aui/aui_utilities.py +648 -0
  54. wx/lib/agw/aui/auibar.py +4045 -0
  55. wx/lib/agw/aui/auibook.py +6288 -0
  56. wx/lib/agw/aui/dockart.py +1198 -0
  57. wx/lib/agw/aui/framemanager.py +10485 -0
  58. wx/lib/agw/aui/tabart.py +2749 -0
  59. wx/lib/agw/aui/tabmdi.py +679 -0
  60. wx/lib/agw/balloontip.py +1157 -0
  61. wx/lib/agw/buttonpanel.py +2787 -0
  62. wx/lib/agw/cubecolourdialog.py +3529 -0
  63. wx/lib/agw/customtreectrl.py +9908 -0
  64. wx/lib/agw/data/ShortcutEditor_1.png +0 -0
  65. wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
  66. wx/lib/agw/data/ShortcutEditor_2.png +0 -0
  67. wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
  68. wx/lib/agw/data/ShortcutEditor_3.png +0 -0
  69. wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
  70. wx/lib/agw/data/ShortcutEditor_4.png +0 -0
  71. wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
  72. wx/lib/agw/data/default_help_text.html +105 -0
  73. wx/lib/agw/flatmenu.py +7392 -0
  74. wx/lib/agw/flatnotebook.py +6669 -0
  75. wx/lib/agw/floatspin.py +1820 -0
  76. wx/lib/agw/fmcustomizedlg.py +535 -0
  77. wx/lib/agw/fmresources.py +407 -0
  78. wx/lib/agw/foldpanelbar.py +2282 -0
  79. wx/lib/agw/fourwaysplitter.py +1130 -0
  80. wx/lib/agw/genericmessagedialog.py +1549 -0
  81. wx/lib/agw/gradientbutton.py +731 -0
  82. wx/lib/agw/hyperlink.py +664 -0
  83. wx/lib/agw/hypertreelist.py +5756 -0
  84. wx/lib/agw/infobar.py +885 -0
  85. wx/lib/agw/knobctrl.py +944 -0
  86. wx/lib/agw/labelbook.py +3028 -0
  87. wx/lib/agw/multidirdialog.py +581 -0
  88. wx/lib/agw/peakmeter.py +1028 -0
  89. wx/lib/agw/persist/__init__.py +188 -0
  90. wx/lib/agw/persist/persist_constants.py +283 -0
  91. wx/lib/agw/persist/persist_handlers.py +2614 -0
  92. wx/lib/agw/persist/persistencemanager.py +863 -0
  93. wx/lib/agw/piectrl.py +1082 -0
  94. wx/lib/agw/pybusyinfo.py +399 -0
  95. wx/lib/agw/pycollapsiblepane.py +940 -0
  96. wx/lib/agw/pygauge.py +570 -0
  97. wx/lib/agw/pyprogress.py +916 -0
  98. wx/lib/agw/ribbon/__init__.py +198 -0
  99. wx/lib/agw/ribbon/art.py +219 -0
  100. wx/lib/agw/ribbon/art_aui.py +1283 -0
  101. wx/lib/agw/ribbon/art_default.py +81 -0
  102. wx/lib/agw/ribbon/art_internal.py +248 -0
  103. wx/lib/agw/ribbon/art_msw.py +2735 -0
  104. wx/lib/agw/ribbon/art_osx.py +52 -0
  105. wx/lib/agw/ribbon/bar.py +1259 -0
  106. wx/lib/agw/ribbon/buttonbar.py +1317 -0
  107. wx/lib/agw/ribbon/control.py +205 -0
  108. wx/lib/agw/ribbon/gallery.py +973 -0
  109. wx/lib/agw/ribbon/page.py +946 -0
  110. wx/lib/agw/ribbon/panel.py +1170 -0
  111. wx/lib/agw/ribbon/toolbar.py +1441 -0
  112. wx/lib/agw/rulerctrl.py +1885 -0
  113. wx/lib/agw/scrolledthumbnail.py +2116 -0
  114. wx/lib/agw/shapedbutton.py +1809 -0
  115. wx/lib/agw/shortcuteditor.py +2642 -0
  116. wx/lib/agw/speedmeter.py +1800 -0
  117. wx/lib/agw/supertooltip.py +1443 -0
  118. wx/lib/agw/thumbnailctrl.py +529 -0
  119. wx/lib/agw/toasterbox.py +1327 -0
  120. wx/lib/agw/ultimatelistctrl.py +13671 -0
  121. wx/lib/agw/xlsgrid.py +2111 -0
  122. wx/lib/agw/zoombar.py +1336 -0
  123. wx/lib/analogclock/__init__.py +140 -0
  124. wx/lib/analogclock/analogclock.py +630 -0
  125. wx/lib/analogclock/helpers.py +986 -0
  126. wx/lib/analogclock/lib_setup/__init__.py +0 -0
  127. wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
  128. wx/lib/analogclock/lib_setup/fontselect.py +57 -0
  129. wx/lib/analogclock/setup.py +490 -0
  130. wx/lib/analogclock/styles.py +47 -0
  131. wx/lib/anchors.py +103 -0
  132. wx/lib/art/__init__.py +4 -0
  133. wx/lib/art/flagart.py +1583 -0
  134. wx/lib/art/img2pyartprov.py +56 -0
  135. wx/lib/busy.py +152 -0
  136. wx/lib/buttons.py +1140 -0
  137. wx/lib/calendar.py +1596 -0
  138. wx/lib/checkbox.py +837 -0
  139. wx/lib/colourchooser/__init__.py +36 -0
  140. wx/lib/colourchooser/canvas.py +145 -0
  141. wx/lib/colourchooser/intl.py +24 -0
  142. wx/lib/colourchooser/pycolourbox.py +89 -0
  143. wx/lib/colourchooser/pycolourchooser.py +626 -0
  144. wx/lib/colourchooser/pycolourslider.py +98 -0
  145. wx/lib/colourchooser/pypalette.py +208 -0
  146. wx/lib/colourdb.py +740 -0
  147. wx/lib/colourselect.py +385 -0
  148. wx/lib/colourutils.py +118 -0
  149. wx/lib/combotreebox.py +944 -0
  150. wx/lib/delayedresult.py +420 -0
  151. wx/lib/dialogs.py +510 -0
  152. wx/lib/docview.py +3210 -0
  153. wx/lib/dragscroller.py +79 -0
  154. wx/lib/editor/README.txt +77 -0
  155. wx/lib/editor/__init__.py +24 -0
  156. wx/lib/editor/editor.py +974 -0
  157. wx/lib/editor/images.py +15 -0
  158. wx/lib/editor/selection.py +44 -0
  159. wx/lib/embeddedimage.py +76 -0
  160. wx/lib/eventStack.py +136 -0
  161. wx/lib/eventwatcher.py +440 -0
  162. wx/lib/evtmgr.py +521 -0
  163. wx/lib/expando.py +393 -0
  164. wx/lib/fancytext.py +494 -0
  165. wx/lib/filebrowsebutton.py +461 -0
  166. wx/lib/flashwin.py +262 -0
  167. wx/lib/flashwin_old.py +651 -0
  168. wx/lib/floatcanvas/FCEvents.py +53 -0
  169. wx/lib/floatcanvas/FCObjects.py +2910 -0
  170. wx/lib/floatcanvas/FloatCanvas.py +1025 -0
  171. wx/lib/floatcanvas/GUIMode.py +396 -0
  172. wx/lib/floatcanvas/NavCanvas.py +162 -0
  173. wx/lib/floatcanvas/Resources.py +319 -0
  174. wx/lib/floatcanvas/ScreenShot.py +1788 -0
  175. wx/lib/floatcanvas/Utilities/BBox.py +313 -0
  176. wx/lib/floatcanvas/Utilities/Colors.py +137 -0
  177. wx/lib/floatcanvas/Utilities/GUI.py +91 -0
  178. wx/lib/floatcanvas/Utilities/__init__.py +7 -0
  179. wx/lib/floatcanvas/__init__.py +124 -0
  180. wx/lib/foldmenu.py +89 -0
  181. wx/lib/gestures.py +310 -0
  182. wx/lib/gizmos/__init__.py +18 -0
  183. wx/lib/gizmos/dynamicsash.py +1202 -0
  184. wx/lib/gizmos/ledctrl.py +299 -0
  185. wx/lib/gizmos/treelistctrl.py +87 -0
  186. wx/lib/graphics.py +1942 -0
  187. wx/lib/gridmovers.py +516 -0
  188. wx/lib/iewin.py +249 -0
  189. wx/lib/iewin_old.py +894 -0
  190. wx/lib/imagebrowser.py +853 -0
  191. wx/lib/imageutils.py +163 -0
  192. wx/lib/infoframe.py +490 -0
  193. wx/lib/inspection.py +1254 -0
  194. wx/lib/intctrl.py +990 -0
  195. wx/lib/itemspicker.py +256 -0
  196. wx/lib/langlistctrl.py +480 -0
  197. wx/lib/layoutf.py +271 -0
  198. wx/lib/masked/__init__.py +27 -0
  199. wx/lib/masked/combobox.py +839 -0
  200. wx/lib/masked/ctrl.py +108 -0
  201. wx/lib/masked/ipaddrctrl.py +241 -0
  202. wx/lib/masked/maskededit.py +7262 -0
  203. wx/lib/masked/numctrl.py +2000 -0
  204. wx/lib/masked/textctrl.py +465 -0
  205. wx/lib/masked/timectrl.py +1465 -0
  206. wx/lib/mixins/__init__.py +17 -0
  207. wx/lib/mixins/grid.py +47 -0
  208. wx/lib/mixins/gridlabelrenderer.py +277 -0
  209. wx/lib/mixins/imagelist.py +77 -0
  210. wx/lib/mixins/inspection.py +184 -0
  211. wx/lib/mixins/listctrl.py +893 -0
  212. wx/lib/mixins/rubberband.py +403 -0
  213. wx/lib/mixins/treemixin.py +678 -0
  214. wx/lib/msgpanel.py +95 -0
  215. wx/lib/multisash.py +746 -0
  216. wx/lib/myole4ax.idl +178 -0
  217. wx/lib/myole4ax.tlb +0 -0
  218. wx/lib/newevent.py +229 -0
  219. wx/lib/newevent.pyi +25 -0
  220. wx/lib/nvdlg.py +156 -0
  221. wx/lib/ogl/__init__.py +13 -0
  222. wx/lib/ogl/basic.py +3989 -0
  223. wx/lib/ogl/bmpshape.py +86 -0
  224. wx/lib/ogl/canvas.py +467 -0
  225. wx/lib/ogl/composit.py +1576 -0
  226. wx/lib/ogl/diagram.py +230 -0
  227. wx/lib/ogl/divided.py +482 -0
  228. wx/lib/ogl/drawn.py +898 -0
  229. wx/lib/ogl/lines.py +1809 -0
  230. wx/lib/ogl/oglmisc.py +607 -0
  231. wx/lib/pdfviewer/__init__.py +113 -0
  232. wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
  233. wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
  234. wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
  235. wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
  236. wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
  237. wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
  238. wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
  239. wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
  240. wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
  241. wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
  242. wx/lib/pdfviewer/bitmaps/Save.png +0 -0
  243. wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
  244. wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
  245. wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
  246. wx/lib/pdfviewer/buttonpanel.py +285 -0
  247. wx/lib/pdfviewer/images.py +240 -0
  248. wx/lib/pdfviewer/viewer.py +1118 -0
  249. wx/lib/pdfwin.py +295 -0
  250. wx/lib/pdfwin_old.py +789 -0
  251. wx/lib/platebtn.py +789 -0
  252. wx/lib/plot/CHANGELOG.md +150 -0
  253. wx/lib/plot/README.md +16 -0
  254. wx/lib/plot/__init__.py +46 -0
  255. wx/lib/plot/__main__.py +5 -0
  256. wx/lib/plot/examples/__init__.py +0 -0
  257. wx/lib/plot/examples/demo.py +1010 -0
  258. wx/lib/plot/examples/simple_example.py +56 -0
  259. wx/lib/plot/plotcanvas.py +2985 -0
  260. wx/lib/plot/polyobjects.py +1524 -0
  261. wx/lib/plot/utils.py +334 -0
  262. wx/lib/popupctl.py +251 -0
  263. wx/lib/printout.py +1155 -0
  264. wx/lib/progressindicator.py +151 -0
  265. wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
  266. wx/lib/pubsub/README_WxPython.txt +22 -0
  267. wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
  268. wx/lib/pubsub/__init__.py +25 -0
  269. wx/lib/pubsub/core/__init__.py +92 -0
  270. wx/lib/pubsub/core/arg1/__init__.py +16 -0
  271. wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
  272. wx/lib/pubsub/core/arg1/publisher.py +40 -0
  273. wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
  274. wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
  275. wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
  276. wx/lib/pubsub/core/callables.py +198 -0
  277. wx/lib/pubsub/core/imp2.py +62 -0
  278. wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
  279. wx/lib/pubsub/core/kwargs/__init__.py +16 -0
  280. wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
  281. wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
  282. wx/lib/pubsub/core/kwargs/publisher.py +77 -0
  283. wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
  284. wx/lib/pubsub/core/kwargs/topicargspecimpl.py +216 -0
  285. wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
  286. wx/lib/pubsub/core/listener.py +40 -0
  287. wx/lib/pubsub/core/listenerbase.py +185 -0
  288. wx/lib/pubsub/core/notificationmgr.py +185 -0
  289. wx/lib/pubsub/core/publisherbase.py +189 -0
  290. wx/lib/pubsub/core/topicargspec.py +77 -0
  291. wx/lib/pubsub/core/topicdefnprovider.py +631 -0
  292. wx/lib/pubsub/core/topicexc.py +72 -0
  293. wx/lib/pubsub/core/topicmgr.py +454 -0
  294. wx/lib/pubsub/core/topicobj.py +472 -0
  295. wx/lib/pubsub/core/topictreetraverser.py +143 -0
  296. wx/lib/pubsub/core/topicutils.py +119 -0
  297. wx/lib/pubsub/core/treeconfig.py +21 -0
  298. wx/lib/pubsub/core/validatedefnargs.py +29 -0
  299. wx/lib/pubsub/core/weakmethod.py +102 -0
  300. wx/lib/pubsub/policies.py +24 -0
  301. wx/lib/pubsub/pub.py +199 -0
  302. wx/lib/pubsub/setuparg1.py +47 -0
  303. wx/lib/pubsub/setupkwargs.py +29 -0
  304. wx/lib/pubsub/utils/__init__.py +27 -0
  305. wx/lib/pubsub/utils/exchandling.py +100 -0
  306. wx/lib/pubsub/utils/misc.py +99 -0
  307. wx/lib/pubsub/utils/notification.py +331 -0
  308. wx/lib/pubsub/utils/topictreeprinter.py +195 -0
  309. wx/lib/pubsub/utils/xmltopicdefnprovider.py +286 -0
  310. wx/lib/pydocview.py +3300 -0
  311. wx/lib/rcsizer.py +227 -0
  312. wx/lib/resizewidget.py +357 -0
  313. wx/lib/scrolledpanel.py +243 -0
  314. wx/lib/sheet.py +350 -0
  315. wx/lib/sized_controls.py +691 -0
  316. wx/lib/softwareupdate.py +355 -0
  317. wx/lib/splitter.py +925 -0
  318. wx/lib/statbmp.py +199 -0
  319. wx/lib/stattext.py +321 -0
  320. wx/lib/throbber.py +424 -0
  321. wx/lib/ticker.py +306 -0
  322. wx/lib/ticker_xrc.py +48 -0
  323. wx/lib/utils.py +89 -0
  324. wx/lib/wordwrap.py +97 -0
  325. wx/lib/wxcairo/__init__.py +139 -0
  326. wx/lib/wxcairo/wx_cairocffi.py +200 -0
  327. wx/lib/wxcairo/wx_pycairo.py +455 -0
  328. wx/lib/wxpTag.py +274 -0
  329. wx/libcairo-2.dll +0 -0
  330. wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
  331. wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
  332. wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
  333. wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
  334. wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
  335. wx/locale/co/LC_MESSAGES/wxstd.mo +0 -0
  336. wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
  337. wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
  338. wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
  339. wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
  340. wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
  341. wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
  342. wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
  343. wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
  344. wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
  345. wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
  346. wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
  347. wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
  348. wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
  349. wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
  350. wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
  351. wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
  352. wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
  353. wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
  354. wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
  355. wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
  356. wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
  357. wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
  358. wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
  359. wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
  360. wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
  361. wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
  362. wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
  363. wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
  364. wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
  365. wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
  366. wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
  367. wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
  368. wx/locale/sr/LC_MESSAGES/wxstd.mo +0 -0
  369. wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
  370. wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
  371. wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
  372. wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
  373. wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
  374. wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
  375. wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
  376. wx/media.py +30 -0
  377. wx/media.pyi +272 -0
  378. wx/msw.py +16 -0
  379. wx/msw.pyi +91 -0
  380. wx/propgrid.py +498 -0
  381. wx/propgrid.pyi +7427 -0
  382. wx/py/CHANGES.txt +796 -0
  383. wx/py/Py.ico +0 -0
  384. wx/py/PyAlaCarte.py +34 -0
  385. wx/py/PyAlaMode.py +34 -0
  386. wx/py/PyAlaModeTest.py +33 -0
  387. wx/py/PyCrust.ico +0 -0
  388. wx/py/PyCrust.py +78 -0
  389. wx/py/PyCrust_16.png +0 -0
  390. wx/py/PyCrust_32.png +0 -0
  391. wx/py/PyFilling.py +35 -0
  392. wx/py/PyShell.py +78 -0
  393. wx/py/PySlices.ico +0 -0
  394. wx/py/PySlices.py +98 -0
  395. wx/py/PySlicesShell.py +94 -0
  396. wx/py/PySlices_16.png +0 -0
  397. wx/py/PySlices_32.png +0 -0
  398. wx/py/PyWrap.py +52 -0
  399. wx/py/README.txt +77 -0
  400. wx/py/__init__.py +20 -0
  401. wx/py/buffer.py +136 -0
  402. wx/py/crust.py +403 -0
  403. wx/py/crustslices.py +403 -0
  404. wx/py/dispatcher.py +259 -0
  405. wx/py/document.py +37 -0
  406. wx/py/editor.py +844 -0
  407. wx/py/editwindow.py +316 -0
  408. wx/py/filling.py +358 -0
  409. wx/py/frame.py +976 -0
  410. wx/py/images.py +212 -0
  411. wx/py/interpreter.py +161 -0
  412. wx/py/introspect.py +402 -0
  413. wx/py/magic.py +98 -0
  414. wx/py/parse.py +134 -0
  415. wx/py/path.py +36 -0
  416. wx/py/pseudo.py +99 -0
  417. wx/py/shell.py +1579 -0
  418. wx/py/sliceshell.py +3805 -0
  419. wx/py/tests/test_interpreter.py +71 -0
  420. wx/py/tests/test_introspect.py +810 -0
  421. wx/py/tests/test_pseudo.py +70 -0
  422. wx/py/tests/test_version.py +36 -0
  423. wx/py/tests/testall.py +22 -0
  424. wx/py/version.py +7 -0
  425. wx/py.typed +0 -0
  426. wx/ribbon.py +48 -0
  427. wx/ribbon.pyi +3099 -0
  428. wx/richtext.py +141 -0
  429. wx/richtext.pyi +13581 -0
  430. wx/siplib.cp315-win_amd64.pyd +0 -0
  431. wx/siplib.pyi +19 -0
  432. wx/stc.py +59 -0
  433. wx/stc.pyi +9918 -0
  434. wx/svg/__init__.py +363 -0
  435. wx/svg/_nanosvg.cp315-win_amd64.pyd +0 -0
  436. wx/tools/__init__.py +18 -0
  437. wx/tools/dbg.py +268 -0
  438. wx/tools/genaxmodule.py +50 -0
  439. wx/tools/helpviewer.py +92 -0
  440. wx/tools/img2img.py +85 -0
  441. wx/tools/img2png.py +54 -0
  442. wx/tools/img2py.py +306 -0
  443. wx/tools/img2xpm.py +54 -0
  444. wx/tools/pywxrc.py +951 -0
  445. wx/tools/wxget.py +254 -0
  446. wx/tools/wxget_docs_demo.py +183 -0
  447. wx/wxbase334u_net_vc140_x64.dll +0 -0
  448. wx/wxbase334u_vc140_x64.dll +0 -0
  449. wx/wxbase334u_xml_vc140_x64.dll +0 -0
  450. wx/wxmsw334u_adv_vc140_x64.dll +0 -0
  451. wx/wxmsw334u_aui_vc140_x64.dll +0 -0
  452. wx/wxmsw334u_core_vc140_x64.dll +0 -0
  453. wx/wxmsw334u_gl_vc140_x64.dll +0 -0
  454. wx/wxmsw334u_html_vc140_x64.dll +0 -0
  455. wx/wxmsw334u_media_vc140_x64.dll +0 -0
  456. wx/wxmsw334u_propgrid_vc140_x64.dll +0 -0
  457. wx/wxmsw334u_qa_vc140_x64.dll +0 -0
  458. wx/wxmsw334u_ribbon_vc140_x64.dll +0 -0
  459. wx/wxmsw334u_richtext_vc140_x64.dll +0 -0
  460. wx/wxmsw334u_stc_vc140_x64.dll +0 -0
  461. wx/wxmsw334u_webview_vc140_x64.dll +0 -0
  462. wx/wxmsw334u_xrc_vc140_x64.dll +0 -0
  463. wx/xml.py +18 -0
  464. wx/xml.pyi +728 -0
  465. wx/xrc.py +68 -0
  466. wx/xrc.pyi +896 -0
  467. wxpython-4.3.2.dist-info/METADATA +71 -0
  468. wxpython-4.3.2.dist-info/RECORD +472 -0
  469. wxpython-4.3.2.dist-info/WHEEL +5 -0
  470. wxpython-4.3.2.dist-info/entry_points.txt +13 -0
  471. wxpython-4.3.2.dist-info/licenses/LICENSE.txt +610 -0
  472. wxpython-4.3.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,631 @@
1
+ """
2
+ :copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
3
+ :license: BSD, see LICENSE_BSD_Simple.txt for details.
4
+ """
5
+
6
+
7
+ import os, re, inspect, io
8
+ from textwrap import TextWrapper, dedent
9
+
10
+ from .. import (
11
+ policies,
12
+ )
13
+ from .topicargspec import (
14
+ topicArgsFromCallable,
15
+ ArgSpecGiven
16
+ )
17
+ from .topictreetraverser import TopicTreeTraverser
18
+ from .topicexc import UnrecognizedSourceFormatError
19
+
20
+
21
+ class ITopicDefnProvider:
22
+ """
23
+ All topic definition providers added via pub.addTopicDefnProvider()
24
+ must have this interface. Derived classes must override the getDefn(),
25
+ getTreeDoc() and topicNames() methods.
26
+ """
27
+
28
+ def getDefn(self, topicNameTuple):
29
+ """Must return a pair (string, ArgSpecGiven) for given topic.
30
+ The first item is a description for topic, the second item
31
+ contains the message data specification (MDS). Note topic name
32
+ is in tuple format ('a', 'b', 'c') rather than 'a.b.c'. """
33
+ msg = 'Must return (string, ArgSpecGiven), or (None, None)'
34
+ raise NotImplementedError(msg)
35
+
36
+ def topicNames(self):
37
+ """Return an iterator over topic names available from this provider.
38
+ Note that the topic names should be in tuple rather than dotted-string
39
+ format so as to be compatible with getDefn()."""
40
+ msg = 'Must return a list of topic names available from this provider'
41
+ raise NotImplementedError(msg)
42
+
43
+ def getTreeDoc(self):
44
+ """Get the docstring for the topic tree."""
45
+ msg = 'Must return documentation string for root topic (tree)'
46
+ raise NotImplementedError(msg)
47
+
48
+ def __iter__(self):
49
+ """Same as self.topicNames(), do NOT override."""
50
+ return self.topicNames()
51
+
52
+
53
+ # name of method in class name assumed to represent topic's listener signature
54
+ # which will get checked against topic's Message Data Specification (MDS)
55
+ SPEC_METHOD_NAME = 'msgDataSpec'
56
+
57
+
58
+ class ITopicDefnDeserializer:
59
+ """
60
+ Interface class for all topic definition de-serializers that can be
61
+ accepted by TopicDefnProvider. A deserializer
62
+ creates a topic tree from something such as file, module, or string.
63
+ """
64
+
65
+ class TopicDefn:
66
+ """Encapsulate date for a topic definition. Used by
67
+ getNextTopic()."""
68
+
69
+ def __init__(self, nameTuple, description, argsDocs, required):
70
+ self.nameTuple = nameTuple
71
+ self.description = description
72
+ self.argsDocs = argsDocs
73
+ self.required = required
74
+
75
+ def isComplete(self):
76
+ return (self.description is not None) and (self.argsDocs is not None)
77
+
78
+ def getTreeDoc(self):
79
+ """Get the docstring for the topic tree."""
80
+ raise NotImplementedError
81
+
82
+ def getNextTopic(self):
83
+ """Get the next topic definition available from the data. The return
84
+ must be an instance of TopicDefn. Must return None when no topics
85
+ are left."""
86
+ raise NotImplementedError
87
+
88
+ def doneIter(self):
89
+ """Called automatically by TopicDefnProvider once
90
+ it considers the iteration completed. Override this only if
91
+ deserializer needs to take action, such as closing a file."""
92
+ pass
93
+
94
+ def resetIter(self):
95
+ """Called by the TopicDefnProvider if it needs to
96
+ restart the topic iteration. Override this only if special action needed,
97
+ such as resetting a file pointer to beginning of file."""
98
+ pass
99
+
100
+
101
+ class TopicDefnDeserialClass(ITopicDefnDeserializer):
102
+ """
103
+ Convert a nested class tree as a topic definition tree. Format: the class
104
+ name is the topic name, its doc string is its description. The topic's
105
+ message data specification is determined by inspecting a class method called
106
+ the same as SPEC_METHOD_NAME. The doc string of that method is parsed to
107
+ extract the description for each message data.
108
+ """
109
+
110
+ def __init__(self, pyClassObj=None):
111
+ """If pyClassObj is given, it is an object that contains nested
112
+ classes defining root topics; the root topics contain nested
113
+ classes defining subtopics; etc."""
114
+ self.__rootTopics = []
115
+ self.__iterStarted = False
116
+ self.__nextTopic = iter(self.__rootTopics)
117
+ self.__rootDoc = None
118
+
119
+ if pyClassObj is not None:
120
+ self.__rootDoc = pyClassObj.__doc__
121
+ topicClasses = self.__getTopicClasses(pyClassObj)
122
+ for topicName, pyClassObj in topicClasses:
123
+ self.__addDefnFromClassObj(pyClassObj)
124
+
125
+ def getTreeDoc(self):
126
+ return self.__rootDoc
127
+
128
+ def getNextTopic(self):
129
+ self.__iterStarted = True
130
+ try:
131
+ topicNameTuple, topicClassObj = next(self.__nextTopic)
132
+ except StopIteration:
133
+ return None
134
+
135
+ # ok get the info from class
136
+ if hasattr(topicClassObj, SPEC_METHOD_NAME):
137
+ protoListener = getattr(topicClassObj, SPEC_METHOD_NAME)
138
+ argsDocs, required = topicArgsFromCallable(protoListener)
139
+ if protoListener.__doc__:
140
+ self.__setArgsDocsFromProtoDocs(argsDocs, protoListener.__doc__)
141
+ else:
142
+ # assume definition is implicitly that listener has no args
143
+ argsDocs = {}
144
+ required = ()
145
+ desc = None
146
+ if topicClassObj.__doc__:
147
+ desc = dedent(topicClassObj.__doc__)
148
+ return self.TopicDefn(topicNameTuple, desc, argsDocs, required)
149
+
150
+ def resetIter(self):
151
+ self.__iterStarted = False
152
+ self.__nextTopic = iter(self.__rootTopics)
153
+
154
+ def getDefinedTopics(self):
155
+ return [nt for (nt, defn) in self.__rootTopics]
156
+
157
+ def __addDefnFromClassObj(self, pyClassObj):
158
+ """Extract a topic definition from a Python class: topic name,
159
+ docstring, and MDS, and docstring for each message data.
160
+ The class name is the topic name, assumed to be a root topic, and
161
+ descends recursively into nested classes to define subtopic etc. """
162
+ if self.__iterStarted:
163
+ raise RuntimeError('addDefnFromClassObj must be called before iteration started!')
164
+
165
+ parentNameTuple = (pyClassObj.__name__, )
166
+ if pyClassObj.__doc__ is not None:
167
+ self.__rootTopics.append( (parentNameTuple, pyClassObj) )
168
+ if self.__rootDoc is None:
169
+ self.__rootDoc = pyClassObj.__doc__
170
+ self.__findTopics(pyClassObj, parentNameTuple)
171
+ # iterator is now out of sync, so reset it; obviously this would
172
+ # screw up getNextTopic which is why we had to test for self.__iterStarted
173
+ self.__nextTopic = iter(self.__rootTopics)
174
+
175
+ def __findTopics(self, pyClassObj, parentNameTuple):
176
+ assert not self.__iterStarted
177
+ assert parentNameTuple
178
+ assert pyClassObj.__name__ == parentNameTuple[-1]
179
+
180
+ topicClasses = self.__getTopicClasses(pyClassObj, parentNameTuple)
181
+ pyClassObj._topicNameStr = '.'.join(parentNameTuple)
182
+
183
+ # make sure to update rootTopics BEFORE we recurse, so that toplevel
184
+ # topics come first in the list
185
+ for parentNameTuple2, topicClassObj in topicClasses:
186
+ # we only keep track of topics that are documented, so that
187
+ # multiple providers can co-exist without having to duplicate
188
+ # information
189
+ if topicClassObj.__doc__ is not None:
190
+ self.__rootTopics.append( (parentNameTuple2, topicClassObj) )
191
+ # now can find its subtopics
192
+ self.__findTopics(topicClassObj, parentNameTuple2)
193
+
194
+ def __getTopicClasses(self, pyClassObj, parentNameTuple=()):
195
+ """Returns a list of pairs, (topicNameTuple, memberClassObj)"""
196
+ memberNames = dir(pyClassObj)
197
+ topicClasses = []
198
+ for memberName in memberNames:
199
+ if memberName.startswith('_'):
200
+ continue # ignore special and non-public methods
201
+ member = getattr(pyClassObj, memberName)
202
+ if inspect.isclass( member ):
203
+ topicNameTuple = parentNameTuple + (memberName,)
204
+ topicClasses.append( (topicNameTuple, member) )
205
+ return topicClasses
206
+
207
+ def __setArgsDocsFromProtoDocs(self, argsDocs, protoDocs):
208
+ PAT_ITEM_STR = r'\A-\s*' # hyphen and any number of blanks
209
+ PAT_ARG_NAME = r'(?P<argName>\w*)'
210
+ PAT_DOC_STR = r'(?P<doc1>.*)'
211
+ PAT_BLANK = r'\s*'
212
+ PAT_ITEM_SEP = r':'
213
+ argNamePat = re.compile(
214
+ PAT_ITEM_STR + PAT_ARG_NAME + PAT_BLANK + PAT_ITEM_SEP
215
+ + PAT_BLANK + PAT_DOC_STR)
216
+ protoDocs = dedent(protoDocs)
217
+ lines = protoDocs.splitlines()
218
+ argName = None
219
+ namesFound = []
220
+ for line in lines:
221
+ match = argNamePat.match(line)
222
+ if match:
223
+ argName = match.group('argName')
224
+ namesFound.append(argName)
225
+ argsDocs[argName] = [match.group('doc1') ]
226
+ elif argName:
227
+ argsDocs[argName].append(line)
228
+
229
+ for name in namesFound:
230
+ argsDocs[name] = '\n'.join( argsDocs[name] )
231
+
232
+
233
+ class TopicDefnDeserialModule(ITopicDefnDeserializer):
234
+ """
235
+ Deserialize a module containing Python source code defining a topic tree.
236
+ This loads the module and gives it to an instance of TopicDefnDeserialClass.
237
+ """
238
+
239
+ def __init__(self, moduleName, searchPath=None):
240
+ """Load the given named module, searched for in searchPath or, if not
241
+ specified, in sys.path. Give it to a TopicDefnDeserialClass."""
242
+ from . import imp2
243
+ module = imp2.load_module(moduleName, searchPath)
244
+ self.__classDeserial = TopicDefnDeserialClass(module)
245
+
246
+ def getTreeDoc(self):
247
+ return self.__classDeserial.getTreeDoc()
248
+
249
+ def getNextTopic(self):
250
+ return self.__classDeserial.getNextTopic()
251
+
252
+ def doneIter(self):
253
+ self.__classDeserial.doneIter()
254
+
255
+ def resetIter(self):
256
+ self.__classDeserial.resetIter()
257
+
258
+ def getDefinedTopics(self):
259
+ return self.__classDeserial.getDefinedTopics()
260
+
261
+
262
+ class TopicDefnDeserialString(ITopicDefnDeserializer):
263
+ """
264
+ Deserialize a string containing Python source code defining a topic tree.
265
+ The string has the same format as expected by TopicDefnDeserialModule.
266
+ """
267
+
268
+ def __init__(self, source):
269
+ """This just saves the string into a temporary file created in
270
+ os.getcwd(), and the rest is delegated to TopicDefnDeserialModule.
271
+ The temporary file (module -- as well as its byte-compiled
272
+ version) will be deleted when the doneIter() method is called."""
273
+
274
+ def createTmpModule():
275
+ moduleNamePre = 'tmp_export_topics_'
276
+ import os, tempfile
277
+ creationDir = os.getcwd()
278
+ fileID, path = tempfile.mkstemp('.py', moduleNamePre, dir=creationDir)
279
+ with os.fdopen(fileID, 'w') as stringFile:
280
+ stringFile.write( dedent(source) )
281
+ return path, [creationDir]
282
+
283
+ self.__filename, searchPath = createTmpModule()
284
+ moduleName = os.path.splitext( os.path.basename(self.__filename) )[0]
285
+ self.__modDeserial = TopicDefnDeserialModule(moduleName, searchPath)
286
+
287
+ def getTreeDoc(self):
288
+ return self.__modDeserial.getTreeDoc()
289
+
290
+ def getNextTopic(self):
291
+ return self.__modDeserial.getNextTopic()
292
+
293
+ def doneIter(self):
294
+ self.__modDeserial.doneIter()
295
+ # remove the temporary module and its compiled version (*.pyc)
296
+ os.remove(self.__filename)
297
+ try: # py3.2+ uses special folder/filename for .pyc files
298
+ from importlib.util import cache_from_source
299
+ os.remove(cache_from_source(self.__filename))
300
+ except ImportError:
301
+ os.remove(self.__filename + 'c')
302
+
303
+ def resetIter(self):
304
+ self.__modDeserial.resetIter()
305
+
306
+ def getDefinedTopics(self):
307
+ return self.__modDeserial.getDefinedTopics()
308
+
309
+
310
+ TOPIC_TREE_FROM_MODULE = 'module'
311
+ TOPIC_TREE_FROM_STRING = 'string'
312
+ TOPIC_TREE_FROM_CLASS = 'class'
313
+
314
+
315
+ class TopicDefnProvider(ITopicDefnProvider):
316
+ """
317
+ Default implementation of the ITopicDefnProvider API. This
318
+ implementation accepts several formats for the topic tree
319
+ source data and delegates to a registered ITopicDefnDeserializer
320
+ that converts source data into topic definitions.
321
+
322
+ This provider is instantiated automatically by
323
+ ``pub.addTopicDefnProvider(source, format)``
324
+ when source is *not* an ITopicDefnProvider.
325
+
326
+ Additional de-serializers can be registered via registerTypeForImport().
327
+ """
328
+
329
+ _typeRegistry = {}
330
+
331
+ def __init__(self, source, format, **providerKwargs):
332
+ """Find the correct de-serializer class from registry for the given
333
+ format; instantiate it with given source and providerKwargs; get
334
+ all available topic definitions."""
335
+ if format not in self._typeRegistry:
336
+ raise UnrecognizedSourceFormatError()
337
+ providerClassObj = self._typeRegistry[format]
338
+ provider = providerClassObj(source, **providerKwargs)
339
+ self.__topicDefns = {}
340
+ self.__treeDocs = provider.getTreeDoc()
341
+ try:
342
+ topicDefn = provider.getNextTopic()
343
+ while topicDefn is not None:
344
+ self.__topicDefns[topicDefn.nameTuple] = topicDefn
345
+ topicDefn = provider.getNextTopic()
346
+ finally:
347
+ provider.doneIter()
348
+
349
+ def getDefn(self, topicNameTuple):
350
+ desc, spec = None, None
351
+ defn = self.__topicDefns.get(topicNameTuple, None)
352
+ if defn is not None:
353
+ assert defn.isComplete()
354
+ desc = defn.description
355
+ spec = ArgSpecGiven(defn.argsDocs, defn.required)
356
+ return desc, spec
357
+
358
+ def topicNames(self):
359
+ return iter(self.__topicDefns.keys())
360
+
361
+ def getTreeDoc(self):
362
+ return self.__treeDocs
363
+
364
+ @classmethod
365
+ def registerTypeForImport(cls, typeName, providerClassObj):
366
+ """If a new type of importer is defined for topic definitions, it
367
+ can be registered with pubsub by providing a name for the new
368
+ importer (typeName), and the class to instantiate when
369
+ pub.addTopicDefnProvider(obj, typeName) is called. For instance, ::
370
+
371
+ from pubsub.core.topicdefnprovider import ITopicDefnDeserializer
372
+ class SomeNewImporter(ITopicDefnDeserializer):
373
+ ...
374
+ TopicDefnProvider.registerTypeForImport('some name', SomeNewImporter)
375
+ # will instantiate SomeNewImporter(source)
376
+ pub.addTopicDefnProvider(source, 'some name')
377
+ """
378
+ assert issubclass(providerClassObj, ITopicDefnDeserializer)
379
+ cls._typeRegistry[typeName] = providerClassObj
380
+
381
+ @classmethod
382
+ def initTypeRegistry(cls):
383
+ cls.registerTypeForImport(TOPIC_TREE_FROM_MODULE, TopicDefnDeserialModule)
384
+ cls.registerTypeForImport(TOPIC_TREE_FROM_STRING, TopicDefnDeserialString)
385
+ cls.registerTypeForImport(TOPIC_TREE_FROM_CLASS, TopicDefnDeserialClass)
386
+
387
+
388
+ TopicDefnProvider.initTypeRegistry()
389
+
390
+
391
+ def _backupIfExists(filename, bak):
392
+ import os, shutil
393
+ if os.path.exists(filename):
394
+ backupName = '%s.%s' % (filename, bak)
395
+ shutil.copy(filename, backupName)
396
+
397
+
398
+ defaultTopicTreeSpecHeader = \
399
+ """
400
+ Topic tree for application.
401
+ Used via pub.addTopicDefnProvider(thisModuleName).
402
+ """
403
+
404
+ defaultTopicTreeSpecFooter = \
405
+ """\
406
+ # End of topic tree definition. Note that application may load
407
+ # more than one definitions provider.
408
+ """
409
+
410
+
411
+ def exportTopicTreeSpec(moduleName = None, rootTopic=None, bak='bak', moduleDoc=None):
412
+ """Using TopicTreeSpecPrinter, exports the topic tree rooted at rootTopic to a
413
+ Python module (.py) file. This module will define module-level classes
414
+ representing root topics, nested classes for subtopics etc. Returns a string
415
+ representing the contents of the file. Parameters:
416
+
417
+ - If moduleName is given, the topic tree is written to moduleName.py in
418
+ os.getcwd(). By default, it is first backed up, it it already exists,
419
+ using bak as the filename extension. If bak is None, existing module file
420
+ gets overwritten.
421
+ - If rootTopic is specified, the export only traverses tree from
422
+ corresponding topic. Otherwise, complete tree, using
423
+ pub.getDefaultTopicTreeRoot() as starting point.
424
+ - The moduleDoc is the doc string for the module ie topic tree.
425
+ """
426
+
427
+ if rootTopic is None:
428
+ from .. import pub
429
+ rootTopic = pub.getDefaultTopicMgr().getRootAllTopics()
430
+ elif isinstance(rootTopic, str):
431
+ from .. import pub
432
+ rootTopic = pub.getDefaultTopicMgr().getTopic(rootTopic)
433
+
434
+ # create exporter
435
+ if moduleName is None:
436
+ capture = io.StringIO()
437
+ TopicTreeSpecPrinter(rootTopic, fileObj=capture, treeDoc=moduleDoc)
438
+ return capture.getvalue()
439
+
440
+ else:
441
+ filename = '%s.py' % moduleName
442
+ if bak:
443
+ _backupIfExists(filename, bak)
444
+ with open(filename, 'w') as moduleFile:
445
+ TopicTreeSpecPrinter(rootTopic, fileObj=moduleFile, treeDoc=moduleDoc)
446
+
447
+ ##############################################################
448
+
449
+ class TopicTreeSpecPrinter:
450
+ """
451
+ Helper class to print the topic tree using the Python class
452
+ syntax. The "printout" can be sent to any file object (object that has a
453
+ write() method). If printed to a module, the module can be imported and
454
+ given to pub.addTopicDefnProvider(module, 'module'). Importing the module
455
+ also provides code completion of topic names (rootTopic.subTopic can be
456
+ given to any pubsub function requiring a topic name).
457
+ """
458
+
459
+ INDENT_CH = ' '
460
+ #INDENT_CH = '.'
461
+
462
+ def __init__(self, rootTopic=None, fileObj=None, width=70, indentStep=4,
463
+ treeDoc = defaultTopicTreeSpecHeader, footer = defaultTopicTreeSpecFooter):
464
+ """For formatting, can specify the width of output, the indent step, the
465
+ header and footer to print to override defaults. The destination is fileObj;
466
+ if none is given, then sys.stdout is used. If rootTopic is given, calls
467
+ writeAll(rootTopic) at end of __init__."""
468
+ self.__traverser = TopicTreeTraverser(self)
469
+
470
+ import sys
471
+ fileObj = fileObj or sys.stdout
472
+
473
+ self.__destination = fileObj
474
+ self.__output = []
475
+ self.__header = self.__toDocString(treeDoc)
476
+ self.__footer = footer
477
+ self.__lastWasAll = False # True when last topic done was the ALL_TOPICS
478
+
479
+ self.__width = width
480
+ self.__wrapper = TextWrapper(width)
481
+ self.__indentStep = indentStep
482
+ self.__indent = 0
483
+
484
+ args = dict(width=width, indentStep=indentStep, treeDoc=treeDoc,
485
+ footer=footer, fileObj=fileObj)
486
+ def fmItem(argName, argVal):
487
+ if isinstance(argVal, str):
488
+ MIN_OFFSET = 5
489
+ lenAV = width - MIN_OFFSET - len(argName)
490
+ if lenAV > 0:
491
+ argVal = repr(argVal[:lenAV] + '...')
492
+ elif argName == 'fileObj':
493
+ argVal = fileObj.__class__.__name__
494
+ return '# - %s: %s' % (argName, argVal)
495
+ fmtArgs = [fmItem(key, args[key]) for key in sorted(args.keys())]
496
+ self.__comment = [
497
+ '# Automatically generated by %s(**kwargs).' % self.__class__.__name__,
498
+ '# The kwargs were:',
499
+ ]
500
+ self.__comment.extend(fmtArgs)
501
+ self.__comment.extend(['']) # two empty line after comment
502
+
503
+ if rootTopic is not None:
504
+ self.writeAll(rootTopic)
505
+
506
+ def getOutput(self):
507
+ """Each line that was sent to fileObj was saved in a list; returns a
508
+ string which is ``'\\n'.join(list)``."""
509
+ return '\n'.join( self.__output )
510
+
511
+ def writeAll(self, topicObj):
512
+ """Traverse each topic of topic tree, starting at topicObj, printing
513
+ each topic definition as the tree gets traversed. """
514
+ self.__traverser.traverse(topicObj)
515
+
516
+ def _accept(self, topicObj):
517
+ # accept every topic
518
+ return True
519
+
520
+ def _startTraversal(self):
521
+ # output comment
522
+ self.__wrapper.initial_indent = '# '
523
+ self.__wrapper.subsequent_indent = self.__wrapper.initial_indent
524
+ self.__output.extend( self.__comment )
525
+
526
+ # output header:
527
+ if self.__header:
528
+ self.__output.extend([''])
529
+ self.__output.append(self.__header)
530
+ self.__output.extend([''])
531
+
532
+ def _doneTraversal(self):
533
+ if self.__footer:
534
+ self.__output.append('')
535
+ self.__output.append('')
536
+ self.__output.append(self.__footer)
537
+
538
+ if self.__destination is not None:
539
+ self.__destination.write(self.getOutput())
540
+
541
+ def _onTopic(self, topicObj):
542
+ """This gets called for each topic. Print as per specified content."""
543
+ # don't print root of tree, it is the ALL_TOPICS builtin topic
544
+ if topicObj.isAll():
545
+ self.__lastWasAll = True
546
+ return
547
+ self.__lastWasAll = False
548
+
549
+ self.__output.append( '' ) # empty line
550
+ # topic name
551
+ self.__wrapper.width = self.__width
552
+ head = 'class %s:' % topicObj.getNodeName()
553
+ self.__formatItem(head)
554
+
555
+ # each extra content (assume constructor verified that chars are valid)
556
+ self.__printTopicDescription(topicObj)
557
+ if policies.msgDataProtocol != 'arg1':
558
+ self.__printTopicArgSpec(topicObj)
559
+
560
+ def _startChildren(self):
561
+ """Increase the indent"""
562
+ if not self.__lastWasAll:
563
+ self.__indent += self.__indentStep
564
+
565
+ def _endChildren(self):
566
+ """Decrease the indent"""
567
+ if not self.__lastWasAll:
568
+ self.__indent -= self.__indentStep
569
+
570
+ def __toDocString(self, msg):
571
+ if not msg:
572
+ return msg
573
+ if msg.startswith("'''") or msg.startswith('"""'):
574
+ return msg
575
+ return '"""\n%s\n"""' % msg.strip()
576
+
577
+ def __printTopicDescription(self, topicObj):
578
+ if topicObj.getDescription():
579
+ extraIndent = self.__indentStep
580
+ self.__formatItem('"""', extraIndent)
581
+ self.__formatItem( topicObj.getDescription(), extraIndent )
582
+ self.__formatItem('"""', extraIndent)
583
+
584
+ def __printTopicArgSpec(self, topicObj):
585
+ extraIndent = self.__indentStep
586
+
587
+ # generate the message data specification
588
+ reqdArgs, optArgs = topicObj.getArgs()
589
+ argsStr = []
590
+ if reqdArgs:
591
+ argsStr.append( ", ".join(reqdArgs) )
592
+ if optArgs:
593
+ optStr = ', '.join([('%s=None' % arg) for arg in optArgs])
594
+ argsStr.append(optStr)
595
+ argsStr = ', '.join(argsStr)
596
+
597
+ # print it only if there are args; ie if listener() don't print it
598
+ if argsStr:
599
+ # output a blank line and protocol
600
+ self.__formatItem('\n', extraIndent)
601
+ protoListener = 'def %s(%s):' % (SPEC_METHOD_NAME, argsStr)
602
+ self.__formatItem(protoListener, extraIndent)
603
+
604
+ # and finally, the args docs
605
+ extraIndent += self.__indentStep
606
+ self.__formatItem('"""', extraIndent)
607
+ # but ignore the arg keys that are in parent args docs:
608
+ parentMsgKeys = ()
609
+ if topicObj.getParent() is not None:
610
+ parentMsgKeys = set(topicObj.getParent().getArgDescriptions())
611
+ argsDocs = topicObj.getArgDescriptions()
612
+ for key in sorted(argsDocs):
613
+ if key not in parentMsgKeys:
614
+ argDesc = argsDocs[key]
615
+ msg = "- %s: %s" % (key, argDesc)
616
+ self.__formatItem(msg, extraIndent)
617
+ self.__formatItem('"""', extraIndent)
618
+
619
+ def __formatItem(self, item, extraIndent=0):
620
+ indent = extraIndent + self.__indent
621
+ indentStr = self.INDENT_CH * indent
622
+ lines = item.splitlines()
623
+ for line in lines:
624
+ self.__output.append( '%s%s' % (indentStr, line) )
625
+
626
+ def __formatBlock(self, text, extraIndent=0):
627
+ self.__wrapper.initial_indent = self.INDENT_CH * (self.__indent + extraIndent)
628
+ self.__wrapper.subsequent_indent = self.__wrapper.initial_indent
629
+ self.__output.append( self.__wrapper.fill(text) )
630
+
631
+
@@ -0,0 +1,72 @@
1
+ """
2
+ :copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
3
+ :license: BSD, see LICENSE_BSD_Simple.txt for details.
4
+ """
5
+
6
+
7
+
8
+ class TopicNameError(ValueError):
9
+ """Raised when the topic name is not properly formatted or
10
+ no corresponding Topic object found. """
11
+ def __init__(self, name, msg):
12
+ ValueError.__init__(self, 'Topic name "%s": %s' % (name, msg))
13
+
14
+
15
+ class TopicDefnError(RuntimeError):
16
+ """
17
+ Raised when an operation requires a topic have an MDS, but it doesn't.
18
+ See also pub.setTopicUnspecifiedFatal().
19
+ """
20
+ def __init__(self, topicNameTuple):
21
+ msg = "No topic specification for topic '%s'." \
22
+ % '.'.join(topicNameTuple)
23
+ RuntimeError.__init__(self, msg +
24
+ " See pub.addTopicDefnProvider() and/or pub.setTopicUnspecifiedFatal()")
25
+
26
+
27
+ class MessageDataSpecError(RuntimeError):
28
+ """
29
+ Raised when an attempt is made to define a topic's Message Data
30
+ Specification (MDS) to something that is not valid.
31
+
32
+ The keyword names for invalid data go in the 'args' list,
33
+ and the msg should state the problem and contain "%s" for the
34
+ args, such as MessageDataSpecError('duplicate args %s', ('arg1', 'arg2')).
35
+ """
36
+
37
+ def __init__(self, msg, args):
38
+ argsMsg = msg % ','.join(args)
39
+ RuntimeError.__init__(self, 'Invalid message data spec: ' + argsMsg)
40
+
41
+
42
+ class ExcHandlerError(RuntimeError):
43
+ """
44
+ Raised when a listener exception handler (see pub.setListenerExcHandler())
45
+ raises an exception. The original exception is contained.
46
+ """
47
+
48
+ def __init__(self, badExcListenerID, topicObj, origExc=None):
49
+ """The badExcListenerID is the name of the listener that raised
50
+ the original exception that handler was attempting to handle.
51
+ The topicObj is the Topic object for the topic of the
52
+ sendMessage that had an exception raised.
53
+ The origExc is currently not used. """
54
+ self.badExcListenerID = badExcListenerID
55
+ import traceback
56
+ self.exc = traceback.format_exc()
57
+ msg = 'The exception handler registered with pubsub raised an ' \
58
+ + 'exception, *while* handling an exception raised by listener ' \
59
+ + ' "%s" of topic "%s"):\n%s' \
60
+ % (self.badExcListenerID, topicObj.getName(), self.exc)
61
+ RuntimeError.__init__(self, msg)
62
+
63
+
64
+ class UnrecognizedSourceFormatError(ValueError):
65
+ """
66
+ Raised when a topic definition provider doesn't recognize the format
67
+ of source input it was given.
68
+ """
69
+ def __init__(self):
70
+ ValueError.__init__(self, 'Source format not recognized')
71
+
72
+