vispy 0.15.0__cp312-cp312-macosx_10_13_x86_64.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 +1003 -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 +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -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 +1046 -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 +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -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 +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -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-312-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -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 +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
from __future__ import print_function
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
import sys
|
|
11
|
+
import os
|
|
12
|
+
import inspect
|
|
13
|
+
import gc
|
|
14
|
+
import pytest
|
|
15
|
+
import functools
|
|
16
|
+
|
|
17
|
+
from packaging.version import Version
|
|
18
|
+
|
|
19
|
+
from ..util.check_environment import has_backend
|
|
20
|
+
|
|
21
|
+
skipif = pytest.mark.skipif
|
|
22
|
+
|
|
23
|
+
IS_TRAVIS_CI = "true" in os.getenv("TRAVIS", "")
|
|
24
|
+
IS_GITHUB_ACTIONS = "true" in os.getenv("GITHUB_ACTIONS", "")
|
|
25
|
+
IS_CI = IS_TRAVIS_CI or IS_GITHUB_ACTIONS
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def SkipTest(*args, **kwargs):
|
|
29
|
+
"""Backport for raising SkipTest that gives a better traceback."""
|
|
30
|
+
__tracebackhide__ = True
|
|
31
|
+
import pytest
|
|
32
|
+
return pytest.skip(*args, **kwargs)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _safe_rep(obj, short=False):
|
|
36
|
+
"""Helper for assert_* ports"""
|
|
37
|
+
try:
|
|
38
|
+
result = repr(obj)
|
|
39
|
+
except Exception:
|
|
40
|
+
result = object.__repr__(obj)
|
|
41
|
+
if not short or len(result) < 80:
|
|
42
|
+
return result
|
|
43
|
+
return result[:80] + ' [truncated]...'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _safe_str(obj):
|
|
47
|
+
"""Helper for assert_* ports"""
|
|
48
|
+
try:
|
|
49
|
+
return str(obj)
|
|
50
|
+
except Exception:
|
|
51
|
+
return object.__str__(obj)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _format_msg(msg, std_msg):
|
|
55
|
+
"""Helper for assert_* ports"""
|
|
56
|
+
if msg is None:
|
|
57
|
+
msg = std_msg
|
|
58
|
+
else:
|
|
59
|
+
try:
|
|
60
|
+
msg = '%s : %s' % (std_msg, msg)
|
|
61
|
+
except UnicodeDecodeError:
|
|
62
|
+
msg = '%s : %s' % (_safe_str(std_msg), _safe_str(msg))
|
|
63
|
+
return msg
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def nottest(func):
|
|
67
|
+
"""Decorator to mark a function or method as *not* a test"""
|
|
68
|
+
func.__test__ = False
|
|
69
|
+
return func
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def assert_raises(exp, func, *args, **kwargs):
|
|
73
|
+
"""Backport"""
|
|
74
|
+
try:
|
|
75
|
+
func(*args, **kwargs)
|
|
76
|
+
except exp:
|
|
77
|
+
return
|
|
78
|
+
std_msg = '%s not raised' % (_safe_rep(exp))
|
|
79
|
+
raise AssertionError(_format_msg(None, std_msg))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def assert_in(member, container, msg=None):
|
|
83
|
+
"""Backport"""
|
|
84
|
+
if member in container:
|
|
85
|
+
return
|
|
86
|
+
std_msg = '%s not found in %s' % (_safe_rep(member), _safe_rep(container))
|
|
87
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def assert_true(x, msg=None):
|
|
91
|
+
"""Backport"""
|
|
92
|
+
if x:
|
|
93
|
+
return
|
|
94
|
+
std_msg = '%s is not True' % (_safe_rep(x),)
|
|
95
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def assert_equal(x, y, msg=None):
|
|
99
|
+
"""Backport"""
|
|
100
|
+
if x == y:
|
|
101
|
+
return
|
|
102
|
+
std_msg = '%s not equal to %s' % (_safe_rep(x), _safe_rep(y))
|
|
103
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def assert_not_equal(x, y, msg=None):
|
|
107
|
+
"""Backport"""
|
|
108
|
+
if x != y:
|
|
109
|
+
return
|
|
110
|
+
std_msg = '%s equal to %s' % (_safe_rep(x), _safe_rep(y))
|
|
111
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def assert_not_in(member, container, msg=None):
|
|
115
|
+
"""Backport"""
|
|
116
|
+
if member not in container:
|
|
117
|
+
return
|
|
118
|
+
std_msg = '%s found in %s' % (_safe_rep(member), _safe_rep(container))
|
|
119
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def assert_is(expr1, expr2, msg=None):
|
|
123
|
+
"""Backport"""
|
|
124
|
+
if expr1 is not expr2:
|
|
125
|
+
std_msg = '%s is not %s' % (_safe_rep(expr1), _safe_rep(expr2))
|
|
126
|
+
raise AssertionError(_format_msg(msg, std_msg))
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class raises(object):
|
|
130
|
+
"""Helper class to test exception raising"""
|
|
131
|
+
|
|
132
|
+
def __init__(self, exc):
|
|
133
|
+
self.exc = exc
|
|
134
|
+
|
|
135
|
+
def __enter__(self):
|
|
136
|
+
return self
|
|
137
|
+
|
|
138
|
+
def __exit__(self, exc_typ, exc, tb):
|
|
139
|
+
if isinstance(exc, self.exc):
|
|
140
|
+
return True
|
|
141
|
+
elif exc is None:
|
|
142
|
+
raise AssertionError("Expected %s (no exception raised)" %
|
|
143
|
+
self.exc.__name__)
|
|
144
|
+
else:
|
|
145
|
+
raise AssertionError("Expected %s, got %s instead (%s)" %
|
|
146
|
+
(self.exc.__name__, type(exc).__name__, exc))
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
###############################################################################
|
|
150
|
+
# GL stuff
|
|
151
|
+
|
|
152
|
+
def has_pyopengl():
|
|
153
|
+
try:
|
|
154
|
+
from OpenGL import GL # noqa, analysis:ignore
|
|
155
|
+
except ImportError:
|
|
156
|
+
return False
|
|
157
|
+
else:
|
|
158
|
+
return True
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def requires_pyopengl():
|
|
162
|
+
skip = not has_pyopengl()
|
|
163
|
+
return skipif(skip, reason='Requires PyOpenGL')
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def requires_ssl():
|
|
167
|
+
bad = os.getenv('CIBW_BUILDING', 'false') == 'true'
|
|
168
|
+
return skipif(bad, reason='Requires proper SSL support')
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
###############################################################################
|
|
172
|
+
# App stuff
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def has_application(backend=None, has=(), capable=()):
|
|
176
|
+
"""Determine if a suitable app backend exists"""
|
|
177
|
+
from ..app.backends import BACKEND_NAMES
|
|
178
|
+
# avoid importing other backends if we don't need to
|
|
179
|
+
if backend is None:
|
|
180
|
+
for backend in BACKEND_NAMES:
|
|
181
|
+
if has_backend(backend, has=has, capable=capable):
|
|
182
|
+
good = True
|
|
183
|
+
msg = backend
|
|
184
|
+
break
|
|
185
|
+
else:
|
|
186
|
+
good = False
|
|
187
|
+
msg = 'Requires application backend'
|
|
188
|
+
else:
|
|
189
|
+
good, why = has_backend(backend, has=has, capable=capable,
|
|
190
|
+
out=['why_not'])
|
|
191
|
+
if not good:
|
|
192
|
+
msg = 'Requires %s: %s' % (backend, why)
|
|
193
|
+
else:
|
|
194
|
+
msg = backend
|
|
195
|
+
return good, msg
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def composed(*decs):
|
|
199
|
+
def deco(f):
|
|
200
|
+
for dec in reversed(decs):
|
|
201
|
+
f = dec(f)
|
|
202
|
+
return f
|
|
203
|
+
return deco
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def garbage_collect(f):
|
|
207
|
+
# Pytest expects things like the name of the functions not to change
|
|
208
|
+
# Therefore, we must use the functools.wraps decorator on our deco
|
|
209
|
+
@functools.wraps(f)
|
|
210
|
+
def deco(*args, **kwargs):
|
|
211
|
+
gc.collect()
|
|
212
|
+
try:
|
|
213
|
+
return f(*args, **kwargs)
|
|
214
|
+
finally:
|
|
215
|
+
gc.collect()
|
|
216
|
+
return deco
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def requires_application(backend=None, has=(), capable=(), force_gc=True):
|
|
220
|
+
"""Return a decorator for tests that require an application"""
|
|
221
|
+
good, msg = has_application(backend, has, capable)
|
|
222
|
+
dec_backend = skipif(not good, reason="Skipping test: %s" % msg)
|
|
223
|
+
try:
|
|
224
|
+
import pytest
|
|
225
|
+
except Exception:
|
|
226
|
+
return dec_backend
|
|
227
|
+
dec_app = pytest.mark.vispy_app_test
|
|
228
|
+
funcs = [dec_app, dec_backend]
|
|
229
|
+
if force_gc:
|
|
230
|
+
funcs.append(garbage_collect)
|
|
231
|
+
return composed(*funcs)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def requires_img_lib():
|
|
235
|
+
"""Decorator for tests that require an image library"""
|
|
236
|
+
from ..io import _check_img_lib
|
|
237
|
+
if sys.platform.startswith('win'):
|
|
238
|
+
has_img_lib = False # PIL breaks tests on windows (!)
|
|
239
|
+
else:
|
|
240
|
+
has_img_lib = not all(c is None for c in _check_img_lib())
|
|
241
|
+
return skipif(not has_img_lib, reason='imageio or PIL required')
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def has_ipython(version='3.0'):
|
|
245
|
+
"""Function that checks the presence of IPython"""
|
|
246
|
+
# typecast version to a string, in case an integer is given
|
|
247
|
+
version = str(version)
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
import IPython # noqa
|
|
251
|
+
except Exception:
|
|
252
|
+
return False, "IPython library not found"
|
|
253
|
+
else:
|
|
254
|
+
if Version(IPython.__version__) >= Version(version):
|
|
255
|
+
return True, "IPython present"
|
|
256
|
+
else:
|
|
257
|
+
message = (
|
|
258
|
+
"current IPython version: (%s) is "
|
|
259
|
+
"older than expected version: (%s)") % \
|
|
260
|
+
(IPython.__version__, version)
|
|
261
|
+
|
|
262
|
+
return False, message
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def requires_ipython(version='3.0'):
|
|
266
|
+
ipython_present, message = has_ipython(version)
|
|
267
|
+
return skipif(not ipython_present, reason=message)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def requires_numpydoc():
|
|
271
|
+
try:
|
|
272
|
+
import numpydoc # noqa
|
|
273
|
+
except Exception:
|
|
274
|
+
present = False
|
|
275
|
+
else:
|
|
276
|
+
present = True
|
|
277
|
+
return skipif(not present, reason='numpydoc is required')
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
###############################################################################
|
|
281
|
+
# Visuals stuff
|
|
282
|
+
|
|
283
|
+
def _has_scipy(min_version):
|
|
284
|
+
try:
|
|
285
|
+
assert isinstance(min_version, str)
|
|
286
|
+
import scipy # noqa, analysis:ignore
|
|
287
|
+
this_version = Version(scipy.__version__)
|
|
288
|
+
if this_version < min_version:
|
|
289
|
+
return False
|
|
290
|
+
except Exception:
|
|
291
|
+
return False
|
|
292
|
+
else:
|
|
293
|
+
return True
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def requires_scipy(min_version='0.13'):
|
|
297
|
+
return skipif(not _has_scipy(min_version),
|
|
298
|
+
reason='Requires Scipy version >= %s' % min_version)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def _bad_glfw_decorate(app):
|
|
302
|
+
return app.backend_name == 'Glfw' and \
|
|
303
|
+
app.backend_module.glfw.__version__ == (3, 3, 1)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
@nottest
|
|
307
|
+
def TestingCanvas(bgcolor='black', size=(100, 100), dpi=None, decorate=None,
|
|
308
|
+
**kwargs):
|
|
309
|
+
"""Avoid importing scene until necessary."""
|
|
310
|
+
# On Windows decorations can force windows to be an incorrect size
|
|
311
|
+
# (e.g., instead of 100x100 they will be 100x248), having no
|
|
312
|
+
# decorations works around this
|
|
313
|
+
from ..scene import SceneCanvas
|
|
314
|
+
|
|
315
|
+
class TestingCanvas(SceneCanvas):
|
|
316
|
+
def __init__(self, bgcolor, size, dpi, decorate, **kwargs):
|
|
317
|
+
self._entered = False
|
|
318
|
+
self._wanted_vp = None
|
|
319
|
+
if decorate is None:
|
|
320
|
+
# deal with GLFW's problems
|
|
321
|
+
from vispy.app import use_app
|
|
322
|
+
app = use_app()
|
|
323
|
+
if _bad_glfw_decorate(app):
|
|
324
|
+
decorate = True
|
|
325
|
+
else:
|
|
326
|
+
decorate = False
|
|
327
|
+
SceneCanvas.__init__(self, bgcolor=bgcolor, size=size,
|
|
328
|
+
dpi=dpi, decorate=decorate,
|
|
329
|
+
**kwargs)
|
|
330
|
+
|
|
331
|
+
def __enter__(self):
|
|
332
|
+
SceneCanvas.__enter__(self)
|
|
333
|
+
# sometimes our window can be larger than our requsted draw
|
|
334
|
+
# area (e.g. on Windows), and this messes up our tests that
|
|
335
|
+
# typically use very small windows. Here we "fix" it.
|
|
336
|
+
scale = np.array(self.physical_size) / np.array(self.size, float)
|
|
337
|
+
scale = int(np.round(np.mean(scale)))
|
|
338
|
+
self._wanted_vp = 0, 0, size[0] * scale, size[1] * scale
|
|
339
|
+
self.context.set_state(clear_color=self._bgcolor)
|
|
340
|
+
self.context.set_viewport(*self._wanted_vp)
|
|
341
|
+
self._entered = True
|
|
342
|
+
return self
|
|
343
|
+
|
|
344
|
+
def draw_visual(self, visual, event=None):
|
|
345
|
+
if not self._entered:
|
|
346
|
+
return
|
|
347
|
+
SceneCanvas.draw_visual(self, visual, event)
|
|
348
|
+
self.context.finish()
|
|
349
|
+
|
|
350
|
+
return TestingCanvas(bgcolor, size, dpi, decorate, **kwargs)
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
@nottest
|
|
354
|
+
def save_testing_image(image, location):
|
|
355
|
+
from ..gloo.util import _screenshot
|
|
356
|
+
from ..util import make_png
|
|
357
|
+
if image == "screenshot":
|
|
358
|
+
image = _screenshot(alpha=False)
|
|
359
|
+
with open(location + '.png', 'wb') as fid:
|
|
360
|
+
fid.write(make_png(image))
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
@nottest
|
|
364
|
+
def run_tests_if_main():
|
|
365
|
+
"""Run tests in a given file if it is run as a script"""
|
|
366
|
+
local_vars = inspect.currentframe().f_back.f_locals
|
|
367
|
+
if not local_vars.get('__name__', '') == '__main__':
|
|
368
|
+
return
|
|
369
|
+
# we are in a "__main__"
|
|
370
|
+
fname = local_vars['__file__']
|
|
371
|
+
# Run ourselves. post-mortem debugging!
|
|
372
|
+
try:
|
|
373
|
+
import faulthandler
|
|
374
|
+
faulthandler.enable()
|
|
375
|
+
except Exception:
|
|
376
|
+
pass
|
|
377
|
+
import __main__
|
|
378
|
+
try:
|
|
379
|
+
import pytest
|
|
380
|
+
pytest.main(['-s', '--tb=short', fname])
|
|
381
|
+
except ImportError:
|
|
382
|
+
print('==== Running tests in script\n==== %s' % fname)
|
|
383
|
+
run_tests_in_object(__main__)
|
|
384
|
+
print('==== Tests pass')
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def run_tests_in_object(ob):
|
|
388
|
+
# Setup
|
|
389
|
+
for name in dir(ob):
|
|
390
|
+
if name.lower().startswith('setup'):
|
|
391
|
+
print('Calling %s' % name)
|
|
392
|
+
getattr(ob, name)()
|
|
393
|
+
# Exec
|
|
394
|
+
for name in sorted(dir(ob), key=lambda x: x.lower()): # consistent order
|
|
395
|
+
val = getattr(ob, name)
|
|
396
|
+
if name.startswith('_'):
|
|
397
|
+
continue
|
|
398
|
+
elif callable(val) and (name[:4] == 'test' or name[-4:] == 'test'):
|
|
399
|
+
print('Running test-func %s ... ' % name, end='')
|
|
400
|
+
try:
|
|
401
|
+
val()
|
|
402
|
+
print('ok')
|
|
403
|
+
except Exception as err:
|
|
404
|
+
if 'skiptest' in err.__class__.__name__.lower():
|
|
405
|
+
print('skip')
|
|
406
|
+
else:
|
|
407
|
+
raise
|
|
408
|
+
elif isinstance(val, type) and 'Test' in name:
|
|
409
|
+
print('== Running test-class %s' % name)
|
|
410
|
+
run_tests_in_object(val())
|
|
411
|
+
print('== Done with test-class %s' % name)
|
|
412
|
+
# Teardown
|
|
413
|
+
for name in dir(ob):
|
|
414
|
+
if name.lower().startswith('teardown'):
|
|
415
|
+
print('Calling %s' % name)
|
|
416
|
+
getattr(ob, name)()
|