1
0
mirror of synced 2026-10-23 07:08:55 +03:00

chore(deps): bump third-party JS and Python dependencies (#10370)

JS (yarn, patch/minor only): babel toolchain, MUI, react/react-dom,
testing-library, axios, webpack ecosystem, jest, eslint plugins, and
misc small libs. Excluded @simonwep/pickr (webpack prod-bundle
interop break on 1.10.x), @testing-library/user-event@14.6.7 and
webpack@5.110.3 (both npm-quarantined at bump time).

Python (>3.9 requirements branch only, Python 3.9 pins untouched):
Authlib 1.8, google-auth-oauthlib 1.4.1, gssapi 1.12 (ungated),
psycopg[c] 3.3.5, selenium 4.48.0, testscenarios 0.7.0.

Skipped: paramiko 3->5 (blocked on sshtunnel's paramiko.DSSKey
usage), azure-mgmt-resource 26.0.0 (drops Python 3.9 support and
conflicts with the <26 upper bound kept for Azure CLI distro
packaging, see #10247).

Two bumped packages required source fixes:

- psycopg 3.3.5 restructured the private
  psycopg._encodings._py_codecs attribute from a dict to a tuple of
  alias groups, breaking our monkeypatch in
  pgadmin/utils/driver/psycopg3/encoding.py with TypeError: 'tuple'
  object does not support item assignment. Rewrote get_encoding()/
  configure_driver_encodings() to use the derived py_codecs/
  pg_codecs dicts instead, which stay plain dicts across psycopg
  3.2.x-3.3.5 regardless of _py_codecs's internal shape. Verified
  byte-for-byte identical behavior against 3.3.4 for every
  encode_dict entry (SQL_ASCII, EUC_TW, UNICODE, ascii) plus
  UTF8/LATIN1. Added a DB-free unit test
  (pgadmin/utils/driver/psycopg3/tests/test_encoding.py) so a future
  psycopg internals change fails fast here instead of only surfacing
  as an app-wide import crash in the full regression suite.

- react-frame-component 5.3.2 breaks LayoutIframeTab.jsx (the iframe
  wrapper every tool panel - Query Tool, Debugger, PSQL, ERD, Schema
  Diff - renders into): the panel's iframe never mounts, hanging any
  of those tools indefinitely (React error #130 in the production
  bundle). This caused every run-feature-tests-pg CI job to fail.
  Reverted to 5.2.6.
This commit is contained in:
Ashesh Vashi
2026-09-03 09:28:04 +00:00
committed by GitHub
parent bc58657d3d
commit bd7cde5851
6 changed files with 2416 additions and 1124 deletions

View File

@@ -13,7 +13,7 @@
###############################################################################
Authlib==1.6.*; python_version <= '3.9'
Authlib==1.7.*; python_version > '3.9'
Authlib==1.8.*; python_version > '3.9'
azure-identity==1.25.3
azure-mgmt-rdbms==10.1.1
# Azure CLI (a common companion package on Linux distros) still pins
@@ -44,8 +44,8 @@ Flask-WTF==1.3.*; python_version > '3.9'
Flask==3.1.*
google-api-python-client==2.*
google-auth-oauthlib==1.3.1; python_version <= '3.9'
google-auth-oauthlib==1.4.0; python_version > '3.9'
gssapi==1.11.*
google-auth-oauthlib==1.4.1; python_version > '3.9'
gssapi==1.12.*
jsonformatter~=0.3.4
keyring==25.*
ldap3==2.*
@@ -53,7 +53,7 @@ libgravatar==1.0.*
paramiko==3.5.1
psutil==7.2.*
psycopg[c]==3.2.13; python_version < '3.10'
psycopg[c]==3.3.4; python_version >= '3.10'
psycopg[c]==3.3.5; python_version >= '3.10'
pyotp==2.*
python-dateutil==2.*
pytz==2026.*

View File

@@ -7,24 +7,24 @@
],
"license": "PostgreSQL",
"devDependencies": {
"@babel/core": "^7.29.6",
"@babel/eslint-parser": "^7.28.6",
"@babel/eslint-plugin": "^7.27.1",
"@babel/plugin-syntax-jsx": "^7.28.6",
"@babel/plugin-transform-class-properties": "^7.28.6",
"@babel/plugin-transform-object-rest-spread": "^7.28.6",
"@babel/plugin-transform-runtime": "^7.29.0",
"@babel/preset-env": "^7.29.2",
"@babel/preset-react": "^7.28.5",
"@babel/preset-typescript": "^7.28.5",
"@babel/core": "^7.29.7",
"@babel/eslint-parser": "^7.29.7",
"@babel/eslint-plugin": "^7.29.7",
"@babel/plugin-syntax-jsx": "^7.29.7",
"@babel/plugin-transform-class-properties": "^7.29.7",
"@babel/plugin-transform-object-rest-spread": "^7.29.7",
"@babel/plugin-transform-runtime": "^7.29.7",
"@babel/preset-env": "^7.29.7",
"@babel/preset-react": "^7.29.7",
"@babel/preset-typescript": "^7.29.7",
"@emotion/memoize": "^0.9.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@emotion/utils": "^1.4.2",
"@svgr/webpack": "^8.1.0",
"@testing-library/dom": "10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "16.3.2",
"@testing-library/jest-dom": "^6.10.0",
"@testing-library/react": "16.3.3",
"@testing-library/user-event": "^14.6.3",
"@types/jest": "^30.0.0",
"autoprefixer": "^10.5.4",
@@ -33,21 +33,21 @@
"browserify": "^17.0.1",
"buffer": "^6.0.3",
"copy-webpack-plugin": "^14.0.0",
"core-js": "^3.49.0",
"core-js": "^3.50.0",
"cross-env": "^10.1.0",
"css-loader": "^7.1.4",
"css-loader": "^7.1.5",
"css-minimizer-webpack-plugin": "^8.0.0",
"eslint": "^9.39.4",
"eslint-plugin-jest": "^29.15.5",
"eslint": "^9.39.5",
"eslint-plugin-jest": "^29.16.6",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-unused-imports": "^4.4.1",
"exports-loader": "^5.0.0",
"globals": "^17.7.0",
"globals": "^17.12.0",
"html-react-parser": "^5.2.17",
"image-minimizer-webpack-plugin": "^5.0.0",
"imports-loader": "^5.0.0",
"jest": "^30.4.2",
"jest-environment-jsdom": "^30.4.1",
"jest": "^30.5.1",
"jest-environment-jsdom": "^30.5.1",
"loader-utils": "^3.3.1",
"mini-css-extract-plugin": "^2.10.2",
"postcss-loader": "^8.2.1",
@@ -57,20 +57,20 @@
"shim-loader": "^1.0.1",
"style-loader": "^4.0.0",
"stylis": "^4.4.0",
"svgo": "4.0.2",
"svgo": "4.1.0",
"svgo-loader": "^5.0.0",
"terser-webpack-plugin": "^5.6.1",
"typescript": "^6.0.3",
"typescript-eslint": "^8.65.0",
"typescript-eslint": "^8.69.0",
"url-loader": "^4.1.1",
"webfonts-loader": "^8.1.1",
"webpack": "^5.108.4",
"webpack-bundle-analyzer": "^5.3.1",
"webpack-bundle-analyzer": "^5.3.2",
"webpack-cli": "^6.0.1",
"yarn-audit-html": "7.3.2"
},
"optionalDependencies": {
"sharp": "^0.35.3"
"sharp": "^0.35.4"
},
"dependencies": {
"@codemirror/lang-json": "^6.0.2",
@@ -80,63 +80,63 @@
"@emotion/sheet": "^1.4.0",
"@fluentui/keyboard-key": "^0.4.23",
"@fortawesome/fontawesome-free": "latest",
"@mui/icons-material": "^7.3.10",
"@mui/material": "^7.3.10",
"@mui/x-date-pickers": "^8.28.3",
"@mui/icons-material": "^7.3.11",
"@mui/material": "^7.3.11",
"@mui/x-date-pickers": "^8.29.3",
"@nozbe/microfuzz": "^1.0.0",
"@projectstorm/react-diagrams": "^7.0.4",
"@simonwep/pickr": "~1.9.1",
"@szhsin/react-menu": "^4.5.2",
"@tanstack/react-query": "^5.101.4",
"@tanstack/react-query": "^5.102.8",
"@tanstack/react-table": "^8.21.3",
"@tanstack/react-virtual": "^3.14.9",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@tanstack/react-virtual": "^3.14.10",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.5",
"@xterm/addon-fit": "^0.11.0",
"@xterm/addon-search": "^0.16.0",
"@xterm/addon-web-links": "^0.12.0",
"@xterm/xterm": "^6.0.0",
"ajv": "^8.20.0",
"anti-trojan-source": "^1.12.1",
"anti-trojan-source": "^1.12.2",
"aspen-decorations": "^1.1.1",
"axios": "^1.18.1",
"axios": "^1.20.0",
"babelify": "~10.0.0",
"bignumber.js": "^10.0.2",
"brace": "^0.11.1",
"chart.js": "^4.5.1",
"chartjs-plugin-zoom": "^2.2.0",
"codemirror": "^6.0.2",
"codemirror": "^6.65.7",
"convert-units": "^2.3.4",
"date-fns": "^4.4.0",
"diff-arrays-of-objects": "^1.1.10",
"dompurify": "^3.4.13",
"hotkeys-js": "^4.0.4",
"diff-arrays-of-objects": "^1.1.11",
"dompurify": "^3.4.14",
"hotkeys-js": "^4.0.7",
"html-to-image": "1.11.13",
"immutability-helper": "^3.1.1",
"insert-if": "^1.2.0",
"ip-address": "^10.3.1",
"ip-address": "^10.7.0",
"json-bignumber": "^1.1.1",
"leaflet": "^1.9.4",
"lodash": "4.*",
"lossless-json": "^4.3.0",
"marked": "^18.0.7",
"lossless-json": "^4.3.1",
"marked": "^18.0.11",
"moment": "^2.30.1",
"moment-timezone": "^0.6.3",
"notificar": "^1.0.1",
"notistack": "^3.0.2",
"papaparse": "^5.5.4",
"papaparse": "^5.7.0",
"path-fx": "^2.1.2",
"postcss": "^8.5.23",
"rc-dock": "^4.0.0-alpha.2",
"react": "^19.2.7",
"react-arborist": "^3.5.0",
"postcss": "^8.5.26",
"rc-dock": "^4.0.0-alpha.3",
"react": "^19.2.8",
"react-arborist": "^3.16.0",
"react-aspen": "^1.2.0",
"react-checkbox-tree": "^2.0.2",
"react-data-grid": "https://github.com/pgadmin-org/react-data-grid.git#8ddaa7bed99c8329e39b8ff37ba156f7fc8e85d4",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "^19.2.7",
"react-draggable": "^4.7.0",
"react-dom": "^19.2.8",
"react-draggable": "^4.7.1",
"react-dropzone": "^15.0.0",
"react-frame-component": "~5.2.6",
"react-leaflet": "^4.2.1",
@@ -154,9 +154,9 @@
"uplot-react": "^1.2.4",
"use-resize-observer": "^10.0.0",
"valid-filename": "^4.0.0",
"vanilla-jsoneditor": "^3.12.0",
"vanilla-jsoneditor": "^3.13.0",
"wkx": "^0.5.0",
"zustand": "^5.0.14"
"zustand": "^5.0.15"
},
"resolutions": {
"rc-resize-observer": "1.4.0",

View File

@@ -43,8 +43,8 @@ def get_encoding(key):
current_app.logger.error(e)
postgres_encoding = 'utf-8'
python_encoding = psycopg._encodings._py_codecs.get(postgres_encoding,
'utf-8')
python_encoding = psycopg._encodings.py_codecs.get(
postgres_encoding.upper().encode(), 'utf-8')
_dict = encode_dict.get(postgres_encoding.upper(),
[postgres_encoding,
@@ -61,9 +61,8 @@ def configure_driver_encodings(encodings):
for key, val in encode_dict.items():
_, python_encoding = val
psycopg._encodings._py_codecs[key] = python_encoding
psycopg._encodings.py_codecs[key.encode()] = python_encoding
encodings.update((k.encode(), v
) for k, v in psycopg._encodings._py_codecs.items())
encodings.update(psycopg._encodings.py_codecs)
psycopg._encodings.pg_codecs = {
v: k.encode() for k, v in psycopg._encodings._py_codecs.items()}
v: k for k, v in psycopg._encodings.py_codecs.items()}

View File

@@ -0,0 +1,67 @@
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2026, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""
Unit tests for pgadmin.utils.driver.psycopg3.encoding.
These guard against psycopg restructuring its private
psycopg._encodings module (e.g. 3.3.5 changed _py_codecs from a dict
to a tuple of alias groups, breaking configure_driver_encodings()).
They don't need a live database connection.
"""
import psycopg
from pgadmin.utils.driver.psycopg3.encoding import get_encoding, \
configure_driver_encodings
from pgadmin.utils.route import BaseTestGenerator
class TestEncoding(BaseTestGenerator):
"""Validate get_encoding()/configure_driver_encodings() against
whatever shape the installed psycopg version's encoding tables
have."""
scenarios = [
('UTF8 maps to the utf-8 python codec',
dict(key='UTF8', expected=['utf-8', 'utf-8'])),
('LATIN1 maps to the iso8859-1 python codec',
dict(key='LATIN1', expected=['ISO88591', 'iso8859-1'])),
('SQL_ASCII falls back to the pgAdmin-only override',
dict(key='SQL_ASCII', expected=['utf-8', 'utf-8'])),
('EUC_TW falls back to the pgAdmin-only override',
dict(key='EUC_TW', expected=['utf-8', 'utf-8'])),
('UNICODE falls back to the pgAdmin-only override',
dict(key='UNICODE', expected=['utf-8', 'utf-8'])),
('the ascii special-case resolves via raw_unicode_escape',
dict(key='ascii', expected=['SQLASCII', 'raw-unicode-escape'])),
]
def setUp(self):
# No DB connection needed for this test.
pass
def runTest(self):
encodings = {}
configure_driver_encodings(encodings)
with self.app.app_context():
self.assertEqual(get_encoding(self.key), self.expected)
# py_codecs/pg_codecs must stay plain dicts and stay in sync,
# regardless of how psycopg represents its internal encoding
# table (dict in <=3.3.4, tuple-of-aliases in >=3.3.5).
self.assertIsInstance(psycopg._encodings.py_codecs, dict)
self.assertIsInstance(psycopg._encodings.pg_codecs, dict)
# pg_codecs is the reverse of py_codecs (python codec -> one of
# its PG names); every value it holds must round-trip back to
# the same python codec through py_codecs.
for python_codec, pg_name in psycopg._encodings.pg_codecs.items():
self.assertEqual(
psycopg._encodings.py_codecs.get(pg_name), python_codec)

View File

@@ -28,9 +28,9 @@ pbr==7.0.3
pycodestyle>=2.14.0
python-mimeparse==2.0.0
selenium==4.44.0; python_version <= '3.9'
selenium==4.47.0; python_version > '3.9'
selenium==4.48.0; python_version > '3.9'
testscenarios==0.5.0; python_version <= '3.9'
testscenarios==0.6.2; python_version > '3.9'
testscenarios==0.7.0; python_version > '3.9'
testtools==2.7.2; python_version <= '3.9'
testtools==2.9.1; python_version > '3.9'
traceback2==1.4.0

File diff suppressed because it is too large Load Diff