Skip to main content

C-Two is a resource-RPC framework that enables resource-oriented classes to be remotely invoked across different processes or machines.

Project description

C-Two

A resource-oriented RPC framework for Python — turn stateful classes into location-transparent distributed resources.

PyPI Free-threading License

中文版


Basic Idea

  • Resources, not services — C-Two doesn't expose RPC endpoints. It makes Python classes remotely accessible while preserving their stateful, object-oriented nature.

  • Zero-copy from process to data — Same-process calls skip serialization entirely. Cross-process IPC can hold shared-memory buffers alive, letting you read columnar data (NumPy, Arrow, …) directly from SHM — no deserialization, no copies.

  • Built for scientific Python — Native support for Apache Arrow, NumPy arrays, and large payloads (chunked streaming for data beyond 256 MB). Designed for computational workloads, not microservices.

  • Rust-powered transport — The IPC layer uses a Rust buddy allocator for shared memory and a Rust HTTP relay for high-throughput networking.


Quick Start

pip install c-two

Define a resource interface and its implementation

import c_two as cc

# Interface — declares which methods are remotely accessible
@cc.icrm(namespace='demo.counter', version='0.1.0')
class ICounter:
    def increment(self, amount: int) -> int: ...

    @cc.read
    def value(self) -> int: ...

    def reset(self) -> int: ...


# Implementation — a plain Python class holding state
class Counter:
    def __init__(self, initial: int = 0):
        self._value = initial

    def increment(self, amount: int) -> int:
        self._value += amount
        return self._value

    def value(self) -> int:
        return self._value

    def reset(self) -> int:
        old = self._value
        self._value = 0
        return old

Use it locally (zero serialization)

cc.register(ICounter, Counter(initial=100), name='counter')
counter = cc.connect(ICounter, name='counter')

counter.increment(10)    # → 110
counter.value()          # → 110
counter.reset()          # → 110 (returns old value)
counter.value()          # → 0

cc.close(counter)

Or remotely — same API, different address

# Server process
cc.set_address('ipc:///tmp/my_server')
cc.register(ICounter, Counter(), name='counter')

# Client process (separate terminal)
counter = cc.connect(ICounter, name='counter', address='ipc:///tmp/my_server')
counter.increment(5)     # works identically
cc.close(counter)

See examples/ for complete runnable demos.


Core Concepts

ICRM — Interface

An ICRM (Interface of Core Resource Model) declares which CRM methods are remotely accessible. Decorated with @cc.icrm(), method bodies are ... (pure interface — no implementation).

@cc.icrm(namespace='demo.greeter', version='0.1.0')
class IGreeter:
    @cc.read                              # concurrent reads allowed
    def greet(self, name: str) -> str: ...

    @cc.read
    def language(self) -> str: ...

Methods can be annotated with @cc.read (concurrent access allowed) or left as default write (exclusive access).

CRM — Core Resource Model

A CRM is a plain Python class that holds state and implements domain logic. It is not decorated — the framework discovers its methods through the ICRM interface.

class Greeter:
    def __init__(self, lang: str = 'en'):
        self._lang = lang
        self._templates = {'en': 'Hello, {}!', 'zh': '你好, {}!'}

    def greet(self, name: str) -> str:
        return self._templates.get(self._lang, 'Hi, {}!').format(name)

    def language(self) -> str:
        return self._lang

Component — Consumer

Components consume CRM resources through ICRM proxies. The proxy is location-transparent — it works the same whether the CRM is in the same process or on a remote machine.

greeter = cc.connect(IGreeter, name='greeter')
greeter.greet('World')     # → 'Hello, World!'
cc.close(greeter)

@transferable — Custom Serialization

For custom data types that need to cross the wire, use @cc.transferable. Without it, pickle is used as fallback.

A transferable class defines up to three static methods (written without @staticmethod — the framework adds it automatically):

Method Required Purpose
serialize(data) → bytes ✅ Yes Encode data for wire transfer (outbound)
deserialize(raw) → T ✅ Yes Decode wire bytes into an owned Python object (inbound)
from_buffer(buf) → T ❌ Optional Build a zero-copy view over the raw buffer (inbound, hold mode)
import numpy as np

@cc.transferable
class Matrix:
    rows: int
    cols: int
    data: np.ndarray

    def serialize(mat: 'Matrix') -> bytes:
        header = struct.pack('>II', mat.rows, mat.cols)
        return header + mat.data.tobytes()

    def deserialize(raw: bytes) -> 'Matrix':
        rows, cols = struct.unpack_from('>II', raw)
        arr = np.frombuffer(raw, dtype=np.float64, offset=8).reshape(rows, cols)
        return Matrix(rows=rows, cols=cols, data=arr.copy())  # owned copy

    def from_buffer(buf: memoryview) -> 'Matrix':
        header = bytes(buf[:8])
        rows, cols = struct.unpack('>II', header)
        arr = np.frombuffer(buf[8:], dtype=np.float64).reshape(rows, cols)
        return Matrix(rows=rows, cols=cols, data=arr)  # zero-copy view into SHM

When from_buffer is present, the server automatically uses hold mode — the SHM buffer stays alive so from_buffer can return a zero-copy view. Without from_buffer, the server uses view mode — the buffer is released immediately after deserialize.

@cc.transfer — Per-Method Control

Use @cc.transfer() on ICRM methods to explicitly specify which transferable type handles serialization, or to override the buffer mode:

@cc.icrm(namespace='demo.compute', version='0.1.0')
class ICompute:
    @cc.transfer(input=Matrix, output=Matrix, buffer='hold')
    def transform(self, mat: Matrix) -> Matrix: ...

    @cc.transfer(input=Matrix, buffer='view')  # force copy even if from_buffer exists
    def ingest(self, mat: Matrix) -> None: ...

Without @cc.transfer, the framework automatically matches registered @transferable types by function signature and resolves the buffer mode from the input type's capabilities.

cc.hold() — Client-Side Zero-Copy

On the client side, cc.hold() requests that the response SHM buffer remain alive, enabling zero-copy reads of the result. The returned HeldResult wraps the value and provides a three-layer safety net for SHM lifecycle:

  1. Explicit .release() — preferred for complex workflows holding multiple buffers
  2. Context manager (with) — recommended for single-buffer scopes
  3. __del__ fallback — last resort, emits ResourceWarning if you forget to release
grid = cc.connect(ICompute, name='compute', address='ipc://server')

# Normal call — buffer released immediately after deserialize
result = grid.transform(matrix)

# Option 1: Context manager — clean for single holds
with cc.hold(grid.transform)(matrix) as held:
    data = held.value          # zero-copy NumPy array backed by SHM
    process(data)              # read directly from shared memory
# SHM buffer released on context exit

# Option 2: Explicit release — better for multiple concurrent holds
a = cc.hold(grid.transform)(matrix_a)
b = cc.hold(grid.transform)(matrix_b)
try:
    combined = np.concatenate([a.value.data, b.value.data])
    process(combined)
finally:
    a.release()
    b.release()

When to use hold mode: Large array/columnar data where deserialization dominates cost. For small payloads (< 1 MB), the overhead of tracking SHM lifecycle exceeds the copy cost.


Examples

Single Process — Thread Preference

When cc.connect() targets a CRM registered in the same process, the proxy calls methods directly with zero serialization overhead.

import c_two as cc

cc.register(IGreeter, Greeter(lang='en'), name='greeter')
cc.register(ICounter, Counter(initial=100), name='counter')

greeter = cc.connect(IGreeter, name='greeter')
counter = cc.connect(ICounter, name='counter')

print(greeter.greet('World'))    # → Hello, World!
print(counter.value())           # → 100
counter.increment(10)

cc.close(greeter)
cc.close(counter)
cc.shutdown()

Best for: local prototyping, testing, single-machine computation.

Multi-Process IPC — with Custom Transferable

Separate server and client processes communicating over Unix domain sockets with shared memory.

Shared types (types.py):

import c_two as cc
import numpy as np, struct

@cc.transferable
class Mesh:
    n_vertices: int
    positions: np.ndarray   # (N, 3) float64

    def serialize(mesh: 'Mesh') -> bytes:
        header = struct.pack('>I', mesh.n_vertices)
        return header + mesh.positions.tobytes()

    def deserialize(raw: bytes) -> 'Mesh':
        (n,) = struct.unpack_from('>I', raw)
        arr = np.frombuffer(raw, dtype=np.float64, offset=4).reshape(n, 3).copy()
        return Mesh(n_vertices=n, positions=arr)

    def from_buffer(buf: memoryview) -> 'Mesh':
        header = bytes(buf[:4])
        (n,) = struct.unpack('>I', header)
        arr = np.frombuffer(buf[4:], dtype=np.float64).reshape(n, 3)
        return Mesh(n_vertices=n, positions=arr)  # zero-copy view

@cc.icrm(namespace='demo.mesh', version='0.1.0')
class IMeshStore:
    @cc.read
    def get_mesh(self) -> Mesh: ...

    def update_positions(self, mesh: Mesh) -> int: ...

    @cc.on_shutdown
    def cleanup(self) -> None: ...

Server (server.py):

import c_two as cc
from types import IMeshStore, Mesh

class MeshStore:
    def __init__(self):
        self._mesh = Mesh(n_vertices=0, positions=np.empty((0, 3)))

    def get_mesh(self) -> Mesh:
        return self._mesh

    def update_positions(self, mesh: Mesh) -> int:
        self._mesh = mesh
        return mesh.n_vertices

    def cleanup(self):
        print('MeshStore shutting down')

cc.set_address('ipc://mesh_server')
cc.register(IMeshStore, MeshStore(), name='mesh')
cc.serve()  # blocks until interrupted

Client (client.py):

import c_two as cc
from types import IMeshStore, Mesh
import numpy as np

mesh_store = cc.connect(IMeshStore, name='mesh', address='ipc://mesh_server')

# Upload data
big_mesh = Mesh(n_vertices=1_000_000,
                positions=np.random.randn(1_000_000, 3))
mesh_store.update_positions(big_mesh)

# Read with hold — zero-copy SHM access
with cc.hold(mesh_store.get_mesh)() as held:
    positions = held.value.positions  # np.ndarray backed by SHM, no copy
    centroid = positions.mean(axis=0)
    print(f'Centroid: {centroid}')
# SHM released here

cc.close(mesh_store)

Best for: multi-process on same host, worker isolation, high-throughput local IPC.

Cross-Machine — HTTP Relay

An HTTP relay bridges network requests to CRM processes running on IPC.

# CRM Server (resource.py)
cc.set_address('ipc://mesh_server')
cc.register(IMeshStore, MeshStore(), name='mesh')
cc.serve()

# Relay (start via CLI)
# c3 relay --upstream ipc://mesh_server --bind 0.0.0.0:8080

# Client — same API, just change the address
mesh = cc.connect(IMeshStore, name='mesh', address='http://relay-host:8080')
mesh.get_mesh()
cc.close(mesh)

Best for: network-accessible services, web integration, cross-machine deployment.

Function-Based Components

For scripting-style code, @cc.runtime.connect injects the ICRM proxy as the first parameter:

@cc.runtime.connect
def compute_centroid(store: IMeshStore) -> np.ndarray:
    mesh = store.get_mesh()
    return mesh.positions.mean(axis=0)

# Framework injects the proxy — caller only passes non-ICRM args
result = compute_centroid(crm_address='ipc://mesh_server')

Server-Side Monitoring

Use cc.hold_stats() to monitor SHM buffers held by CRM methods in hold mode:

stats = cc.hold_stats()
# {'active_holds': 3, 'total_held_bytes': 52428800, 'oldest_hold_seconds': 12.5}

Architecture

The design philosophy of C-Two is not to define services, but to empower resources.

In scientific computation, resources encapsulating complex state and domain-specific operations need to be organized into cohesive units. We call these Core Resource Models (CRMs). Applications care more about how to interact with resources than where they are located. We call resource consumers Components. C-Two provides location transparency and uniform resource access, allowing components to interact with CRMs as if they were local objects.

graph LR
    subgraph Component Layer
        C1[Component] -->|cc.connect| P1[ICRM Proxy]
        C2[Component] -->|cc.connect| P2[ICRM Proxy]
    end

    subgraph Transport Layer
        P1 --> T{Protocol<br/>Auto-detect}
        P2 --> T
        T -->|thread://| TH[Thread<br/>Direct Call]
        T -->|ipc://| IPC[IPC<br/>UDS + SHM]
        T -->|http://| HTTP[HTTP<br/>Relay]
    end

    subgraph CRM Layer
        TH --> CRM1[CRM Instance]
        IPC --> CRM1
        HTTP --> CRM1
    end

Component Layer

Client-side consumers that access remote resources through ICRM proxies. The proxy provides full type safety and location transparency — components don't know (or care) where the CRM is running.

  • Script-based: cc.connect(ICRMClass, name='...', address='...') returns a typed ICRM proxy
  • Function-based: @cc.runtime.connect decorator injects the ICRM proxy as the first parameter

CRM Layer

Server-side stateful resources exposed through standardized ICRM interfaces.

  • CRM: Plain Python class — state + domain logic. Not decorated.
  • ICRM: Interface class decorated with @cc.icrm(). Only methods declared here are remotely accessible.
  • @transferable: Custom serialization for domain data types. Optionally provides from_buffer for zero-copy SHM views.
  • @cc.transfer: Per-method control over input/output transferable types and buffer mode.
  • @cc.read / @cc.write: Concurrency annotations — parallel reads, exclusive writes.
  • @cc.on_shutdown: Lifecycle callback invoked when a CRM is unregistered (not exposed via RPC).

Transport Layer

Protocol-agnostic communication with automatic protocol detection based on address scheme:

Scheme Transport Use case
thread:// In-process direct call Zero serialization, testing
ipc:///path Unix domain socket + shared memory Multi-process, same host
http://host:port HTTP relay Cross-machine, web-compatible

The IPC transport uses a control-plane / data-plane separation: method routing flows through UDS inline frames while payload bytes are exchanged via shared memory — zero-copy on the data path. When from_buffer is available, hold mode keeps the SHM buffer alive across the CRM method call, enabling the CRM to operate directly on shared memory without deserialization.

Rust Native Layer

Performance-critical components are implemented in Rust and compiled as a Python extension via PyO3 + maturin:

The Rust workspace contains 7 crates organized in 4 layers (foundation → protocol → transport → bridge):

  • Buddy Allocator — Zero-syscall shared memory allocation for the IPC transport. Cross-process, lock-free on the fast path.
  • Wire Protocol — Frame encoding, chunk assembly, and chunk registry for large-payload lifecycle management.
  • HTTP Relay — High-throughput axum-based gateway bridging HTTP to IPC. Handles connection pooling and request multiplexing.

The Rust extension is compiled automatically during pip install c-two (from pre-built wheels) or uv sync (from source).


Installation

From PyPI

pip install c-two

Pre-built wheels are available for:

  • Linux: x86_64, aarch64
  • macOS: Apple Silicon (aarch64), Intel (x86_64)
  • Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.14t (free-threading)

If no pre-built wheel is available for your platform, pip will build from source (requires a Rust toolchain).

Development Setup

git clone https://github.com/world-in-progress/c-two.git
cd c-two
uv sync          # install dependencies + compile Rust extensions
uv run pytest    # run the test suite

Requires uv and a Rust toolchain.


Roadmap

Feature Status
Core RPC framework (CRM / ICRM / Component) ✅ Stable
IPC transport with SHM buddy allocator ✅ Stable
HTTP relay (Rust-powered) ✅ Stable
Chunked streaming (payloads > 256 MB) ✅ Stable
Heartbeat & connection management ✅ Stable
Read/write concurrency control ✅ Stable
Unified config architecture (Python SSOT) ✅ Stable
CI/CD & multi-platform PyPI publishing ✅ Stable
Disk spill for extreme payloads ✅ Stable
Hold mode with from_buffer zero-copy ✅ Stable
SHM residence monitoring (cc.hold_stats()) ✅ Stable
Async interfaces 🔜 Planned
Cross-language clients (TypeScript/Rust) 🔮 Future

See the full roadmap for details.


License

MIT


Built for scientific Python. Powered by Rust.

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

c_two-0.4.3.tar.gz (195.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

c_two-0.4.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp314-cp314t-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

c_two-0.4.3-cp314-cp314t-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

c_two-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp314-cp314-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

c_two-0.4.3-cp314-cp314-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

c_two-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp313-cp313-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

c_two-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

c_two-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp312-cp312-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

c_two-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

c_two-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp311-cp311-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

c_two-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

c_two-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

c_two-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

c_two-0.4.3-cp310-cp310-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

c_two-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file c_two-0.4.3.tar.gz.

File metadata

  • Download URL: c_two-0.4.3.tar.gz
  • Upload date:
  • Size: 195.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for c_two-0.4.3.tar.gz
Algorithm Hash digest
SHA256 8a6dd93f1f34e7781707f7317187dabd727e7d2d343051e8eacb1be4b2899166
MD5 910a3f4a7ffad04d08fcf819d6e9bf5a
BLAKE2b-256 1d61786238e7a3d53cd36c7a74148b1d049524b4703abeba6c15f74537cef8e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3.tar.gz:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cdd41a2694e503317abfe644cce3116eb4e2b49fed3142451f12f822ff7376ea
MD5 0ff7e46dc250e1cf19f22432d5660086
BLAKE2b-256 b43ce41e8b3b78b953c0ce64bead20468cef7f481662d1a33fa0faab7463a060

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6aef269fc84c08b778607d4d89518ef1d17f7381b7f0175fad8ad0645b4f83d7
MD5 2aeae36cd656e569ef0d2ca6fced2bde
BLAKE2b-256 43be611b0c8e17a0c1cb3c615092ffc89a38c5fefb2b63042ddba86ae098b277

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e66289f55f9f7999cfe8a4a1dd1ff380aa0681ff090e5ea1ec94e5e177ee5c93
MD5 43f34d962f49c8fd5664753b2607086f
BLAKE2b-256 c0be31443997bd0ffe98c37554e58a31720f6b3046c3649e31ba8f8e2b4e96d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a7edf7747ecb022e0772c11ec9599282de94291b31297fd1fae7f82f7eee55a4
MD5 e4fbfc64dd6aaa734473e222bee76e10
BLAKE2b-256 59ef8f59237280c1b831a54886f76e954ada3697c3df33782836a344e127e860

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314t-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 36d6526da2c3f1a9750505c2b083f3d03838c9921aa90216a14cd0bec5562650
MD5 90d112343c180562d90f06f7c6b733ca
BLAKE2b-256 8fc984c8714705f482e70c6dd71ab63a8df9dad4dbe41143d0027dad8e663395

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4cf2589a939c81fb122a6c326316f1047f80b4e00f4cf01f265cf70843906153
MD5 6e7237d55d90dc5e168c544be9281afe
BLAKE2b-256 93a3454ed88d0619bd54eac1054ff9adff41c76bd5d7986f6e1c17b6ecab0ea6

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fea1886f84eddd60e7c53dd836e76bf4dc78ad21a321642b185a98cb49ecc594
MD5 2f79d0410855e8a140ae6e3cd3519ca1
BLAKE2b-256 47dad7dc892e31b7c07cd59610356ec99aeee8698d1e25aad06bde83e42e1f5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5a6e012a22666c9a2152236474f7b6b875233145bcc515c99a43546aee7651fb
MD5 819afcbe5ef1c7ebe75fc52a35c40dd7
BLAKE2b-256 f47da707d5fce9a8e9d3194ca1e89a02df0a762dee5101ae3fc68c39cd25de16

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 653a569180668433f492a224ee75bc6f7bd2164cedfb0d9adf87c5898b67b905
MD5 c9da0cf46fec4565979d0f9f5519425b
BLAKE2b-256 fc3ac7c93f6a7b23c91d78729eff10cf245696324aff99ce43de85ebd0755df2

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b8a3baf2a935ddea2a39152b302423337258e7a5f72aab28ee76ec40b101ade6
MD5 ca3e1a28ebe9fb440cd3c4393d27e2b2
BLAKE2b-256 29196437529e9f9184a313138ec2ce218c4e230acd72952c262c1db1de964b9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 610860d73f5eb2de1679a4967729777dfcce23a1290a73b3f4fffb00941c79e6
MD5 5cd1a02959d75edccb2c0bdc2367e65d
BLAKE2b-256 68626a93a728b5cf4fae8c1786e4694811fa17a1467cf7e2dddc817a1614af8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 98176fbc995b396020df5cba175c334d8849b4acdcd12250176c36ad5d6dca6b
MD5 ea145199fd8a42389155e99b626794dd
BLAKE2b-256 34b32879273a42d44d0364b493d2acee7b21b02c49f71a97945653e3130511f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 05096f736b7b58218ce843b6d8d1ea7b67e338f96e48d81990e6920431635e57
MD5 434b6a18facb1d3f8c69d7f85436f378
BLAKE2b-256 ab7ada666fad2cd26690fb6d44a70623f4b6bf15f7e0d2317c28868d57952c3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8d141ca1e761fde7b203408847f62b576f7ecd0d44cd004fea63e452cc680457
MD5 9eaa940629617bbeae7002695d428f45
BLAKE2b-256 090932a8ddd5bf1070088bb8a49fb25737a2a5bbe120233c0f33a5aa2ae10652

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8cbdc5474d5a7a0988504732f8cd95b28735c1074cc351862b3065c59847121
MD5 1b0cc7dff1538f6a18157c3dbaa6fa97
BLAKE2b-256 82f59e9b4fe9298b696b486d95c80bde1130ef55ef955bf199945ca51e37b68f

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6c8b4291e741e3ee6bd535b86752fcaee9b4ab133a3a665e90c4fbc4b24d3b5b
MD5 93d12c301d2f21eabd729cf6ef609df0
BLAKE2b-256 27d3562d693bd41113ce96375cf5d2aa6f4d1b95119f3014319539c88fd6c33d

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c2caa8a545f3f021c5f138d89c06e597e500d0794fe118eb46f7d0f7e36a74b
MD5 a5d3565e4021221243940dc23484ffb1
BLAKE2b-256 aa721855fd06eb137daf0ad50c0a39bcd7a542b685398958b7382e69341095fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0efa16913492916757c47a3264526a6f400813b9942dfce3f36fe4cf0e417673
MD5 6f21d3c2db5c146cecbb2148bb5d46b3
BLAKE2b-256 59850d4955fab42ab87b222e99adecf968463a12f806e242a96509eec89ab7d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2d9db7ec8699726a50d5023536a33b122a04e75b451d151aedb7ad9229931bf6
MD5 aba93d827979666d134ee32a19656b5c
BLAKE2b-256 a194b6c57c35dcd5029a622acbb8f00af0627ceb69e9592e34d06f7bc404e46f

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7f7f7615b906cf8b452417cbfc5d0d1507b0a1751ba98a886761bde08c4942e0
MD5 4cbe7f8d3185f91000592476e7f28095
BLAKE2b-256 475fc308cf296ced64f7de3921a5803bd801c5032281ef9f54b0d32357dab9d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae65153b41db702de6d994f9a505074144d4959b39459830a1b3d4b2929656e5
MD5 45d3e4298ebc185fa809f9bffbc3ff88
BLAKE2b-256 e12c57c356a731a6d45d84a4c95464f39689171b4de1725484bc8c2c41cc4df5

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f9912fad03056b66dc3f9507b238cfa9c34946c21db179da467118ec816e718e
MD5 45e4f35838ceec6e31179a9077dd0003
BLAKE2b-256 022713dad4ec6fd62d003cbcc8a474d922f7f3670ce82545a1000c533f39b53c

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d8bd1f7fe94e28b7fa850caa4d6450d5bb04946ec0289cfbb74bf16ff6a229c8
MD5 0c956e381f0b1badcc566762685cddce
BLAKE2b-256 53f69499492a0d229e9cf2c83e1cbfe917b80cc1c40f3288a266bf64861789c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file c_two-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for c_two-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ca4ab63d894e29703ece2b94751b763cf36c27ac9f6fa341f1c36185da5445ca
MD5 5f57350803d78f15b4d64a6d081476bc
BLAKE2b-256 dd3adab34d26df4141c026da6bb7c11647a4a9c14437996b6c890a261e09da9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for c_two-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: release.yml on world-in-progress/c-two

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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