Python port of d3-interpolate
Project description
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.
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 Distribution
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ddc6281dc76a5622bb59ef34c91172664a765fc426cd366a6cbdce06dcf5ce65
|
|
| MD5 |
a694971572fcfc17633e261729b7960c
|
|
| BLAKE2b-256 |
ca3cf2aeab3ba277ee62de0aeab41b27fd4fbde33c1e524d40914c827bb16bea
|
File details
Details for the file pyd3js_interpolate-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyd3js_interpolate-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f5042bfe1297b5eb6c7d2c6649244673989dc61e7decc32ce2494f8463c91e8
|
|
| MD5 |
ed6b0da5f46351091e5b13eae540f090
|
|
| BLAKE2b-256 |
fa53677c209a90d5410a8314894ce36d187e8215d15ff3048e1f91d0da2fc2a6
|