Skip to main content

pyraymesh

Description

pyraymesh is a Python library for performing ray intersection and occlusion tests on 3D meshes using a Bounding Volume Hierarchy (BVH). The library uses the C++ library bvh for building the BVH and performing the intersection tests.

While this library is reasonably fast for simpler meshes (benchmarks coming soon), it is not as fast as Embree, espcially for larger and more complex meshes. However, it does not have any dependencies on external libraries, and is thus easier to install and use.

Installation

Install the package either by

pip install pyraymesh

or cloning the repo and using pip:

pip install .

Note that the package requires a C++ compiler to build the C++ extension.

Usage

Building the BVH

To build the BVH for a mesh:

from pyraymesh import Mesh
import numpy as np

vertices = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]])
faces = np.array([[0, 1, 2], [2, 3, 0]])
mesh = Mesh(vertices, faces)
mesh.build("medium")

The build method takes a string argument that specifies the BVH build type, which can be one of the following: "low", "medium" and "high". The build type determines the trade-off between build time and query time. For most cases "medium" is almost always the right choice.

Ray Intersection

To perform ray intersection tests:

ray_origin = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
ray_direction = [[0, 0, -1], [0, 0, 1]]
## or 
ray_origin = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
ray_direction = [0, 0, -1]  # multiple rays with same direction
## or 
ray_origin = [0.1, 0.2, 1]
ray_direction = [[0, 0, -1], [0, 0, 1]]  # multiple rays with same origin

result = mesh.intersect(ray_origin, ray_direction, tnear=0, tfar=1000)
print(result.num_hits)
print(result.coords)
print(result.tri_ids)
print(result.distances)

tnear and tfar can be scalars or lists of the same length as the number of rays. If they are scalars, the same value will be used for all rays. If they are lists, each value will be used for the corresponding ray.

If you set tnear to a value greater than 0, the intersection tests will ignore any intersections that are closer than tnear. Similarly, if you set tfar to a value less than infinity, the intersection tests will ignore any intersections that are farther than tfar. This library does not support negative values for tnear or tfar.

Reflections

If you want to get the reflection of the rays, add the calculate_reflections = True parameter to the intersect method:

ray_origin = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
ray_direction = [[0, 0, -1], [0, 0, 1]]
result = mesh.intersect(ray_origin, ray_direction, tnear=0, tfar=1000, calculate_reflections=True)
print(result.reflections)

results.reflections is a list of noramlized vectors representing the directions of the reflection of the rays. Only do this if you need the reflections, as it will slow down the intersection tests.

Occlusion Test

If you just care about whether a ray is occluded or not (i.e., you don't care about the intersection point) you can use the occlusion method which is faster than the intersect method and just returns an array of booleans.

ray_origin = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
ray_direction = [[0, 0, -1], [0, 0, 1]]
occluded = mesh.occlusion(ray_origin, ray_direction)
print(occluded)

Count intersections

If you want to know the total number of intersections for each ray along its path, without stopping at the first intersection, you can use the count_intersections method:

total_intersections = mesh.count_intersections(ray_origin, ray_direction)
print(total_intersections)

This method returns an array of integers representing the total number of triangles that each ray intersects between tnear and tfar.

Parallelization

The intersect and occlusion methods can be parallelized by passing threads parameter when calling the methods:

result = mesh.intersect(ray_origin, ray_direction, tnear=0, tfar=1000, threads=4)

The threads parameter specifies the number of threads to use for the intersection tests. If set to -1, the number of threads will be equal to the number of cores on the machine. In general you shouldn't set the number of threads to be greater than the number of cores on the machine.

For a small number of rays, the overhead of parallelization might make the parallel version slower than the serial version, so it is recommended to test the performance of both versions for your specific use case.

Ray Direction Utilities

The library includes several utility methods for generating ray directions distributed on a sphere. The sphere_direction_vectors function generates points evenly distributed on a sphere using a Fibonacci spiral pattern, providing excellent uniformity even with small sample counts. For an alternative distribution, hammersley_sphere_direction_vectors implements the low-discrepancy Hammersley sequence. When you need to sample within a specific angle, the cone_direction_vectors function creates rays distributed within a cone of a specified angle around a central direction. For completely random sampling, random_sphere_direction_vectors provides uniformly distributed random directions.

from pyraymesh.ray_functions import (
    sphere_direction_vectors,
    hammersley_sphere_direction_vectors,
    cone_direction_vectors,
    random_sphere_direction_vectors,
)

# Generate 1000 rays distributed on a sphere (using Fibonacci spiral pattern)   
sphere_rays = sphere_direction_vectors(1000) 
# Generate 1000 rays distributed on a sphere (using Hammersley sequence)
hammersley_rays = hammersley_sphere_direction_vectors(1000)
# Generate 1000 rays distributed within a cone of 30 degrees around the z-axis
cone_rays = cone_direction_vectors(1000, [0, 0, 1], 30)
# Generate 1000 uniformly distributed random rays
random_rays = random_sphere_direction_vectors(1000)

Test line-of-sight

If you want to know if two points are visible to each other, you can use the line_of_sight method:

origin_point = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
target_point = [[0, 0, -1], [0, 0, 1]]
## or 
origin_point = [[0.1, 0.2, 1], [0.2, 0.1, 1]]
target_point = [0, 0, -1]  # multiple origin points with same target
## or 
origin_point = [0.1, 0.2, 1]
target_point = [[0, 0, -1], [0, 0, 1]]  # multiple target points with same origin

visible = mesh.line_of_sight(origin_point, target_point)

visible is a list of booleans representing whether the target point is visible from the origin point.

Visibility Matrix

If you want to know the visibility matrix between all pairs of a list of points, you can use the visibility_matrix method: For N points it returns an NxN matrix where the element at (i, j) is True if the j-th point is visible from the i-th point.

points = [[0.1, 0.2, 1], [0.2, 0.1, 1], [0.3, 0.4, 1]]
vis_matrix = mesh.visibility_matrix(points)
# vis_matrix is a 3x3 array of booleans

Traverse the BVH

If you want to traverse the BVH and get all triangles that are along a ray in the BVH, you can use the traverse or traverse_all method. These are useful if you want to do some custom processing on the triangles that are potentially intersected by a ray. The traverse_all method returns a list of triangle IDs of all triangles potentially intersected by the ray. The traverse method returns a generator that you can use to traverse the BVH. If you know you will need all, or most, of the triangles, it is recommended to use traverse_all as it is faster. If you are likely to break early from the loop, you can use traverse fpr better performance and use less memory.

origin = [0, 0, 10]
direction = [0, 0, -1]

for t_id in mesh.traverse(origin, direction):
    print(f"Triangle {mesh.vertices[mesh.faces[t_id]]} is the first triangle in the BVH traversed by the ray.")
    break

all_triangles = mesh.traverse_all(origin, direction)   
for t_id in all_triangles:
    print(f"Triangle {mesh.vertices[mesh.faces[t_id]]} is potentially intersected by the ray.")

Testing

To run the tests:

pytest

License

This project is licensed under the MIT License - see the LICENSE file for details.

Metadata

Release files for pyraymesh 0.2.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pyraymesh 0.2.6
File
pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl PyPy 3.10 PyPy 3.10 7.3 Linux glibc 2.17+ x86-64 Details
pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl PyPy 3.10 PyPy 3.10 7.3 Linux glibc 2.17+ x86-32 Details
pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_i686.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-32 Details
pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-32 Details
pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_i686.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-32 Details
pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-32 Details
pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_i686.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-32 Details
pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-32 Details
pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details
pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_i686.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-32 Details
pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-32 Details

Total release size: 6.3 MB

Release files / pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 142.5 kB
Tags Linux glibc 2.17+ x86-64 PyPy 3.10 PyPy 3.10 7.3
SHA-256 checksum
How to use checksums
b987ae4bdb07a73ae79b48b67313705552026fae7ac3c851104dede9ee3e1430
BLAKE2b-256 checksum
How to use checksums
6961aca7934339bf6bbf3af0a327295c126f48f65a7c7912773227dae134fdfa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL pyraymesh-0.2.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Size 148.3 kB
Tags Linux glibc 2.17+ x86-32 PyPy 3.10 PyPy 3.10 7.3
SHA-256 checksum
How to use checksums
dec3f3e01d386f2e58819899d9746621042c0c85b58e92da0932cda73ed176a1
BLAKE2b-256 checksum
How to use checksums
99c3864a7ef3e93d77e571cc82315fa39aa659226bd352bdfa9df772e2ccbe36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_x86_64.whl
Size 580.8 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
51175d8320471203d88f2cad41a8b2a2f7b17c1ea1ac91e916121b3481cc90f3
BLAKE2b-256 checksum
How to use checksums
275572fdcda0570b67333551029052a2d391a144312ce7457493cd29c70e4f84
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_i686.whl

Download URL pyraymesh-0.2.6-cp313-cp313-musllinux_1_2_i686.whl
Size 627.8 kB
Tags CPython 3.13 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
bee8ff8b36b9a4daf677cbea9a7627956a9dcce4b0f423019ce1e795a2528335
BLAKE2b-256 checksum
How to use checksums
a15b1728f9a6742af4f9398f18c4e3b680703ca75ec36760df87685835baeed6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 144.6 kB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
c2c993ed4d13c6b2354c5acb2827a3657239ffe00a576b6c5e0ab35976d98810
BLAKE2b-256 checksum
How to use checksums
fb91840a7d0810d740202b45e4581d1635edc1e5edc5b0e3df2378026b261760
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL pyraymesh-0.2.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Size 150.4 kB
Tags CPython 3.13 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
0c6e7d501131801806cf3a479b7f78838d0e3bae1abaa029a3ea5ba20b59070a
BLAKE2b-256 checksum
How to use checksums
0d6c2e0bfa87ddf597dfaa20fa121c61239380aa7f2396fa86a14443e11a69df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_x86_64.whl
Size 580.8 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
66a1f88ca19c178160e7d6b6095b2e68277dfc93ed3eea6ac6dff3ad46959a5c
BLAKE2b-256 checksum
How to use checksums
73e8fd614200cf2c11e2f3192aaab58fe685473d7497ea4e7aa51368cd4010fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_i686.whl

Download URL pyraymesh-0.2.6-cp312-cp312-musllinux_1_2_i686.whl
Size 627.8 kB
Tags CPython 3.12 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
b0d9b2b1cdbcf946e2ccffd9bd188e12347fa4fc8d7656347a32adc15cbefec1
BLAKE2b-256 checksum
How to use checksums
f2096c1bfe170f72f9d222e4fadb291d4aa56d14c1faae735eb1c68c82c1e4e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 144.7 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
a362cde7804b0f19d0855a339ab4e5756d92167ee621df2d2710cb4c4259661f
BLAKE2b-256 checksum
How to use checksums
99fa45243fbb06ac3e812aef0e3c47136e96b5736e520db58a75749f39010071
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL pyraymesh-0.2.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Size 150.4 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
8d7c91c51ae0b2b870626f072a721a8cc5d9757dd960c8a7540c6d0afb4f4cbf
BLAKE2b-256 checksum
How to use checksums
6581eeb16433a4d43116de73f3bdcf0f3d96039df48bbb9f4f20f21075944500
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_x86_64.whl
Size 581.6 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
fe3dc12fdca0b8ca5ff7e6832a45175ffffc719284afdf2cfa44786851ff7941
BLAKE2b-256 checksum
How to use checksums
7a2a6bdbe01aa4c6ad8f8acc4c799a4baf56166fa812a5a2a851641a35aacf7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_i686.whl

Download URL pyraymesh-0.2.6-cp311-cp311-musllinux_1_2_i686.whl
Size 628.9 kB
Tags CPython 3.11 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
1e3a1bf8ac7767771ad2d2df839e7d7dc9485692a9bfd26f9a9b45247a51a230
BLAKE2b-256 checksum
How to use checksums
3eeaab2fb7be6a4b9497b3cdfd416f7a16d95cf7624404e6bf670b7dd5d01fa9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 145.8 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
0659e8c6ea89ecf9fe2ebfbc4308c6c361b2efd82149fb84ae9d8dad9421db3c
BLAKE2b-256 checksum
How to use checksums
6e73d2d41e46b1c3d900c8cfabeb928ccbb3127964ef7464cfde4c77304ebedc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL pyraymesh-0.2.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Size 151.6 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
285665392a1fbe364f1741d70b4ba71eeba48e829fbeeeb22e7042c23ef4afe8
BLAKE2b-256 checksum
How to use checksums
1f502b17f9e5cc576996081a2d06a49b5bda7a45d137e2b83781d2872dc8f85b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_x86_64.whl
Size 581.7 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
19cab2b67f862b605fa9a925149c7275929d42aa7f02de27d83e0f6887852813
BLAKE2b-256 checksum
How to use checksums
f51e85ee3ed9567a9f98a28e649c87547871828e7f1adb681705fa022c3914da
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_i686.whl

Download URL pyraymesh-0.2.6-cp310-cp310-musllinux_1_2_i686.whl
Size 629.2 kB
Tags CPython 3.10 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
e2eb6317eb333b6a9736dfe927e62f125eb766c6552c129bd0819621a7e31cd7
BLAKE2b-256 checksum
How to use checksums
6cd7541b9ba3123a00f4fdd9dee2ef6a6a783816676682aa15356bbc9065f747
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 146.1 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
12e8fff83dcccc15f603698d44bfb8202f529984a7f4a84ef50986fe2121f424
BLAKE2b-256 checksum
How to use checksums
29f991648da1e51d989c42072352cf0d2d826e578792ccfeec3b91aeec3d3528
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL pyraymesh-0.2.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Size 151.8 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
615121d7e723eb399f0de81a866bb3b777f2bbc4f19e23fc3a8e4523f5935dd0
BLAKE2b-256 checksum
How to use checksums
296a8d0a05fa272b717fe3c7c0ec2cc0cdd26ac4eaae38177467ca8e75fa4ad8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release history Release notifications | RSS feed

This release

0.2.6 This release

18 release files

0.2.4

37 release files

0.2.2

37 release files

0.2.1

37 release files

0.2.0

37 release files

0.1.4

37 release files

0.1.3

37 release files

0.1.2

37 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page