mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-18 07:23:00 +00:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1d4c33b24d | ||
![]() |
89ef91b23d | ||
![]() |
a439dc5653 | ||
![]() |
a0785ed718 | ||
![]() |
c1fbdf3b13 | ||
![]() |
fb2aed84fa | ||
![]() |
70b86eb7b8 | ||
![]() |
1f8465e3ff | ||
![]() |
2f4f5ac103 | ||
![]() |
0d908dab27 | ||
![]() |
8b408bc0b1 | ||
![]() |
c1c90fc923 | ||
![]() |
5e3aac97fa | ||
![]() |
2e8ed8fa84 | ||
![]() |
801e32e564 | ||
![]() |
89013dac0d | ||
![]() |
da00efea2b | ||
![]() |
098ba7c79f | ||
![]() |
86d51271e1 | ||
![]() |
6fb0d88637 | ||
![]() |
e9654d6752 | ||
![]() |
ca3b2bc079 | ||
![]() |
59d7d659bf | ||
![]() |
e63c403e92 |
12
.github/workflows/test.yml
vendored
12
.github/workflows/test.yml
vendored
@@ -82,12 +82,12 @@ jobs:
|
||||
subset: singleuser
|
||||
- python: "3.9"
|
||||
db: mysql
|
||||
- python: "3.10"
|
||||
db: postgres
|
||||
- python: "3.12"
|
||||
db: postgres
|
||||
- python: "3.13"
|
||||
subdomain: subdomain
|
||||
serverextension: serverextension
|
||||
- python: "3.11"
|
||||
- python: "3.13"
|
||||
ssl: ssl
|
||||
serverextension: serverextension
|
||||
- python: "3.11"
|
||||
@@ -101,12 +101,14 @@ jobs:
|
||||
ssl: ssl
|
||||
noextension: noextension
|
||||
subset: singleuser
|
||||
- python: "3.11"
|
||||
- python: "3.13"
|
||||
browser: browser
|
||||
- python: "3.11"
|
||||
subdomain: subdomain
|
||||
browser: browser
|
||||
- python: "3.12"
|
||||
- python: "3.14"
|
||||
main_dependencies: main_dependencies
|
||||
- python: "3.14t"
|
||||
main_dependencies: main_dependencies
|
||||
|
||||
steps:
|
||||
|
@@ -16,7 +16,7 @@ ci:
|
||||
repos:
|
||||
# autoformat and lint Python code
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.12.11
|
||||
rev: v0.13.3
|
||||
hooks:
|
||||
- id: ruff
|
||||
types_or:
|
||||
|
@@ -21,7 +21,7 @@ fi
|
||||
# Configure a set of databases in the database server for upgrade tests
|
||||
# this list must be in sync with versions in test_db.py:test_upgrade
|
||||
set -x
|
||||
for SUFFIX in '' _upgrade_110 _upgrade_122 _upgrade_130 _upgrade_150 _upgrade_211 _upgrade_311; do
|
||||
for SUFFIX in '' _upgrade_110 _upgrade_122 _upgrade_130 _upgrade_150 _upgrade_211 _upgrade_311 _upgrade_416; do
|
||||
$SQL_CLIENT "DROP DATABASE jupyterhub${SUFFIX};" 2>/dev/null || true
|
||||
$SQL_CLIENT "CREATE DATABASE jupyterhub${SUFFIX} ${EXTRA_CREATE_DATABASE_ARGS:-};"
|
||||
done
|
||||
|
@@ -7,7 +7,7 @@ info:
|
||||
license:
|
||||
name: BSD-3-Clause
|
||||
identifier: BSD-3-Clause
|
||||
version: 5.4.0
|
||||
version: 5.4.1
|
||||
servers:
|
||||
- url: /hub/api
|
||||
security:
|
||||
|
@@ -228,6 +228,7 @@ def setup(app):
|
||||
app.add_directive("jupyterhub-generate-config", ConfigDirective)
|
||||
app.add_directive("jupyterhub-help-all", HelpAllDirective)
|
||||
app.add_directive("jupyterhub-rest-api-links", RestAPILinksDirective)
|
||||
app.add_css_file("https://docs.jupyter.org/en/latest/_static/jupyter.css")
|
||||
|
||||
|
||||
# -- Read The Docs -----------------------------------------------------------
|
||||
@@ -262,6 +263,7 @@ html_static_path = ["_static"]
|
||||
|
||||
html_theme = "jupyterhub_sphinx_theme"
|
||||
html_theme_options = {
|
||||
# "announcement": "🚀 Join us in San Diego · JupyterCon 2025 · Nov 4-5 · <a href=\"https://events.linuxfoundation.org/jupytercon/program/schedule/\">SCHEDULE</a> · <a href=\"https://events.linuxfoundation.org/jupytercon/register/\">REGISTER NOW</a>",
|
||||
"header_links_before_dropdown": 6,
|
||||
"icon_links": [
|
||||
{
|
||||
|
@@ -22,6 +22,42 @@ Contributors to major version bumps in JupyterHub include:
|
||||
|
||||
## 5.4
|
||||
|
||||
### 5.4.1 - 2025-10-17
|
||||
|
||||
5.4.1 fixes some small regressions in 5.4.0.
|
||||
|
||||
Notably:
|
||||
|
||||
- with new stricter internal_ssl checking, [](Spawner.ssl_alt_names) may now be callable, giving an easier path to setting the alt names of SSL destinations.
|
||||
- fixes the visibility of headings meant only for assistive technologies.
|
||||
|
||||
([full changelog](https://github.com/jupyterhub/jupyterhub/compare/5.4.0...5.4.1))
|
||||
|
||||
#### New features added
|
||||
|
||||
- allow ssl_alt_names to be callable [#5171](https://github.com/jupyterhub/jupyterhub/pull/5171) ([@kreuzert](https://github.com/kreuzert), [@minrk](https://github.com/minrk))
|
||||
|
||||
#### Enhancements made
|
||||
|
||||
- demote failing API request log level to debug [#5167](https://github.com/jupyterhub/jupyterhub/pull/5167) ([@kreuzert](https://github.com/kreuzert), [@minrk](https://github.com/minrk))
|
||||
|
||||
#### Bugs fixed
|
||||
|
||||
- fix sr-only -> visually hidden [#5169](https://github.com/jupyterhub/jupyterhub/pull/5169) ([@minrk](https://github.com/minrk), [@manics](https://github.com/manics))
|
||||
|
||||
#### Maintenance and upkeep improvements
|
||||
|
||||
- test with 3.14 (and 3.14t) [#5176](https://github.com/jupyterhub/jupyterhub/pull/5176) ([@minrk](https://github.com/minrk))
|
||||
|
||||
#### Contributors to this release
|
||||
|
||||
The following people contributed discussions, new ideas, code and documentation contributions, and review.
|
||||
See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports).
|
||||
|
||||
([GitHub contributors page for this release](https://github.com/jupyterhub/jupyterhub/graphs/contributors?from=2025-10-06&to=2025-10-17&type=c))
|
||||
|
||||
@choldgraf ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fjupyterhub+involves%3Acholdgraf+updated%3A2025-10-06..2025-10-17&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fjupyterhub+involves%3Akrassowski+updated%3A2025-10-06..2025-10-17&type=Issues)) | @kreuzert ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fjupyterhub+involves%3Akreuzert+updated%3A2025-10-06..2025-10-17&type=Issues)) | @manics ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fjupyterhub+involves%3Amanics+updated%3A2025-10-06..2025-10-17&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyterhub%2Fjupyterhub+involves%3Aminrk+updated%3A2025-10-06..2025-10-17&type=Issues))
|
||||
|
||||
### 5.4.0 - 2025-10-06
|
||||
|
||||
JupyterHub 5.4 is a small release with a few new features and several nice bugfixes.
|
||||
|
@@ -3,7 +3,7 @@
|
||||
# Copyright (c) Jupyter Development Team.
|
||||
# Distributed under the terms of the Modified BSD License.
|
||||
# version_info updated by running `tbump`
|
||||
version_info = (5, 4, 0, "", "")
|
||||
version_info = (5, 4, 1, "", "")
|
||||
|
||||
# pep 440 version: no dot before beta/rc, but before .dev
|
||||
# 0.1.0rc1
|
||||
|
@@ -1650,7 +1650,7 @@ class UserUrlHandler(BaseHandler):
|
||||
|
||||
def _fail_api_request(self, user_name='', server_name=''):
|
||||
"""Fail an API request to a not-running server"""
|
||||
self.log.warning(
|
||||
self.log.debug(
|
||||
"Failing suspected API request to not-running server: %s", self.request.path
|
||||
)
|
||||
|
||||
|
@@ -547,7 +547,7 @@ class Expiring:
|
||||
which should be unix timestamp or datetime object
|
||||
"""
|
||||
|
||||
now = utcnow # function, must return float timestamp or datetime
|
||||
now = staticmethod(utcnow) # function, must return float timestamp or datetime
|
||||
expires_at = None # must be defined
|
||||
|
||||
@property
|
||||
@@ -1078,7 +1078,7 @@ class APIToken(Hashed, Base):
|
||||
session_id = Column(Unicode(255), nullable=True)
|
||||
|
||||
# token metadata for bookkeeping
|
||||
now = utcnow # for expiry
|
||||
now = staticmethod(utcnow) # for expiry
|
||||
created = Column(DateTime, default=utcnow)
|
||||
expires_at = Column(DateTime, default=None, nullable=True)
|
||||
last_activity = Column(DateTime)
|
||||
|
@@ -1425,13 +1425,19 @@ class Spawner(LoggingConfigurable):
|
||||
|
||||
trusted_alt_names = List(Unicode())
|
||||
|
||||
ssl_alt_names = List(
|
||||
Unicode(),
|
||||
ssl_alt_names = Union(
|
||||
[List(Unicode()), Callable()],
|
||||
config=True,
|
||||
help="""List of SSL alt names
|
||||
help="""List of SSL alt names (list of strings).
|
||||
|
||||
May be set in config if all spawners should have the same value(s),
|
||||
or set at runtime by Spawner that know their names.
|
||||
|
||||
.. versionchanged:: 5.4.1
|
||||
May now be a callable.
|
||||
The callable will receive the Spawner as its only argument,
|
||||
and must return a list of strings.
|
||||
It may be async.
|
||||
""",
|
||||
)
|
||||
|
||||
@@ -1479,7 +1485,13 @@ class Spawner(LoggingConfigurable):
|
||||
|
||||
default_names = ["DNS:localhost", "IP:127.0.0.1"]
|
||||
alt_names = []
|
||||
alt_names.extend(self.ssl_alt_names)
|
||||
|
||||
ssl_alt_names = self.ssl_alt_names
|
||||
if callable(ssl_alt_names):
|
||||
ssl_alt_names = ssl_alt_names(self)
|
||||
if isawaitable(ssl_alt_names):
|
||||
ssl_alt_names = await ssl_alt_names
|
||||
alt_names.extend(ssl_alt_names)
|
||||
|
||||
if self.ssl_alt_names_include_local:
|
||||
alt_names = default_names + alt_names
|
||||
|
@@ -45,9 +45,11 @@ def generate_old_db(env_dir, hub_version, db_url):
|
||||
# changes to this version list must also be reflected
|
||||
# in ci/init-db.sh
|
||||
@pytest.mark.parametrize(
|
||||
'hub_version', ['1.1.0', '1.2.2', '1.3.0', '1.5.0', '2.1.1', '3.1.1']
|
||||
'hub_version', ['1.1.0', '1.2.2', '1.3.0', '1.5.0', '2.1.1', '3.1.1', '4.1.6']
|
||||
)
|
||||
async def test_upgrade(tmpdir, hub_version):
|
||||
if sys.version_info >= (3, 13) and V(hub_version) < V("4"):
|
||||
pytest.skip("jupyterhub < 4 needs Python 3.12 or earlier")
|
||||
db_url = os.getenv('JUPYTERHUB_TEST_DB_URL')
|
||||
if db_url:
|
||||
db_url += '_upgrade_' + hub_version.replace('.', '')
|
||||
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
||||
# ref: https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html
|
||||
[project]
|
||||
name = "jupyterhub"
|
||||
version = "5.4.0"
|
||||
version = "5.4.1"
|
||||
dynamic = ["readme", "dependencies"]
|
||||
description = "JupyterHub: A multi-user server for Jupyter notebooks"
|
||||
authors = [
|
||||
@@ -147,7 +147,7 @@ indent_size = 2
|
||||
github_url = "https://github.com/jupyterhub/jupyterhub"
|
||||
|
||||
[tool.tbump.version]
|
||||
current = "5.4.0"
|
||||
current = "5.4.1"
|
||||
|
||||
# Example of a semver regexp.
|
||||
# Make sure this matches current_version before
|
||||
|
@@ -4,7 +4,7 @@
|
||||
{% endif %}
|
||||
{% block main %}
|
||||
<div class="container">
|
||||
<h1 class="sr-only">JupyterHub home page</h1>
|
||||
<h1 class="visually-hidden">JupyterHub home page</h1>
|
||||
<div class="row">
|
||||
<div class="text-center">
|
||||
{% if default_server.active %}<a id="stop" role="button" class="btn btn-lg btn-danger">Stop My Server</a>{% endif %}
|
||||
|
@@ -14,7 +14,7 @@
|
||||
aria-valuenow="0"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100">
|
||||
<span class="sr-only"><span id="sr-progress">0%</span> Complete</span>
|
||||
<span class="visually-hidden"><span id="sr-progress">0%</span> Complete</span>
|
||||
</div>
|
||||
</div>
|
||||
<p id="progress-message"></p>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{% extends "page.html" %}
|
||||
{% block main %}
|
||||
<div class="container">
|
||||
<h1 class="sr-only">Manage JupyterHub Tokens</h1>
|
||||
<h1 class="visually-hidden">Manage JupyterHub Tokens</h1>
|
||||
<div class="row justify-content-center">
|
||||
<form id="request-token-form" class="col-lg-6">
|
||||
<div class="form-group">
|
||||
|
Reference in New Issue
Block a user