vispy 0.14.0__cp312-cp312-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 (519) 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 +968 -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 +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -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 +134 -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 +698 -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 +506 -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 +566 -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 +1816 -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 +1045 -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 +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -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 +173 -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 +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -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 +17 -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 +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -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 +163 -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 +796 -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 +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -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 +810 -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_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.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,446 @@
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
+ main()
168
+ except SystemExit as ex:
169
+ if ex.code in (None, 0):
170
+ pass # do not exit yet, we want to print a success msg
171
+ else:
172
+ raise RuntimeError('flake8 failed')
173
+ finally:
174
+ os.chdir(orig_dir)
175
+
176
+
177
+ def _check_line_endings():
178
+ """Check all files in the repository for CR characters"""
179
+ if sys.platform == 'win32':
180
+ print('Skipping line endings check on Windows')
181
+ sys.stdout.flush()
182
+ return
183
+ print('Running line endings check... ')
184
+ sys.stdout.flush()
185
+ report = []
186
+ import_dir, dev = _get_import_dir()
187
+ for dirpath, dirnames, filenames in os.walk(import_dir):
188
+ for fname in filenames:
189
+ if op.splitext(fname)[1] in ('.pyc', '.pyo', '.so', '.dll'):
190
+ continue
191
+ # Get filename
192
+ filename = op.join(dirpath, fname)
193
+ relfilename = op.relpath(filename, import_dir)
194
+ # Open and check
195
+ try:
196
+ with open(filename, 'rb') as fid:
197
+ text = fid.read().decode('utf-8')
198
+ except UnicodeDecodeError:
199
+ continue # Probably a binary file
200
+ crcount = text.count('\r')
201
+ if crcount:
202
+ lfcount = text.count('\n')
203
+ report.append('In %s found %i/%i CR/LF' %
204
+ (relfilename, crcount, lfcount))
205
+
206
+ # Process result
207
+ if len(report) > 0:
208
+ raise RuntimeError('Found %s files with incorrect endings:\n%s'
209
+ % (len(report), '\n'.join(report)))
210
+
211
+
212
+ _script = """
213
+ import sys
214
+ import time
215
+ import warnings
216
+ import os
217
+ try:
218
+ import faulthandler
219
+ faulthandler.enable()
220
+ except Exception:
221
+ pass
222
+ from vispy.util.gallery_scraper import get_canvaslike_from_globals, FrameGrabber
223
+ os.environ['VISPY_IGNORE_OLD_VERSION'] = 'true'
224
+ os.environ['_VISPY_RUNNING_GALLERY_EXAMPLES'] = 'true'
225
+ import {0}
226
+
227
+ canvas_or_widget = get_canvaslike_from_globals({0}.__dict__)
228
+ if canvas_or_widget is None:
229
+ raise RuntimeError('Bad example formatting: fix or add `# vispy: testskip`'
230
+ ' to the top of the file.')
231
+
232
+ frame_grabber = FrameGrabber(canvas_or_widget, [1, 2, 3, 4, 5])
233
+ frame_grabber.collect_frames()
234
+ """
235
+
236
+ bad_examples = []
237
+ if IS_TRAVIS_CI and sys.platform == 'darwin':
238
+ # example scripts that contain non-ascii text
239
+ # seem to fail on Travis OSX
240
+ bad_examples = [
241
+ 'examples/basics/plotting/colorbar.py',
242
+ 'examples/basics/plotting/plot.py',
243
+ 'examples/demo/gloo/high_frequency.py',
244
+ 'examples/basics/scene/shared_context.py',
245
+ ]
246
+ elif IS_CI and 'linux' in sys.platform:
247
+ # example scripts that contain non-ascii text
248
+ # seem to fail on Travis OSX
249
+ bad_examples = [
250
+ 'examples/basics/scene/shared_context.py',
251
+ ]
252
+ if IS_CI:
253
+ # OpenGL >2.0 that fail on Travis
254
+ bad_examples += [
255
+ 'examples/basics/gloo/geometry_shader.py',
256
+ 'examples/gloo/geometry_shader.py',
257
+ ]
258
+
259
+
260
+ def _skip_example(fname):
261
+ for bad_ex in bad_examples:
262
+ if fname.endswith(bad_ex):
263
+ return True
264
+ return False
265
+
266
+
267
+ def _examples(fnames_str):
268
+ """Run examples and make sure they work.
269
+
270
+ Parameters
271
+ ----------
272
+ fnames_str : str
273
+ Can be a space-separated list of paths to test, or an empty string to
274
+ auto-detect and run all examples.
275
+ """
276
+ import_dir, dev = _get_import_dir()
277
+ reason = None
278
+ if not dev:
279
+ reason = 'Cannot test examples unless in vispy git directory'
280
+ else:
281
+ with use_log_level('warning', print_msg=False):
282
+ good, backend = has_application(capable=('multi_window',))
283
+ if not good:
284
+ reason = 'Must have suitable app backend'
285
+ if reason is not None:
286
+ raise VispySkipSuite('Skipping example test: %s' % reason)
287
+
288
+ # if we're given individual file paths as a string in fnames_str,
289
+ # then just use them as the fnames
290
+ # otherwise, use the full example paths that have been
291
+ # passed to us
292
+ if fnames_str:
293
+ examples_dir = ''
294
+ fnames = fnames_str.split(' ')
295
+
296
+ else:
297
+ examples_dir = op.join(import_dir, '..', 'examples')
298
+ fnames = [op.join(d[0], fname)
299
+ for d in os.walk(examples_dir)
300
+ for fname in d[2] if fname.endswith('.py')]
301
+
302
+ fnames = sorted(fnames, key=lambda x: x.lower())
303
+ print(_line_sep + '\nRunning examples using %s backend' % (backend,))
304
+ op.join('tutorial', 'app', 'shared_context.py'), # non-standard
305
+
306
+ fails = []
307
+ n_ran = n_skipped = 0
308
+ t0 = time()
309
+ for fi, fname in enumerate(fnames):
310
+ n_ran += 1
311
+ root_name = fname[-len(fname) + len(examples_dir):]
312
+ good = True
313
+ with open(fname, 'rb') as fid:
314
+ for _ in range(10): # just check the first 10 lines
315
+ line = fid.readline().decode('utf-8')
316
+ if line == '':
317
+ break
318
+ elif line.startswith('# vispy: ') and 'testskip' in line:
319
+ good = False
320
+ break
321
+ if _skip_example(fname):
322
+ print("Skipping example that fails on Travis CI: {}".format(fname))
323
+ good = False
324
+ if not good:
325
+ n_ran -= 1
326
+ n_skipped += 1
327
+ continue
328
+ line_str = ('[%3d/%3d] %s' % (fi + 1, len(fnames), root_name))
329
+ print(line_str.ljust(len(_line_sep) - 1), end='')
330
+ sys.stdout.flush()
331
+ cwd = op.dirname(fname)
332
+ cmd = [sys.executable, '-c', _script.format(op.split(fname)[1][:-3])]
333
+ sys.stdout.flush()
334
+ stdout, stderr, retcode = run_subprocess(cmd, return_code=True,
335
+ cwd=cwd, env=os.environ)
336
+ if retcode or len(stderr.strip()) > 0:
337
+ # Skipping due to missing dependency is okay
338
+ if "ImportError: " in stderr:
339
+ print('S')
340
+ else:
341
+ ext = '\n' + _line_sep + '\n'
342
+ fails.append('X%sExample %s failed (%s):%s%s%s'
343
+ % (ext, root_name, retcode, ext, stderr, ext))
344
+ print(fails[-1])
345
+ else:
346
+ print('✓')
347
+ sys.stdout.flush()
348
+ print('')
349
+ t = (': %s failed, %s succeeded, %s skipped in %s seconds'
350
+ % (len(fails), n_ran - len(fails), n_skipped, round(time() - t0)))
351
+ if len(fails) > 0:
352
+ raise RuntimeError('Failed%s' % t)
353
+ print('Success%s' % t)
354
+
355
+
356
+ @nottest
357
+ def test(label='full', extra_arg_string='', coverage=False):
358
+ """Test vispy software
359
+
360
+ Parameters
361
+ ----------
362
+ label : str
363
+ Can be one of 'full', 'unit', 'nobackend', 'extra', 'lineendings',
364
+ 'flake', 'docs', or any backend name (e.g., 'qt').
365
+ extra_arg_string : str | list of str
366
+ Extra arguments to sent to ``pytest``.
367
+ Can also be a list of str to more explicitly provide the
368
+ arguments.
369
+ coverage : bool
370
+ If True, collect coverage data.
371
+ """
372
+ if label == 'osmesa':
373
+ # Special case for OSMesa, we have to modify the VISPY_GL_LIB envvar
374
+ # before the vispy.gloo package gets imported
375
+ from ..util.osmesa_gl import fix_osmesa_gl_lib
376
+ fix_osmesa_gl_lib()
377
+
378
+ from ..app.backends import BACKEND_NAMES as backend_names
379
+ label = label.lower()
380
+ label = 'pytest' if label == 'nose' else label
381
+ known_types = ['full', 'unit', 'lineendings', 'extra', 'flake',
382
+ 'docs', 'nobackend', 'examples']
383
+
384
+ if label not in known_types + backend_names:
385
+ raise ValueError('label must be one of %s, or a backend name %s, '
386
+ 'not \'%s\'' % (known_types, backend_names, label))
387
+ # remove troublesome backends
388
+ # see https://github.com/vispy/vispy/issues/2009
389
+ backend_names.remove('tkinter')
390
+
391
+ # figure out what we actually need to run
392
+ runs = []
393
+ if label in ('full', 'unit'):
394
+ for backend in backend_names:
395
+ runs.append([partial(_unit, backend, extra_arg_string, coverage),
396
+ backend])
397
+ elif label in backend_names:
398
+ runs.append([partial(_unit, label, extra_arg_string, coverage), label])
399
+
400
+ if label in ('full', 'unit', 'nobackend'):
401
+ runs.append([partial(_unit, 'nobackend', extra_arg_string, coverage),
402
+ 'nobackend'])
403
+
404
+ if label == "examples":
405
+ # take the extra arguments so that specific examples can be run
406
+ runs.append([partial(_examples, extra_arg_string),
407
+ 'examples'])
408
+ elif label == 'full':
409
+ # run all the examples
410
+ runs.append([partial(_examples, ""), 'examples'])
411
+
412
+ if label in ('full', 'extra', 'lineendings'):
413
+ runs.append([_check_line_endings, 'lineendings'])
414
+ if label in ('full', 'extra', 'flake'):
415
+ runs.append([_flake, 'flake'])
416
+ if label in ('extra', 'docs'):
417
+ runs.append([_docs, 'docs'])
418
+
419
+ t0 = time()
420
+ fail = []
421
+ skip = []
422
+ for run in runs:
423
+ try:
424
+ run[0]()
425
+ except RuntimeError as exp:
426
+ print('Failed: %s' % str(exp))
427
+ fail += [run[1]]
428
+ except VispySkipSuite:
429
+ skip += [run[1]]
430
+ except Exception as exp:
431
+ # this should only happen if we've screwed up the test setup
432
+ fail += [run[1]]
433
+ print('Failed strangely (%s): %s\n' % (type(exp), str(exp)))
434
+ import traceback
435
+ type_, value, tb = sys.exc_info()
436
+ traceback.print_exception(type_, value, tb)
437
+ else:
438
+ print('Passed\n')
439
+ sys.stdout.flush()
440
+ dt = time() - t0
441
+ stat = '%s failed, %s skipped' % (fail if fail else 0, skip if skip else 0)
442
+ extra = 'failed' if fail else 'succeeded'
443
+ print('Testing %s (%s) in %0.3f seconds' % (extra, stat, dt))
444
+ sys.stdout.flush()
445
+ if len(fail) > 0:
446
+ raise RuntimeError('FAILURE')