{"record":{"id":"0e1f043fc239889c","repo":"puppetlabs/puppet","slug":"invalid-version-format-version-semantic-versi","errorCode":null,"errorMessage":"Invalid version format: %{version} (Semantic Versions are acceptable: http://semver.org)","messagePattern":"Invalid version format: %(.+?) \\(Semantic Versions are acceptable: http://semver\\.org\\)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/applications/application.rb","lineNumber":84,"sourceCode":"\n        @metadata\n      end\n\n      def load_metadata!\n        @metadata = nil\n        metadata(true)\n      end\n\n      def parse_filename(filename)\n        match = /^((.*?)-(.*?))-(\\d+\\.\\d+\\.\\d+.*?)$/.match(File.basename(filename, '.tar.gz'))\n        if match\n          module_name, author, shortname, version = match.captures\n        else\n          raise ArgumentError, _(\"Could not parse filename to obtain the username, module name and version.  (%{release_name})\") % { release_name: @release_name }\n        end\n\n        unless SemanticPuppet::Version.valid?(version)\n          raise ArgumentError, _(\"Invalid version format: %{version} (Semantic Versions are acceptable: http://semver.org)\") % { version: version }\n        end\n\n        {\n          :module_name => module_name,\n          :author => author,\n          :dir_name => shortname,\n          :version => version\n        }\n      end\n    end\n  end\nend\n","sourceCodeStart":66,"sourceCodeEnd":97,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/applications/application.rb#L66-L97","documentation":"Application#parse_filename raises ArgumentError when the version substring extracted from the tarball filename fails SemanticPuppet::Version.valid?. The regex only guarantees digits.digits.digits at the start of the version segment; this second check requires the whole segment (including any prerelease/build suffix) to be a valid semantic version per semver.org.","triggerScenarios":"A filename version segment like '1.0.0.0' (four segments), '1.02.3' (leading zero), '2.0.0-RC.01+build..2' (malformed prerelease/build metadata with empty identifiers or leading zeros), or '1.0.0-alpha..1'. The regex matched, so the tarball reached version validation, but SemanticPuppet rejects the string.","commonSituations":"Custom versioning schemes (date-based '2023.01.15.1', four-part .NET-style versions) in internally packaged modules; handcrafted prerelease tags with invalid characters; snapshot builds appending timestamps after '+'.","solutions":["Use strict semver MAJOR.MINOR.PATCH with optional '-' prerelease and '+' build identifiers: rename/repack as 'author-mod-1.0.0-rc.1.tar.gz'.","Drop the fourth version segment or move it into build metadata (e.g. '1.2.3+4').","Fix leading zeros in numeric prerelease parts ('-RC.01' -> '-RC.1').","Rebuild the module with `puppet module build` after correcting 'version' in metadata.json."],"exampleFix":"# before\nmyteam-webapp-1.2.3.4.tar.gz\n\n# after\nmyteam-webapp-1.2.3+4.tar.gz","handlingStrategy":"validation","validationCode":"require 'semantic_puppet'\n\nversion = filename_segment.split('-').last\nabort 'version must be semantic (x.y.z[-pre][+build])' unless SemanticPuppet::Version.valid?(version)","typeGuard":"def semver_string?(s)\n  SemanticPuppet::Version.valid?(s.to_s)\nend","tryCatchPattern":"begin\n  app.parse_filename(tarball)\nrescue ArgumentError => e\n  retry_with_renamed = e.message.include?('Invalid version format')\n  raise\nend","preventionTips":["Keep module versions strict semver (three numeric segments, optional -pre/+build).","Validate metadata.json 'version' with SemanticPuppet::Version.valid? at build time, not after packaging.","Avoid date-based or four-part version schemes for Puppet modules."],"tags":["puppet","semver","module-tool","version-validation"],"backgroundTag":"invalid-semver","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}