{"record":{"id":"2bf5e692a3accdbd","repo":"apache/beam","slug":"transform-mapping-must-be-a-dict","errorCode":null,"errorMessage":"'Transform mapping must be a dict.'","messagePattern":"'Transform mapping must be a dict\\.'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_provider.py","lineNumber":479,"sourceCode":"  def _affinity(self, other: \"Provider\"):\n    if isinstance(other, InlineProvider):\n      return 50\n    else:\n      return super()._affinity(other)\n\n  def _with_extra_dependencies(self, dependencies: Iterable[str]):\n    return ExternalPythonProvider(\n        self._urns, None, set(self._packages).union(set(dependencies)))\n\n\n@ExternalProvider.register_provider_type('yaml')\nclass YamlProvider(Provider):\n  def __init__(\n      self,\n      transforms: Mapping[str, Mapping[str, Any]],\n      provider_base_path: Optional[str] = None):\n    if not isinstance(transforms, dict):\n      raise ValueError('Transform mapping must be a dict.')\n    self._transforms = transforms\n    self._provider_base_path = provider_base_path\n\n  def available(self):\n    return True\n\n  def cache_artifacts(self):\n    pass\n\n  def provided_transforms(self):\n    return self._transforms.keys()\n\n  def config_schema(self, type):\n    return json_utils.json_schema_to_beam_schema(self.json_config_schema(type))\n\n  def json_config_schema(self, type):\n    return dict(\n        type='object',","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_provider.py#L461-L497","documentation":"YamlProvider.__init__ (yaml_provider.py:479) requires its 'transforms' argument to be a dict mapping transform names to configurations. Passing any other Mapping/list raises ValueError 'Transform mapping must be a dict.'","triggerScenarios":"Constructing YamlProvider(transforms=...) programmatically with a list, OrderedDict-like non-dict mapping, or a JSON array; a provider spec whose 'transforms' value parses as a list rather than a mapping.","commonSituations":"Building providers from JSON/YAML where 'transforms' was authored as a sequence; passing a collections.abc.Mapping that isn't a dict subclass (the check is isinstance(transforms, dict)).","solutions":["Convert the transforms argument to a plain dict: dict(transforms).","Fix the provider spec so 'transforms' is a YAML mapping (name: config), not a list of entries.","If using a custom Mapping type, wrap or copy it into a dict before constructing YamlProvider."],"exampleFix":"// before\nYamlProvider(transforms=[{'A': {...}}])\n// after\nYamlProvider(transforms={'A': {...}})","handlingStrategy":"type-guard","validationCode":"if not isinstance(transforms, dict):\n    transforms = dict(transforms)  # or fix the source spec to be a mapping","typeGuard":"def is_transform_mapping(x) -> bool:\n    return isinstance(x, dict) and all(isinstance(k, str) for k in x)","tryCatchPattern":"try:\n    p = YamlProvider(transforms)\nexcept ValueError as e:\n    log.error('YamlProvider needs a dict of transforms: %s', e)\n    raise","preventionTips":["Author 'transforms' in YAML as a mapping, never a list of entries.","Copy non-dict Mappings into plain dict before constructing YamlProvider.","Add a schema check for provider specs that asserts transforms is a mapping."],"tags":["python","apache-beam","yaml","provider","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-14T21:17:11.552Z"}