{"record":{"id":"ffff1db0f4fde40c","repo":"docling-project/docling","slug":"every-record-needs-a-selector-when-record-type-fie","errorCode":null,"errorMessage":"every record needs a selector when record_type_field is set","messagePattern":"every record needs a selector when record_type_field is set","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"docling/datamodel/backend_options.py","lineNumber":562,"sourceCode":"\n    def select(self, record_type: Optional[str]) -> Optional[EbcdicRecordLayout]:\n        \"\"\"Return the schema matching a record-type value, if any.\"\"\"\n        if self.record_type_field is None:\n            return self.records[0]\n        return next(\n            (item for item in self.records if item.selector == record_type), None\n        )\n\n    @model_validator(mode=\"after\")\n    def _validate_records(self) -> \"EbcdicLayout\":\n        if len(self.records) > 1 and self.record_type_field is None:\n            raise ValueError(\n                \"record_type_field is required for a layout with several records\"\n            )\n        if self.record_type_field is not None:\n            selectors = [item.selector for item in self.records]\n            if None in selectors:\n                raise ValueError(\n                    \"every record needs a selector when record_type_field is set\"\n                )\n            if len(set(selectors)) != len(selectors):\n                raise ValueError(\"record selectors must be unique\")\n        return self\n\n\nclass EbcdicBackendOptions(BaseBackendOptions):\n    \"\"\"Options specific to the EBCDIC backend.\"\"\"\n\n    kind: Annotated[Literal[\"ebcdic\"], Field(exclude=True, repr=False)] = \"ebcdic\"\n    encoding: Annotated[\n        str,\n        Field(\n            description=(\n                \"Python codec used to decode character data, e.g. `cp037` \"\n                \"(US/Canada), `cp500` (international) or `cp1140` (euro).\"\n            )","sourceCodeStart":544,"sourceCodeEnd":580,"githubUrl":"https://github.com/docling-project/docling/blob/61d76f1ff3f8428065465889f7b4577da7df704c/docling/datamodel/backend_options.py#L544-L580","documentation":"Pydantic model_validator on EbcdicLayout: once record_type_field is set, every entry in records must carry a non-None selector, because select() matches records by item.selector == record_type. A record without a selector can never be chosen, so the layout is rejected.","triggerScenarios":"Setting record_type_field='REC_TYPE' but leaving one EbcdicRecordLayout's selector as None (the default) — e.g., adding a new record type and forgetting its selector.","commonSituations":"Iteratively building layouts: start with selectors on all records, then append a record copied from a template without filling selector; JSON layout files where a selector key was dropped.","solutions":["Set an explicit selector on every record in records, each matching a concrete value of record_type_field.","Audit the layout dict/JSON for missing 'selector' keys before constructing EbcdicLayout.","Keep a test that asserts all(r.selector for r in layout.records) when record_type_field is set."],"exampleFix":"# before\nEbcdicLayout(record_type_field='REC_TYPE', records=[\n    EbcdicRecordLayout(selector='01', fields=...),\n    EbcdicRecordLayout(fields=...),  # selector missing -> ValueError\n])\n\n# after\nEbcdicLayout(record_type_field='REC_TYPE', records=[\n    EbcdicRecordLayout(selector='01', fields=...),\n    EbcdicRecordLayout(selector='02', fields=...),\n])","handlingStrategy":"validation","validationCode":"def all_records_have_selector(records, record_type_field) -> bool:\n    if record_type_field is None:\n        return True\n    return all(r.get('selector') is not None for r in records)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When record_type_field is set, treat selector as a required field in every record entry.","Validate layout JSON with your own schema before constructing the Pydantic model.","Code-generate layouts from the record spec so selectors cannot be forgotten."],"tags":["ebcdic","validation","pydantic"],"backgroundTag":null,"analyzedSha":"61d76f1ff3f8428065465889f7b4577da7df704c","analyzedAt":"2026-08-14T23:53:18.727Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}