puppetlabs/puppet · error · ArgumentError
field 'data_provider' contains non-alphanumeric characters
Error message
field 'data_provider' contains non-alphanumeric characters
What it means
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.
Source
Thrown at lib/puppet/module_tool/metadata.rb:210
# Validates that the version string can be parsed as per SemVer.
def validate_version(version)
return if SemanticPuppet::Version.valid?(version)
err = _("version string cannot be parsed as a valid Semantic Version")
raise ArgumentError, _("Invalid 'version' field in metadata.json: %{err}") % { err: err }
end
# Validates that the given _value_ is a symbolic name that starts with a letter
# and then contains only letters, digits, or underscore. Will raise an ArgumentError
# if that's not the case.
#
# @param value [Object] The value to be tested
def validate_data_provider(value)
if value.is_a?(String)
unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/
if value =~ /^[a-zA-Z]/
raise ArgumentError, _("field 'data_provider' contains non-alphanumeric characters")
else
raise ArgumentError, _("field 'data_provider' must begin with a letter")
end
end
else
raise ArgumentError, _("field 'data_provider' must be a string")
end
end
# Validates that the version range can be parsed by Semantic.
def validate_version_range(version_range)
SemanticPuppet::VersionRange.parse(version_range)
rescue ArgumentError => e
raise ArgumentError, _("Invalid 'version_range' field in metadata.json: %{err}") % { err: e }
end
end
end
View on GitHub (pinned to e227c27540)
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
Example fix
// before - metadata.json "data_provider": "custom-data", // after "data_provider": "custom_data",
Defensive patterns
Strategy: validation
Validate before calling
value = JSON.parse(File.read('metadata.json'))['data_provider']
if value.is_a?(String) && value !~ /\A[a-zA-Z][a-zA-Z0-9_]*\Z/ && value =~ /\A[a-zA-Z]/
abort "data_provider '#{value}' must contain only letters, digits, and underscores"
end Try / catch
begin
Puppet::ModuleTool::Metadata.from_hash('data_provider' => raw)
rescue ArgumentError => e
raise unless e.message =~ /data_provider.*non-alphanumeric/
raw = raw.tr('^a-zA-Z0-9_', '_') # 'hiera-v5' -> 'hiera_v5'
retry
end Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- field 'data_provider' must begin with a letter
- field 'data_provider' must be a string
- Dependency conflict for %{module_name}: Dependency %{name} w
- Invalid 'name' field in metadata.json: %{err}
- Invalid 'version' field in metadata.json: %{err}
AI-assisted analysis of puppetlabs/puppet@e227c27540 (2026-08-21).
Data as JSON: /api/errors/b2ef4b1ace8d1398.
Report an issue: GitHub.