From f0ce8c541f241d2f6f808b37b6068975d5dc7a48 Mon Sep 17 00:00:00 2001 From: Steven Brudenell Date: Wed, 14 Oct 2020 16:32:49 -0800 Subject: [PATCH 1/3] Ensure equal versions have equal hashes --- docs/usage.rst | 24 ++++++++++++++++++++++++ semver.py | 2 +- test_semver.py | 14 ++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/usage.rst b/docs/usage.rst index 2f23e571..66ca4397 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -452,6 +452,30 @@ functions that leverage this capability; builtins including, but not limited to: (for examples, see :ref:`sec_max_min`) and :func:`sorted`. +Version Equality +---------------- + +Note that when comparing two versions, the ``build`` part is ignored:: + + >>> v = semver.VersionInfo.parse("1.2.3-rc4+1e4664d") + >>> v == "1.2.3-rc4+dedbeef" + True + +This also applies when a :class:`semver.VersionInfo` is a member of a set, or a +dictionary key:: + + >>> d = {} + >>> v1 = semver.VersionInfo.parse("1.2.3-rc4+1e4664d") + >>> v2 = semver.VersionInfo.parse("1.2.3-rc4+dedbeef") + >>> d[v1] = 1 + >>> d[v2] + 1 + >>> s = set() + >>> s.add(v1) + >>> v2 in s + True + + Comparing Versions through an Expression ---------------------------------------- diff --git a/semver.py b/semver.py index 85811fec..a435442a 100644 --- a/semver.py +++ b/semver.py @@ -575,7 +575,7 @@ def __str__(self): return version def __hash__(self): - return hash(self.to_tuple()) + return hash(self.to_tuple()[:4]) def finalize_version(self): """ diff --git a/test_semver.py b/test_semver.py index b23576d5..168955d6 100644 --- a/test_semver.py +++ b/test_semver.py @@ -679,6 +679,20 @@ def test_parse_version_info_str_hash(): d[v] = "" # to ensure that VersionInfo are hashable +def test_equal_versions_have_equal_hashes(): + v1 = parse_version_info("1.2.3-alpha.1.2+build.11.e0f985a") + v2 = parse_version_info("1.2.3-alpha.1.2+build.22.a589f0e") + assert v1 == v2 + assert hash(v1) == hash(v2) + d = {} + d[v1] = 1 + d[v2] = 2 + assert d[v1] == 2 + s = set() + s.add(v1) + assert v2 in s + + def test_parse_method_for_version_info(): s_version = "1.2.3-alpha.1.2+build.11.e0f985a" v = VersionInfo.parse(s_version) From 3b2c27d14e79a215a5cbf2f030b09af1ad09680b Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 20 Oct 2020 17:36:12 +0200 Subject: [PATCH 2/3] Apply suggestions from code review Add suggestions to docs/usage.rst --- docs/usage.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index 66ca4397..6280702c 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -452,10 +452,12 @@ functions that leverage this capability; builtins including, but not limited to: (for examples, see :ref:`sec_max_min`) and :func:`sorted`. -Version Equality +Determining Version Equality ---------------- -Note that when comparing two versions, the ``build`` part is ignored:: +Version equality means for semver, that major, minor, patch, and prerelease +parts are equal in both versions you compare. The build part is ignored. +For example:: >>> v = semver.VersionInfo.parse("1.2.3-rc4+1e4664d") >>> v == "1.2.3-rc4+dedbeef" From d02ce168d70921a96424a0c15fef6530fdb55874 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Tue, 20 Oct 2020 17:49:05 +0200 Subject: [PATCH 3/3] Doc: Fix underline in header --- docs/usage.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.rst b/docs/usage.rst index 6280702c..2f2eb33a 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -453,7 +453,7 @@ functions that leverage this capability; builtins including, but not limited to: Determining Version Equality ----------------- +---------------------------- Version equality means for semver, that major, minor, patch, and prerelease parts are equal in both versions you compare. The build part is ignored.