{"record":{"id":"491adf1ec7ce5c22","repo":"puppetlabs/puppet","slug":"name-must-be-a-string-not-klass","errorCode":null,"errorMessage":"Name must be a String not %{klass}","messagePattern":"Name must be a String not %(.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/type/package.rb","lineNumber":274,"sourceCode":"          ...\n\n          $ssh = $os['name'] ? {\n            solaris => SMCossh,\n            default => openssh\n          }\n\n          package { 'openssh':\n            ensure  => installed,\n            name    => $ssh,\n            require => Package['openssl'],\n          }\n\n      \"\n      isnamevar\n\n      validate do |value|\n        unless value.is_a?(String)\n          raise ArgumentError, _(\"Name must be a String not %{klass}\") % { klass: value.class }\n        end\n      end\n    end\n\n    # We call providify here so that we can set provider as a namevar.\n    # Normally this method is called after newtype finishes constructing this\n    # Type class.\n    providify\n    paramclass(:provider).isnamevar\n\n    def self.parameters_to_include\n      [:provider]\n    end\n\n    # Specify a targeted package management command.\n    newparam(:command, :required_features => :targetable) do\n      desc <<-EOT\n        The targeted command to use when managing a package:","sourceCodeStart":256,"sourceCodeEnd":292,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/type/package.rb#L256-L292","documentation":"The package type's name parameter (a namevar) validates that it is a String: arrays, nil/undef, hashes, or symbols raise \"Name must be a String not %{klass}\". One package resource manages exactly one package name.","triggerScenarios":"`package { 'foo': name => ['a', 'b'] }`; a Hiera lookup where the name key resolves to undef; ENC or Ruby code passing a hash/symbol; note that array titles like `package { ['a','b']: }` are fine — only an explicit non-string name parameter raises.","commonSituations":"Hiera data missing the name key after refactors; external tools emitting lists into name; assuming array-title semantics apply to the name parameter; params classes defaulting name to undef.","solutions":["Set name to a single string: `name => 'openssl'`.","For multiple packages iterate: `['a','b'].each |$p| { package { $p: ensure => installed } }`.","Fix Hiera so the key resolves, and guard with `assert_type(String, $name)`.","In Ruby, fail loudly on nil instead of coercing it to the string 'nil'."],"exampleFix":"// before\npackage { 'ssh': name => ['openssh-server', 'openssh-client'] }\n\n// after\n['openssh-server', 'openssh-client'].each |$p| {\n  package { $p: ensure => installed }\n}","handlingStrategy":"type-guard","validationCode":"// Puppet: guard Hiera-sourced names\n$name = assert_type(String, $name)","typeGuard":"def package_name_ok?(v)\n  v.is_a?(String) && !v.empty?\nend","tryCatchPattern":null,"preventionTips":["One name per resource; loop over lists instead.","assert_type(String, ...) on any Hiera-sourced name.","Watch refactors that leave the name key undef.","Put arrays in the resource title, never in the name parameter."],"tags":["puppet","package","namevar","type-validation","hiera"],"backgroundTag":"invalid-parameter-value","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}