Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-ipyvue for openSUSE:Factory checked in at 2023-09-25 20:03:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-ipyvue (Old) and /work/SRC/openSUSE:Factory/.python-ipyvue.new.1770 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-ipyvue" Mon Sep 25 20:03:13 2023 rev:7 rq:1113292 version:1.10.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-ipyvue/python-ipyvue.changes 2023-08-18 19:28:46.367360410 +0200 +++ /work/SRC/openSUSE:Factory/.python-ipyvue.new.1770/python-ipyvue.changes 2023-09-25 20:58:21.637708123 +0200 @@ -1,0 +2,9 @@ +Sun Sep 24 17:44:12 UTC 2023 - Ben Greiner <c...@bnavigator.de> + +- Update to 1.10.1 + * no upstream release notes, listing significant commit messages + * feat: support serialization of more event data + * fix: non Event objects do not need processing before + serialization + +------------------------------------------------------------------- Old: ---- ipyvue-1.9.2-gh.tar.gz ipyvue-1.9.2.tar.gz New: ---- ipyvue-1.10.1-gh.tar.gz ipyvue-1.10.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-ipyvue.spec ++++++ --- /var/tmp/diff_new_pack.X5igYa/_old 2023-09-25 20:58:22.769749019 +0200 +++ /var/tmp/diff_new_pack.X5igYa/_new 2023-09-25 20:58:22.769749019 +0200 @@ -17,9 +17,9 @@ # This is important for versions ending in .0 -%define python3dist_version 1.9.2 +%define python3dist_version 1.10.1 Name: python-ipyvue -Version: 1.9.2 +Version: 1.10.1 Release: 0 Summary: Jupyter widgets base for Vue libraries License: MIT ++++++ ipyvue-1.9.2-gh.tar.gz -> ipyvue-1.10.1-gh.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/.bumpversion.cfg new/ipyvue-1.10.1/.bumpversion.cfg --- old/ipyvue-1.9.2/.bumpversion.cfg 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/.bumpversion.cfg 2023-09-07 16:55:32.000000000 +0200 @@ -1,6 +1,7 @@ [bumpversion] -current_version = 1.9.2 +current_version = 1.10.1 commit = True +message = chore: bump version: {current_version} â {new_version} tag = True parse = (?P<major>\d+)(\.(?P<minor>\d+))(\.(?P<patch>\d+))((?P<release>.)(?P<build>\d+))? serialize = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/RELEASE.md new/ipyvue-1.10.1/RELEASE.md --- old/ipyvue-1.9.2/RELEASE.md 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/RELEASE.md 2023-09-07 16:55:32.000000000 +0200 @@ -1,20 +1,18 @@ -- To release a new version of ipyvue on PyPI: +# Release a new version of ipyvue on PyPI and NPM: -Update _version.py (set release version, remove 'dev') -git add the _version.py file and git commit -`python setup.py sdist upload` -`python setup.py bdist_wheel upload` -`git tag -a X.X.X -m 'comment'` -Update _version.py (add 'dev' and increment minor) -git add and git commit -git push -git push --tags +- assert you have a remote called "upstream" pointing to g...@github.com:widgetti/ipyvue.git +- assert you have an up-to-date and clean working directory on the branch master +- run `./release.sh [patch | minor | major]` -- To release a new version of jupyter-vue on NPM: +## Making an alpha release + $ ./release.sh patch --new-version 1.19.0a1 + +## Recover from a failed release + +If a release fails on CI, and you want to keep the history clean +``` +# do fix +$ git rebase -i HEAD~3 +$ git tag v1.19.0 -f && git push upstream master v1.19.0 -f ``` -# clean out the `dist` and `node_modules` directories -git clean -fdx -npm install -npm publish -``` \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/ipyvue/_version.py new/ipyvue-1.10.1/ipyvue/_version.py --- old/ipyvue-1.9.2/ipyvue/_version.py 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/ipyvue/_version.py 2023-09-07 16:55:32.000000000 +0200 @@ -1,2 +1,2 @@ -__version__ = "1.9.2" +__version__ = "1.10.1" semver = "^" + __version__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/js/package.json new/ipyvue-1.10.1/js/package.json --- old/ipyvue-1.9.2/js/package.json 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/js/package.json 2023-09-07 16:55:32.000000000 +0200 @@ -1,6 +1,6 @@ { "name": "jupyter-vue", - "version": "1.9.2", + "version": "1.10.1", "description": "Jupyter widgets base for Vue libraries", "license": "MIT", "author": "Mario Buikhuizen, Maarten Breddels", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/js/src/VueRenderer.js new/ipyvue-1.10.1/js/src/VueRenderer.js --- old/ipyvue-1.9.2/js/src/VueRenderer.js 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/js/src/VueRenderer.js 2023-09-07 16:55:32.000000000 +0200 @@ -51,29 +51,34 @@ }; } -export function eventToObject(event) { - if (event == null) { - return event; - } - let props; - switch (event.constructor) { - case MouseEvent: - props = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey', 'offsetX', 'offsetY', 'clientX', 'clientY', 'pageX', 'pageY', 'screenX', 'screenY', 'shiftKey', 'x', 'y']; - break; - case WheelEvent: - props = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey', 'offsetX', 'offsetY', 'clientX', 'clientY', 'pageX', 'pageY', 'screenX', 'screenY', 'shiftKey', 'x', 'y', 'wheelDelta', 'wheelDeltaX', 'wheelDeltaY']; - break; - // TODO: More events - default: - return event; +// based on https://stackoverflow.com/a/58416333/5397207 +function pickSerializable(object, depth=0, max_depth=2) { + // change max_depth to see more levels, for a touch event, 2 is good + if (depth > max_depth) + return 'Object'; + + const obj = {}; + for (let key in object) { + let value = object[key]; + if (value instanceof Node) + // specify which properties you want to see from the node + value = {id: value.id}; + else if (value instanceof Window) + value = 'Window'; + else if (value instanceof Object) + value = pickSerializable(value, depth+1, max_depth); + + obj[key] = value; } - return props.reduce( - (result, key) => { - result[key] = event[key]; // eslint-disable-line no-param-reassign - return result; - }, {}, - ); + return obj; +} + +export function eventToObject(event) { + if (event instanceof Event) { + return pickSerializable(event); + } + return event; } export function vueRender(createElement, model, parentView, slotScopes) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/release.sh new/ipyvue-1.10.1/release.sh --- old/ipyvue-1.9.2/release.sh 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/release.sh 2023-09-07 16:55:32.000000000 +0200 @@ -1,6 +1,6 @@ #!/bin/bash set -e -o pipefail # usage: ./release minor -n -version=$(bump2version --dry-run --list $* | grep new_version | sed -r s,"^.*=",,) +version=$(bump2version --dry-run --list $* | grep new_version= | sed -r s,"^.*=",,) echo Version tag v$version bumpversion $* --verbose && git push upstream master v$version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/tests/ui/test_events.py new/ipyvue-1.10.1/tests/ui/test_events.py --- old/ipyvue-1.9.2/tests/ui/test_events.py 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/tests/ui/test_events.py 2023-09-07 16:55:32.000000000 +0200 @@ -9,7 +9,7 @@ from unittest.mock import MagicMock -def test_widget_button(solara_test, page_session: playwright.sync_api.Page): +def test_event_basics(solara_test, page_session: playwright.sync_api.Page): inner = vue.Html(tag="div", children=["Click Me!"]) outer = vue.Html(tag="dev", children=[inner]) mock_outer = MagicMock() @@ -36,3 +36,26 @@ inner_sel.click() page_session.locator("text=Clicked").wait_for() mock_outer.assert_called_once() + + +def test_mouse_event(solara_test, page_session: playwright.sync_api.Page): + div = vue.Html(tag="div", children=["Click Me!"]) + last_event_data = None + + def on_click(widget, event, data): + nonlocal last_event_data + last_event_data = data + div.children = ["Clicked"] + + div.on_event("click", on_click) + display(div) + + # click in the div + box = page_session.locator("text=Click Me!").bounding_box() + assert box is not None + page_session.mouse.click(box["x"], box["y"]) + + page_session.locator("text=Clicked").wait_for() + assert last_event_data is not None + assert last_event_data["x"] == box["x"] + assert last_event_data["y"] == box["y"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ipyvue-1.9.2/tests/ui/test_template.py new/ipyvue-1.10.1/tests/ui/test_template.py --- old/ipyvue-1.9.2/tests/ui/test_template.py 2023-06-16 14:52:37.000000000 +0200 +++ new/ipyvue-1.10.1/tests/ui/test_template.py 2023-09-07 16:55:32.000000000 +0200 @@ -8,7 +8,7 @@ import playwright.sync_api from IPython.display import display -from traitlets import default, Int +from traitlets import default, Int, Callable, Unicode class MyTemplate(vue.VueTemplate): @@ -37,3 +37,36 @@ widget.wait_for() widget.click() page_session.locator("text=Clicked 1").wait_for() + + +class MyEventTemplate(vue.VueTemplate): + on_custom = Callable() + text = Unicode("Click Me").tag(sync=True) + + @default("template") + def _default_vue_template(self): + return """ + <template> + <div @click="custom_event('not-an-event-object')">{{text}}</div> + </template> + """ + + def vue_custom_event(self, data): + self.on_custom(data) + + +def test_template_custom_event(solara_test, page_session: playwright.sync_api.Page): + last_event_data = None + + def on_custom(data): + nonlocal last_event_data + last_event_data = data + div.text = "Clicked" + + div = MyEventTemplate(on_custom=on_custom) + + display(div) + + page_session.locator("text=Click Me").click() + page_session.locator("text=Clicked").wait_for() + assert last_event_data == "not-an-event-object" ++++++ ipyvue-1.9.2-gh.tar.gz -> ipyvue-1.10.1.tar.gz ++++++ ++++ 21363 lines of diff (skipped)