Contributing a certification row#

Add a new array framework, or a new “crossing” (a way one of raptor’s pieces hands data to or from that framework) for one already certified, to the interop certification matrix.

Time: ~10 min to read · You need: a checkout of this repository plus the one that owns the crossing you are adding, and pytest.

Plugging in a new row is a two-repository process, in order — there is no way to skip the first step.

1. Declare the row in raptor#

ROWS, CERTIFIED and UNIVERSE are closed constants declared in raptor.conformance.interop, in this repository. Open a pull request against raptor that adds the row’s id, framework and kind (one of ALIAS, COPY, STREAM, ENV or INVARIANCE — see the two transfer laws on the Interoperability page) to ROWS (and, for a brand-new framework, to UNIVERSE/CERTIFIED or ROADMAP). This repository is the declaration’s only owner; no other repository may add a row to it.

2. Register the test in the owning repository#

Only once the row exists in raptor does the repository responsible for that crossing register a test for it, with @register_row(row_id):

from raptor.conformance.interop import register_row

@register_row("T-IN-CUDA-ALIAS")
def test_my_cuda_alias():
    ...

register_row refuses an undeclared row id immediately, at decoration time: KeyError: "register_row: 'NOT-A-REAL-ROW' is not a declared row in ROWS". A typo’d id fails loud, not silently — there is no way to certify a crossing by registering a test for a row that step 1 never declared.

3. Pass the two hygiene checks your PR runs into#

Your new test file must pass two checks: no skip tokens, and it must be found by the matrix scanner.

import pathlib

from raptor.conformance.interop import (
    assert_no_skip_tokens,
    discover_matrix_modules,
)

matrix_dir = pathlib.Path("tests/conformance")
modules = discover_matrix_modules(matrix_dir)
assert_no_skip_tokens(*modules)

discover_matrix_modules finds every file that calls register_row, by scanning its AST (Python’s own parsed syntax tree) rather than a hand-maintained list — your new file is found automatically. assert_no_skip_tokens then refuses any pytest.skip / skipif / importorskip in those files outright: nothing is printed when a module passes both checks cleanly; a banned skip token raises AssertionError naming the file and the token.

Why two checks, not one: registration happens at import time (when Python loads the test module), not when the test itself runs, so a “completeness gate” (a check that every declared row has a registered test) can otherwise not tell a row that was never collected apart from one that was collected and then skipped. These two checks are what keep that gate trustworthy.

See also#

Interoperability is the full, human-readable matrix this declaration publishes. Read the interop matrix reads the same declaration from the user side, with no pull request involved.