The breaking half of #1550, deliberately deferred out of #1556 so that 2.3.4 stayed additive.
What 2.3.4 shipped
encode/decode gained an explicit context argument carrying schema, table, field and config. Nothing broke, by three deliberate choices:
- DataJoint passes
context only to codecs whose signature declares it, so a codec with the old signature is never offered the argument.
- The underscore keys —
_schema, _table, _field, _config — stay in key and are still populated.
_extract_context(key) still accepts one argument, warning only when it actually falls back to those keys.
The documentation already teaches the new signature as the signature, in both repos, so codecs written from 2.3.4 onward are ready for this.
What this issue removes
- Stop populating the underscore keys.
table.py builds them alongside codec_context; decode_attribute builds {"_config": ...} alongside {"config": ...}. Both halves collapse to the context one, and key reverts to meaning the primary key, as it does everywhere else in DataJoint.
- Drop the fallback in
_extract_context and Codec._codec_config, along with the DeprecationWarning.
- Drop the capability check. With every supported codec declaring
context, _accepts_kwarg(fn, "context") can go and the argument is passed unconditionally. The store_name check stays — that one is genuinely optional.
Worth doing at the same time
Make config a required parameter of _build_path and _get_backend rather than defaulting to None with a global-config fallback. That fallback is what made the original defect silent: omitting config resolved a different store rather than raising, which is how dj-figpack-codecs#6 and dj-canvasxpress-codecs#3 both shipped broken. A required parameter turns that into a TypeError at the call site.
This is the part with real value, and it is why the deprecation window exists.
Migration
For a codec author it is two lines:
# before
def encode(self, value, *, key=None, store_name=None):
schema, table, field, pk = self._extract_context(key)
config = (key or {}).get("_config")
# after
def encode(self, value, *, key=None, context=None, store_name=None):
schema, table, field, pk = self._extract_context(key, context)
config = self._codec_config(key, context)
Before closing
Check the four codecs in the ecosystem — dj-figpack-codecs, dj-canvasxpress-codecs, dj-zarr-codecs, dj-photon-codecs. All four were on the old signature when 2.3.4 was cut; each needs the two-line change above before the legacy path is removed, and a release that requires DataJoint >= 2.4.
The breaking half of #1550, deliberately deferred out of #1556 so that 2.3.4 stayed additive.
What 2.3.4 shipped
encode/decodegained an explicitcontextargument carryingschema,table,fieldandconfig. Nothing broke, by three deliberate choices:contextonly to codecs whose signature declares it, so a codec with the old signature is never offered the argument._schema,_table,_field,_config— stay inkeyand are still populated._extract_context(key)still accepts one argument, warning only when it actually falls back to those keys.The documentation already teaches the new signature as the signature, in both repos, so codecs written from 2.3.4 onward are ready for this.
What this issue removes
table.pybuilds them alongsidecodec_context;decode_attributebuilds{"_config": ...}alongside{"config": ...}. Both halves collapse to thecontextone, andkeyreverts to meaning the primary key, as it does everywhere else in DataJoint._extract_contextandCodec._codec_config, along with theDeprecationWarning.context,_accepts_kwarg(fn, "context")can go and the argument is passed unconditionally. Thestore_namecheck stays — that one is genuinely optional.Worth doing at the same time
Make
configa required parameter of_build_pathand_get_backendrather than defaulting toNonewith a global-config fallback. That fallback is what made the original defect silent: omittingconfigresolved a different store rather than raising, which is howdj-figpack-codecs#6anddj-canvasxpress-codecs#3both shipped broken. A required parameter turns that into aTypeErrorat the call site.This is the part with real value, and it is why the deprecation window exists.
Migration
For a codec author it is two lines:
Before closing
Check the four codecs in the ecosystem —
dj-figpack-codecs,dj-canvasxpress-codecs,dj-zarr-codecs,dj-photon-codecs. All four were on the old signature when 2.3.4 was cut; each needs the two-line change above before the legacy path is removed, and a release that requires DataJoint >= 2.4.