vispy 0.15.0__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.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.

Potentially problematic release.


This version of vispy might be problematic. Click here for more details.

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-aarch64-linux-gnu.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,51 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ """
5
+ Testing
6
+ =======
7
+ This module provides functions useful for running tests in vispy.
8
+
9
+ Tests can be run in a few ways:
10
+
11
+ * From Python, you can import ``vispy`` and do ``vispy.test()``.
12
+ * From the source root, you can do ``make test`` which wraps to
13
+ a call to ``python make test``.
14
+
15
+ There are various different testing "modes", including:
16
+
17
+ * "full": run all tests.
18
+ * any backend name (e.g., "glfw"): run application/GL tests using a
19
+ specific backend.
20
+ * "nobackend": run tests that do not require a backend.
21
+ * "examples": run repo examples to check for errors and warnings.
22
+ * "flake": check style errors.
23
+
24
+ Examples get automatically tested unless they have a special comment toward
25
+ the top ``# vispy: testskip``. Examples that should be tested should be
26
+ formatted so that 1) a ``Canvas`` class is defined, or a ``canvas`` class
27
+ is instantiated; and 2) the ``app.run()`` call is protected by a check
28
+ if ``__name__ == "__main__"``. This makes it so that the event loop is not
29
+ started when running examples in the test suite -- the test suite instead
30
+ manually updates the canvas (using ``app.process_events()``) for under one
31
+ second to ensure that things like timer events are processed.
32
+
33
+ For examples on how to test various bits of functionality (e.g., application
34
+ functionality, or drawing things with OpenGL), it's best to look at existing
35
+ examples in the test suite.
36
+
37
+ The code base gets automatically tested by GitHub Actions. There are multiple
38
+ testing modes that use e.g. full dependencies, minimal dependencies, etc.
39
+ See ``.github/workflows/main.yml`` to determine what automatic tests are run.
40
+ """
41
+
42
+ from ._testing import (SkipTest, requires_application, requires_ipython, # noqa
43
+ requires_img_lib, # noqa
44
+ requires_pyopengl, # noqa
45
+ requires_scipy, # noqa
46
+ save_testing_image, TestingCanvas, has_pyopengl, # noqa
47
+ run_tests_if_main, requires_ssl, # noqa
48
+ assert_is, assert_in, assert_not_in, assert_equal,
49
+ assert_not_equal, assert_raises, assert_true, # noqa
50
+ raises, requires_numpydoc, IS_TRAVIS_CI, IS_CI) # noqa
51
+ from ._runners import test # noqa
@@ -0,0 +1,448 @@
1
+ # -*- coding: utf-8 -*-
2
+ # vispy: testskip
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ """Test running functions."""
6
+
7
+ from __future__ import print_function
8
+
9
+ import sys
10
+ import os
11
+ import warnings
12
+ from os import path as op
13
+ from copy import deepcopy
14
+ from functools import partial
15
+
16
+ from ..util import use_log_level, run_subprocess
17
+ from ..util.ptime import time
18
+ from ._testing import has_application, nottest, IS_CI, IS_TRAVIS_CI
19
+
20
+
21
+ _line_sep = '-' * 70
22
+
23
+
24
+ class VispySkipSuite(Exception):
25
+ """Class we use to internally signal skipping a test suite."""
26
+
27
+ def __init__(self, msg=''):
28
+ if msg:
29
+ print(msg)
30
+ super(VispySkipSuite, self).__init__(msg)
31
+
32
+
33
+ def _get_import_dir():
34
+ import_dir = op.abspath(op.join(op.dirname(__file__), '..'))
35
+ up_dir = op.join(import_dir, '..')
36
+ if (op.isfile(op.join(up_dir, 'setup.py')) and
37
+ op.isdir(op.join(up_dir, 'vispy')) and
38
+ op.isdir(op.join(up_dir, 'examples'))):
39
+ dev = True
40
+ else:
41
+ dev = False
42
+ return import_dir, dev
43
+
44
+
45
+ def _unit(mode, extra_arg_string='', coverage=False):
46
+ """Run unit tests using a particular mode"""
47
+ if isinstance(extra_arg_string, str):
48
+ if len(extra_arg_string):
49
+ extra_args = extra_arg_string.split(' ')
50
+ else:
51
+ extra_args = ()
52
+ else:
53
+ extra_args = extra_arg_string
54
+ del extra_arg_string
55
+ assert isinstance(extra_args, (list, tuple))
56
+ assert all(isinstance(e, str) for e in extra_args)
57
+
58
+ import_dir = _get_import_dir()[0]
59
+ cwd = op.abspath(op.join(import_dir, '..'))
60
+ extra_args = list(extra_args)
61
+ try:
62
+ import pytest # noqa, analysis:ignore
63
+ except ImportError:
64
+ raise VispySkipSuite('Skipping unit tests, pytest not installed')
65
+
66
+ if mode == 'nobackend':
67
+ msg = 'Running tests with no backend'
68
+ extra_args += ['-m', 'not vispy_app_test']
69
+ else:
70
+ # check to make sure we actually have the backend of interest
71
+ stdout, stderr, invalid = run_subprocess(
72
+ [sys.executable, '-c',
73
+ 'import vispy.app; vispy.app.use_app("%s"); exit(0)' % mode],
74
+ return_code=True)
75
+ if invalid:
76
+ stdout = stdout + '\n' + stderr
77
+ stdout = '\n'.join(' ' + x for x in stdout.split('\n'))
78
+ raise VispySkipSuite(
79
+ '\n%s\n%s\n%s' % (_line_sep, 'Skipping backend %s, not '
80
+ 'installed or working properly:\n%s'
81
+ % (mode, stdout), _line_sep))
82
+ msg = 'Running tests with %s backend' % mode
83
+ extra_args += ['-m', 'vispy_app_test']
84
+ if coverage:
85
+ # Don't actually print the coverage because it's way too long
86
+ extra_args += ['--cov', 'vispy', '--cov-report=']
87
+ if not any(e.startswith('-r') for e in extra_args):
88
+ extra_args.append('-ra')
89
+ # make a call to "python" so that it inherits whatever the system
90
+ # thinks is "python" (e.g., virtualenvs)
91
+ extra_args += [import_dir] # positional argument
92
+ cmd = [sys.executable, '-m', 'pytest'] + extra_args
93
+ env = deepcopy(os.environ)
94
+
95
+ # We want to set this for all app backends plus "nobackend" to
96
+ # help ensure that app tests are appropriately decorated
97
+ env.update(dict(_VISPY_TESTING_APP=mode, VISPY_IGNORE_OLD_VERSION='true'))
98
+ env_str = '_VISPY_TESTING_APP=%s ' % mode
99
+ if len(msg) > 0:
100
+ cmd_string = ' '.join(cmd)
101
+ msg = ('%s\n%s:\n%s%s'
102
+ % (_line_sep, 'msg', env_str, cmd_string))
103
+ print(msg)
104
+ sys.stdout.flush()
105
+ return_code = run_subprocess(cmd, return_code=True, cwd=cwd,
106
+ env=env, stdout=None, stderr=None)[2]
107
+ if return_code:
108
+ raise RuntimeError('unit failure (%s)' % return_code)
109
+ if coverage:
110
+ # Running a py.test with coverage will wipe out any files that
111
+ # exist as .coverage or .coverage.*. It should work to pass
112
+ # COVERAGE_FILE env var when doing run_subprocess above, but
113
+ # it does not. Therefore we instead use our own naming scheme,
114
+ # and in Travis when we combine them, use COVERAGE_FILE with the
115
+ # `coverage combine` command.
116
+ out_name = op.join(cwd, '.vispy-coverage.%s' % mode)
117
+ if op.isfile(out_name):
118
+ os.remove(out_name)
119
+ os.rename(op.join(cwd, '.coverage'), out_name)
120
+
121
+
122
+ def _docs():
123
+ """Test docstring parameters
124
+ using vispy/utils/tests/test_docstring_parameters.py
125
+ """
126
+ dev = _get_import_dir()[1]
127
+
128
+ if not dev:
129
+ warnings.warn("Docstring test imports Vispy from"
130
+ " Vispy's installation. It is"
131
+ " recommended to setup Vispy using"
132
+ " 'python setup.py develop'"
133
+ " so that the latest sources are used automatically")
134
+ try:
135
+ # this should always be importable
136
+ from ..util.tests import test_docstring_parameters
137
+ print("Running docstring test...")
138
+ test_docstring_parameters.test_docstring_parameters()
139
+ except AssertionError as docstring_violations:
140
+ # the test harness expects runtime errors,
141
+ # not AssertionError. So wrap the AssertionError
142
+ # that is thrown by test_docstring_parameters()
143
+ # with a RuntimeError
144
+ raise RuntimeError(docstring_violations)
145
+
146
+
147
+ def _flake():
148
+ """Test flake8"""
149
+ orig_dir = os.getcwd()
150
+ import_dir, dev = _get_import_dir()
151
+ os.chdir(op.join(import_dir, '..'))
152
+ if dev:
153
+ sys.argv[1:] = ['vispy', 'examples', 'make']
154
+ else:
155
+ sys.argv[1:] = [op.basename(import_dir)]
156
+ try:
157
+ try:
158
+ from flake8.main import main
159
+ except ImportError:
160
+ from flake8.main.cli import main
161
+ except ImportError:
162
+ print('Skipping flake8 test, flake8 not installed')
163
+ else:
164
+ print('Running flake8... ') # if end='', first error gets ugly
165
+ sys.stdout.flush()
166
+ try:
167
+ # flake8 used to exit on failure, but instead `main` now returns an exit code
168
+ # see https://github.com/PyCQA/flake8/pull/1461
169
+ raise SystemExit(main())
170
+ except SystemExit as ex:
171
+ if ex.code in (None, 0):
172
+ pass # do not exit yet, we want to print a success msg
173
+ else:
174
+ raise RuntimeError('flake8 failed')
175
+ finally:
176
+ os.chdir(orig_dir)
177
+
178
+
179
+ def _check_line_endings():
180
+ """Check all files in the repository for CR characters"""
181
+ if sys.platform == 'win32':
182
+ print('Skipping line endings check on Windows')
183
+ sys.stdout.flush()
184
+ return
185
+ print('Running line endings check... ')
186
+ sys.stdout.flush()
187
+ report = []
188
+ import_dir, dev = _get_import_dir()
189
+ for dirpath, dirnames, filenames in os.walk(import_dir):
190
+ for fname in filenames:
191
+ if op.splitext(fname)[1] in ('.pyc', '.pyo', '.so', '.dll'):
192
+ continue
193
+ # Get filename
194
+ filename = op.join(dirpath, fname)
195
+ relfilename = op.relpath(filename, import_dir)
196
+ # Open and check
197
+ try:
198
+ with open(filename, 'rb') as fid:
199
+ text = fid.read().decode('utf-8')
200
+ except UnicodeDecodeError:
201
+ continue # Probably a binary file
202
+ crcount = text.count('\r')
203
+ if crcount:
204
+ lfcount = text.count('\n')
205
+ report.append('In %s found %i/%i CR/LF' %
206
+ (relfilename, crcount, lfcount))
207
+
208
+ # Process result
209
+ if len(report) > 0:
210
+ raise RuntimeError('Found %s files with incorrect endings:\n%s'
211
+ % (len(report), '\n'.join(report)))
212
+
213
+
214
+ _script = """
215
+ import sys
216
+ import time
217
+ import warnings
218
+ import os
219
+ try:
220
+ import faulthandler
221
+ faulthandler.enable()
222
+ except Exception:
223
+ pass
224
+ from vispy.util.gallery_scraper import get_canvaslike_from_globals, FrameGrabber
225
+ os.environ['VISPY_IGNORE_OLD_VERSION'] = 'true'
226
+ os.environ['_VISPY_RUNNING_GALLERY_EXAMPLES'] = 'true'
227
+ import {0}
228
+
229
+ canvas_or_widget = get_canvaslike_from_globals({0}.__dict__)
230
+ if canvas_or_widget is None:
231
+ raise RuntimeError('Bad example formatting: fix or add `# vispy: testskip`'
232
+ ' to the top of the file.')
233
+
234
+ frame_grabber = FrameGrabber(canvas_or_widget, [1, 2, 3, 4, 5])
235
+ frame_grabber.collect_frames()
236
+ """
237
+
238
+ bad_examples = []
239
+ if IS_TRAVIS_CI and sys.platform == 'darwin':
240
+ # example scripts that contain non-ascii text
241
+ # seem to fail on Travis OSX
242
+ bad_examples = [
243
+ 'examples/basics/plotting/colorbar.py',
244
+ 'examples/basics/plotting/plot.py',
245
+ 'examples/demo/gloo/high_frequency.py',
246
+ 'examples/basics/scene/shared_context.py',
247
+ ]
248
+ elif IS_CI and 'linux' in sys.platform:
249
+ # example scripts that contain non-ascii text
250
+ # seem to fail on Travis OSX
251
+ bad_examples = [
252
+ 'examples/basics/scene/shared_context.py',
253
+ ]
254
+ if IS_CI:
255
+ # OpenGL >2.0 that fail on Travis
256
+ bad_examples += [
257
+ 'examples/basics/gloo/geometry_shader.py',
258
+ 'examples/gloo/geometry_shader.py',
259
+ ]
260
+
261
+
262
+ def _skip_example(fname):
263
+ for bad_ex in bad_examples:
264
+ if fname.endswith(bad_ex):
265
+ return True
266
+ return False
267
+
268
+
269
+ def _examples(fnames_str):
270
+ """Run examples and make sure they work.
271
+
272
+ Parameters
273
+ ----------
274
+ fnames_str : str
275
+ Can be a space-separated list of paths to test, or an empty string to
276
+ auto-detect and run all examples.
277
+ """
278
+ import_dir, dev = _get_import_dir()
279
+ reason = None
280
+ if not dev:
281
+ reason = 'Cannot test examples unless in vispy git directory'
282
+ else:
283
+ with use_log_level('warning', print_msg=False):
284
+ good, backend = has_application(capable=('multi_window',))
285
+ if not good:
286
+ reason = 'Must have suitable app backend'
287
+ if reason is not None:
288
+ raise VispySkipSuite('Skipping example test: %s' % reason)
289
+
290
+ # if we're given individual file paths as a string in fnames_str,
291
+ # then just use them as the fnames
292
+ # otherwise, use the full example paths that have been
293
+ # passed to us
294
+ if fnames_str:
295
+ examples_dir = ''
296
+ fnames = fnames_str.split(' ')
297
+
298
+ else:
299
+ examples_dir = op.join(import_dir, '..', 'examples')
300
+ fnames = [op.join(d[0], fname)
301
+ for d in os.walk(examples_dir)
302
+ for fname in d[2] if fname.endswith('.py')]
303
+
304
+ fnames = sorted(fnames, key=lambda x: x.lower())
305
+ print(_line_sep + '\nRunning examples using %s backend' % (backend,))
306
+ op.join('tutorial', 'app', 'shared_context.py'), # non-standard
307
+
308
+ fails = []
309
+ n_ran = n_skipped = 0
310
+ t0 = time()
311
+ for fi, fname in enumerate(fnames):
312
+ n_ran += 1
313
+ root_name = fname[-len(fname) + len(examples_dir):]
314
+ good = True
315
+ with open(fname, 'rb') as fid:
316
+ for _ in range(10): # just check the first 10 lines
317
+ line = fid.readline().decode('utf-8')
318
+ if line == '':
319
+ break
320
+ elif line.startswith('# vispy: ') and 'testskip' in line:
321
+ good = False
322
+ break
323
+ if _skip_example(fname):
324
+ print("Skipping example that fails on Travis CI: {}".format(fname))
325
+ good = False
326
+ if not good:
327
+ n_ran -= 1
328
+ n_skipped += 1
329
+ continue
330
+ line_str = ('[%3d/%3d] %s' % (fi + 1, len(fnames), root_name))
331
+ print(line_str.ljust(len(_line_sep) - 1), end='')
332
+ sys.stdout.flush()
333
+ cwd = op.dirname(fname)
334
+ cmd = [sys.executable, '-c', _script.format(op.split(fname)[1][:-3])]
335
+ sys.stdout.flush()
336
+ stdout, stderr, retcode = run_subprocess(cmd, return_code=True,
337
+ cwd=cwd, env=os.environ)
338
+ if retcode or len(stderr.strip()) > 0:
339
+ # Skipping due to missing dependency is okay
340
+ if "ImportError: " in stderr:
341
+ print('S')
342
+ else:
343
+ ext = '\n' + _line_sep + '\n'
344
+ fails.append('X%sExample %s failed (%s):%s%s%s'
345
+ % (ext, root_name, retcode, ext, stderr, ext))
346
+ print(fails[-1])
347
+ else:
348
+ print('✓')
349
+ sys.stdout.flush()
350
+ print('')
351
+ t = (': %s failed, %s succeeded, %s skipped in %s seconds'
352
+ % (len(fails), n_ran - len(fails), n_skipped, round(time() - t0)))
353
+ if len(fails) > 0:
354
+ raise RuntimeError('Failed%s' % t)
355
+ print('Success%s' % t)
356
+
357
+
358
+ @nottest
359
+ def test(label='full', extra_arg_string='', coverage=False):
360
+ """Test vispy software
361
+
362
+ Parameters
363
+ ----------
364
+ label : str
365
+ Can be one of 'full', 'unit', 'nobackend', 'extra', 'lineendings',
366
+ 'flake', 'docs', or any backend name (e.g., 'qt').
367
+ extra_arg_string : str | list of str
368
+ Extra arguments to sent to ``pytest``.
369
+ Can also be a list of str to more explicitly provide the
370
+ arguments.
371
+ coverage : bool
372
+ If True, collect coverage data.
373
+ """
374
+ if label == 'osmesa':
375
+ # Special case for OSMesa, we have to modify the VISPY_GL_LIB envvar
376
+ # before the vispy.gloo package gets imported
377
+ from ..util.osmesa_gl import fix_osmesa_gl_lib
378
+ fix_osmesa_gl_lib()
379
+
380
+ from ..app.backends import BACKEND_NAMES as backend_names
381
+ label = label.lower()
382
+ label = 'pytest' if label == 'nose' else label
383
+ known_types = ['full', 'unit', 'lineendings', 'extra', 'flake',
384
+ 'docs', 'nobackend', 'examples']
385
+
386
+ if label not in known_types + backend_names:
387
+ raise ValueError('label must be one of %s, or a backend name %s, '
388
+ 'not \'%s\'' % (known_types, backend_names, label))
389
+ # remove troublesome backends
390
+ # see https://github.com/vispy/vispy/issues/2009
391
+ backend_names.remove('tkinter')
392
+
393
+ # figure out what we actually need to run
394
+ runs = []
395
+ if label in ('full', 'unit'):
396
+ for backend in backend_names:
397
+ runs.append([partial(_unit, backend, extra_arg_string, coverage),
398
+ backend])
399
+ elif label in backend_names:
400
+ runs.append([partial(_unit, label, extra_arg_string, coverage), label])
401
+
402
+ if label in ('full', 'unit', 'nobackend'):
403
+ runs.append([partial(_unit, 'nobackend', extra_arg_string, coverage),
404
+ 'nobackend'])
405
+
406
+ if label == "examples":
407
+ # take the extra arguments so that specific examples can be run
408
+ runs.append([partial(_examples, extra_arg_string),
409
+ 'examples'])
410
+ elif label == 'full':
411
+ # run all the examples
412
+ runs.append([partial(_examples, ""), 'examples'])
413
+
414
+ if label in ('full', 'extra', 'lineendings'):
415
+ runs.append([_check_line_endings, 'lineendings'])
416
+ if label in ('full', 'extra', 'flake'):
417
+ runs.append([_flake, 'flake'])
418
+ if label in ('extra', 'docs'):
419
+ runs.append([_docs, 'docs'])
420
+
421
+ t0 = time()
422
+ fail = []
423
+ skip = []
424
+ for run in runs:
425
+ try:
426
+ run[0]()
427
+ except RuntimeError as exp:
428
+ print('Failed: %s' % str(exp))
429
+ fail += [run[1]]
430
+ except VispySkipSuite:
431
+ skip += [run[1]]
432
+ except Exception as exp:
433
+ # this should only happen if we've screwed up the test setup
434
+ fail += [run[1]]
435
+ print('Failed strangely (%s): %s\n' % (type(exp), str(exp)))
436
+ import traceback
437
+ type_, value, tb = sys.exc_info()
438
+ traceback.print_exception(type_, value, tb)
439
+ else:
440
+ print('Passed\n')
441
+ sys.stdout.flush()
442
+ dt = time() - t0
443
+ stat = '%s failed, %s skipped' % (fail if fail else 0, skip if skip else 0)
444
+ extra = 'failed' if fail else 'succeeded'
445
+ print('Testing %s (%s) in %0.3f seconds' % (extra, stat, dt))
446
+ sys.stdout.flush()
447
+ if len(fail) > 0:
448
+ raise RuntimeError('FAILURE')