Skip to main content

pysof - SQL on FHIR for Python

PyPI version Python versions License: MIT Downloads

High-performance FHIR data transformation for Python. Transform FHIR resources into tabular formats (CSV, JSON, Parquet) using declarative ViewDefinitions from the SQL on FHIR specification.

Built in Rust for speed, exposed to Python with a simple, Pythonic API. Part of the Helios FHIR Server project.

✨ Key Features

  • 🚀 High Performance: Native Rust implementation with minimal Python overhead
  • 📊 Multiple Output Formats: CSV, JSON, NDJSON, and Parquet
  • 🔄 Parallel Processing: Automatic multithreading with 5-7x speedup on multi-core systems
  • 📦 Streaming Support: Memory-efficient chunked processing for large NDJSON files
  • 🌐 Multi-Version FHIR: Supports R4, R4B, R5, and R6 (based on build features)
  • 🎯 Type-Safe: Leverages Rust's type safety with a Pythonic interface
  • ⚡ GIL-Friendly: the GIL is released during parsing and processing, so other Python threads stay responsive
  • 📨 Flexible Input: ViewDefinitions and Bundles as Python dicts or pre-serialized JSON (str/bytes)

🎯 Why pysof?

Working with FHIR data in Python just got faster. pysof lets you:

  • Transform complex FHIR resources into clean, analyzable tables without writing custom parsers
  • Process large datasets efficiently with automatic parallel processing and Rust-level performance
  • Use standard SQL on FHIR ViewDefinitions for portable, maintainable data transformations
  • Export to multiple formats (CSV, JSON, NDJSON, Parquet) for analytics, ML, or reporting workflows

Perfect for healthcare data engineers, researchers, and developers building FHIR-based analytics pipelines.

📥 Installation

pip install pysof

Supported Platforms:

  • Linux: x86_64 (glibc and musl)
  • Windows: x86_64 (MSVC)
  • macOS: AArch64 (Apple Silicon)
  • Python: 3.10, 3.11, 3.12, 3.13, 3.14

From GitHub Releases

Download pre-built wheels from the releases page:

pip install pysof-*.whl

🚀 Quick Start

Transform FHIR patient data to CSV in just a few lines:

import pysof

# Define what data to extract
view_definition = {
    "resourceType": "ViewDefinition",
    "id": "patient-demographics",
    "name": "PatientDemographics",
    "status": "active",
    "resource": "Patient",
    "select": [{
        "column": [
            {"name": "id", "path": "id"},
            {"name": "family_name", "path": "name.family"},
            {"name": "given_name", "path": "name.given.first()"},
            {"name": "gender", "path": "gender"},
            {"name": "birth_date", "path": "birthDate"}
        ]
    }]
}

# Sample FHIR Bundle
bundle = {
    "resourceType": "Bundle",
    "type": "collection",
    "entry": [{
        "resource": {
            "resourceType": "Patient",
            "id": "patient-1",
            "name": [{"family": "Doe", "given": ["John"]}],
            "gender": "male",
            "birthDate": "1990-01-01"
        }
    }]
}

# Transform to CSV
csv_output = pysof.run_view_definition(view_definition, bundle, "csv")
print(csv_output.decode('utf-8'))
# Output:
# id,family_name,given_name,gender,birth_date
# patient-1,Doe,John,male,1990-01-01

📖 Usage

Multiple Output Formats

import pysof
import json

# Transform to different formats
csv_result = pysof.run_view_definition(view_definition, bundle, "csv")
json_result = pysof.run_view_definition(view_definition, bundle, "json")
ndjson_result = pysof.run_view_definition(view_definition, bundle, "ndjson")
parquet_result = pysof.run_view_definition(view_definition, bundle, "parquet")

print("CSV Output:")
print(csv_result.decode('utf-8'))

print("\nJSON Output:")
data = json.loads(json_result.decode('utf-8'))
print(json.dumps(data, indent=2))

Advanced Options

import pysof

# Transform with pagination and filtering
result = pysof.run_view_definition_with_options(
    view_definition,
    bundle,
    "json",
    limit=10,                          # Limit results
    page=1,                            # Page number
    since="2023-01-01T00:00:00Z",     # Filter by modification date
    fhir_version="R4"                  # Specify FHIR version
)

Remote resolve() (Trusted Servers)

resolve() dereferences references against the input bundle by default. You can optionally let it fetch references that point at explicitly trusted FHIR servers and fold them into the resolution pool before rows are generated. This is off by default and gated by a strict allowlist (matching scheme + host + port

  • path-prefix; private/loopback addresses are blocked unless opted in).
import pysof

config = pysof.RemoteResolveConfig(
    ["https://fhir.example.org/r4"],   # trusted base URLs (allowlist)
    max_fetches=256,                    # per-run/-stream fetch cap
    max_depth=1,                        # chained-reference rounds
    allow_private_addresses=False,      # allow internal LBs (e.g. Traefik) by hostname
    bearer_tokens={"fhir.example.org": "TOKEN"},  # optional per-host auth
)

# Or build it from SOF_RESOLVE_* environment variables:
# config = pysof.RemoteResolveConfig.from_env()

result = pysof.run_view_definition_remote(
    view_definition, bundle, "json", config, fhir_version="R4"
)

# Streaming NDJSON with remote resolve() (one shared cache across chunks):
stats = pysof.process_ndjson_to_file_remote(
    view_definition, "input.ndjson", "output.json", "ndjson", config, chunk_size=1000
)

When config.is_active() is False (disabled or empty allowlist) these behave exactly like their non-remote counterparts. Enabling remote resolution makes output depend on remote server state at run time. See the SQL-on-FHIR guide for the full security model and configuration reference.

Utility Functions

import pysof

# Validate structures
is_valid_view = pysof.validate_view_definition(view_definition)
is_valid_bundle = pysof.validate_bundle(bundle)

# Parse content types
format_str = pysof.parse_content_type("text/csv")  # Returns "csv_with_header"

# Check supported FHIR versions
versions = pysof.get_supported_fhir_versions()  # Returns ["R4"] or more
print(f"Supported FHIR versions: {versions}")

# Package info
print(f"Version: {pysof.get_version()}")
print(pysof.get_status())

Streaming Large NDJSON Files

For memory-efficient processing of large NDJSON files, use the ChunkedProcessor iterator or process_ndjson_to_file function:

import pysof

view_definition = {
    "resourceType": "ViewDefinition",
    "status": "active",
    "resource": "Patient",
    "select": [{"column": [
        {"name": "id", "path": "id"},
        {"name": "gender", "path": "gender"}
    ]}]
}

# Iterator approach - process chunks incrementally
for chunk in pysof.ChunkedProcessor(view_definition, "patients.ndjson", chunk_size=500):
    print(f"Chunk {chunk['chunk_index']}: {len(chunk['rows'])} rows")
    for row in chunk["rows"]:
        process_row(row)
    if chunk["is_last"]:
        print("Processing complete!")

# Access column names before iterating
processor = pysof.ChunkedProcessor(view_definition, "patients.ndjson")
print(f"Columns: {processor.columns}")
for chunk in processor:
    # Process chunks...
    pass

# File-to-file approach - most memory efficient
stats = pysof.process_ndjson_to_file(
    view_definition,
    "input.ndjson",
    "output.csv",
    "csv",  # or "csv_with_header", "ndjson"
    chunk_size=1000,
    skip_invalid=True,  # Continue past invalid JSON lines
    fhir_version="R4"
)
print(f"Processed {stats['resources_processed']} resources")
print(f"Output {stats['output_rows']} rows in {stats['chunks_processed']} chunks")
print(f"Skipped {stats['skipped_lines']} invalid lines")

When to use streaming:

  • Processing NDJSON files larger than available memory
  • Working with datasets of 100K+ resources
  • Building ETL pipelines that process data incrementally
  • When you need fault-tolerant processing (skip invalid lines)

Error Handling

import pysof

try:
    result = pysof.run_view_definition(view_definition, bundle, "json")
except pysof.InvalidViewDefinitionError as e:
    print(f"ViewDefinition validation error: {e}")
except pysof.SerializationError as e:
    print(f"JSON parsing error: {e}")
except pysof.UnsupportedContentTypeError as e:
    print(f"Unsupported format: {e}")
except pysof.SofError as e:
    print(f"General SOF error: {e}")

⚡ Performance

Automatic Parallel Processing

pysof automatically processes FHIR resources in parallel using rayon:

  • 5-7x speedup on typical batch workloads with multi-core CPUs
  • Streaming benefits: ChunkedProcessor and process_ndjson_to_file also use parallel processing
  • Zero configuration - parallelization is always enabled
  • Python GIL released during parsing and processing, so other Python threads stay responsive

Because each call already fans out across all cores via rayon's shared thread pool, running pysof from multiple Python threads does not multiply throughput — one call can saturate the machine. Use Python threads for concurrency (overlapping I/O, serving requests), not to speed up transforms.

Pass Pre-Serialized JSON for Maximum Speed

If your data is already JSON text (from a file, an HTTP body, a database), pass the str or bytes directly instead of json.loads-ing it first:

view_json: str = load_view_definition_text()
bundle_json: bytes = fetch_bundle_bytes()

result = pysof.run_view_definition(view_json, bundle_json, "csv")

This skips the Python-dict conversion entirely and parses the JSON with the GIL released — measured 20-27% faster per call on large bundles, with GIL hold time dropping from tens of milliseconds to microseconds.

Performance Benchmarks

Measured with scripts/bench_threading.py (a 7-column Patient ViewDefinition; Windows 11, 12 logical CPUs, Python 3.11, release build with mimalloc):

Path Dataset Throughput
Batch (dict input) 2,000-patient bundle ~28k patients/sec
Batch (JSON str input) 2,000-patient bundle ~31k patients/sec
Streaming (process_ndjson_to_file) 5,000-patient NDJSON ~31k patients/sec

Numbers vary with hardware and ViewDefinition complexity — re-run scripts/bench_threading.py on your target machine.

Streaming mode (ChunkedProcessor, process_ndjson_to_file) keeps memory bounded by chunk_size regardless of input size, so it is recommended for large NDJSON files; batch mode holds the whole bundle and result in memory.

Controlling Thread Count (RAYON_NUM_THREADS)

Set the RAYON_NUM_THREADS environment variable to control parallel processing:

import os
os.environ['RAYON_NUM_THREADS'] = '4'  # Must be set before first import

import pysof
result = pysof.run_view_definition(view_definition, bundle, "json")

Or from the command line:

# Linux/Mac
RAYON_NUM_THREADS=4 python my_script.py

# Windows PowerShell
$env:RAYON_NUM_THREADS=4
python my_script.py

When to adjust thread count:

  • Reduce threads (RAYON_NUM_THREADS=2-4): On shared systems, containers with CPU limits, or when running multiple instances
  • Increase threads: Rarely needed; rayon auto-detects available cores
  • Single thread (RAYON_NUM_THREADS=1): For debugging or deterministic output ordering

Performance Tips:

  • Use all available cores for large datasets (default behavior)
  • Limit threads on shared systems to avoid resource contention
  • Prefer streaming mode (ChunkedProcessor) for NDJSON files > 100MB

📋 Supported Features

Output Formats

Format Description Output
csv CSV with headers Comma-separated values with header row
json JSON array Array of objects, one per result row
ndjson Newline-delimited JSON One JSON object per line
parquet Parquet format Columnar binary format for analytics

FHIR Versions

  • R4 (default, always available)
  • R4B (if compiled with R4B feature)
  • R5 (if compiled with R5 feature)
  • R6 (if compiled with R6 feature)

Use pysof.get_supported_fhir_versions() to check available versions in your build.


🔧 Development

Requirements

  • Python 3.10 or later (3.10, 3.11, 3.12, 3.13, 3.14 supported)
  • uv (package and environment manager)
  • Rust toolchain (for building from source)

Note: This crate is excluded from the default workspace build. When running cargo build from the repository root, pysof will not be built automatically.

Building from Source

Building with Cargo

This crate is excluded from the default workspace build to allow building the core Rust components without Python. To build it explicitly:

# Your current directory MUST be the pysof crate:
cd crates/pysof

# From the pysof folder
cargo build

# Or build with specific FHIR version features
cargo build -p pysof --features R4,R5

For Python development, it's recommended to use maturin via uv:

# From repo root
cd crates/pysof

# Create a venv with your preferred Python version (3.10+)
uv venv --python 3.11  # or 3.10, 3.12, 3.13, 3.14

# Install the project dev dependencies
uv sync --group dev

# Build and install the Rust extension into the venv
uv run maturin develop --release

# Build distributable artifacts
uv run maturin build --release -o dist     # wheels
uv run maturin sdist -o dist               # source distribution

# Sanity checks
uv run python -c "import pysof; print(pysof.__version__); print(pysof.get_status()); print(pysof.get_supported_fhir_versions())"

Installing from Source

Requires Rust toolchain:

# Install directly
pip install -e .

# Or build wheel locally
maturin build --release --out dist
pip install dist/*.whl

Testing

The project has separate test suites for Python and Rust components:

Python Tests

Run the comprehensive Python test suite:

# Run all Python tests
uv run pytest python-tests/

# Run specific test files
uv run pytest python-tests/test_core_functions.py -v
uv run pytest python-tests/test_content_types.py -v
uv run pytest python-tests/test_import.py -v

# Run with coverage
uv run pytest python-tests/ --cov=pysof --cov-report=html

# Run tests with detailed output
uv run pytest python-tests/ -v --tb=short

Rust Tests

Run the Rust unit and integration tests:

# Run all Rust tests
cargo test

# Run unit tests only
cargo test --test lib_tests

# Run integration tests only
cargo test --test integration

# Run with verbose output
cargo test -- --nocapture

Configuring FHIR Version Support

By default, pysof is compiled with R4 support only. You can configure which FHIR versions are available by modifying the feature compilation settings.

Change Default FHIR Version

To change from R4 to another version (e.g., R5):

  1. Edit crates/pysof/Cargo.toml:

    [features]
    default = ["R5"]  # Changed from ["R4"]
    R4 = ["helios-sof/R4", "helios-fhir/R4"]
    R4B = ["helios-sof/R4B", "helios-fhir/R4B"]
    R5 = ["helios-sof/R5", "helios-fhir/R5"]
    R6 = ["helios-sof/R6", "helios-fhir/R6"]
    
  2. Rebuild the extension:

    cd crates/pysof
    uv run maturin develop --release
    
  3. Verify the change:

    uv run python -c "
    import pysof
    versions = pysof.get_supported_fhir_versions()
    print('Supported FHIR versions:', versions)
    "
    

    This should now show ['R5'] instead of ['R4'].

Enable Multiple FHIR Versions

To support multiple FHIR versions simultaneously:

  1. Edit crates/pysof/Cargo.toml:

    [features]
    default = ["R4", "R5"]  # Enable both R4 and R5
    # Or enable all versions:
    # default = ["R4", "R4B", "R5", "R6"]
    
  2. Rebuild and verify:

    uv run maturin develop --release
    uv run python -c "import pysof; print(pysof.get_supported_fhir_versions())"
    

    This should show ['R4', 'R5'] (or all enabled versions).

  3. Use specific versions in code:

    import pysof
    
    # Use R4 explicitly
    result_r4 = pysof.run_view_definition(view, bundle, "json", fhir_version="R4")
    
    # Use R5 explicitly  
    result_r5 = pysof.run_view_definition(view, bundle, "json", fhir_version="R5")
    

Build with Specific Features (Without Changing Default)

To temporarily build with different features without modifying Cargo.toml:

# Build with only R5
cargo build --features R5 --no-default-features

# Build with R4 and R6
cargo build --features R4,R6 --no-default-features

# With maturin
uv run --with maturin -- maturin develop --release --cargo-extra-args="--features R5 --no-default-features"

Testing After Version Changes

After changing FHIR version support, run the test suite to ensure compatibility:

# Run all tests
uv run pytest

# Run FHIR version-specific tests
uv run pytest tests/test_fhir_versions.py -v

# Test with your new default version
uv run python -c "
import pysof

# Test with default version (should be your new default)
view = {'resourceType': 'ViewDefinition', 'id': 'test', 'name': 'Test', 'status': 'active', 'resource': 'Patient', 'select': [{'column': [{'name': 'id', 'path': 'id'}]}]}
bundle = {'resourceType': 'Bundle', 'type': 'collection', 'entry': [{'resource': {'resourceType': 'Patient', 'id': 'test'}}]}

result = pysof.run_view_definition(view, bundle, 'json')
print('Default version test successful:', len(result), 'bytes')
"

Project layout

crates/pysof/
├─ pyproject.toml          # PEP 621 metadata, Python >=3.8, uv-compatible
├─ README.md
├─ src/
│  ├─ pysof/
│  │  └─ __init__.py       # Python package root
│  └─ lib.rs               # Rust PyO3 bindings
├─ tests/                  # Rust tests (17 tests)
│  ├─ lib_tests.rs         # Unit tests for core library functions
│  ├─ integration.rs       # Integration tests for component interactions
│  └─ integration/         # Organized integration test modules
│     ├─ mod.rs
│     ├─ content_types.rs
│     ├─ error_handling.rs
│     └─ fhir_versions.rs
├─ python-tests/           # Python test suite (58 tests)
│  ├─ __init__.py
│  ├─ test_core_functions.py
│  ├─ test_content_types.py
│  ├─ test_fhir_versions.py
│  ├─ test_import.py
│  └─ test_package_metadata.py
└─ Cargo.toml              # Rust crate metadata

📄 License

MIT License - See LICENSE.md for details.

Copyright (c) 2025 Helios Software

🤝 Contributing

Contributions are welcome! Please see our Contributing Guidelines for details.

Reporting Issues

Development Setup

See the Development section above for instructions on setting up your development environment.

🙏 Acknowledgments

Built with:

  • PyO3 - Rust bindings for Python
  • maturin - Build system for Rust Python extensions
  • helios-sof - Core SQL-on-FHIR implementation in Rust

Part of the Helios FHIR Server project.


Made with ❤️ by Helios Software

Metadata

Release files for pysof 0.2.4

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

Source distribution (sdist)

Source distribution for pysof 0.2.4
File Size Uploaded
pysof-0.2.4.tar.gz 36.1 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for pysof 0.2.4
File
pysof-0.2.4-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
pysof-0.2.4-cp314-cp314-manylinux_2_34_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ x86-64 Details
pysof-0.2.4-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details
pysof-0.2.4-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
pysof-0.2.4-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
pysof-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
pysof-0.2.4-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
pysof-0.2.4-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
pysof-0.2.4-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
pysof-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
pysof-0.2.4-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
pysof-0.2.4-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
pysof-0.2.4-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
pysof-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
pysof-0.2.4-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
pysof-0.2.4-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pysof-0.2.4-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
pysof-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ x86-64 Details
pysof-0.2.4-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
pysof-0.2.4-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 695.5 MB

Release files / pysof-0.2.4.tar.gz

Download URL pysof-0.2.4.tar.gz
Size 36.1 MB
Tags Source
SHA-256 checksum
How to use checksums
1c5f020d68a402776849f3ff15b7dd22fc11c3a3a61de8318955f6e10a1f837e
BLAKE2b-256 checksum
How to use checksums
4bea66105dc5045dcf10cf343f2b171ead2af8f6c5f434b0f9257e4c3b62a3e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp314-cp314-win_amd64.whl

Download URL pysof-0.2.4-cp314-cp314-win_amd64.whl
Size 36.5 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
229637ae382e43ba8a40bd7f75305ae80a322aee71137a51aa3776f3301550a0
BLAKE2b-256 checksum
How to use checksums
d8ae4270adf61ba58010deb417cd9d41638e4ea97b431e3bebd93dc7047a639d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp314-cp314-manylinux_2_34_x86_64.whl

Download URL pysof-0.2.4-cp314-cp314-manylinux_2_34_x86_64.whl
Size 34.3 MB
Tags CPython 3.14 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
a4c1685b19f2ab73e4cf198d52547f56ce704192f7aada6a6f7cb9833482cbeb
BLAKE2b-256 checksum
How to use checksums
19ad55b51515faa3f2840155448d2cb47f17348b642589d1f5de19f9de4fc3df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL pysof-0.2.4-cp314-cp314-manylinux_2_28_aarch64.whl
Size 33.2 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
a64bc1512dfa454f853a91aab2150441559ecf61069d8ba7965ae671f4083ebb
BLAKE2b-256 checksum
How to use checksums
531595dae90bbe747f65f92b9b8cd2d5c4636acfcf7e6e465cb023f03a65b052
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp314-cp314-macosx_11_0_arm64.whl

Download URL pysof-0.2.4-cp314-cp314-macosx_11_0_arm64.whl
Size 27.9 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3d1e0860aa42196519d1be752a01828e712e6ca40b5ff1bfc2aefad365323358
BLAKE2b-256 checksum
How to use checksums
bae8cfc207b9d562d7b6ddbbf64aa0e00f5b09cceee68defaf690c3d7568f891
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp313-cp313-win_amd64.whl

Download URL pysof-0.2.4-cp313-cp313-win_amd64.whl
Size 36.5 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
879ed5e6d54c74e4c99344b3503aa9b37934aebab11e82946514d753e7f07589
BLAKE2b-256 checksum
How to use checksums
4889f0f6bc03879c8d3ac1ed7a88ce8da35194b353a97d6be079c5eef5f66abc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl

Download URL pysof-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl
Size 34.3 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
cf7e14b4aceae7ad0c12068bbee2e0c723d1e478ef1927add5f2f78d6a8aca08
BLAKE2b-256 checksum
How to use checksums
68e5fc8abef87e455d8af170c7ea95266e35d9463ffdd873772cd038fcdf1392
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL pysof-0.2.4-cp313-cp313-manylinux_2_28_aarch64.whl
Size 33.2 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
4b295d8ae23871bc036ec05ddb84740840e88e29631eb692201b0e65720b2b84
BLAKE2b-256 checksum
How to use checksums
22a3284a3f4e91d0b116fc830a7deba2cc8a2e7458526a275adc88561d822014
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp313-cp313-macosx_11_0_arm64.whl

Download URL pysof-0.2.4-cp313-cp313-macosx_11_0_arm64.whl
Size 27.9 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c84ffbc1d3b96fa9e51502acd95593b205520264575d2b22068cb203f4935105
BLAKE2b-256 checksum
How to use checksums
0dd1e03a84bb98c2b347bb689069e887e2bd45351ce15b74967912c80fbc538e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp312-cp312-win_amd64.whl

Download URL pysof-0.2.4-cp312-cp312-win_amd64.whl
Size 36.5 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
0fd138cb07a639b90deae2dd29124df91d7f527fa9998da7bc40cd43dd75285e
BLAKE2b-256 checksum
How to use checksums
1b860106e9cc12534f322c6e9109968e638517deb0e31e7c56e092ba3670917f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL pysof-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl
Size 34.3 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
405ec3bbf4644f132ddb660fd338395bd1866be1025ed88ca590a2d82be2c737
BLAKE2b-256 checksum
How to use checksums
ebc23a01c1cb9991fa5065405b79ee6f674a589733d4a659514107c8cbc55654
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL pysof-0.2.4-cp312-cp312-manylinux_2_28_aarch64.whl
Size 33.2 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
ab69d128e19420698c2a6ee939c6eaf8215374865e9a8ccd92883028f189b116
BLAKE2b-256 checksum
How to use checksums
39b776c3ae2adee474ff0aadd587d879c38ff194f4ea858142ceca582eb7a8d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp312-cp312-macosx_11_0_arm64.whl

Download URL pysof-0.2.4-cp312-cp312-macosx_11_0_arm64.whl
Size 27.9 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
93a8bd0bb7498d4ff3bf12b5162beb44a948f3aaf9c9f8c79701ffb13ded3bc5
BLAKE2b-256 checksum
How to use checksums
ce5fcd5d210bcc770097b2409a6be68b775ed8de290835a0cfb91a9d879c86e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp311-cp311-win_amd64.whl

Download URL pysof-0.2.4-cp311-cp311-win_amd64.whl
Size 36.5 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
b0201bd2c6f3b359db91bdb4fa8c20dbb523160b89cdee887d1f395d5a93aed6
BLAKE2b-256 checksum
How to use checksums
7b4de61b91d02a7facd6174c510b5eaef5792c85b933c0b41675c5b7e5c6cde0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl

Download URL pysof-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl
Size 34.3 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
0b47940d93775ec2fb2bc79aa975dd9129a4e0bc8adee1a5efac6cf1f2f3669b
BLAKE2b-256 checksum
How to use checksums
43b75d54eeb5a52832e0ebcf2e320daa173bf92dc8e7aa981a9ad489833e6313
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL pysof-0.2.4-cp311-cp311-manylinux_2_28_aarch64.whl
Size 33.2 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
eab6fd706f9e250c63468b16091fdc94b0144902961354772875c039ae50114e
BLAKE2b-256 checksum
How to use checksums
44be14a2b96036b3212ba23fbb8de091c12a4924dd8284648a65695654bf09bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp311-cp311-macosx_11_0_arm64.whl

Download URL pysof-0.2.4-cp311-cp311-macosx_11_0_arm64.whl
Size 27.9 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
58c8d3f1e2598dbeaa22c9b88fc131625ed61adabbae0413bd0e6ed3b37257d0
BLAKE2b-256 checksum
How to use checksums
be6388bc095a6796089e73498cb629c8fd1e792ae7ff11e6975858b8cdbacd4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp310-cp310-win_amd64.whl

Download URL pysof-0.2.4-cp310-cp310-win_amd64.whl
Size 36.5 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
5562d05376a06e248355bb35ca1899977b7b5e34c57fd1183f8c5f5dfb95bb25
BLAKE2b-256 checksum
How to use checksums
154ded2a156783ed259a22eb3b3bec4d9d08fc820add5ce2090bf7dd73853c8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl

Download URL pysof-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl
Size 34.3 MB
Tags CPython 3.10 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
1d5faab02878090d677b3512a06379b7b3bdd940d893abed7dedb5335f31a1d7
BLAKE2b-256 checksum
How to use checksums
4a8f4aff17eda435752c567953a25913d1312980a6acf84f9fe2d6e34727a5ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL pysof-0.2.4-cp310-cp310-manylinux_2_28_aarch64.whl
Size 33.2 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
291949c01087e356a9bdf814610f6adf022e387e7df9f69922427ca3bb2021de
BLAKE2b-256 checksum
How to use checksums
b1014ae18db34cf6cc15cb89376315b999d23429173429debe3966653bc6b3e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release files / pysof-0.2.4-cp310-cp310-macosx_11_0_arm64.whl

Download URL pysof-0.2.4-cp310-cp310-macosx_11_0_arm64.whl
Size 27.9 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
749cc52d1ac003b60491183e42cd4c37e1590b0e971fc958bbd2d988a73b89b5
BLAKE2b-256 checksum
How to use checksums
0ea11bca10334e0349eee7c03e1005924fc455459fb67fd3f7f3b9ca2b9ee322
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.3

Release history Release notifications | RSS feed

This release

0.2.4 This release

21 release files

0.2.3

21 release files

0.2.1

21 release files

0.2.0

21 release files

0.1.27

4 release files

0.1.3

4 release files

0.1.2

3 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