Skip to content

Commit 2c346d4

Browse files
tomschrLexicalitytlaferriererafalkrupinski
committed
Fix #284: implement "is_compatible" with method
* Implement Version.is_compatible() method * Update test cases * Update documentation * Rename isvalid method to is_valid to make it consistent with is_compatible The algorithm checks: * if the two majors are different, it's incompatible * if the two majors are equal, but the minor of the new version is lower than the old, it's incompatible * if both prereleases are present and different, it's incompatible * otherwise it's compatible The algorithm does *not* check patches! Co-authored-by: Lexi Robinson <lexi@lexi.org.uk> Co-authored-by: Thomas Laferriere <tlaferriere@users.noreply.github.com> Co-authored-by: Raphael Krupinski <rafalkrupinski@users.noreply.github.com>
1 parent bf8757a commit 2c346d4

14 files changed

+199
-11
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,6 @@ fabric.properties
268268

269269
docs/_api
270270
!docs/_api/semver.__about__.rst
271+
272+
# For node
273+
node_modules/

changelog.d/284.deprecation.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Deprecate the use of :meth:`Version.isvalid`.
2+
3+
Rename :meth:`Version.isvalid <semver.version.Version.isvalid>`
4+
to :meth:`Version.is_valid <semver.version.Version.is_valid>`
5+
for consistency reasons with :meth:`Version.is_compatible <semver.version.Version.is_compatible>`

changelog.d/284.doc.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Document deprecation of :meth:`Version.isvalid`.

changelog.d/284.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement :meth:`Version.is_compatible <semver.version.Version.is_compatible>` to make "is self compatible with X".

docs/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ def find_version(*file_paths):
118118
# Markup to shorten external links
119119
# See https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
120120
extlinks = {
121-
"gh": ("https://github.com/python-semver/python-semver/issues/%s", "#"),
122-
"pr": ("https://github.com/python-semver/python-semver/pull/%s", "PR #"),
121+
"gh": ("https://github.com/python-semver/python-semver/issues/%s", "#%s"),
122+
"pr": ("https://github.com/python-semver/python-semver/pull/%s", "PR #%s"),
123123
}
124124

125125
# -- Options for HTML output ----------------------------------------------

docs/migration/migratetosemver3.rst

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
Migrating from semver2 to semver3
44
=================================
55

6-
This document describes the visible differences for
6+
This section describes the visible differences for
77
users and how your code stays compatible for semver3.
8+
Some changes are backward incompatible.
89

910
Although the development team tries to make the transition
1011
to semver3 as smooth as possible, at some point change
@@ -34,9 +35,16 @@ Use semver.cli instead of semver
3435
--------------------------------
3536

3637
All functions related to CLI parsing are moved to :mod:`semver.cli`.
37-
If you are such functions, like :func:`semver.cmd_bump <semver.cli.cmd_bump>`,
38+
If you need such functions, like :func:`semver.cmd_bump <semver.cli.cmd_bump>`,
3839
import it from :mod:`semver.cli` in the future:
3940

4041
.. code-block:: python
4142
4243
from semver.cli import cmd_bump
44+
45+
46+
Use semver.Version.is_valid instead of semver.Version.isvalid
47+
-------------------------------------------------------------
48+
49+
The pull request :pr:`284` introduced the method :meth:`Version.is_compatible <semver.Version.is_compatible>`. To keep consistency, the development team
50+
decided to rename the :meth:`isvalid <semver.Version.isvalid>` to :meth:`is_valid <semver.Version.is_valid>`.

docs/migration/replace-deprecated-functions.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ them with code which is compatible for future versions:
3131
3232
Likewise with the other module level functions.
3333

34+
* :func:`semver.Version.isvalid`
35+
36+
Replace it with :meth:`semver.Version.is_valid`:
37+
38+
3439
* :func:`semver.finalize_version`
3540

3641
Replace it with :func:`semver.Version.finalize_version`:
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
Checking for a Compatible Semver Version
2+
========================================
3+
4+
To check if a *change* from a semver version a to a semver version b is
5+
*compatible* according to semver rule, use :meth:`Version.is_compatible <semver.Version.is_compatible>`.
6+
7+
The expression ``a.is_compatible(b) is True`` when either is true:
8+
9+
* both versions are identical, or
10+
* both are releases, their majors are equal and higher than 0 and minor
11+
versions, or
12+
* both are releases, their majors are equal and higher than 0 and b's
13+
minor version is higher then a's
14+
15+
In all other cases, the result is false.
16+
17+
Keep in mind, the method *does not* check patches!
18+
19+
20+
.. code-block:: python
21+
22+
# Two different majors:
23+
>>> a = Version(1, 1, 1) # This is "A"
24+
>>> b = Version(2, 0, 0) # This is "B"
25+
>>> a.is_compatible(b)
26+
False
27+
>>> b.is_compatible(a)
28+
False
29+
30+
# Two different minors:
31+
>>> a = Version(1, 1, 0)
32+
>>> b = Version(1, 0, 0)
33+
>>> a.is_compatible(b)
34+
False
35+
>>> b.is_compatible(a)
36+
True
37+
38+
# The same two majors and minors:
39+
>>> a = Version(1, 1, 1)
40+
>>> b = Version(1, 1, 0)
41+
>>> a.is_compatible(b)
42+
True
43+
>>> b.is_compatible(a)
44+
True
45+
46+
# Release and pre-release:
47+
>>> a = Version(1, 1, 1)
48+
>>> b = Version(1, 0, 0,'rc1')
49+
>>> a.is_compatible(b)
50+
False
51+
>>> b.is_compatible(a)
52+
False
53+
54+
# Different pre-releases:
55+
>>> a = Version(1, 0, 0, 'rc1')
56+
>>> b = Version(1, 0, 0, 'rc2')
57+
>>> a.is_compatible(b)
58+
False
59+
>>> b.is_compatible(a)
60+
False
61+
62+
# Identical pre-releases
63+
>>> a = Version(1, 0, 0,'rc1')
64+
>>> b = Version(1, 0, 0,'rc1')
65+
>>> a.is_compatible(b)
66+
True
67+
68+
All major zero versions are incompatible with anything but itself:
69+
70+
.. code-block:: python
71+
72+
>>> Version(0,1,0).is_compatible(Version(0,1,1))
73+
False
74+
75+
# Only identical versions are compatible for major zero versions:
76+
>>> Version(0,1,0).is_compatible(Version(0,1,0))
77+
True

docs/usage/check-valid-semver-version.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ classmethod :func:`Version.isvalid <semver.version.Version.isvalid>`:
66

77
.. code-block:: python
88
9-
>>> Version.isvalid("1.0.0")
9+
>>> Version.is_valid("1.0.0")
1010
True
11-
>>> Version.isvalid("invalid")
11+
>>> Version.is_valid("invalid")
1212
False

docs/usage/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Using semver
88
create-a-version
99
parse-version-string
1010
check-valid-semver-version
11+
check-compatible-semver-version
1112
access-parts-of-a-version
1213
access-parts-through-index
1314
replace-parts-of-a-version

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy