From 1b493c9f13bf1391cadfa1cc222da60818311f87 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Fri, 22 Apr 2022 13:32:49 +0100 Subject: [PATCH] Raise `ArgumentError` if `Version` is initialized with a `nil` version string At the moment, `Semantic::Version.new` raises a `NoMethodError` exception like this if you try to pass in `nil` as the version string: ``` undefined method `match' for nil:NilClass (NoMethodError) v = version_str.match(SemVerRegexp) ``` This alters the behaviour to raise an `ArgumentError` instead, which is what we do if you pass a malformed string (e.g. `dasd`). This is a breaking change - but feels like a more reasonable and unsurprising behaviour. --- lib/semantic/version.rb | 11 +++++++++-- spec/version_spec.rb | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/semantic/version.rb b/lib/semantic/version.rb index 7eda70c..629e697 100644 --- a/lib/semantic/version.rb +++ b/lib/semantic/version.rb @@ -10,9 +10,8 @@ class Version attr_reader :build def initialize version_str - v = version_str.match(SemVerRegexp) + v = parse_version_string!(version_str) - raise ArgumentError.new("#{version_str} is not a valid SemVer Version (http://semver.org)") if v.nil? @major = v[1].to_i @minor = v[2].to_i @patch = v[3].to_i @@ -176,5 +175,13 @@ def semverified version_string parts.join('.') end + def parse_version_string! version_str + if !version_str.nil? && version = version_str.match(SemVerRegexp) + version + else + raise ArgumentError.new("#{version_str} is not a valid SemVer Version (http://semver.org)") if version.nil? + end + end + end end diff --git a/spec/version_spec.rb b/spec/version_spec.rb index 2ac8bd0..4255a38 100644 --- a/spec/version_spec.rb +++ b/spec/version_spec.rb @@ -38,6 +38,15 @@ end end + it 'raises an error when passed nil' do + @bad_versions.each do |v| + expect { Semantic::Version.new nil }.to raise_error( + ArgumentError, + /not a valid SemVer/ + ) + end + end + it 'stores parsed versions in member variables' do v1 = Semantic::Version.new '1.5.9' expect(v1.major).to eq(1)