Skip to main content

Python port of d3-interpolate

Project description

pyd3js-interpolate

PyPI version Python versions License CI Security

Python port of d3-interpolate.

Tracked version: upstream_lock.json (d3-interpolate@3.0.1).

What is d3-interpolate?

d3-interpolate provides interpolators: functions that map a parameter (t \in [0,1]) between two values (numbers, colors, dates, arrays, affine transforms, zoom views, and more). D3 uses these for transitions and animations; this package brings the same building blocks to Python (with DOM-free transform parsing).

What you get

  • 100% upstream export parity for the pinned d3-interpolate@3.0.1 (see the compatibility matrix and docs/UPSTREAM_API.md).
  • 100% line coverage for pyd3js_interpolate (enforced via --cov-fail-under=100 when running this package’s tests).
  • Pytest ports of the upstream Mocha tests, plus an optional vendored Mocha gate (-m upstream) after scripts/vendor_upstream.py and npm install.
  • Runnable docs: docs/USER_GUIDE.md examples are checked by the test suite (same pattern as pyd3js-array).
  • D3-style camelCase names on the package (e.g. interpolateRgb) and snake_case equivalents (e.g. interpolate_rgb).
  • DOM-free interpolateTransformCss / interpolateTransformSvg (no browser DOMMatrix or SVG DOM).

Install

From PyPI:

pip install pyd3js-interpolate

This pulls in pyd3js-color automatically.

Workspace development:

uv sync --group dev

Usage

import pyd3js_interpolate as d3

i = d3.interpolate(0, 10)
print(i(0.5))

c = d3.interpolateRgb("steelblue", "brown")
print(c(0.5))
5.0
rgb(118, 86, 111)

Compatibility matrix

Pinned upstream inventory: docs/UPSTREAM_API.md.

Legend:

  • [implemented]: ported for the pinned version; covered by Python tests (and optional upstream Mocha gate).
  • [missing]: reserved for upstream drift (should not appear for the pinned version).

Upstream exports (d3-interpolate@3.0.1)

  • interpolate — [implemented]
  • interpolateArray — [implemented]
  • interpolateBasis — [implemented]
  • interpolateBasisClosed — [implemented]
  • interpolateDate — [implemented]
  • interpolateDiscrete — [implemented]
  • interpolateHue — [implemented]
  • interpolateNumber — [implemented]
  • interpolateNumberArray — [implemented]
  • interpolateObject — [implemented]
  • interpolateRound — [implemented]
  • interpolateString — [implemented]
  • interpolateTransformCss — [implemented]
  • interpolateTransformSvg — [implemented]
  • interpolateZoom — [implemented]
  • interpolateRgb — [implemented]
  • interpolateRgbBasis — [implemented]
  • interpolateRgbBasisClosed — [implemented]
  • interpolateHsl — [implemented]
  • interpolateHslLong — [implemented]
  • interpolateLab — [implemented]
  • interpolateHcl — [implemented]
  • interpolateHclLong — [implemented]
  • interpolateCubehelix — [implemented]
  • interpolateCubehelixLong — [implemented]
  • piecewise — [implemented]
  • quantize — [implemented]

Python-only helpers

The module also exposes isNumberArray / is_number_array, snake_case interpolate_* aliases, interpolate_value, generic_array, and basis_fn for Python ergonomics (not separate names in upstream index.js).

Testing

# From repo root, or from this package directory (`uv run pytest` enforces 100% line coverage via pyproject.toml):
uv run pytest packages/pyd3js-interpolate/package_tests --cov=pyd3js_interpolate --cov-fail-under=100
uv run ruff format packages/pyd3js-interpolate
uv run ruff check packages/pyd3js-interpolate
uv run ty check packages/pyd3js-interpolate/src

Upstream Mocha suite (optional)

uv run python scripts/vendor_upstream.py
cd packages/pyd3js-interpolate/upstream/d3-interpolate && npm install
uv run pytest -m upstream packages/pyd3js-interpolate/package_tests

Use npm install --legacy-peer-deps if the vendored tree requires it (same as pyd3js-array).

Documentation

Stability notes

  • Numbers / truthiness: interpolators treat IEEE NaN like JavaScript (e.g. nogamma uses a JS-style “truthy difference” check).
  • interpolateNumberArray: accepts Python array.array, 1-D memoryview, numeric list / tuple (stored as float like JS number arrays), and None as a or b matching JS undefined / empty-buffer behavior; multi-dimensional or unsupported buffer formats are rejected.
  • interpolate / value.js: collections.abc.Mapping (not only dict) uses the object interpolator; interpolateNumber applies a JS-style unary-+ / ToNumber approximation (valueOftoString / overridden __str__, with a recursion cap). Dispatch uses ToNumber(b) to choose object vs number, matching value.js. Boxed booleans via valueOf coerce to 0/1 like JS.
  • interpolateObject: user-defined valueOf / toString methods on the class (not inherited from object alone) are included in the key set, similar to enumerable prototype fields in JS for…in.
  • Transforms: interpolateTransformSvg parses the SVG transform attribute with the same affine composer as CSS (not only a single matrix(...)), including rotate(angle cx cy) as translate(cx,cy) rotate(angle) translate(-cx,-cy) and skewY(angle) (alongside skewX). Decomposition follows d3’s six-parameter model (translate, rotate, skewX, scaleX, scaleY); a lone skewY is folded into that basis like a browser DOMMatrix decomposition, not re-emitted as a skewY(...) token in interpolateTransformCss / Svg.

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

pyd3js_interpolate-0.1.0.tar.gz (86.2 kB view details)

Uploaded Source

Built Distribution

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

pyd3js_interpolate-0.1.0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file pyd3js_interpolate-0.1.0.tar.gz.

File metadata

  • Download URL: pyd3js_interpolate-0.1.0.tar.gz
  • Upload date:
  • Size: 86.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pyd3js_interpolate-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ddc6281dc76a5622bb59ef34c91172664a765fc426cd366a6cbdce06dcf5ce65
MD5 a694971572fcfc17633e261729b7960c
BLAKE2b-256 ca3cf2aeab3ba277ee62de0aeab41b27fd4fbde33c1e524d40914c827bb16bea

See more details on using hashes here.

File details

Details for the file pyd3js_interpolate-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pyd3js_interpolate-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3f5042bfe1297b5eb6c7d2c6649244673989dc61e7decc32ce2494f8463c91e8
MD5 ed6b0da5f46351091e5b13eae540f090
BLAKE2b-256 fa53677c209a90d5410a8314894ce36d187e8215d15ff3048e1f91d0da2fc2a6

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