Skip to content

Require the codec context kwarg: remove connection context from the key dict #1557

Description

@dimitri-yatsenko

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions