C++ accelerated data preparation for pandas and the Python data stack
Project description
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.
pip install arnio
Colab install smoke test: COLAB_SMOKE_TEST.md
Quickstart · Integrations · 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)
# 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 Arniodf = 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 Arnioframe = 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 |
|
|
🧰 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(default0.0) instead of raising an error or producingNaN/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=Truetoto_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
objectcolumns 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.
🤝 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— replacingstd::ostringstreamrow serialization with proper hash-based comparisonsstrip_whitespace— converting from copy-on-write to in-place mutation- Parallel column processing —
std::threadacross 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 Commits —
feat:,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.
- Merge user-facing changes with Conventional Commit PR titles (
feat:,fix:,docs:, orchore:) so Release Please can choose the version bump and changelog entries. - Review and merge the Release Please PR on
main; this updates release metadata and creates the GitHub release and tag. - Confirm the
Build & Publish Wheelsworkflow succeeds for the release tag. It builds the sdist and wheels, then publishes to PyPI through Trusted Publishing. - 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
- 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
Stop writing cleaning scripts. Declare clean data.
Built with C++ and pybind11 · Licensed under MIT · Maintained by @im-anishraj
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arnio-1.6.1.tar.gz.
File metadata
- Download URL: arnio-1.6.1.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
068cd261618a18ffeb2a7df3613485713d79778e601bbbb5cd25e5ccb618452d
|
|
| MD5 |
f5eddfefd9555757bd81f69b66211d56
|
|
| BLAKE2b-256 |
c76a4a605ade9ab1382740f4c67930bfc19986f6dbb5dbeef8c5434f9f474ad9
|
File details
Details for the file arnio-1.6.1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3af8a48e09a98141c0641586d70da4c4014fbe725d758080cb0a14dc4be5a0b
|
|
| MD5 |
9be0854eece246d5426f43143f70e72d
|
|
| BLAKE2b-256 |
108b6cc0b943616a007c91042f356058e9c1414754c3117d3318a70f68e77e20
|
File details
Details for the file arnio-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 250.5 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c10473c70f14474218ffe0a0fbfd77f9593e03cf3c025d45a86c2637dd43129
|
|
| MD5 |
37705d947b0a5cca06a130dd09c41d7c
|
|
| BLAKE2b-256 |
ffe85c7ee94bbcbefd376570415eed97132a0d56b073b72fdc50cd197fd8dfff
|
File details
Details for the file arnio-1.6.1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: arnio-1.6.1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 191.5 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6886aae9e085126ce677be1209ffb953e63e1ef234033daebf4408e3635397a9
|
|
| MD5 |
c16d7801976ed90e4676dcacbc0674ca
|
|
| BLAKE2b-256 |
0e2183c9550ca163799d215644f5bc50cc2151a5b13b53ac54a4ac1c375019a9
|
File details
Details for the file arnio-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl
- Upload date:
- Size: 206.6 kB
- Tags: CPython 3.13, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfc2dca3f07f60ff6b0cc4b7fc7664a67adfe4cb7ec99c0503c1c9118eb4a0ef
|
|
| MD5 |
8a1fa32381a865bf51b24f49347825f4
|
|
| BLAKE2b-256 |
94678274d31674c7ea9b87697d39d55d1add3ebe915dc8743be8cb63329673da
|
File details
Details for the file arnio-1.6.1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
754cebb1a9f429dad354e90c3ccdea69b7591913f73fd2d49d127eea34678c71
|
|
| MD5 |
7d3a19883417354fdd698ff5ba78363a
|
|
| BLAKE2b-256 |
da43aac38c61d38a5c25f876d0759511d7a98c5a7d305f50fa7b022b0e2923eb
|
File details
Details for the file arnio-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 250.4 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4a3af0744586ca58e353a4fe24d6259c7c73468db606d77df47a6a8920243e0
|
|
| MD5 |
09f6b936690b643ac90d0e5bfa256a9a
|
|
| BLAKE2b-256 |
e60081ced9275e37e62f52085c570b34bca12dd40f3b25c80c3c2fc42b8a21ae
|
File details
Details for the file arnio-1.6.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: arnio-1.6.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 191.5 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d61b70d7cfedcc1ea0b72db7de7c781da1384188490b5075b9b5a36ac64e181
|
|
| MD5 |
9fd1f345c1e715a4468354528ace5d85
|
|
| BLAKE2b-256 |
c24104f6c970f83deaa8a18010138dccf86fd9963576cab13143b325b7f4f4ac
|
File details
Details for the file arnio-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl
- Upload date:
- Size: 206.6 kB
- Tags: CPython 3.12, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e182f3f5ce37adc8c3665b263898e03714c650593ee14e22e33dc55bb6b171d2
|
|
| MD5 |
b0213b6f517b10bbf565cfab4de5879f
|
|
| BLAKE2b-256 |
5b6de9b97940c7ec9d9f990a7237111529723458cfb7626dc29f5735938b1d19
|
File details
Details for the file arnio-1.6.1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: arnio-1.6.1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 199.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43cd3376d5403633d91fa4e42f18281aedc0b279956384acc7d7f93111ad71b4
|
|
| MD5 |
958868c5cbe3bab038a28d6b3a2a366d
|
|
| BLAKE2b-256 |
35e2b3a8aa4139222252f2f6fbb2b00a48fdbc04c14764fb853bc240100670bb
|
File details
Details for the file arnio-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 249.2 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
177f7d847c7a8f87b30cc0a1f8b94fc8f96657ebab1820a4aae0c00965421247
|
|
| MD5 |
f1ca2d0e3636b8f651a86ba2eaf6c592
|
|
| BLAKE2b-256 |
a9d84002fdd7cca278b28aec0885b61634da2b4883886de5664b6432f721f008
|
File details
Details for the file arnio-1.6.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: arnio-1.6.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 190.5 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
039c95cc675ebd8c4fb6c1b64d720b19112123a558df24fdffdb4f99946fef26
|
|
| MD5 |
9f40a8d6d51957717395a487653ee63a
|
|
| BLAKE2b-256 |
8ef003e1b2d02c6549911b71f64c4b55cb7fb21f78afdaad733703e54b2db0ca
|
File details
Details for the file arnio-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 204.8 kB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e17e65435fefa65ce6a83906214e44b63ec6214831174ed550df7b1d865f8cb1
|
|
| MD5 |
38ae86d6757e145dca5530a855fe9753
|
|
| BLAKE2b-256 |
6b9961b7d5efaa47ea0a015612ceddc1591d96d9ee74b2713173477c94dabb81
|
File details
Details for the file arnio-1.6.1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9080937a003d114a92c6de5a866757d572de5ec48f06d6e6c2e7ff4813ad102a
|
|
| MD5 |
1e1ae914718de4af4dbdc20814f40aec
|
|
| BLAKE2b-256 |
615a268862ea95cfb38d2e96cc8edab3ba0d0c1d66bb04b57f1e7aeb3e263aa5
|
File details
Details for the file arnio-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 247.8 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d088a9020d79e8aa61a7761fd02fb06615f0b1e4e88e45399127a559e12fa0b
|
|
| MD5 |
d6282dcbf2b5c8d56f955dfb3eba6df7
|
|
| BLAKE2b-256 |
5c42ff0ccd9ba47351b9f5e43cdd8424b93ad353cad2ff15c293e144b3b97730
|
File details
Details for the file arnio-1.6.1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: arnio-1.6.1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 189.6 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
655e320222f7d118e43920995ffca37053683f4b623dc289b60350105ad1475d
|
|
| MD5 |
b84206fdfaa2585f22c074f0e96286c4
|
|
| BLAKE2b-256 |
9569af1456312f950b13c56eeb41571f5f5eb345a16c475cd73219c5aeb65480
|
File details
Details for the file arnio-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl
- Upload date:
- Size: 203.5 kB
- Tags: CPython 3.10, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12df7851bc20bafeb87e4ba39f25f7cda867b75bfed8d95eaf110c780d570408
|
|
| MD5 |
938da8e46059d8f36db955762c590460
|
|
| BLAKE2b-256 |
a34ab202ab8c8e05a5f6edb3030ab3d3faa735ce883d256d257420cba5e5ebb2
|
File details
Details for the file arnio-1.6.1-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87d2cda4a3a299eb29ec9f7e84d9e850ac6092ac1d359720ce2e925f4808f5b4
|
|
| MD5 |
d858a660eb2192be9ddc263da5770f15
|
|
| BLAKE2b-256 |
22a6ae30f5523840bb5d0eba8d3796944d9a5b27de193ab29ad89612aca9bf22
|
File details
Details for the file arnio-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 248.1 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ca77db6416f4df2cea8a0940cdf12ea5cd7a7c8ecf676cb46b90fea719ba346
|
|
| MD5 |
a5b77dbe023bcd8dcb575d555aa641f0
|
|
| BLAKE2b-256 |
88c62ed07049c4ab89fafbe05415c057223b1bbc67c8487761a8a85ad43a0171
|
File details
Details for the file arnio-1.6.1-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38205ec28f011bbf59b3892ba9f1a282afe5b62a5b827b02b412d7dcdad4c4a4
|
|
| MD5 |
8821f82d7d610eca1113faa1d6af1318
|
|
| BLAKE2b-256 |
17cb1d1325479465da184993ac8055c98d07b2d9ae4439492d0f9fe73b2f648a
|
File details
Details for the file arnio-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl.
File metadata
- Download URL: arnio-1.6.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c07a152940a55aa57b2a32ab7d987e574d0db4c0f6d0493426012ce64510d434
|
|
| MD5 |
3e36ab91f24e10a94f542a3422e8ec95
|
|
| BLAKE2b-256 |
51c1bd46c2ca296702f6921b212fbadb12ed0a966aac9d7853c571793fdb265f
|