pyd3js-interpolate
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 anddocs/UPSTREAM_API.md). - 100% line coverage for
pyd3js_interpolate(enforced via--cov-fail-under=100when running this package’s tests). - Pytest ports of the upstream Mocha tests, plus an optional vendored Mocha gate (
-m upstream) afterscripts/vendor_upstream.pyandnpm install. - Runnable docs:
docs/USER_GUIDE.mdexamples are checked by the test suite (same pattern aspyd3js-array). - D3-style camelCase names on the package (e.g.
interpolateRgb) and snake_case equivalents (e.g.interpolate_rgb). - DOM-free
interpolateTransformCss/interpolateTransformSvg(no browserDOMMatrixor 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
- User guide:
docs/USER_GUIDE.md - Changelog:
docs/CHANGELOG.md - Roadmap:
docs/ROADMAP.md - Upstream update checklist:
docs/UPSTREAM_UPDATE.md
Stability notes
- Numbers / truthiness: interpolators treat IEEE NaN like JavaScript (e.g.
nogammauses a JS-style “truthy difference” check). interpolateNumberArray: accepts Pythonarray.array, 1-Dmemoryview, numericlist/tuple(stored asfloatlike JS number arrays), andNoneasaorbmatching JSundefined/ empty-buffer behavior; multi-dimensional or unsupported buffer formats are rejected.interpolate/value.js:collections.abc.Mapping(not onlydict) uses the object interpolator;interpolateNumberapplies a JS-style unary-+/ToNumberapproximation (valueOf→toString/ overridden__str__, with a recursion cap). Dispatch usesToNumber(b)to choose object vs number, matchingvalue.js. Boxed booleans viavalueOfcoerce to0/1like JS.interpolateObject: user-definedvalueOf/toStringmethods on the class (not inherited fromobjectalone) are included in the key set, similar to enumerable prototype fields in JSfor…in.- Transforms:
interpolateTransformSvgparses the SVGtransformattribute with the same affine composer as CSS (not only a singlematrix(...)), includingrotate(angle cx cy)astranslate(cx,cy) rotate(angle) translate(-cx,-cy)andskewY(angle)(alongsideskewX). Decomposition follows d3’s six-parameter model (translate,rotate,skewX,scaleX,scaleY); a loneskewYis folded into that basis like a browserDOMMatrixdecomposition, not re-emitted as askewY(...)token ininterpolateTransformCss/Svg.
Metadata
Release files for pyd3js-interpolate 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyd3js_interpolate-0.1.0.tar.gz | 86.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyd3js_interpolate-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.4 kB
Release files / pyd3js_interpolate-0.1.0.tar.gz
| Download URL | pyd3js_interpolate-0.1.0.tar.gz |
|---|---|
| Size | 86.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ddc6281dc76a5622bb59ef34c91172664a765fc426cd366a6cbdce06dcf5ce65
|
|
BLAKE2b-256 checksum How to use checksums |
ca3cf2aeab3ba277ee62de0aeab41b27fd4fbde33c1e524d40914c827bb16bea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Release files / pyd3js_interpolate-0.1.0-py3-none-any.whl
| Download URL | pyd3js_interpolate-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3f5042bfe1297b5eb6c7d2c6649244673989dc61e7decc32ce2494f8463c91e8
|
|
BLAKE2b-256 checksum How to use checksums |
fa53677c209a90d5410a8314894ce36d187e8215d15ff3048e1f91d0da2fc2a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|