{"record":{"id":"89b22383e17a7397","repo":"puppetlabs/puppet","slug":"invalid-version-range-field-in-metadata-json","errorCode":null,"errorMessage":"Invalid 'version_range' field in metadata.json: %{err}","messagePattern":"Invalid 'version_range' field in metadata\\.json: %(.+?)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/metadata.rb","lineNumber":224,"sourceCode":"    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":206,"sourceCodeEnd":228,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/metadata.rb#L206-L228","documentation":"Puppet::ModuleTool::Metadata#validate_version_range wraps SemanticPuppet::VersionRange.parse and converts its ArgumentError into this metadata-specific message. Every dependency's version_requirement in metadata.json passes through here (add_dependency line 69), so one malformed range anywhere in the dependency list fails the whole metadata parse with the underlying parse error shown.","triggerScenarios":"A metadata.json dependency with \"version_requirement\": \"latest\", \">= 1.0 < < 2.0\" (malformed operator), \"1.x.x.x\" or another string SemanticPuppet::VersionRange.parse rejects; parse error text is embedded via %{err}.","commonSituations":"Copy-pasting npm/gem style ranges ('^1.2.3', '~> 2.1') that SemanticPuppet does not accept; typo'd operators; empty-string requirements after bad templating; ranges assembled by string concatenation that drop a bound.","solutions":["Use SemanticPuppet range syntax: '>= 1.0.0 < 3.0.0', '1.x', or exact '2.1.3'","Remove non-SemVer conventions: no '^', no '~>', no 'latest' in version_requirement","Test the range standalone: `ruby -r semantic_puppet -e \"SemanticPuppet::VersionRange.parse(ARGV[0])\" '>= 1.0.0 < 2.0.0'`","If you want 'any version', omit version_requirement entirely instead of using a placeholder string"],"exampleFix":"// before - metadata.json\n{ \"name\": \"puppetlabs/stdlib\", \"version_requirement\": \"^4.0.0\" }\n\n// after\n{ \"name\": \"puppetlabs/stdlib\", \"version_requirement\": \">= 4.0.0 < 5.0.0\" }","handlingStrategy":"validation","validationCode":"require 'semantic_puppet'\n\nJSON.parse(File.read('metadata.json'))['dependencies'].each do |dep|\n  next unless dep['version_requirement']\n  begin\n    SemanticPuppet::VersionRange.parse(dep['version_requirement'])\n  rescue ArgumentError\n    abort \"dependency #{dep['name']} has unparseable range '#{dep['version_requirement']}'\"\n  end\nend","typeGuard":null,"tryCatchPattern":"begin\n  metadata.add_dependency(dep['name'], dep['version_requirement'])\nrescue ArgumentError => e\n  raise unless e.message =~ /Invalid 'version_range' field/\n  normalized = dep['version_requirement'].gsub(/\\^|~>/, '').strip  # drop gem/npm-style operators\n  metadata.add_dependency(dep['name'], normalized.empty? ? nil : normalized)\nend","preventionTips":["Use only SemanticPuppet range syntax ('>= 1.0.0 < 2.0.0', '1.x', exact versions) in version_requirement","Omit version_requirement rather than writing 'latest' or placeholder strings","Run metadata-json-lint in CI to validate every dependency range before release"],"tags":["puppet","module-tool","metadata","version-range","semver","validation"],"backgroundTag":"invalid-version-range","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}