vispy 0.14.0__cp311-cp311-macosx_11_0_arm64.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.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +968 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +134 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +698 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +506 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1045 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +173 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +17 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +163 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +796 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +810 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-311-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +5 -0
- 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')
|