{"record":{"id":"73c57933da78de72","repo":"apache/beam","slug":"renamingprovider-transform-mappings-must-be-dict-or-specify","errorCode":null,"errorMessage":"\"RenamingProvider transform mappings must be dict or specify transform that has mappings within same provider.\"","messagePattern":"\"RenamingProvider transform mappings must be dict or specify transform that has mappings within same provider\\.\"","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_provider.py","lineNumber":1513,"sourceCode":"          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\n  def config_schema(self, type):\n    underlying_schema = self._underlying_provider.config_schema(\n        self._transforms[type])\n    if underlying_schema is None:\n      return None\n    defaults = self._defaults.get(type, {})","sourceCodeStart":1495,"sourceCodeEnd":1531,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_provider.py#L1495-L1531","documentation":"Raised by RenamingProvider.expand_mappings when a mappings value is a string alias but that alias does not itself exist as a key in the same mappings dict. String values must reference another transform's mappings within the same provider.","triggerScenarios":"mappings={'MyRead': 'Read'} where 'Read' is not itself a key in mappings — string values must point at another mapping entry, not directly at the underlying transform name that lacks its own mappings.","commonSituations":"Authors assume string values are direct aliases of underlying transform names, but the provider requires the target name to also have an entry (typically a dict of config mappings) in the same mappings dict.","solutions":["Give the target transform its own mapping entry: mappings={'MyRead': 'Read', 'Read': {...actual mapping...}}.","Replace the string alias with the actual mapping dict: mappings={'MyRead': {'input': ..., 'output': ...}}.","Fix the alias spelling so it matches an existing key in mappings."],"exampleFix":"// before\nmappings={'MyRead': 'Read'}\n// after\nmappings={'MyRead': 'Read', 'Read': {'config_mapping': {...}}}","handlingStrategy":"validation","validationCode":"def validate_string_aliases(mappings):\n    for k, v in mappings.items():\n        if isinstance(v, str) and v not in mappings:\n            raise ValueError(f'Alias {v!r} for {k!r} must be another key in mappings')","typeGuard":null,"tryCatchPattern":"try:\n    provider = RenamingProvider(base, transforms, mappings)\nexcept ValueError as e:\n    if 'must be dict or specify transform' in str(e):\n        logging.error('String alias target missing from mappings: %s', e)\n        raise\n    raise","preventionTips":["Remember string values are aliases to other mappings keys, not underlying transform names.","Prefer inline dict mappings over string aliases to avoid indirection bugs.","Add a pre-load validation pass resolving aliases before constructing the provider."],"tags":["python","apache-beam","yaml","provider"],"backgroundTag":"missing-required-config-field","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"}