{"record":{"id":"04f122daf8811bf8","repo":"apache/beam","slug":"renamingprovider-mappings-must-be-dict-of-transform-mappings","errorCode":null,"errorMessage":"\"RenamingProvider mappings must be dict of transform mappings.\"","messagePattern":"\"RenamingProvider mappings must be dict of transform mappings\\.\"","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_provider.py","lineNumber":1507,"sourceCode":"      provider_base_path,\n      mappings,\n      underlying_provider,\n      defaults=None):\n    if isinstance(underlying_provider, dict):\n      underlying_provider = ExternalProvider.provider_from_spec(\n          provider_base_path, underlying_provider)\n    self._transforms = transforms\n    self._underlying_provider = underlying_provider\n    for transform in transforms.keys():\n      if transform not in mappings:\n        raise ValueError(f'Missing transform {transform} in mappings.')\n    self._mappings = self.expand_mappings(mappings)\n    self._defaults = defaults or {}\n\n  @staticmethod\n  def expand_mappings(mappings):\n    if not isinstance(mappings, dict):\n      raise ValueError(\n          \"RenamingProvider mappings must be dict of transform \"\n          \"mappings.\")\n    for key, value in mappings.items():\n      if isinstance(value, str):\n        if value not in mappings.keys():\n          raise ValueError(\n              \"RenamingProvider transform mappings must be dict or \"\n              \"specify transform that has mappings within same \"\n              \"provider.\")\n        mappings[key] = mappings[value]\n    return mappings\n\n  def available(self) -> bool:\n    return self._underlying_provider.available()\n\n  def provided_transforms(self) -> Iterable[str]:\n    return self._transforms.keys()\n","sourceCodeStart":1489,"sourceCodeEnd":1525,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_provider.py#L1489-L1525","documentation":"Raised by RenamingProvider.expand_mappings when the mappings argument is not a dict. RenamingProvider requires mappings to be a dict of transform-name -> mapping (target transform name or config mapping dict).","triggerScenarios":"Passing mappings as a list, string, or None to RenamingProvider, e.g. mappings=['Read'] or a YAML mapping that parsed as a scalar.","commonSituations":"Malformed YAML provider spec where the mappings section is a sequence rather than a map, or programmatic construction with the wrong shape.","solutions":["Pass mappings as a dict, e.g. {'MyRead': 'Read'} or {'MyRead': {'underlying': 'Read', 'config': {...}}}.","Fix the YAML provider spec so mappings is a map (key: value pairs), not a list.","Check for None: provide a default empty dict if no mappings are needed (with a corresponding transforms list)."],"exampleFix":"// before\nRenamingProvider(provider, transforms=['MyRead'], mappings=['Read'])\n// after\nRenamingProvider(provider, transforms=['MyRead'], mappings={'MyRead': 'Read'})","handlingStrategy":"type-guard","validationCode":"def validate_mappings_shape(mappings):\n    if not isinstance(mappings, dict):\n        raise TypeError('mappings must be a dict of transform mappings')","typeGuard":"def is_valid_mappings(mappings):\n    return isinstance(mappings, dict)","tryCatchPattern":"try:\n    provider = RenamingProvider(base, transforms, mappings)\nexcept ValueError as e:\n    if 'must be dict' in str(e):\n        logging.error('Fix mappings shape to a dict: %s', e)\n        raise\n    raise","preventionTips":["In YAML, ensure mappings uses key: value map syntax, not a list of items.","Never pass None; use {} plus a matching transforms list.","Validate the provider spec against its JSON schema before loading."],"tags":["python","apache-beam","yaml","type-mismatch"],"backgroundTag":"config-type-mismatch","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}