Skip to main content

C++ accelerated data preparation for pandas and the Python data stack

Project description


Arnio



Fast data preparation for the Python data stack.


Arnio is a compiled C++ data preparation engine for messy CSV and pandas workflows.
It parses, infers types, strips whitespace, deduplicates, validates, and profiles data —
then hands clean results back to the tools you already use.
Use Arnio before and alongside pandas, NumPy, scikit-learn, DuckDB, and Arrow.


PyPI  Python  CI  Coverage  MIT  GSSoC 2026  Join Discord PyPI Downloads



pip install arnio

Colab install smoke test: COLAB_SMOKE_TEST.md


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




⚡ Quickstart

A simple workflow in just a few steps.

New to Arnio? Start with the pandas workflow example below before exploring advanced pipelines.

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)

# Use copy=True when you need defensive pandas-owned buffers
safe_df = ar.to_pandas(clean, copy=True)

Already have a pandas DataFrame? Use Arnio in-place in your existing pandas workflow:

import pandas as pd
import arnio as ar

df = pd.read_csv("messy_sales_data.csv")

clean_df = df.arnio.clean([
    ("strip_whitespace",),
    ("normalize_case", {"case_type": "lower"}),
    ("drop_duplicates",),
])

report = clean_df.arnio.profile()

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.




🔗 Integrations

Arnio is designed to make the rest of the Python data stack more productive, not to replace it.

Workflow How Arnio helps
pandas Clean, validate, and profile messy DataFrames through df.arnio.
NumPy Prepare typed numeric data before array/modeling workflows.
scikit-learn Use Arnio cleaning as a preprocessing layer before model training.
DuckDB / Arrow Validate and prepare data before analytics and columnar exchange.
notebooks Inspect quality issues and cleaning suggestions before analysis.

Pandas accessor

df = pd.read_csv("raw_customers.csv")

clean_df = df.arnio.clean(drop_duplicates=True)
quality = clean_df.arnio.profile()
validation = clean_df.arnio.validate({
    "email": ar.Email(nullable=False),
    "age": ar.Int64(nullable=True, min=0),
})

This keeps pandas as the analysis tool while Arnio handles the preparation, quality, and validation layer.

Product direction: PROJECT_DIRECTION.md




🔍 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 preparation layer into a predictable pipeline, accelerates supported operations in C++, and gives you clean data for pandas, NumPy, scikit-learn, DuckDB, or notebooks.

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 where supported. Numeric columns preserve the fast zero-copy path by default, while copy=True requests defensive pandas-owned buffers.
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"])
validate_columns_exist Fail early when required columns are missing ar.validate_columns_exist(frame, ["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, [
    ("validate_columns_exist", {"columns": ["name", "city", "revenue"]}),
    ("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 columns are optimized for zero-copy conversion between C++ and pandas where supported.
  • Pass copy=True to to_pandas() when downstream pandas code needs defensive pandas-owned column buffers.
  • Boolean conversion is already copied by the binding because std::vector<bool> cannot be exposed as a zero-copy NumPy buffer in the current implementation.
  • Columns with null masks may require copies so pandas can apply nullable values safely.
  • 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),
    "username": ar.String(min_length=3, max_length=20),
    "revenue": ar.Float64(nullable=True, min=0),
})

result = ar.validate(frame, schema)
if not result.passed:
    summary = result.summary()
    print(summary["issues_by_rule"])
    print(summary["issues_by_column"])
    print(summary["issues_by_column_and_rule"])
    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. Severity counts are not included in summary() yet because ValidationIssue does not currently carry severity information.

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))
# Bounded profiling for large datasets (controls how many sample values are kept)
report = ar.profile(df, sample_size=5)

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.6.2.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.6.2-cp313-cp313-win_amd64.whl (202.4 kB view details)

Uploaded CPython 3.13Windows x86-64

arnio-1.6.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (250.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

arnio-1.6.2-cp313-cp313-macosx_11_0_arm64.whl (191.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

arnio-1.6.2-cp313-cp313-macosx_10_13_x86_64.whl (206.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

arnio-1.6.2-cp312-cp312-win_amd64.whl (202.4 kB view details)

Uploaded CPython 3.12Windows x86-64

arnio-1.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (250.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

arnio-1.6.2-cp312-cp312-macosx_11_0_arm64.whl (191.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

arnio-1.6.2-cp312-cp312-macosx_10_13_x86_64.whl (206.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

arnio-1.6.2-cp311-cp311-win_amd64.whl (200.0 kB view details)

Uploaded CPython 3.11Windows x86-64

arnio-1.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (249.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

arnio-1.6.2-cp311-cp311-macosx_11_0_arm64.whl (190.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

arnio-1.6.2-cp311-cp311-macosx_10_9_x86_64.whl (204.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

arnio-1.6.2-cp310-cp310-win_amd64.whl (199.3 kB view details)

Uploaded CPython 3.10Windows x86-64

arnio-1.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (247.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

arnio-1.6.2-cp310-cp310-macosx_11_0_arm64.whl (189.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

arnio-1.6.2-cp310-cp310-macosx_10_9_x86_64.whl (203.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

arnio-1.6.2-cp39-cp39-win_amd64.whl (205.9 kB view details)

Uploaded CPython 3.9Windows x86-64

arnio-1.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (248.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

arnio-1.6.2-cp39-cp39-macosx_11_0_arm64.whl (189.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

arnio-1.6.2-cp39-cp39-macosx_10_9_x86_64.whl (203.6 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: arnio-1.6.2.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.6.2.tar.gz
Algorithm Hash digest
SHA256 5fbd79fe2c89d96e79220b02bcc89b0855230eecf77b1a56e8142165c2771195
MD5 6c45a41e28df01b2e6d686022ecd4cc7
BLAKE2b-256 6129f99d6541756f366ff617517155a25a0884942a7b5f972b99b480e32d96e1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 202.4 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.6.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0b00c72b7aca1de3545733891f99e7dcb2fcf31f7926b5d74d56d37abec3f6a4
MD5 3c63d87a0c0482134bb65cda3df48819
BLAKE2b-256 ade6c6157085a1efa7c3493a99c021508c096a67bfe646ac27003c82cb3971c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d3e6048a131be85594aba29fc0c27708e612fe34a558102e1446d2dfd66fa15
MD5 533d94374f34fc349d23616998a195c2
BLAKE2b-256 b8b0bf0eba701bad9f386aa29a576c05591ac9feeeb7263c0972565d924ac4f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 70e585c48c7d20bfc2cbe79e51285adbe32f290298136919d5d3e2c58e2bb1a8
MD5 bc81c86ecea37c73e681fe87ee983f5a
BLAKE2b-256 24df99b47d78eb725300f00d39ef5fddc90424a94b8c781a70473174407629f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 42ee46fcdb407bd795004e491a0dbf333b33d293df322634e115d038c8fe9790
MD5 cb86c7559344671042364df29d1bbac1
BLAKE2b-256 8ce4c3ffd79c30dcc91acade261719fbed07caea038497413483d3ec4a6fde3d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 202.4 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.6.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d039ff2a952b4edabf717ae6927fe5ba3f9bef60acd13b5d958f6852b6d5318b
MD5 98f1e6e3db95216577cc133c78f5f91b
BLAKE2b-256 f311b81b7ba49ebe81d264db54bb0ad83dfeb2fc17047b1d1cda564134375009

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 340c685a0f32bf0c646c869bee775569c3c98182b92fb915cf3a5f7110ea4e43
MD5 c4f6397de693218b2e953f0a944f18e5
BLAKE2b-256 ecb6171019e107e28c7ac0d3e98cb7e1fa353e2463ec011e39e6713827c3af7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a60250dfc29c5cfee9cce96829b0604be979930fc4ade267b0e89c2f43fc716f
MD5 366474ad6c1b493565a52875dc6bfae5
BLAKE2b-256 cd88b9150df8609648a9f165e4ac2ccbefcfeda5a1245781f5f0bf4c88e1ca72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c54947124ad472d85c060e11c66ffc8dfce3529bb1bfb931dfb6d8e0d5bf4e0e
MD5 e142600fcf48e656ea1eaaf23bf40319
BLAKE2b-256 c2a745aa8cc00a406a136edc384cb384a4fcbad26289ab65db151befcbea895b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 200.0 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.6.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e5660d2b1d4d79f4a8f40be33094ef973148a0730fcb4f33ca7bf6d2b12c278a
MD5 e2fd21e63626d2cc537d82ec769a7da7
BLAKE2b-256 2a490287e2161f600184bd118125b5cad15d39f163d0560ef181aa9b5af3a52d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d71c30301158ce5276fcd25fdd97dc50fe8e6ad38737141b2976c14113ac1271
MD5 278685671a92658a69399dc225a7fb8d
BLAKE2b-256 81a868f77f488e3084ad2e4c64776368265bd6856b6034cbffc7f8f1b03d2226

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc7a2eba075774d653fdc0db3eaee0cbb3446b71e3c7443bff00fa82d53e0f67
MD5 d60f612a5303d44164fa05ce12cbd229
BLAKE2b-256 c463c4db59f0029a90b362f97a638296be0b3a4794c0f13b41eb6d27fc832fe2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 eba5b69071e40b1b6f25f5e6d1c7ad3e2d21e9de6175d077ea9833ad1940112e
MD5 88575065042227c79c932970fa8a6631
BLAKE2b-256 d0613315eef5aed9663a3ce6cceb483e8b9872edc2f742e4db344f7e279b713e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 199.3 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.6.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d2320cbec6f382713399e2a00d1d670d470ccb357976e6a8dab56445a3da84b3
MD5 e33ae2767ebf1483f74541d4a4fdc503
BLAKE2b-256 225723189450f587cf644615443967e3b4407f6540468246d29dcfa796244091

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a9aee326553d5b65a31c8d8a021b1d6a6d4b7cf820825529e60857ec2fa65a79
MD5 041fedc2df06ca9b694bcf36ad3105c9
BLAKE2b-256 a6510ecf74e750231ae3a89b4c85cc0c169a38abd13dd51ebf831e846c86710e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6eec60432d5fd75fe21c5a19a0f72ab64879b5ec537b519c51d4601556b1b609
MD5 8950f2d9e7778c45acbc7bda2eb67967
BLAKE2b-256 118acfffc5e81db801a2639f521d399404eaec6fb78642e6957734ed17b9bf95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 047b5918128d7c8ae6fcc9baf4f0444e1b94fe0fc7bec623c1548f988770f3f4
MD5 500005f3ff1096abe5744d5a5b9e0934
BLAKE2b-256 9b54d0e65996fa6acc8acc6a65ba0db9f58866c296f9440c8752b0e99274ff72

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 205.9 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.6.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f2228928421c1114e63afec9f0dc547c67473a411c82989233d263242297e589
MD5 e1df861f8b1b024c8b9d0471127ea5e4
BLAKE2b-256 9ad020906729e9c59e5d38eebf7bfda9034e88ad96f0e3575f06aeaebaf77ef0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arnio-1.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b5e5ad0617bf42fce8311a7d0c80edac7a0bdb9a2edba7a48fbbec4a39cdad85
MD5 5a848aafde8b3a2f84b912b7fc517e6b
BLAKE2b-256 c25753424bb2dcd7c85205cc9501cac70d50acb6c6796adda27b4f2746ba7a01

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 189.7 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.6.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d868d7f2dfa1109737fa6b09a327c7a2a4721d0bd99d0d0bda28923e084b3b69
MD5 94a2a151aec4b2c53d1cf1b4be43f7d9
BLAKE2b-256 7f99b0b8b89ce4a9fd89b5f32680d6cb552a0b31de6a36ac3da3775ee26f45fa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: arnio-1.6.2-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 203.6 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.6.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 66046c240d78253b0f1f5b2a8843b4882300f5b8e25a308d887465b3d4837965
MD5 78e389ffb1368c9b74552ea39b75d282
BLAKE2b-256 b4ea0437621935315ce0254b92fa7b0307ff6ceaac769c3497a42635c807cf2e

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