Skip to main content

Serve Python (or C++) objects across a LAN using something like JSON-RPC

Project description

https://badge.fury.io/py/tuberd.svg https://github.com/gsmecher/tuberd/actions/workflows/package.yml/badge.svg

Tuber Server and Client

Tuber is a C++ server and Python client for exposing an instrumentation control plane across a network.

On a client, you can write Python code like this:

>>> some_resource.increment([1, 2, 3, 4, 5])
[2, 3, 4, 5, 6]

…and end up with a remote method call on a networked resource written in Python or (more usually) C++. The C++ implementation might look like this:

class SomeResource {
public:
    std::vector<int> increment(std::vector<int> x) {
        std::ranges::for_each(x, [](int &n) { n++; });
        return x;
    };
};

On the client side, Python needs to know where to find the server. On the server side, the C++ code must be registered with pybind11 (just as any other pybind11 code) and the tuber server. Other than that, however, there is no ceremony and no boilerplate.

Its main features and design principles are:

  • Pythonic call styles, including *args, **kwargs, and DocStrings.

  • JSON and CBOR support for efficient and friendly serialization of return values.

  • “Less-is-more” approach to code. For example, Tuber uses pybind11 and C++ as a shim between C and Python, because the combination gives us the shortest and most expressive way to produce the results we want. It pairs excellently with orjson (as a JSON interface) or cbor2 (as a CBOR interface), which efficiently serialize (for example) NumPy arrays created in C++ across the network.

  • Schema-less RPC using standard-ish protocols (HTTP 1.1, JSON, CBOR, and something like JSON-RPC). Avoiding a schema allows server and client code to be independently and seamlessly up- and downgraded, with differences between exposed APIs only visible at the sites where RPC calls are made.

  • A mature, quick-ish, third-party, low-overhead, low-prerequisite embedded webserver. Tuber uses libhttpserver, which in turn, is a C++ wrapper around the well-established libmicrohttpd. We use the thread-per-connection configuration because a single keep-alive connection with a single client is the expected “hot path”; C10K-style server architectures wouldn’t be better.

  • High performance when communicating with RPC endpoints, using:

    • HTTP/1.1 Keep-Alive to avoid single-connection-per-request overhead. See this Wikipedia page for details.

    • A call API that (optionally) allows multiple RPC calls to be combined and dispatched together.

    • Client-side caches for remote properties (server-side constants)

    • Python 3.x’s aiohttp/asyncio libraries to asynchronously dispatch across multiple endpoints (e.g. multiple boards in a crate, each of which is an independent Tuber endpoint.)

  • A friendly interactive experience using Jupyter/IPython-style REPL environments. Tuber servers export metadata that can be used to provide DocStrings and tab-completion for RPC resources.

  • The ability to serve a web-based UI using static JavaScript, CSS, and HTML.

Anti-goals of this Tuber server include the following:

  • No authentication/encryption is used. For now, network security is strictly out-of-scope. (Yes, it feels naïve to write this in 2022.)

  • The additional complexity of HTTP/2 and HTTP/3 protocols are not justified. HTTP/1.1 keep-alive obviates much of the performance gains promised by connection multiplexing.

  • The performance gains possible using a binary RPC protocol do not justify the loss of a human-readable, browser-accessible JSON protocol.

  • The use of newer, better languages than C++ (server side) or Python (client side). The instruments Tuber targets are likely to be a polyglot stew, and I am mindful that every additional language or runtime reduces the project’s accessibility to newcomers. Perhaps pybind11 will be eclipsed by something in Rust one day - for now, the ability to make casual cross-language calls is essential to keeping Tuber small. (Exception: the orjson JSON library is a wonderful complement to tuber and I recommend using them together!)

Although the Tuber server hosts an embedded Python interpreter and can expose embedded resources coded in ordinary Python, it is intended to expose C/C++ code. The Python interpeter provides a convenient, Pythonic approach to attribute and method lookup and dispatch without the overhead of a fully interpreted embedded runtime.

Tuber is licensed using the 3-clause BSD license (BSD-3-Clause). This software is intended to be useful, and its licensing is intended to be pragmatic. If licensing is a stumbling block for you, please contact me at gsmecher@threespeedlogic.com.

Installation

Pre-built wheels for Linux and macOS operating systems are available on PyPI for CPython 3.8+:

pip install tuberd

Building from source requires the libmicrohttpd and libhttpserver dependencies. To simplify the build process, the wheels/install_deps.sh script can be used to build all the dependencies locally and compile against them. In this instance, cmake should be able to discover the appropriate paths for all dependencies. Use the BUILD_DEPS cmake argument to trigger this build with pip:

CMAKE_ARGS="-DBUILD_DEPS=yes" pip install tuberd

If you prefer to build the dependencies manually, to ensure that cmake can find the libhttpserver library, you may need to add the path where the FindLibHttpServer.cmake file is installed to the CMAKE_MODULE_PATH option, for example:

CMAKE_ARGS="-DCMAKE_MODULE_PATH=/usr/local/share/cmake/Modules" pip install tuberd

Optional dependencies may be installed to enable alternative encoding schemes (cbor, orjson) with and without numpy support, or the asyncio-enabled client interface:

pip install tuberd[async,cbor,numpy,orjson]

To run the test suite, install the development dependencies:

pip install tuberd[dev]

Client Installation

The above tuberd package includes both the server and client components. If you require just the python components to run the client interface, pre-built wheels of the client code are available on PyPI for Python 3.

pip install tuber-client

To include the dependencies for the asyncio-enabled interface and/or cbor encoding with or without numpy support:

pip install tuber-client[async,cbor,numpy]

Benchmarking

With concurrency 1 and keep-alive enabled, a 1M request benchmark can be generated as follows:

$ sudo apt-get install apache2-utils
$ echo '{ "object":"Wrapper", "method":"increment", "args":[[
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10,
     1,2,3,4,5,6,7,8,9,10 ]]}' > benchmark.json
$ for n in `seq 100`
  do
      ab -q -k -n 10000 -c 1 -p benchmark.json -T application/json http://localhost:8080/tuber
  done | awk '
     BEGIN { delete A }
     /Time taken/ { A[length(A)+1] = $5; }
     END { printf("x = [ "); for(i in A) printf(A[i] ", "); print "];" }'

These results are formatted suitably for the following Python snippet:

import matplotlib.pyplot as plt
plt.hist(x)
plt.legend()
plt.grid(True)
plt.savefig('histogram.png')

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tuberd-0.16.tar.gz (44.6 kB view details)

Uploaded Source

Built Distributions

tuberd-0.16-cp313-cp313-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp313-cp313-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (658.7 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (633.0 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp313-cp313-macosx_11_0_arm64.whl (412.0 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

tuberd-0.16-cp313-cp313-macosx_10_15_x86_64.whl (420.1 kB view details)

Uploaded CPython 3.13 macOS 10.15+ x86-64

tuberd-0.16-cp312-cp312-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp312-cp312-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (658.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (632.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp312-cp312-macosx_11_0_arm64.whl (411.8 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

tuberd-0.16-cp312-cp312-macosx_10_15_x86_64.whl (419.9 kB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

tuberd-0.16-cp311-cp311-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp311-cp311-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (657.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (631.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp311-cp311-macosx_11_0_arm64.whl (413.0 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

tuberd-0.16-cp311-cp311-macosx_10_15_x86_64.whl (421.3 kB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

tuberd-0.16-cp310-cp310-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp310-cp310-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (629.4 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp310-cp310-macosx_11_0_arm64.whl (411.0 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

tuberd-0.16-cp310-cp310-macosx_10_15_x86_64.whl (419.1 kB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

tuberd-0.16-cp39-cp39-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp39-cp39-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (655.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (629.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp39-cp39-macosx_11_0_arm64.whl (411.3 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

tuberd-0.16-cp39-cp39-macosx_10_15_x86_64.whl (419.4 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

tuberd-0.16-cp38-cp38-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

tuberd-0.16-cp38-cp38-musllinux_1_2_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARM64

tuberd-0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (654.9 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

tuberd-0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (629.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

tuberd-0.16-cp38-cp38-macosx_10_15_x86_64.whl (419.5 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file tuberd-0.16.tar.gz.

File metadata

  • Download URL: tuberd-0.16.tar.gz
  • Upload date:
  • Size: 44.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for tuberd-0.16.tar.gz
Algorithm Hash digest
SHA256 ba74d7d0cdf2a94c8b77ae09ad92f5e6fe6878f24eb8dda997b3508564f005b9
MD5 4f24b9631a5f3a19b66732f5add3cccd
BLAKE2b-256 87d9b0b601725467b33fa838d5bae5f71fd34d4b9542666f4fe790d3b0ce9ddc

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 25354b59335135df5d83096eddf939bc6f4b51f16ecd69afc4494328a9ba4ecb
MD5 f6456a08cb037dff7fb2204f86d17689
BLAKE2b-256 ef611dda0bd170347a3c3c61420ac2bbf52a5324308c4872638b54a3edbd7904

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7bc85e2b5240a16467812db2ae11aa479959ff666b0fec65cf89fa8960695633
MD5 26184d720b2aaea9fc298347fc8f0225
BLAKE2b-256 6049fe7836fdddff12790185ba5e56922b7db913305f484cc3b11b7b71c695d1

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 137fb8911870ae66e9771cd9411874043cd2321725537d120dbd0e2c623752f8
MD5 8114e8043211d7bbc7ce4ca769765001
BLAKE2b-256 8495bd24fad1e87771a9aedf0e34dcb79a7712c28435abd388ee9c503bfbf292

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8080449f01d4854fdcd18839325727a058516ff16821057b7a42a8410aa0fa3
MD5 36bc87978e0f845c4dabf7254dc01c14
BLAKE2b-256 9ae969c1fc33213acb82b477ebb5992120460e6c07299b5b7a68b95d9c5fea23

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7bad80e1b075290b0109b72cf56d92adc039ffa7938260825b867aa330b1ee3a
MD5 7d330fd39b1b9524e0a80b73b08c9d98
BLAKE2b-256 b0ae07be8082e52b6a33073f22edbc4445d73412430822a050346fdcc6439ce0

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2500f33b14206e54bb0b3cc06e30fcb1b63d13344696662f496df43070e44a11
MD5 e0cf9cc57fef54e386ceeb6a61ccf00d
BLAKE2b-256 f27f3ea308836f24de40e8b88502d4c52da954387d9e606b3223e28fd1b1cb07

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0e8914bb5e0a902d91376b10f77071fdd74c737b460cd8059f6d43dcf5ed22d3
MD5 676b3102e037daddc13eb79dfdfc6919
BLAKE2b-256 8c96b568b1ef9fa1faebbcf3a8e08bcf4eac993895d2add5d81f61645a855cda

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 065ac21ce92fb700c1983cee76f56ffb3274abde87f9e742bd727873a27ca06d
MD5 51de50a7b147009b7dab5aa797fcd2c9
BLAKE2b-256 8d1afa7338eb02b8641cf3432b2231219fe14c174d613417fb2b17e6c71716ae

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5078936a8443cc71e551e8a125cf13abcdad07cbd93d426cf8f28723f6153764
MD5 9a464deef2b44d65cf26980d84349b64
BLAKE2b-256 0ec4eb66f7f1b897036520de597fd86359127d6b71e792d2d809e9f1df57cf2e

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4fc20b36b3ef7618ce28dc625bbcc7d438b154a42decea669043598b0680582d
MD5 57840f7bbe1b48b587a2e1308c6520fc
BLAKE2b-256 512f30e446a8a3e0a3f0137f1949c55d4f077e6c9f796839c982087c08d95910

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b3a6f6652821bc8e6f6c077aab49e5755d2fb9c44010aa790889e6d44e01c809
MD5 edf33c0d3f481b6e26b6aef0dd6eaa8f
BLAKE2b-256 658cde392bcb51db5880bfef17a6a26bba3c47b2d4a11f9af9c8d355af021488

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bed758fe04942dde6537232b6132e8eef5405fd18f887ec3d009f8fc9c98f9ac
MD5 e93c86b02aeb4ee85bb0bb0cddd8b175
BLAKE2b-256 f910bca53c5a416ac703f0f3655eee8ed26c0df3bd392731943a09780693caee

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b247c548eaa347715eb1009360b9543c80af6f5b041a197a809f6ba37dff6a0c
MD5 64add89e06a68cb4121f949f2add618c
BLAKE2b-256 88a044cca58f165e879180f89e3e436bcc46525482ece95515b5c586d923269d

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 660568d1dd28eb1c344128821f86b7bac1f5c4e588783fe4d81ba2dcdf89672d
MD5 7efe4242a1a925a67a3bb5d0a9e9a918
BLAKE2b-256 df02baffc90ca5151709c97ef601b0cf6c0342cd057c823032170e266766285b

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf3e7428ce5344adab2c6741f0d30f8376392d0ce6a47a86c5e210da9ace9b15
MD5 cc9a877616ad460f3a3be8fd43dbb721
BLAKE2b-256 757e943c0a7a30880871f2dc1bf35c6b31c4bdbd8d2cbf20ab6c1c5b71c1ee02

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3fab331fa45d30df64b129d14ea2bce6976b63f1eb372c7b108988b408a5e93c
MD5 5008bcf1bd8e35bda7bce7f8150a6149
BLAKE2b-256 5edf9a9c60d96dba87e1c1587fdd123ac1e058b158f35c2305a63f64156f5201

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 65d570dc3b960c05db2aadbab585b4f2d24a14459a8ab71dbaf2fed814d23299
MD5 7ac7d5b29c5eb68b8360f59f237bae5b
BLAKE2b-256 ea3981698425b7e201db19465920fff3427d543c72c0ecb96e24b865cfeca010

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0bb37f338389879a5a22151cdbd4c1142a9c6e6666284851c5b15dcb1c0fcdd2
MD5 4ef979238597d46ad028d247fa6e7e12
BLAKE2b-256 fedaf73d01e8e1324502766b8fc20de87448a64a92a056bbb8f823531fd50fbe

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5b766d9c2f2379f47b1a3c978bb314184c5edb817cb06c7f5f6064ccaeeddf24
MD5 224dbfff931db24d5bd633d0305d6786
BLAKE2b-256 d1a8762acd1f37021b4e614c128344ec71d53aba2993ec3501f5cc221dfd79cd

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 86e08761dda204754719d4e96229bcf3867d61620c03eae67deaabf7b8e78757
MD5 ac3499dedc87b2ba26af6d0b265ed913
BLAKE2b-256 0e3739ebcc1dd881a275d7e7f4a2e2ae727d8dbb545bf690bfc5b94ca3316704

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae1c973e50163e16df6b8077dc3ca35d1366fa2d448e3b0d5bf05f3a9ed5ccd5
MD5 2c087c82641034ef9e2158f67dd8f965
BLAKE2b-256 781cef84bddbbedc554bd832b76e3bc66288b28c15b794dc8cfeeaff0f634850

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d3f2905daabc07191eb38ef05d9035c0a30b75babb8fb252dcdab10081161902
MD5 76dd6b58ca963f74e52e7e6d3e13224c
BLAKE2b-256 ac6e7b330d2c8310f5ac6035b7b3c71144901bf1e3ccb55c41cc597d32789dd0

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54ba505ffd9d961421531a98fe9fd10225cbb07a51f0779f278c72155a759444
MD5 fbd72be54ad05b359b6a9a83f4029658
BLAKE2b-256 e42ba88ea5979c03583c65d0fed0748aa48b65895c6cef8d0f7be13e5b71e232

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b3b8035fe675e5f1552c1e8db1863fa13d5839ec922b69731da7e626e2be171a
MD5 5c3eeac91ef7cf69371503b2a582af5a
BLAKE2b-256 094edc9995f333a9ae408bf44719c5e7e5f745cfdfb295e44df0679d0f5c4f51

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1de84615692c7ed15cce93028da4d72a53e9b91a398c765d2a061f4eb3b1426c
MD5 0d1ad2e214cd1db102c86106f627a4bc
BLAKE2b-256 29f091224a76b8519d8d6152a0fcea356d4a9ba47752c64e993f68cdfe633e51

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e8fe9cd139ff5ea5edd694035602cb62a7db6f1ac9e5f1406e0a403212095f67
MD5 54430c9a9d0123be1bd5ea2ea83fe4af
BLAKE2b-256 858698dc03cc1bff5ba57035d05b34e7872d33828d8ec2be31dff5cd2c3a200e

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 361238f86b754ac3621fa437223362147c6a46d33b92e57302502229fb6d864d
MD5 cf23ecb9b526d6b4198892eab6328af6
BLAKE2b-256 3d3debc2d9361ac95e2e7c693560324388721ec789222f0cc39fbb6f6c85f454

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 af8c6707433da58d59cc5498551f3e5a74c739d64a45fce01204a5f88dc7eaa1
MD5 2d035c5775e30bda1d13c61b9549ee88
BLAKE2b-256 e7f44f45d965596fa040e39608e29bc6dbebcae005e8a429b102a5a9fe13c2f1

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 479bff77f72d85badb73ce8dcef3533418a25c219e9ea71790792cd72dbd263b
MD5 0a90fd27c61166508f608a12713fdae2
BLAKE2b-256 2e21116f5a3f1704816a4452d90a51399e9e2f550ec125d8a1c89eb3dcd40f3f

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ba34416995f8fa3565de0f0582eb9f569597b995524dad895432dbeadb2a82b5
MD5 17f81b0a3d0f5e395d64ff97bc9f42a4
BLAKE2b-256 8d17c304f7116a1e433e20c645a955102522b77fcda929e200e46307bcf8631c

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 05c49a40a1b958c79532633d0876eaca2fe529d158a672a62712d6efa5a179e9
MD5 fe7d1ff3cfa8934e1ea73d45ffeb3700
BLAKE2b-256 694081f5b237d7f8c7a7f83314d9770074abd89480dff82b416c5a8b2658cfdb

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp38-cp38-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp38-cp38-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9091753bbd63c2c4908c07c6ad70d3feedb12553cd5c30c841d8fa1afa3ffcd3
MD5 0579e937a300aecdcb37445bbbf7d60d
BLAKE2b-256 afa7ae297518f1e90d323b39be53f1acdbde4acf56bd7367e8940f96b1f3d229

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ef6ebda150c496e2ec159ff05947c3c11fd01681f17563bd8d41fbbcc3b7ba60
MD5 74822bc7c61583e9a348e9a0c6893056
BLAKE2b-256 123f0c447c182c8c5f01cef98d4317fd6f92d4c6e90a79d174cfe352969b9a46

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6793bd2c2b0f9d75c23b443f2264ad3b93aa8edda328157b2276b5fee12bbbb2
MD5 215aba54341b20eb3eac25ac5900f9c3
BLAKE2b-256 6e09e59636c3480038ec32cee557d722e4fa2a14c69032a73de5a817d51384cf

See more details on using hashes here.

File details

Details for the file tuberd-0.16-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for tuberd-0.16-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5c744d7fb7d55b1d9911b67c9ff07515d5f170b49dec87f44134e75b235084bf
MD5 13fb6dcb4a437da6c51c1d98eb1af4f9
BLAKE2b-256 64749f62b210a0d8a2b1d9a36a0166eef1a7f1f5c8444b446ac7451000c5e719

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page