Skip to main content

IBM Netezza python driver - extended fork

Project description

nzpy_extended: High-performance IBM Netezza driver for Python

nzpy_extended is a hard fork of IBM nzpy — enriched with new features, major performance improvements via a C extension, and expanded platform support.

Key differences from upstream nzpy

Feature nzpy (IBM) nzpy_extended
Row parsing performance (mixed types) ~10 000 rows/s ~63 000 rows/s (no C ext) → ~93 000 rows/s (+ C ext)
Supported Python 3.5+ 3.12, 3.13, 3.14
Platform wheels ❌ None ✅ Linux x64, macOS ARM, Windows x64 (pre-built)
Async support ✅ Fully async API
Sync API (DB-API 2.0) ✅ Full feature parity with async

Windows 11

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext) vs. ODBC
INTEGER ~18 k rows/s ~196 k rows/s ~256 k rows/s ≈ ODBC (~239 k)
NUMERIC ~10 k rows/s ~75 k rows/s ~97 k rows/s ≈ ODBC (~90 k)
STRING ~18 k rows/s ~75 k rows/s ~79 k rows/s ≈ ODBC (~69 k)
DATETIME ~18 k rows/s ~135 k rows/s ~255 k rows/s ≈ ODBC (~249 k)
BOOLEAN ~23 k rows/s ~243 k rows/s ~401 k rows/s ≈ ODBC (~359 k)
Mixed ~4 900 rows/s ~36 k rows/s ~45 k rows/s ≈ ODBC (~44 k)

WSL2 (Linux x86_64)

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext) vs. ODBC
INTEGER ~21 k rows/s ~203 k rows/s ~640 k rows/s ~92 k rows/s
NUMERIC ~11 k rows/s ~79 k rows/s ~150 k rows/s ~63 k rows/s
STRING ~22 k rows/s ~71 k rows/s ~160 k rows/s ~80 k rows/s
DATETIME ~21 k rows/s ~126 k rows/s ~407 k rows/s ~111 k rows/s
BOOLEAN ~25 k rows/s ~186 k rows/s ~418 k rows/s ~192 k rows/s
Mixed ~5.4 k rows/s ~33 k rows/s ~49 k rows/s ~20 k rows/s

Note: WSL2 results were obtained on the same Netezza server as Windows 11 (192.168.0.144) — the higher throughput reflects Linux network stack efficiency. ODBC results use a ctypes-based ANSI-ODBC fallback (because pyodbc's Unicode API is incompatible with the Netezza ODBC driver on Linux). This wrapper fetches every cell individually via SQLGetData, so ODBC numbers on WSL2 are understated vs. native pyodbc on Windows (which uses SQLBindCol batch fetching). The real ODBC-vs-native gap on Linux is likely smaller.

macOS ARM64 (Apple M4)

Benchmarks run on a Mac mini (Apple M4, 16 GB RAM) — same Netezza server at 192.168.0.144. 100 k rows per query.

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext)
INTEGER ~44 k rows/s ~356 k rows/s ~726 k rows/s
NUMERIC ~22 k rows/s ~122 k rows/s ~195 k rows/s
STRING ~39 k rows/s ~143 k rows/s ~183 k rows/s
DATETIME ~42 k rows/s ~253 k rows/s ~683 k rows/s
BOOLEAN ~53 k rows/s ~449 k rows/s ~786 k rows/s
Mixed ~10 k rows/s ~63 k rows/s ~93 k rows/s

The C extension accelerates integer, decimal, datetime, and boolean parsing by avoiding Python object allocations per field and struct.unpack overhead. String parsing is primarily network-bound, so the C extension offers minimal benefit there.

If the compiled extension is not available (unsupported platform or Python version), the driver gracefully falls back to pure Python with identical semantics.

Installation

The package is available on PyPI:

pip install nzpy-extended

Pre-built wheels are provided for:

Platform Architecture Python
Linux x86_64 (manylinux) 3.12 / 3.13 / 3.14
macOS ARM64 (Apple Silicon) 3.12 / 3.13 / 3.14
Windows x86_64 3.12 / 3.13 / 3.14

For other platforms or Python versions, pip install will compile the C extension from source (requires a C compiler: GCC, Clang, or MSVC). On systems without a compiler the install will fail — use a supported platform or version.

Quick Start

Sync — scripts, ETL, Jupyter, Django

import nzpy_extended.sync as nzpy

conn = nzpy.connect(
    user="admin", password="password",
    host="netezza-host", database="mydb",
)

# --- Basic query ---
with conn.cursor() as cur:
    cur.execute("SELECT 1")
    print(cur.fetchone())  # [1]

# --- One-shot convenience (pyodbc pattern) ---
row = conn.execute("SELECT version()").fetchone()
print(row[0])

# --- Parameter binding ---
cur.execute("SELECT id, name FROM users WHERE active = ?", (1,))
for row in cur:
    print(row)

# --- Cursor iteration (batched, arraysize=100) ---
cur.execute("SELECT * FROM large_table")
for row in cur:            # fetches 100 rows per round-trip
    process(row)

# --- Method chaining (PEP 249) ---
rows = cur.execute("SELECT 1, 2, 3").fetchall()

# --- Explicit transaction control ---
conn.autocommit = False
cur.execute("INSERT INTO users (name) VALUES ('Alice')")
cur.execute("INSERT INTO users (name) VALUES ('Bob')")
conn.commit()               # or conn.rollback()
conn.autocommit = True

# --- Transaction context manager ---
with conn.transaction():
    cur.execute("INSERT INTO users (name) VALUES ('Charlie')")
    # auto-commits on success, auto-rollbacks on exception

# --- Timeout (pyodbc-compatible properties) ---
conn.timeout = 5.0          # default for all new cursors
cur = conn.cursor()         # inherits timeout=5.0
cur.execute("SELECT ...")   # raises OperationalError after 5s

cur.timeout = 10.0          # per-cursor override
cur.execute("SELECT ...", timeout=3.0)  # per-execute override wins

# --- Stored procedures ---
result = cur.callproc("sp_add_numbers", [10, 20])
rows = cur.fetchall()

# --- Server notices (RAISE NOTICE) ---
for msg in cur.messages:
    print("Notice:", msg)

# --- PEP 249 rownumber ---
cur.execute("SELECT * FROM t")
print(cur.rownumber)  # 0
cur.fetchone()
print(cur.rownumber)  # 1

# --- Column metadata ---
desc = cur.description       # 7-tuple after execute()
schema = cur.get_schema_table()  # rich metadata as list[dict]

# --- Cancel / interrupt ---
conn.cancel()                # stops running query, session survives
cur.interrupt()              # alias

# --- Connection state ---
print(conn.closed)           # False
conn.close()
print(conn.closed)           # True

Async — FastAPI, asyncio

import asyncio
import nzpy_extended as nzpy

async def main():
    async with await nzpy.connect(
        user="admin", password="password",
        host="netezza-host", database="mydb",
    ) as conn:
        # --- Basic query ---
        async with conn.cursor() as cur:
            await cur.execute("SELECT id, name FROM users WHERE active = ?", (1,))
            return await cur.fetchall()

        # --- One-shot convenience ---
        row = await (await conn.execute("SELECT version()")).fetchone()

        # --- Async iteration (streaming) ---
        cur = conn.cursor()
        await cur.execute("SELECT * FROM large_table")
        async for row in cur:
            process(row)

        # --- Timeout ---
        await cur.execute("SELECT pg_sleep(999)", timeout=3.0)
        # raises OperationalError after 3s

        # --- Stored procedures ---
        result = await cur.callproc("sp_add_numbers", [10, 20])

        # --- Notices ---
        for msg in cur.messages:
            print("Notice:", msg)

asyncio.run(main())

FastAPI with connection pool

from fastapi import FastAPI, Depends
import nzpy_extended as nzpy
import nzpy_extended.fastapi as nzpy_fastapi

pool = nzpy.NzPool(
    min_size=2, max_size=10,
    host="netezza-host", database="mydb",
    user="admin", password="password",
)

app = FastAPI(lifespan=nzpy_fastapi.lifespan(pool))

@app.get("/users")
async def get_users(conn=Depends(nzpy_fastapi.get_connection)):
    async with conn.cursor() as cur:
        await cur.execute("SELECT * FROM users LIMIT 100")
        return await cur.fetchall()

Sync connection pool

import nzpy_extended.sync as nzpy
from nzpy_extended import SyncPool

pool = SyncPool(
    min_size=2, max_size=10,
    host="netezza-host", database="mydb",
    user="admin", password="password",
)
with pool.connection() as conn:
    conn.execute("SELECT 1").fetchone()
pool.close_all()

Bulk data loading via external table protocol

load_data() inserts rows from a Python iterable into a Netezza table using the native external table protocol (REMOTESOURCE 'python'). It supports optional automatic table creation.

# --- Sync ---
import nzpy_extended.sync as nzpy
conn = nzpy.connect(...)
count = conn.load_data("my_table", [(1, "Alice"), (2, "Bob")])

# --- Async ---
import nzpy_extended as nzpy
count = await nzpy.load_data(conn, "my_table", [(1, "Alice"), (2, "Bob")])

# --- Auto-infer types from data ---
rows = [(1, "Alice", 100.50), (2, "Bob", 200.75)]
count = conn.load_data("my_table", rows)
# Creates: col1 SMALLINT, col2 VARCHAR(255), col3 NUMERIC

# --- Explicit columns ---
count = conn.load_data(
    table_name="products",
    rows=[(101, "Widget", 9.99)],
    columns=[("id", "INT"), ("name", "VARCHAR(200)"), ("price", "NUMERIC(10,2)")],
)

# --- Generator for large datasets ---
def generate_rows(n):
    for i in range(n):
        yield (i, f"item_{i}")
count = conn.load_data("my_table", rows=generate_rows(50000))

Parameters:

Parameter Default Description
conn / table_name / rows (required) Connection, target table, row iterable
columns None [(name, nz_type), ...] or None for auto-infer from data
delimiter '|' Field delimiter
encoding 'LATIN9' Text encoding ('UTF8' for NVARCHAR)
create_if_missing True Auto-create table if not exists
temporary False Create TEMP TABLE
distribute_on_random True Add DISTRIBUTE ON RANDOM
logdir temp dir Netezza log directory
escape_char '\\' Escape character for delimiter within values

Auto-infer column types: When columns is None and create_if_missing=True, the driver reads the first row and maps Python types to Netezza DDL: intSMALLINT/INT/BIGINT, floatFLOAT, strVARCHAR(255), DecimalNUMERIC(p,s), boolBOOLEAN, dateDATE, datetimeTIMESTAMP, bytesBYTEA. Column names default to col1, col2, etc.

Metadata API (catalog introspection)

The conn.meta object provides async access to Netezza system catalog views — tables, columns, views, procedures, distribution keys, storage stats, sessions, and more. All queries run against the current database; connect to SYSTEM for system-wide objects.

import nzpy_extended as nzpy

async def main():
    conn = await nzpy.connect(user="admin", password="password",
                              host="netezza-host", database="mydb")

    # --- Schemas & databases ---
    schemas = await conn.meta.get_schemas()       # ["ADMIN", "INFORMATION_SCHEMA", ...]
    dbs     = await conn.meta.get_databases()     # ["JUST_DATA", "SYSTEM", ...]
    db_name = await conn.meta.get_current_database()   # "JUST_DATA"

    # --- Tables ---
    tables = await conn.meta.get_tables(schema="ADMIN")
    # [{"schema": "ADMIN", "table_name": "DIMDATE", "owner": "ADMIN",
    #   "objtype": "TABLE", "objid": 123456, "row_count": 500000}, ...]

    tables = await conn.meta.get_tables(
        schema="ADMIN", table_pattern="DIM%", include_system=False,
    )

    # --- Views (includes view definition SQL) ---
    views = await conn.meta.get_views(schema="ADMIN")
    # [{"schema": "ADMIN", "view_name": "V_SALES", "owner": "ADMIN",
    #   "objid": 789012, "definition": "CREATE VIEW V_SALES AS SELECT ..."}, ...]

    # --- Columns ---
    cols = await conn.meta.get_columns("DIMDATE", schema="ADMIN")
    # [{"column_name": "DATEKEY", "ordinal": 1,
    #   "data_type": "DATE", "nullable": "N"}, ...]

    # Dot-notation also works:
    cols = await conn.meta.get_columns("ADMIN.DIMDATE")

    # --- Distribution key ---
    dk = await conn.meta.get_distribution_key("FACT_SALES", schema="ADMIN")
    # ["CUSTOMER_ID"]  or [] for RANDOM distribution

    # --- Table sizes ---
    sizes = await conn.meta.get_table_sizes(schema="ADMIN")
    # [{"schema": "ADMIN", "table_name": "FACT_SALES",
    #   "used_bytes": 500000000, "allocated_bytes": 600000000,
    #   "size_mb": 476, "skew": 1.2}, ...]

    # --- Stored procedures ---
    procs = await conn.meta.get_procedures(schema="ADMIN")
    # [{"schema": "ADMIN", "proc_name": "SP_LOAD_DATA",
    #   "owner": "ADMIN", "signature": "SP_LOAD_DATA(VARCHAR(256))",
    #   "returns": "INTEGER", "source": "CREATE PROCEDURE ..."}, ...]

    # --- Sequences & synonyms ---
    seqs = await conn.meta.get_sequences(schema="ADMIN")
    syns = await conn.meta.get_synonyms(schema="ADMIN")

    # --- Sessions ---
    sessions = await conn.meta.get_sessions()
    # [{"session_id": 123, "username": "ADMIN", "database_name": "JUST_DATA",
    #   "conntime": datetime(...), "priority": 0, "status": "active"}, ...]

    # --- Users & groups ---
    users  = await conn.meta.get_users()
    groups = await conn.meta.get_groups()

    # --- Query history (requires history collection enabled) ---
    history = await conn.meta.get_query_history(limit=50, username="ADMIN")

    # --- Search across tables, views, procedures ---
    results = await conn.meta.search_objects("SALES%", schema="ADMIN")
    # [{"object_type": "TABLE", "schema": "ADMIN",
    #   "object_name": "FACT_SALES", "owner": "ADMIN", "objid": 123}, ...]

asyncio.run(main())
Method Returns Notes
get_schemas() list[str] All schemas in current database
get_databases() list[str] All databases visible to user
get_current_database() str Current database name
get_current_schema() str Current schema (search path)
get_tables(schema, pattern, include_system) list[dict] Tables: schema, table_name, owner, objtype, objid, row_count
get_views(schema, pattern) list[dict] Views: schema, view_name, owner, objid, definition (SQL!)
get_columns(table, schema) list[dict] Columns: column_name, ordinal, data_type, nullable, objid
get_distribution_key(table, schema) list[str] Distribution column names (empty = RANDOM)
get_table_sizes(schema, pattern) list[dict] Sizes: used_bytes, allocated_bytes, size_mb, skew
get_procedures(schema, pattern) list[dict] Procs: schema, proc_name, owner, signature, returns, source
get_sequences(schema) list[dict] Sequences: schema, seq_name, owner, objid
get_synonyms(schema) list[dict] Synonyms: schema, synonym_name, ref_database, ref_schema, referenced_object
get_sessions() list[dict] Active sessions: session_id, username, database_name, conntime, priority
get_users() list[dict] Users: username, objid
get_groups() list[dict] Groups: groupname, objid
get_query_history(limit, user) list[dict] History: session_id, username, query_text, submit_time, result_rows
search_objects(pattern, schema) list[dict] Unified search: object_type (TABLE/VIEW/PROCEDURE), schema, object_name

API Reference

Feature Async Sync Notes
connect() nzpy.connect(...) nzpy.sync.connect(...)
cursor() conn.cursor() conn.cursor() Returns Cursor / SyncCursor
execute(sql, params) await cur.execute(...) cur.execute(...) PEP 249, returns cursor
executemany(sql, seq) await cur.executemany(...) cur.executemany(...) Partial failure preserves rowcount
callproc(name, params) await cur.callproc(...) cur.callproc(...) CALL proc_name(args)
fetchone() await cur.fetchone() cur.fetchone() Returns row or None
fetchmany(n) await cur.fetchmany(n) cur.fetchmany(n) Default arraysize=100
fetchall() await cur.fetchall() cur.fetchall()
nextset() await cur.nextset() cur.nextset()
description cur.description cur.description 7-tuple, available after execute
rowcount cur.rowcount cur.rowcount Rows affected
rownumber cur.rownumber cur.rownumber PEP 249, 0-based index
messages cur.messages cur.messages Server notices
arraysize cur.arraysize cur.arraysize Default 100
get_schema_table() cur.get_schema_table() cur.get_schema_table() Rich metadata
conn.execute(sql) await conn.execute(...) conn.execute(...) One-shot convenience
conn.timeout conn.timeout = N Default timeout for cursors
cur.timeout cur.timeout = N Per-cursor timeout
autocommit conn.autocommit conn.autocommit Get/set, default True
closed conn.closed Read-only
commit() / rollback() await conn.commit() conn.commit()
cancel() await conn.cancel() conn.cancel() Session survives
transaction() conn.transaction() Context manager
load_data() await nzpy.load_data(...) nzpy.sync.load_data(...) Bulk insert via external table
conn.load_data() await conn.load_data(...) conn.load_data(...) Method form
conn.meta.get_tables() await conn.meta.get_tables(...) Catalog metadata (async only)
NzPool / SyncPool nzpy.NzPool(...) nzpy.SyncPool(...) Connection pooling

Documentation

Requirements

  • Python ≥ 3.12
  • CPython (PyPy not supported for C extension, pure-Python fallback only)

Testing

Running the test suite

Tests require a running Netezza instance. Set the connection environment variables:

export NZ_DEV_HOST=your_netezza_host
export NZ_DEV_PORT=5480
export NZ_DEV_DB=JUST_DATA
export NZ_DEV_USER=admin
export NZ_DEV_PASSWORD=password

Run all tests:

pytest tests/ -v

C Extension / Pure Python parity

The C extension and pure-Python fallback must produce identical results for all data types. Parity tests verify this in two ways:

Unit tests (tests/test_c_python_parity_unit.py) — compare individual C parser functions against Python reference implementations byte-by-byte. No database required.

pytest tests/test_c_python_parity_unit.py -v

Integration tests (tests/test_c_python_parity_integration.py) — run real SQL queries through both code paths and verify results match. Requires a database.

pytest tests/test_c_python_parity_integration.py -v

Verification script — runs both test suites in C-extension and pure-Python modes side-by-side:

python tools/verify_c_python_parity.py

Disabling C extension at runtime:

Set the environment variable NZPY_EXTENDED_NO_CEXT=1 to force pure-Python mode even when the compiled extension is available. Useful for debugging or verifying fallback correctness.

NZPY_EXTENDED_NO_CEXT=1 pip install nzpy_extended
# or at runtime:
NZPY_EXTENDED_NO_CEXT=1 python -c "import nzpy_extended.core; print(nzpy_extended.core._HAVE_C_EXT)"  # False

Reproducing benchmark results

The per-type benchmark table above is generated by tools/examples/performance_test.py.

Prerequisites

  • A running Netezza instance with a table named JUST_DATA..FACTPRODUCTINVENTORY (or adjust SOURCE_TABLE in the script)
  • Python ≥ 3.12
  • Install the required packages:
pip install nzpy_extended

The official IBM driver is also tested for comparison (pip install nzpy).

Optional (for ODBC comparison):

  • pip install pyodbc — with NetezzaSQL ODBC driver installed (rows labeled pyodbc)
  • Set NZ_ODBC_DRIVER if your ODBC driver uses a different name (default: NetezzaSQL). On Linux/WSL2 the name is defined in /etc/odbcinst.ini, e.g.:
    export NZ_ODBC_DRIVER=NetezzaSQL  # Linux/WSL2
    
  • Linux/WSL2: pyodbc's Unicode API is incompatible with the Netezza ODBC driver. The benchmark auto-detects this and falls back to a ctypes-based ANSI-ODBC wrapper. No additional configuration needed.

Steps

  1. Set connection environment variables:
set NZ_HOST=your_netezza_host     # Windows
set NZ_PORT=5480
set NZ_USER=admin
set NZ_PASSWORD=password
set NZ_DATABASE=JUST_DATA

# or on Linux/macOS:
export NZ_HOST=your_netezza_host
export NZ_PORT=5480
export NZ_USER=admin
export NZ_PASSWORD=password
export NZ_DATABASE=JUST_DATA

All variables have defaults — only NZ_HOST is required if your setup differs from the defaults.

ODBC driver name can be set separately:

export NZ_ODBC_DRIVER=NetezzaSQL  # Linux/macOS — defaults to "NetezzaSQL"
  1. Run the benchmark:
python tools/examples/performance_test.py
  1. Adjust row count (default: 100 000):
set NZ_ROWS=100000     # Windows
export NZ_ROWS=100000  # Linux/macOS

What the script does

  1. Connects using each driver: official_nzpy (always), pyodbc (via ANSI-ODBC ctypes fallback on Linux), nzpy_extended (async + sync, with and without C extension).
  2. Runs six query categories: integer_types, numeric_types, string_types, datetime_types, boolean_types, and all_types (mixed).
  3. Prints per-query timing, a compact DRIVER × TYPE comparison table (matching the README layout), and visual bar charts.

Saving results to a TXT file

Use the --output / -o flag or the NZ_OUTPUT environment variable:

python tools/examples/performance_test.py -o benchmark_results.txt

# or via env var:
set NZ_OUTPUT=benchmark_results.txt
python tools/examples/performance_test.py

Force pure-Python mode

set NZPY_EXTENDED_NO_CEXT=1
python tools/examples/performance_test.py

Pytest benchmark (alternative)

A simpler pytest-based benchmark is also available (10 k rows, nzpy_extended only):

pytest tests/test_benchmark.py -v -m benchmark

License

Apache License 2.0 — see LICENSE.

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

nzpy_extended-0.3.1.tar.gz (142.2 kB view details)

Uploaded Source

Built Distributions

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

nzpy_extended-0.3.1-cp313-cp313-win_arm64.whl (97.9 kB view details)

Uploaded CPython 3.13Windows ARM64

nzpy_extended-0.3.1-cp313-cp313-win_amd64.whl (100.1 kB view details)

Uploaded CPython 3.13Windows x86-64

nzpy_extended-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl (140.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

nzpy_extended-0.3.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (144.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

nzpy_extended-0.3.1-cp313-cp313-macosx_11_0_arm64.whl (97.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

nzpy_extended-0.3.1-cp313-cp313-macosx_10_13_universal2.whl (109.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

nzpy_extended-0.3.1-cp312-cp312-win_arm64.whl (97.9 kB view details)

Uploaded CPython 3.12Windows ARM64

nzpy_extended-0.3.1-cp312-cp312-win_amd64.whl (100.1 kB view details)

Uploaded CPython 3.12Windows x86-64

nzpy_extended-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl (140.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

nzpy_extended-0.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (144.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

nzpy_extended-0.3.1-cp312-cp312-macosx_11_0_arm64.whl (97.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

nzpy_extended-0.3.1-cp312-cp312-macosx_10_13_universal2.whl (109.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

File details

Details for the file nzpy_extended-0.3.1.tar.gz.

File metadata

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

File hashes

Hashes for nzpy_extended-0.3.1.tar.gz
Algorithm Hash digest
SHA256 4781f14cf3e63e8f36eaa30258ccc3df1c38809f919a025e739947ce2b25f348
MD5 893bfd325a57843d767d2341fe7a6838
BLAKE2b-256 2575483180553252215250af06e2fb717a8d4d380f53ea0019950ded77e7dc08

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1.tar.gz:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 d01949adfe174b6ff69ec0e397f24a6c58a94597f254ce3f4c16070f9a8e7a28
MD5 c9bf7f462b06a1e93d54c36402a73d18
BLAKE2b-256 c1bb795fda101cf1082f8e301427607be600ec3e363c045afe5794ebec2b3eeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-win_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 dee7329f527859027c05e80a8cfa872e5e2d6417a7ad1abf28e4ffb39045f1a4
MD5 e448a8e9bc017c44224001a60815df44
BLAKE2b-256 eb16c348e8999f8487f8639ef2f011b1ca72efcba6d16e1f8f2bfcf14eb1bcf3

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-win_amd64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3e7ff151282886716cd999326b201bdb7739955d679b19781f87e07732facf50
MD5 78a868415355d0b08cf0f2610f2e436e
BLAKE2b-256 7547ff48201c9720e85cc92507c048c586d24a1036853e3e61be881aefeed642

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a00474220fa1647fc33a756d0b66aae337fecef51a5f13ffd4d42113ee87a0e
MD5 a7cda2b531ec15b416b548886035787b
BLAKE2b-256 78044251e5c42041259161131b6e2cda4fb0c6b74a915d59158f3a5ad66c368b

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f8201547cd64f6c6ca4fcdcc111ec4fc217bb5355ec28481650e6862b313a8a
MD5 cf1675a1a99e2c864eb8c8f20456e43c
BLAKE2b-256 d4812ce65360431542ee0b3f305f6353e02d9df1aadc5eb2bf6fa4d16f8c80cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 0d430a935a9789cb9a6b3d5182ae7910dbdea0f3bfb1f5e1f0a536423d677741
MD5 f24135529028c7fb4fb9a75c7cc414bf
BLAKE2b-256 33436bf3b1ae3e7a328ed9702f6d4954306ac9ebcc86d1d2602c70cf3d5b5c7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 dc0b758f6a2d87d0dc0ab22c2734558856ec10eb3706e7419b47b0b7fecaf22f
MD5 0be24ce85f21f5a35ca9526eec2d5904
BLAKE2b-256 643a67c477112a1006dc5d7f041d907014527d139fd07f0d07300bd6160d8dda

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-win_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 af79bed6aa74756df623657a7a0865b2c19d5818ae61e81fabdd3b3b8bddfe0a
MD5 05af6e37eb699ded38d194a205a8911a
BLAKE2b-256 9b9e9a9049ca04fac7be419511f3cf2366fe062d654fb2fcd449797e23234742

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-win_amd64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7c9f9d0c78e4205c9ce9a6d6a39e776a9579e02f60e9992a7cfd83b042ef99b4
MD5 ced54f4f2a7bd1c21df4602a8cfdc7dd
BLAKE2b-256 67c097b9a55733bc6c5a2f4ddc831bc47ffbcc3e943d39e10be085d70757076d

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 19a2f5bf794582138bfd262800d0f6c6123670e6784199e813e9653b80e69ffc
MD5 0332530e59091c54e5877f4b197c34a5
BLAKE2b-256 765008617ebaacb3b522c3df6ec853e7c47eb0b634842cbfd74b2aab3387df67

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ddf94057c49c64ffb629908e7e473d5077a39b84df0d6cc9b4c81ae933c1f441
MD5 7794fcb8f8e93bf3b3c21b6f7a318759
BLAKE2b-256 e7561ec2cc6393fd544fdbf94d6f9a9e279d64f492091f697219b1efa02a9f10

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

File details

Details for the file nzpy_extended-0.3.1-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.1-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 d73119457d7879bef779eeb8f6c420d2becd408e1325c7faf59e0cb74a706d8c
MD5 5d18c9d49a90c337aac2497cb894d20b
BLAKE2b-256 dcb9446c7859df3fda330ffbe5b3250f8be05325af4aa8a122932aa58b29ced8

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.1-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

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

Supported by

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