Compare commits

..
Author SHA1 Message Date
dependabot[bot] 24c12e19be Bump pyjwt from 2.10.1 to 2.15.0
Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.1 to 2.15.0.
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.1...2.15.0)

---
updated-dependencies:
- dependency-name: pyjwt
  dependency-version: 2.15.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 08:33:57 +00:00
3 changed files with 20 additions and 230 deletions

No files matched your search

+4 -108
View File
@@ -46,29 +46,6 @@
@nextComic="nextComic"
/>
</div>
<div class="col-auto">
<button
type="button"
class="btn btn-sm btn-outline-secondary"
:class="{ active: show_shortcuts }"
:aria-pressed="show_shortcuts ? 'true' : 'false'"
@click="show_shortcuts = !show_shortcuts"
>?</button>
</div>
</div>
<div class="shortcuts" v-if="show_shortcuts" role="dialog" aria-label="Keyboard shortcuts">
<div class="shortcuts-head">
<strong>Keyboard shortcuts</strong>
<button type="button" class="btn btn-sm btn-outline-secondary" @click="show_shortcuts = false">Close</button>
</div>
<table>
<tbody>
<tr v-for="shortcut in shortcuts" :key="shortcut.keys">
<td><kbd>{{ shortcut.keys }}</kbd></td>
<td>{{ shortcut.action }}</td>
</tr>
</tbody>
</table>
</div>
</template>
@@ -107,18 +84,6 @@ export default {
save_timeout: null,
key_locked: false,
key_timeout: null,
show_shortcuts: false,
shortcuts: [
{ keys: '← / →', action: 'Previous / next page' },
{ keys: '↑ / ↓', action: 'Scroll within the page' },
{ keys: 'Space', action: 'Next page' },
{ keys: 'Shift + Space', action: 'Previous page' },
{ keys: 'n / p', action: 'Next / previous page' },
{ keys: 'Home / End', action: 'First / last page' },
{ keys: 'm', action: 'Switch reading mode' },
{ keys: '?', action: 'Show or hide this list' },
{ keys: 'Esc', action: 'Hide this list' },
],
}
},
props: {
@@ -216,10 +181,6 @@ export default {
return
}
if (!this.deck) {
return
}
this.current_page = pageNum-1
this.deck.slide(this.current_page)
},
@@ -236,17 +197,6 @@ export default {
return
}
// These only show or hide the shortcut list, so they still work when a control
// has focus.
if (e.key === 'Escape') {
this.show_shortcuts = false
return
}
if (e.key === '?') {
this.show_shortcuts = !this.show_shortcuts
return
}
// The reader listens on window, so a key pressed while a control has focus would
// otherwise page as well as activate that control.
if (e.target && e.target.closest && e.target.closest('input, select, textarea, button')) {
@@ -263,34 +213,10 @@ export default {
// scrolling: the page is taller than the viewport, and intercepting them here would
// double up with the native scroll. In continuous mode the observer records whichever
// page is topmost, so scrolling inside a page does not change the saved page.
const key = e.key.toLowerCase()
switch (key) {
case 'arrowright':
case 'n':
this.nextPage('auto')
return
case 'arrowleft':
case 'p':
this.prevPage('auto')
return
case ' ':
// Space would otherwise scroll the page as well as turning it.
e.preventDefault?.()
if (e.shiftKey) {
this.prevPage('auto')
} else {
this.nextPage('auto')
}
return
case 'home':
case 'end':
// Same for Home/End, which the browser would scroll to the page edges.
e.preventDefault?.()
this.setPage(key === 'home' ? 1 : this.pages)
return
case 'm':
this.setMode(this.mode === 'paged' ? 'scroll' : 'paged')
return
if (e.key === 'ArrowRight') {
this.nextPage('auto')
} else if (e.key === 'ArrowLeft') {
this.prevPage('auto')
}
},
// Continuous mode: reveal is not used for visibility here, so the page in view is
@@ -489,36 +415,6 @@ section {
padding-bottom: 60px;
}
.shortcuts {
position: fixed;
right: 12px;
bottom: 64px;
max-width: 340px;
padding: 10px 12px;
border: 1px solid #adb5bd;
border-radius: 6px;
background: rgba(255, 255, 255, 0.95);
font-size: 0.85rem;
z-index: 20;
}
.shortcuts-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
}
.shortcuts td {
padding: 2px 8px 2px 0;
vertical-align: top;
}
.shortcuts kbd {
font-family: inherit;
white-space: nowrap;
}
/* reveal.css is deliberately not loaded, so visibility is the `hidden` attribute and
reveal's own transition classes do nothing. A transition cannot run across
display:none -> block, so paged mode uses an animation on the slide that becomes
-92
View File
@@ -231,98 +231,6 @@ describe('TheComicReader', () => {
expect(api.put).not.toHaveBeenCalled()
})
it('shows the shortcut list with ? and hides it again', async () => {
const wrapper = mountReader()
await flushPromises()
expect(wrapper.find('.shortcuts').exists()).toBe(false)
wrapper.vm.keyPress({ key: '?' })
await flushPromises()
expect(wrapper.find('.shortcuts').exists()).toBe(true)
wrapper.vm.keyPress({ key: '?' })
await flushPromises()
expect(wrapper.find('.shortcuts').exists()).toBe(false)
})
it('hides the shortcut list with Escape even when a control has focus', async () => {
const wrapper = mountReader()
await flushPromises()
wrapper.vm.keyPress({ key: '?' })
await flushPromises()
expect(wrapper.find('.shortcuts').exists()).toBe(true)
wrapper.vm.keyPress({ key: 'Escape', target: document.createElement('input') })
await flushPromises()
expect(wrapper.find('.shortcuts').exists()).toBe(false)
})
it('toggles the shortcut list from the ? button', async () => {
const wrapper = mountReader()
await flushPromises()
const button = wrapper.find('button[aria-pressed]')
await button.trigger('click')
expect(wrapper.find('.shortcuts').exists()).toBe(true)
expect(button.attributes('aria-pressed')).toBe('true')
})
it('pages with Space and Shift+Space', async () => {
const wrapper = mountReader()
await flushPromises()
deck.slide.mockClear()
const preventDefault = vi.fn()
wrapper.vm.keyPress({ key: ' ', preventDefault })
expect(preventDefault).toHaveBeenCalled()
expect(deck.slide).toHaveBeenCalledWith(3)
vi.advanceTimersByTime(100)
wrapper.vm.keyPress({ key: ' ', shiftKey: true, preventDefault })
expect(deck.slide).toHaveBeenCalledWith(2)
})
it('pages with n and p whatever the case', async () => {
const wrapper = mountReader()
await flushPromises()
deck.slide.mockClear()
wrapper.vm.keyPress({ key: 'n' })
expect(deck.slide).toHaveBeenCalledWith(3)
vi.advanceTimersByTime(100)
wrapper.vm.keyPress({ key: 'P' })
expect(deck.slide).toHaveBeenCalledWith(2)
})
it('jumps to the first and last page with Home and End', async () => {
const wrapper = mountReader()
await flushPromises()
deck.slide.mockClear()
const preventDefault = vi.fn()
wrapper.vm.keyPress({ key: 'Home', preventDefault })
expect(preventDefault).toHaveBeenCalled()
expect(deck.slide).toHaveBeenCalledWith(0)
vi.advanceTimersByTime(100)
wrapper.vm.keyPress({ key: 'End', preventDefault })
expect(deck.slide).toHaveBeenCalledWith(4)
})
it('switches reading mode with m', async () => {
const wrapper = mountReader()
await flushPromises()
wrapper.vm.keyPress({ key: 'm' })
await flushPromises()
expect(store.commit).toHaveBeenCalledWith('setReaderMode', 'scroll')
expect(wrapper.vm.mode).toBe('scroll')
})
it('shows the top of the page when changing pages in paged mode', async () => {
const wrapper = mountReader()
await flushPromises()
Generated
+16 -30
View File
@@ -1,5 +1,5 @@
version = 1
revision = 5
revision = 3
requires-python = ">=3.14"
resolution-markers = [
"python_full_version >= '3.15'",
@@ -329,11 +329,11 @@ wheels = [
[[package]]
name = "distlib"
version = "0.4.4"
version = "0.4.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/68/bc/d36966de7304047a1001a7559fbf266c464bb5d8cc85464536ef8c9bcc32/distlib-0.4.4.tar.gz", hash = "sha256:ca4175b4ac7f71223cc30ed7248c45d2b38c2439d8ee6e498ab67ed63cf3508d", size = 621304, upload-time = "2026-10-16T13:56:34.203Z" }
sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/2b/238f02a4927fa2e27aa995371d240a468b52e42eae44a678434aff736b38/distlib-0.4.4-py2.py3-none-any.whl", hash = "sha256:cf09d55b1e85a89576b036aeb71550bfd68320f3f21761ca329eadadad918638", size = 472099, upload-time = "2026-10-16T13:56:32.053Z" },
{ url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
]
[[package]]
@@ -542,11 +542,11 @@ wheels = [
[[package]]
name = "filelock"
version = "4.2.1"
version = "3.20.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d5/98/771d8ca889f220d7d7e352addf500666368f0fd081c6080a83767580c6e4/filelock-4.2.1.tar.gz", hash = "sha256:c4c937ccac2a813cee448e662a56366cfb374c0f8702e75f295c412cc1c5d5a3", size = 650997, upload-time = "2026-10-17T16:48:14.435Z" }
sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/28/00/db89d339bc4ecdc8087fa7b8607ba22ffc27bf96286f340c9620bea428b3/filelock-4.2.1-py3-none-any.whl", hash = "sha256:7be2662e9e826b9bba28afc0f843a123280d799a2ea44bb5d35ccec67905ae44", size = 162455, upload-time = "2026-10-17T16:48:12.937Z" },
{ url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" },
]
[[package]]
@@ -833,11 +833,11 @@ wheels = [
[[package]]
name = "packaging"
version = "26.3"
version = "25.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]]
@@ -1068,11 +1068,11 @@ wheels = [
[[package]]
name = "pyjwt"
version = "2.10.1"
version = "2.15.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
sdist = { url = "https://files.pythonhosted.org/packages/02/a5/5197bfd06417837ac079921c66fa6393f1dea3557272a263cebfef69e432/pyjwt-2.15.0.tar.gz", hash = "sha256:b11c5f9791d7bf51c2b39a81ed669f6b2dbbd669df2942f6c60167e9e3d1abe4", size = 120513, upload-time = "2026-09-23T16:56:00.689Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
{ url = "https://files.pythonhosted.org/packages/e8/55/40e45bf052ee8ee12a4dfd785519660f8effa7b065442b91646ec6828619/pyjwt-2.15.0-py3-none-any.whl", hash = "sha256:7a3742debf6b879e912dbb9819ceec1594be812452b78c5f2e2dfc56564954f8", size = 33680, upload-time = "2026-09-23T16:55:59.241Z" },
]
[[package]]
@@ -1175,18 +1175,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9c/03/850bffad2b581c440ca51c039d74504d5a422c94bda0bdb8a8ba5068d48b/pytest_django-4.14.0-py3-none-any.whl", hash = "sha256:c533b08d89cc675efcd5398eea270b34547e35f9a3608e2c9748dd88428ea187", size = 27067, upload-time = "2026-08-10T14:13:06.998Z" },
]
[[package]]
name = "python-discovery"
version = "1.7.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "filelock" },
]
sdist = { url = "https://files.pythonhosted.org/packages/91/53/f0382313b138502c5af4d3f534db0a5f0925d628d110be2fc42fb38fb0d5/python_discovery-1.7.0.tar.gz", hash = "sha256:f484668953706f0b8815521ccf13811fa6ccdc4bd68cf3ef943594ad68a2ac86", size = 124047, upload-time = "2026-10-30T19:24:30.801Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/27/a2/ac16c0b9efa00bc3926827e8299fef116b9803c1f1c916583ae6cb556804/python_discovery-1.7.0-py3-none-any.whl", hash = "sha256:252643f846e11e959ee6fb2f6adafad6822f860b7c1cf953360ea9a020c6de71", size = 39451, upload-time = "2026-10-30T19:24:29.47Z" },
]
[[package]]
name = "python-dotenv"
version = "1.2.4"
@@ -1461,18 +1449,16 @@ wheels = [
[[package]]
name = "virtualenv"
version = "21.15.2"
version = "20.36.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "distlib" },
{ name = "filelock" },
{ name = "packaging" },
{ name = "platformdirs" },
{ name = "python-discovery" },
]
sdist = { url = "https://files.pythonhosted.org/packages/38/9e/40c7098240cedd3a2f32e42a74b35c4563c617fdd7e41ae6268d4fdd8915/virtualenv-21.15.2.tar.gz", hash = "sha256:dbd886e6e5689eb4dde6a9bbc478ad14b4fc8ed0852690d8273ccfb8c467f635", size = 5520597, upload-time = "2026-10-30T19:18:04.759Z" }
sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/d8/09c9d6df253b2016312dd5ccbb962dfa86a5202f2452604b52e0a9844661/virtualenv-21.15.2-py3-none-any.whl", hash = "sha256:fb8c62c7c328e0238061c721068f06b7bc6bd10f7a0f5987195cef1008837ee6", size = 5559530, upload-time = "2026-10-30T19:18:01.134Z" },
{ url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" },
]
[[package]]