{"record":{"id":"b2ef4b1ace8d1398","repo":"puppetlabs/puppet","slug":"field-data-provider-contains-non-alphanumeric-ch","errorCode":null,"errorMessage":"field 'data_provider' contains non-alphanumeric characters","messagePattern":"field 'data_provider' contains non-alphanumeric characters","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/metadata.rb","lineNumber":210,"sourceCode":"\n    # Validates that the version string can be parsed as per SemVer.\n    def validate_version(version)\n      return if SemanticPuppet::Version.valid?(version)\n\n      err = _(\"version string cannot be parsed as a valid Semantic Version\")\n      raise ArgumentError, _(\"Invalid 'version' field in metadata.json: %{err}\") % { err: err }\n    end\n\n    # Validates that the given _value_ is a symbolic name that starts with a letter\n    # and then contains only letters, digits, or underscore. Will raise an ArgumentError\n    # if that's not the case.\n    #\n    # @param value [Object] The value to be tested\n    def validate_data_provider(value)\n      if value.is_a?(String)\n        unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/\n          if value =~ /^[a-zA-Z]/\n            raise ArgumentError, _(\"field 'data_provider' contains non-alphanumeric characters\")\n          else\n            raise ArgumentError, _(\"field 'data_provider' must begin with a letter\")\n          end\n        end\n      else\n        raise ArgumentError, _(\"field 'data_provider' must be a string\")\n      end\n    end\n\n    # Validates that the version range can be parsed by Semantic.\n    def validate_version_range(version_range)\n      SemanticPuppet::VersionRange.parse(version_range)\n    rescue ArgumentError => e\n      raise ArgumentError, _(\"Invalid 'version_range' field in metadata.json: %{err}\") % { err: e }\n    end\n  end\nend\n","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/metadata.rb#L192-L228","documentation":"Puppet::ModuleTool::Metadata#validate_data_provider checks the legacy 'data_provider' field of metadata.json when present: as a String it must match ^[a-zA-Z][a-zA-Z0-9_]*$. This branch fires when the string starts with a letter (or generally matches the start rule) but contains characters outside letters/digits/underscore — e.g. hyphens, dots, or slashes.","triggerScenarios":"A metadata.json containing \"data_provider\": \"hiera-v5\" or \"my.provider\" — the leading letter passes the start check but '-' or '.' trips the non-alphanumeric branch at line 210.","commonSituations":"Setting data_provider to a hyphenated provider name; migrating Puppet 3/4 environment data providers where values like 'hiera' vs 'hiera_data' differ; stale data_provider entries left after the feature was deprecated.","solutions":["Use an underscored identifier: \"data_provider\": \"hiera_v5\" instead of \"hiera-v5\"","If you no longer use the data provider feature, delete the field entirely — it is optional and deprecated","Use one of the bare built-in names like 'hiera' where applicable"],"exampleFix":"// before - metadata.json\n\"data_provider\": \"custom-data\",\n\n// after\n\"data_provider\": \"custom_data\",","handlingStrategy":"validation","validationCode":"value = JSON.parse(File.read('metadata.json'))['data_provider']\nif value.is_a?(String) && value !~ /\\A[a-zA-Z][a-zA-Z0-9_]*\\Z/ && value =~ /\\A[a-zA-Z]/\n  abort \"data_provider '#{value}' must contain only letters, digits, and underscores\"\nend","typeGuard":null,"tryCatchPattern":"begin\n  Puppet::ModuleTool::Metadata.from_hash('data_provider' => raw)\nrescue ArgumentError => e\n  raise unless e.message =~ /data_provider.*non-alphanumeric/\n  raw = raw.tr('^a-zA-Z0-9_', '_')  # 'hiera-v5' -> 'hiera_v5'\n  retry\nend","preventionTips":["Remove the deprecated data_provider field unless you truly use custom data providers","Restrict provider identifiers to letters, digits, and underscores from the start","Lint metadata.json changes in review; treat data_provider edits with suspicion"],"tags":["puppet","module-tool","metadata","data-provider","validation"],"backgroundTag":"invalid-metadata-field","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}