Skip to main content

C++ accelerated CSV preprocessing and data cleaning for pandas

Project description


Arnio



Your CSV hits C++ before Python even wakes up.


Arnio is a compiled C++ data cleaning engine that slots in before pandas.
It parses, infers types, strips whitespace, deduplicates, and normalizes —
all natively, in columnar memory — then hands you a pristine DataFrame.
No .apply(). No lambda chains. No spaghetti.


PyPI  Python  CI  Coverage  MIT  GSSoC 2026  Join Discord PyPI Downloads



pip install arnio

Quickstart · Why Arnio · Architecture · Benchmarks · Community · Contribute




⚡ Quickstart

Three lines. That's the entire workflow.

import arnio as ar

# Load CSV directly through C++ — no Python parsing overhead
frame = ar.read_csv("messy_sales_data.csv")

# Declare what clean data looks like — arnio handles the rest
clean = ar.pipeline(frame, [
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("fill_nulls", {"value": 0.0, "subset": ["revenue"]}),
    ("drop_nulls",),
    ("drop_duplicates",),
])

# Out comes a standard pandas DataFrame — use it like you always have
df = ar.to_pandas(clean)

Select specific columns

Use select_columns() to create a new ArFrame with only the required columns before converting to pandas.

selected = frame.select_columns(["name", "revenue"])

print(selected.columns)
# ['name', 'revenue']

Every step above executes in C++. Your Python code is a configuration — not the execution engine.


📸 Peek at a 100 GB file without loading it

scan_csv reads only the header + a sample to infer the schema. Zero data loaded.

schema = ar.scan_csv("100GB_file.csv")
# {'id': 'int64', 'name': 'string', 'is_active': 'bool', 'revenue': 'float64'}

Useful for exploring datasets before committing memory.

👀 Preview rows without pandas conversion or full-column Python list materialization

preview() reads only the first n rows directly from the C++ frame — no pandas conversion triggered.

frame = ar.read_csv("huge_file.csv")

print(frame.preview())      # first 5 rows (default)
print(frame.preview(n=10))  # first 10 rows

Raises ValueError for invalid n (zero, negative, or non-integer).

🧩 Add custom steps without touching C++

Register any Python function as a pipeline step. It receives a DataFrame, returns a DataFrame.

def remove_outliers(df, column="revenue", threshold=100_000):
    return df[df[column] <= threshold]

ar.register_step("remove_outliers", remove_outliers)

# Now use it in any pipeline alongside native C++ steps
clean = ar.pipeline(frame, [
    ("strip_whitespace",),
    ("remove_outliers", {"column": "revenue", "threshold": 50000}),
    ("drop_duplicates",),
])

Custom steps run through a pandas↔ArFrame conversion bridge. Prototype in Python, then optionally migrate hot paths to C++ for full speed.




🔍 Why Arnio exists

Every data project starts the same way:

df = pd.read_csv("data.csv")              # 💥 RAM spike — entire file as raw strings
df.columns = df.columns.str.strip()        # Why is this not automatic?
df["name"] = df["name"].str.strip()        # Python loop over every cell
df["name"] = df["name"].str.lower()        # Another Python loop
df = df.dropna()                           # Another pass
df = df.drop_duplicates()                  # Another pass

Six lines. Four full-data passes. All in interpreted Python. This is fine for a Jupyter demo — but it doesn't scale, it doesn't compose, and it definitely doesn't belong in production.

Arnio intercepts this entire pattern. It moves the heavy lifting to C++, replaces imperative chains with a declarative pipeline, and gives you a clean DataFrame in one shot.

Without Arnio

df = pd.read_csv(path)
df.columns = df.columns.str.strip()
for col in str_cols:
    df[col] = df[col].str.strip()
    df[col] = df[col].str.lower()
df = df.dropna(subset=["revenue"])
df = df.drop_duplicates()
# 6+ lines, multiple passes, pure Python

With Arnio

frame = ar.read_csv(path)
df = ar.to_pandas(ar.pipeline(frame, [
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("drop_nulls", {"subset": ["revenue"]}),
    ("drop_duplicates",),
]))
# Declarative. Single pipeline. C++ execution.



🏗️ Architecture

Arnio is not a pandas wrapper. It's a separate runtime with its own data model.

┌──────────────────────────────────────────────────────────────┐
│  Your Python Code                                            │
│  frame = ar.read_csv("data.csv")                             │
│  clean = ar.pipeline(frame, [...])                           │
│  df = ar.to_pandas(clean)                                    │
└────────────────────────┬─────────────────────────────────────┘
                         │  pybind11 boundary
┌────────────────────────▼─────────────────────────────────────┐
│  C++ Runtime  (_arnio_cpp)                                   │
│                                                              │
│  ┌─────────────┐  ┌─────────────────┐  ┌──────────────────┐ │
│  │  CsvReader   │  │  Frame/Column   │  │  Cleaning Engine │ │
│  │  • RFC 4180  │  │  • Columnar     │  │  • drop_nulls    │ │
│  │  • BOM strip │  │  • std::variant │  │  • fill_nulls    │ │
│  │  • Type      │  │  • Bool null    │  │  • drop_dupes    │ │
│  │    inference │  │    masks        │  │  • strip_ws      │ │
│  │  • Quoted    │  │  • O(1) column  │  │  • normalize     │ │
│  │    fields    │  │    lookup       │  │  • rename/cast   │ │
│  └─────────────┘  └─────────────────┘  └──────────────────┘ │
│                                                              │
│  to_pandas() ──→ zero-copy NumPy buffer (numerics/bools)     │
└──────────────────────────────────────────────────────────────┘

Design decisions that matter

Decision What it means
Columnar storage Data lives in typed std::vectors — vector<int64_t>, vector<double>, vector<string> — not rows of variants. Cache-friendly and SIMD-ready.
Boolean null masks Nulls are tracked in a separate vector<bool>, keeping data vectors dense. No sentinel values, no NaN tricks.
Two-pass CSV read Pass 1 infers types across all rows. Pass 2 parses values directly into the correct typed column. No string→object→cast overhead.
Zero-copy bridge to_pandas() exposes C++ memory directly via NumPy's buffer protocol. Numeric and boolean columns cross the boundary without copying.
Step registry Pipeline steps map to C++ function pointers. Adding a new cleaning primitive is a single function + one registry entry.

Full architecture documentation: ARCHITECTURE.md




🏎️ Benchmarks

Reference environment: Ubuntu, Python 3.12, synthetic messy CSV inputs.
Reproduce: make benchmark — generates deterministic tall and wide datasets and runs both engines.

To reproduce the published numbers from a fresh checkout:

python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -e .
python benchmarks/generate_data.py
python benchmarks/benchmark_vs_pandas.py

benchmarks/generate_data.py uses deterministic NumPy seeds, so every run creates the same benchmarks/benchmark_1m.csv tall input and benchmarks/benchmark_wide.csv wide input. The benchmark then executes three pandas runs and three arnio runs for each case, printing average wall-clock time from time.perf_counter() and peak Python allocation from tracemalloc. For cleaner comparisons, close other memory-heavy processes and run the script from the repository root after installing the same Python, pandas, NumPy, compiler, and arnio commit you want to compare.

Expected output format:

Tall CSV (1,000,000 rows x 12 columns)
Metric                     pandas        arnio
────────────────────────────────────────────
Exec Time (avg)       4.73s         5.75s
Peak RAM               211MB         212MB
Speed: 0.8x | RAM: -1% reduction

Wide CSV (5,000 rows x 256 columns)
Metric                     pandas        arnio
────────────────────────────────────────────
Exec Time (avg)       ...s          ...s
Peak RAM              ...MB         ...MB
Speed: ...x | RAM: ...% reduction

Small differences are expected across CPUs, operating systems, compilers, Python builds, and pandas/NumPy versions. If you share benchmark results in an issue or PR, include your OS, Python version, CPU model, pandas/NumPy versions, arnio commit, and the full command output so maintainers can compare like for like.

Arnio is near memory parity in the reference benchmark while replacing ad-hoc Python string loops with a compiled, declarative pipeline. Validate memory and speed on your own workload. The execution time gap is a known, active optimization target — the current drop_duplicates and strip_whitespace implementations use unoptimized row-key serialization.

What's already won 🎯 What's being optimized
  • Native C++ parsing eliminates Python memory spikes
  • Columnar storage matches pandas' internal efficiency
  • Declarative API eliminates .apply() spaghetti
  • Zero-copy bridge for numeric conversions
  • drop_duplicates — replace string serialization with hash-based comparisons
  • strip_whitespace — in-place mutation instead of copy-on-write
  • Parallel column processing via std::thread
  • Help close the gap →



🧰 Cleaning primitives

Most operations below run natively in C++. The current filter_rows step uses the Python pipeline backend and may be optimized in C++ later.

Primitive What it does Example
drop_nulls Remove rows with null/empty values ar.drop_nulls(frame, subset=["age"])
filter_rows Filter rows using comparison operators ar.filter_rows(frame, column="age", op=">", value=18)
fill_nulls Replace nulls with a scalar ar.fill_nulls(frame, 0, subset=["revenue"])
drop_duplicates Deduplicate rows (first/last/none) ar.drop_duplicates(frame, keep="first")
drop_constant_columns Remove columns with only one unique value ar.drop_constant_columns(frame)
clip_numeric Clip numeric values to lower and/or upper bounds ar.clip_numeric(frame, lower=0, upper=100)
strip_whitespace Trim leading/trailing spaces from strings ar.strip_whitespace(frame)
normalize_case Force lower/upper/title case ar.normalize_case(frame, case_type="title")
rename_columns Rename columns via mapping ar.rename_columns(frame, {"old": "new"})
cast_types Cast column types ar.cast_types(frame, {"age": "int64"})
round_numeric_columns Round numeric columns (non-numeric columns in subset ignored safely) ar.round_numeric_columns(frame, decimals=2)
clean Convenience shorthand ar.clean(frame, drop_nulls=True)
safe_divide_columns Divide one column by another, handling zero/null denominators ar.safe_divide_columns(frame, numerator="revenue", denominator="cost", output_column="ratio")

Or compose them all into a pipeline:

clean = ar.pipeline(frame, [
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("fill_nulls", {"value": "unknown", "subset": ["city"]}),
    ("drop_duplicates", {"keep": "first"}),
])

🔎 Filter rows inside pipelines

Use filter_rows to keep only rows matching a condition.

clean = ar.pipeline(frame, [
    ("filter_rows", {
        "column": "revenue",
        "op": ">=",
        "value": 1000
    }),
])

Supported operators:

  • >
  • <
  • >=
  • <=
  • ==
  • !=

Works with:

  • integers
  • floats
  • strings
  • booleans

### 🔢 Safe column division

Divide one column by another while handling division by zero and null denominators explicitly:

result = ar.safe_divide_columns(
    frame,
    numerator="revenue",
    denominator="cost",
    output_column="ratio",
    fill_value=0.0,  # used when denominator is zero or null
)

When the denominator is zero or null, the result is replaced with fill_value (default 0.0) instead of raising an error or producing NaN/Inf.



📊 Pandas Dtype Support Matrix

This table helps users understand which pandas dtypes and workflows are fully supported, partially supported, unsupported, or planned.

If a dtype is partially supported, users may need conversion before processing. Unsupported dtypes should raise clear errors where applicable.

Pandas Dtype Support Status Notes
int64 ✅ Supported Fully supported with native C++ columnar storage
float64 ✅ Supported Fully supported with zero-copy conversion where possible
bool ✅ Supported Native supported boolean type
string ✅ Supported Recommended over object dtype for text workflows
datetime64[ns] ❌ Unsupported No native datetime parsing or conversion support yet
category ⚠️ Limited Converted to string/object during processing
object (mixed columns) ⚠️ Limited Mixed object columns may coerce to string and reduce type inference reliability
nullable pandas dtypes (Int64, boolean) ⚠️ Limited Supported through pandas extension dtypes with null-mask handling
timedelta64[ns] ❌ Unsupported Not currently supported

Notes

  • Numeric and boolean columns are optimized for zero-copy conversion between C++ and pandas.
  • String columns require Python string object creation during to_pandas() conversion.
  • Mixed object columns may reduce type inference accuracy and may require preprocessing.
  • Unsupported dtypes should raise clear user-facing errors instead of silent failures.



🧠 Data quality engine

Arnio now includes built-in dataset understanding before you analyze in pandas.

report = ar.profile(frame)
print(report.summary())

suggestions = ar.suggest_cleaning(frame)
clean = ar.pipeline(frame, suggestions)

For production data contracts:

schema = ar.Schema({
    "id": ar.Int64(nullable=False, unique=True),
    "email": ar.Email(nullable=False),
    "revenue": ar.Float64(nullable=True, min=0),
})

result = ar.validate(frame, schema)
if not result.passed:
    print(result.to_pandas())
    print(result.to_markdown(max_issues=10))

ValidationResult.to_markdown() is useful in CI logs, GitHub comments, or data quality reports because it renders a compact validation summary plus a GitHub-friendly issue table.

For low-risk automatic cleanup:

clean, report = ar.auto_clean(frame, mode="strict", return_report=True)

This is the layer pandas does not try to own: profiling, data contracts, row-level validation issues, and safe cleaning suggestions for messy incoming datasets.


Beginner-friendly auto-clean tutorial

Use this workflow when you receive a small messy dataset and want to inspect what Arnio will change before applying it.

import arnio as ar
import pandas as pd

raw = pd.DataFrame(
    {
        "order_id": [1001, 1002, 1002, 1003, 1004],
        "customer": [" Ishan ", " Prasoon ", " Prasoon ", " Pranay ", " Dhruv "],
        "city": [" Paris ", "London", "London", " New York ", " Tokyo "],
    }
)

frame = ar.from_pandas(raw)

report = ar.profile(frame)
summary = report.summary()
print(summary)

suggestions = ar.suggest_cleaning(frame)
print(suggestions)
# [('strip_whitespace', {'subset': ['customer', 'city']}), ('drop_duplicates', {'keep': 'first'})]

safe = ar.auto_clean(frame)
strict = ar.auto_clean(frame, mode="strict")

Messy input:

order_id customer city
1001 Ishan Paris
1002 Prasoon London
1002 Prasoon London
1003 Pranay New York
1004 Dhruv Tokyo

Expected cleaned output with mode="strict":

order_id customer city
1001 Ishan Paris
1002 Prasoon London
1003 Pranay New York
1004 Dhruv Tokyo

mode="safe" only trims whitespace. Use mode="strict" when you also want deterministic built-in cleanup such as exact duplicate removal.

See examples/auto_clean_tutorial.py for a runnable version of this walkthrough.


Data Quality Reports

Arnio provides detailed profiling for datasets via ar.profile(). To generate the report shown in these examples, the following code was used:

import arnio as ar
import pandas as pd

# Sample dataset used for these examples
data = {
    "user_id": [101, 102, 103, 104],
    "email": ["test@arnio.ai", "invalid-email", None, "test@arnio.ai"],
    "score": [85.5, 90.0, None, 88.2]
}
df = ar.from_pandas(pd.DataFrame(data))
report = ar.profile(df)

1. Terminal Representation (Simplified Example)

A simplified view of the standard string representation of the report object:

DataQualityReport(
    row_count=4,
    column_count=3,
    memory_usage=733,
    duplicate_rows=0,
    columns={
        'user_id': ColumnProfile(dtype='int64', semantic_type='identifier', unique_count=4),
        'email': ColumnProfile(dtype='string', semantic_type='categorical', null_count=1, unique_ratio=0.666667),
        'score': ColumnProfile(dtype='float64', semantic_type='numeric', mean=87.9, min=85.5, max=90.0)
    }
)

2. JSON Format (Excerpts from .to_dict())

Key fields from the structured JSON export for integration with APIs or dashboards:

{
  "row_count": 4,
  "column_count": 3,
  "memory_usage": 733,
  "duplicate_rows": 0,
  "duplicate_ratio": 0.0,
  "columns": {
    "user_id": {
      "dtype": "int64",
      "semantic_type": "identifier",
      "null_count": 0,
      "unique_ratio": 1.0
    },
    "email": {
      "dtype": "string",
      "semantic_type": "categorical",
      "null_count": 1,
      "unique_ratio": 0.666667,
      "warnings": ["contains_nulls"]
    },
    "score": {
      "dtype": "float64",
      "semantic_type": "numeric",
      "null_count": 1,
      "mean": 87.9,
      "min": 85.5,
      "max": 90.0,
      "warnings": ["contains_nulls"]
    }
  }
}

3. Example Summary Table

A manually formatted Markdown table representing the core metrics:

Metric Value
Row Count 4
Column Count 3
Memory Usage 733 bytes
Duplicates 0 (0.0%)

🗺️ Roadmap

Version Focus Status
v1.0 Stable release · cross-platform wheels · CI/CD · PyPI publishing · Google Colab support ✅ Shipped
v1.1 Production readiness · release hardening · docs/tooling ✅ Shipped
v1.2 C++ pipeline optimization · speed parity with pandas · hash-based deduplication 🔨 Active
v1.3 Chunked / streaming processing · Parquet & JSON readers 📋 Planned
v1.4 Parallel column processing · SIMD string operations 💭 Exploring



💬 Community

Join the Arnio Discord Community for quick setup help, contributor onboarding, GSSoC 2026 coordination, feature discussion, and community updates.

Discord is for fast conversation and support. GitHub remains the source of truth for issue assignment, PR reviews, bugs, roadmap decisions, and releases.

Join Arnio Discord




🤝 Contribute

Arnio is a GSSoC 2026 project with a structured contributor backlog across beginner, intermediate, and advanced tracks.

You don't need C++ to contribute

Most new features are pure Python pipeline steps:

# 1. Write a function that takes a DataFrame and returns a DataFrame
def remove_special_chars(df, columns=None):
    cols = columns or df.select_dtypes("object").columns
    for col in cols:
        df[col] = df[col].str.replace(r"[^a-zA-Z0-9\s]", "", regex=True)
    return df

# 2. Register it
ar.register_step("remove_special_chars", remove_special_chars)

# 3. Write tests, open a PR. That's it.

If you do know C++

The biggest performance wins are in:

  • drop_duplicates — replacing std::ostringstream row serialization with proper hash-based comparisons
  • strip_whitespace — converting from copy-on-write to in-place mutation
  • Parallel column processingstd::thread across independent columns

Getting started

# macOS / Linux
git clone https://github.com/im-anishraj/arnio.git && cd arnio
make install   # pip install -e ".[dev]" + pre-commit
make test      # pytest with coverage
make lint      # ruff + black

# Windows
pip install -e ".[dev]"
pre-commit install
pytest tests/ -v

PR titles must follow Conventional Commitsfeat:, fix:, docs:, chore:. Our release pipeline auto-generates changelogs from these.

For GSSoC contributors, please read GSSOC_GUIDE.md before asking to be assigned. It explains issue claiming, contribution levels, review expectations, and what maintainers look for in a strong PR. If you want a quick onboarding refresher, see the GSSoC FAQ. If you are new to Arnio terms, see the contributor glossary.

📖 Full Contributing Guide ·  GSSoC Guide ·  🐛 Open Issues ·  💬 Discussions ·  Discord




🚢 Release process

Arnio releases are automated through Release Please and GitHub Actions.

  1. Merge user-facing changes with Conventional Commit PR titles (feat:, fix:, docs:, or chore:) so Release Please can choose the version bump and changelog entries.
  2. Review and merge the Release Please PR on main; this updates release metadata and creates the GitHub release and tag.
  3. Confirm the Build & Publish Wheels workflow succeeds for the release tag. It builds the sdist and wheels, then publishes to PyPI through Trusted Publishing.
  4. Smoke test the published package in a clean environment:
python -m venv /tmp/arnio-smoke
source /tmp/arnio-smoke/bin/activate
python -m pip install -U pip
python -m pip install arnio
printf 'name,revenue\n Ada,10\n' > /tmp/arnio-smoke.csv
python - <<'PY'
import arnio as ar
print(ar.__version__)
print(ar.scan_csv("/tmp/arnio-smoke.csv"))
PY
  1. Verify the GitHub release, PyPI project page, and install command all show the expected version before announcing the release.

If any publish or smoke-test step fails, leave the failed tag and GitHub release in place until maintainers agree on the recovery plan.




📐 Project structure

arnio/
├── cpp/
│   ├── include/arnio/      # C++ headers — types, column, frame, csv_reader, cleaning
│   └── src/                 # C++ implementations (~30 KB of compiled logic)
├── bindings/
│   └── bind_arnio.cpp       # pybind11 module — the Python↔C++ bridge
├── arnio/
│   ├── __init__.py          # Public API surface
│   ├── io.py                # read_csv, scan_csv
│   ├── cleaning.py          # Python wrappers for C++ cleaning functions
│   ├── pipeline.py          # Step registry + pipeline executor
│   ├── convert.py           # to_pandas (zero-copy), from_pandas
│   ├── frame.py             # ArFrame — lightweight C++ Frame wrapper
│   └── exceptions.py        # ArnioError, UnknownStepError, CsvReadError, TypeCastError
├── tests/                   # pytest suite — CSV, cleaning, pipeline, conversions
├── benchmarks/              # Reproducible arnio vs pandas benchmark
├── examples/                # basic_usage.py, auto_clean_tutorial.py, custom_step.py
└── website/                 # Project website — arnio.vercel.app



Arnio



Stop writing cleaning scripts. Declare clean data.


DownloadsStarsForksWebsiteDiscord


Built with C++ and pybind11 · Licensed under MIT · Maintained by @im-anishraj

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

arnio-1.2.0.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

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

arnio-1.2.0-cp313-cp313-win_amd64.whl (196.2 kB view details)

Uploaded CPython 3.13Windows x86-64

arnio-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (243.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

arnio-1.2.0-cp313-cp313-macosx_11_0_arm64.whl (185.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

arnio-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl (201.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

arnio-1.2.0-cp312-cp312-win_amd64.whl (196.2 kB view details)

Uploaded CPython 3.12Windows x86-64

arnio-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (243.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

arnio-1.2.0-cp312-cp312-macosx_11_0_arm64.whl (185.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

arnio-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl (200.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

arnio-1.2.0-cp311-cp311-win_amd64.whl (193.8 kB view details)

Uploaded CPython 3.11Windows x86-64

arnio-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (242.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

arnio-1.2.0-cp311-cp311-macosx_11_0_arm64.whl (185.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

arnio-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl (199.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

arnio-1.2.0-cp310-cp310-win_amd64.whl (193.0 kB view details)

Uploaded CPython 3.10Windows x86-64

arnio-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (241.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

arnio-1.2.0-cp310-cp310-macosx_11_0_arm64.whl (184.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

arnio-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl (198.0 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

arnio-1.2.0-cp39-cp39-win_amd64.whl (199.8 kB view details)

Uploaded CPython 3.9Windows x86-64

arnio-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (241.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

arnio-1.2.0-cp39-cp39-macosx_11_0_arm64.whl (184.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

arnio-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl (198.1 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file arnio-1.2.0.tar.gz.

File metadata

  • Download URL: arnio-1.2.0.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0.tar.gz
Algorithm Hash digest
SHA256 b11c84de9a215d0e2a5b3055b81f26ea775c0dc5648ff340acfc7c7082e04d16
MD5 296781787d48fae2464b63e3d3bd561a
BLAKE2b-256 5e1d9cc86fe32dc2d60f5621b466eca9b3e4930f3471b65d7a3c0858f1cb9786

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 196.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1b87c0520f34e59d45799135682a6ba3cab5f8b76785eeb1003517e31dcbe26f
MD5 7cb5997eff80e77a2e46b3381fd7ac9c
BLAKE2b-256 dd55351180ebdbdfbadea67002e096d474bec67d692aca31e5c5decd7d1aa63b

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e389dc0917e527f2e15e3e61c062ffed0b4b183849b31e2ac984aadec8b093c4
MD5 12908762163c917f9de4bf62f0092270
BLAKE2b-256 d00d9e1e9d2f404fadd65a566754d9527a25dd71cf384f9f0f81e8022bef2371

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8595de2ed3013995afdf3d345543fc00a16459b0c3557462d7b08372d6eb81c
MD5 b72fdb45e7e6c631150602ea53ef0ef3
BLAKE2b-256 a7364567f207fe3b806ea01d1cd9bc3e1833afaa2ef0f8c23cf2079d5988dd8f

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8d4947957abcd0c4969c5bf997d9247e0cc7f97a9993dd0a79c712d8d8b6706f
MD5 8e9d3f3929af377e05a0cc733a8a1092
BLAKE2b-256 ff851f93c0ec94c115314be8843d43720d84deee48cace12172771978ac005e7

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 196.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 75fa00db4855df74137943859e68f3dc210632e6de3ee6724aa253fb103df566
MD5 ca572b40b11f56a95b3959b7f6709a79
BLAKE2b-256 f38964506b54b9a2ca1e9846f703c43fc5c1bacd3f60510beaa038174590ff21

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e25cc28a9390898584c13717ae40e51633fb76040b851ec239d10ecc5204810
MD5 70b7d7d60e167e35a1da2c94306b5433
BLAKE2b-256 f740189fcb2ba064496f857f2180ed2ea9114af445d7099523371fe76794f7b2

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad6afff8b553830b40aa59c23a117b6aad4a5414c0fedb9f3b8c64a05bf0b3ff
MD5 2ac407f6ae5c3096712fe5c52d60133b
BLAKE2b-256 e4e856c1080c9555ffe2dc0866ea2833a2d72e4322c316666071cda3e6be1d88

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2566e2a96083f2948aa9fd47d581622ad561556040f5ba45ca56325ac0928b8e
MD5 396bcf26d7b21888648e54485358600c
BLAKE2b-256 73697293ac8fb3b76a73a8823587d398c9d90ca5b5ef3091cc7f5aee4583a260

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 193.8 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5588279fa54ae00bbee361b80b917e547e047554ccbc94f2e8e9dd26939a9569
MD5 14d63163f0ff16aa7d5742a23e94404f
BLAKE2b-256 c83010f2cb605dbeef95974f582fe9f11806b45f781844552f7042f844f7214f

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4a1640cb05bcf4a4ebb4db402c7fb81cf815b63569558b8efecaa518cc94dcf2
MD5 81999d9a5c7ede3afd2e4ccb0eb1965c
BLAKE2b-256 0e531bc027b6f6ad32d04da0c1610b70a010585cf426cd45152a2d1d75d1b5e1

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bd0e2d8b61a8da85973f626d8a7dce682ced32c32f1249aa450988bcadad2fc0
MD5 01234f452d524acac34500dab4b94925
BLAKE2b-256 fa6c3dadd047d56876ad937cb80b179f2783e6eabf32856af810335d46b586cf

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c6be01c8d6cef993b3d5f2a82fbc323bc6e57a36a4431f964288b50b8c65051d
MD5 9d7aaca7955506ce2ff4d73957dec3b5
BLAKE2b-256 b16f888f9d17785914193168e361a725d44af6a93399c9a876bc07b2bdcb60a0

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 193.0 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 60030eee11c3d02a1cbbc63022ae3890638e6d1121f7decde34378a59420382f
MD5 d07948630b45bad5f53fdc10c953ffaf
BLAKE2b-256 c834a7c6df9ed5ea4326cb45cda6be5b67b75e65eaba28d83a0cf2b83902c92d

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cbb3bb7e80c25a6d806ac0fce3270deac0774bdf5441bf455e4e0f7fbfb96f39
MD5 4ecb3c84e0a1e5cea2e2d6b40d7262e9
BLAKE2b-256 406878fee03f1e56b83a8de4913138bcc1530b53a23751956773037e28eda5a6

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 91616fe0f51cc360c020c5e2d0bec01ebfb7b24e7e7ffc49af2b1194c6c70e28
MD5 7081dcb3d50f6405c5411905d7fb4284
BLAKE2b-256 64c823c6c6204238c3c63e14094ec2414c28755c2f2dca1116dd4ec5dc5e0fd2

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 06f35e3e3ad789da1deb576f4c7d8b8a888e502e5afb54e89d4f4d5ae881d3da
MD5 c90d4755c08919ecc419645fc5876abe
BLAKE2b-256 7905f300b8cc5b9f70ec79a5158162c9c02ee22bf223ea0ac6a182304e3c1c5c

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 199.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 dc372f2af6615b32a9cfa755bf75e2eb8a70eb67828c0ca5abe29e365da228e4
MD5 ae2c230681b9ae30e305a8e445a91cc3
BLAKE2b-256 5d13e4ac279f6d4f932d00389522e46bd82e652da16beb33c6bfa5da521cbefe

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arnio-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 01995069c55f01ca938acd5f7c87b0c2cc1261e57986a49bae0405ccc34184e5
MD5 7495a26c34c7881fc307d15a269ec9de
BLAKE2b-256 8c877822882f7f42fc003c22cd27965ef7f90e731e98fd9c02f01a520f8e8fdd

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 184.1 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2267932e2fdbc91bcfb8f3d6d907474576ffb57acdc5bc4dce315effb33746da
MD5 a0243d32629e6eff5aa846a1493d94f2
BLAKE2b-256 768bccd012f30ff617daf43c2093ca9c8b146691dce5e91233cf192f0782ebba

See more details on using hashes here.

File details

Details for the file arnio-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: arnio-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 198.1 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arnio-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d6a18ae4e507d6d9f5694b46a2e88e98ce85f308fbbccd565380a0fc92a6183a
MD5 5a4f768b7e16dd6c5b659175cc7afcb3
BLAKE2b-256 6ebbc6cce66d53d7b0e03e4e49f3b06e1b809268204e95fb1cb10812719053fe

See more details on using hashes here.

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