Skip to content

Commit b17ad4b

Browse files
kylebarronmanzt
andauthored
Allow semver-compatible frontend versions (#521)
Co-authored-by: Trevor Manz <[email protected]>
1 parent 88076fa commit b17ad4b

File tree

5 files changed

+46
-6
lines changed

5 files changed

+46
-6
lines changed

.changeset/cuddly-fishes-heal.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"anywidget": patch
3+
---
4+
5+
Relax version pinning for anywidget front end
6+
7+
Adopted `~major.minor.*` notation for more flexible version compatibility in the front end, mirroring practices improve compatability in environments where bumping the front-end versions is not possible for end users (i.e., JupyterHub). This change is intended to enhance adaptability without causing disruptions. If issues arise, please report them on our issues page.

anywidget/_descriptor.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
repr_mimebundle,
4545
try_file_contents,
4646
)
47-
from ._version import __version__
47+
from ._version import _ANYWIDGET_SEMVER_VERSION
4848

4949
if TYPE_CHECKING: # pragma: no cover
5050
import comm
@@ -72,13 +72,14 @@ def __call__(self, obj: Any, include: set[str] | None) -> dict: ...
7272
_ANYWIDGET_MODEL_NAME = "AnyModel"
7373
_ANYWIDGET_VIEW_NAME = "AnyView"
7474
_ANYWIDGET_JS_MODULE = "anywidget"
75+
7576
_ANYWIDGET_STATE = {
7677
"_model_module": _ANYWIDGET_JS_MODULE,
7778
"_model_name": _ANYWIDGET_MODEL_NAME,
78-
"_model_module_version": __version__,
79+
"_model_module_version": _ANYWIDGET_SEMVER_VERSION,
7980
"_view_module": _ANYWIDGET_JS_MODULE,
8081
"_view_name": _ANYWIDGET_VIEW_NAME,
81-
"_view_module_version": __version__,
82+
"_view_module_version": _ANYWIDGET_SEMVER_VERSION,
8283
"_view_count": None,
8384
}
8485

anywidget/_version.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,15 @@
1010
__version__ = version("anywidget")
1111
except PackageNotFoundError:
1212
__version__ = "uninstalled"
13+
14+
15+
def get_semver_version(version: str) -> str:
16+
split = version.split(".", maxsplit=2)
17+
is_pre_release = "a" in split[2] or "b" in split[2]
18+
if is_pre_release:
19+
return ".".join(split)
20+
21+
return "~" + ".".join([split[0], split[1], "*"])
22+
23+
24+
_ANYWIDGET_SEMVER_VERSION = get_semver_version(__version__)

anywidget/widget.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
repr_mimebundle,
1818
try_file_contents,
1919
)
20-
from ._version import __version__
20+
from ._version import _ANYWIDGET_SEMVER_VERSION
2121
from .experimental import _collect_anywidget_commands, _register_anywidget_commands
2222

2323

@@ -26,11 +26,11 @@ class AnyWidget(ipywidgets.DOMWidget): # type: ignore [misc]
2626

2727
_model_name = t.Unicode("AnyModel").tag(sync=True)
2828
_model_module = t.Unicode("anywidget").tag(sync=True)
29-
_model_module_version = t.Unicode(__version__).tag(sync=True)
29+
_model_module_version = t.Unicode(_ANYWIDGET_SEMVER_VERSION).tag(sync=True)
3030

3131
_view_name = t.Unicode("AnyView").tag(sync=True)
3232
_view_module = t.Unicode("anywidget").tag(sync=True)
33-
_view_module_version = t.Unicode(__version__).tag(sync=True)
33+
_view_module_version = t.Unicode(_ANYWIDGET_SEMVER_VERSION).tag(sync=True)
3434

3535
def __init__(self, *args: Any, **kwargs: Any) -> None:
3636
if in_colab():

tests/test_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
remove_buffers,
1111
try_file_contents,
1212
)
13+
from anywidget._version import get_semver_version
1314

1415

1516
def enable_hmr():
@@ -163,3 +164,22 @@ def test_try_file_contents_warns(
163164

164165
assert isinstance(file_contents, FileContents)
165166
assert file_contents._background_thread is None
167+
168+
169+
@pytest.mark.parametrize(
170+
"version, expected",
171+
[
172+
("1.0.0", "~1.0.*"),
173+
("2.1.1", "~2.1.*"),
174+
("0.0.1", "~0.0.*"),
175+
("1.2.3a", "1.2.3a"),
176+
("4.5.6b", "4.5.6b"),
177+
("1.0.0-alpha", "1.0.0-alpha"),
178+
("2.1.1-beta", "2.1.1-beta"),
179+
("3.2.1-alpha.1", "3.2.1-alpha.1"),
180+
("0.0.1-beta.2", "0.0.1-beta.2"),
181+
("1.2.3-rc.4", "~1.2.*"),
182+
],
183+
)
184+
def test_get_semver_version(version, expected):
185+
assert get_semver_version(version) == expected

0 commit comments

Comments
 (0)