diff --git a/docs/usage.rst b/docs/usage.rst index 2f23e571..2f2eb33a 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -452,6 +452,32 @@ functions that leverage this capability; builtins including, but not limited to: (for examples, see :ref:`sec_max_min`) and :func:`sorted`. +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. +For example:: + + >>> 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)