diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 8785d88..f481947 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9"] + python-version: ["3.8", "3.10"] steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 7f164e8..4def478 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ ![Python Test Status](https://github.com/SaladDais/Hippolyzer/workflows/Run%20Python%20Tests/badge.svg) [![codecov](https://codecov.io/gh/SaladDais/Hippolyzer/branch/master/graph/badge.svg?token=HCTFA4RAXX)](https://codecov.io/gh/SaladDais/Hippolyzer) -**Note: Python 3.10 is currently unsupported due to PySide2 being broken** - [Hippolyzer](http://wiki.secondlife.com/wiki/Hippo) is a revival of Linden Lab's [PyOGP library](http://wiki.secondlife.com/wiki/PyOGP) targeting modern Python 3, with a focus on debugging issues in Second Life-compatible diff --git a/addon_examples/blueish_object_list.py b/addon_examples/blueish_object_list.py index eb8dcd4..7e63ca2 100644 --- a/addon_examples/blueish_object_list.py +++ b/addon_examples/blueish_object_list.py @@ -11,7 +11,7 @@ import enum import os.path from typing import * -from PySide2 import QtCore, QtGui, QtWidgets +from PySide6 import QtCore, QtGui, QtWidgets from hippolyzer.lib.base.datatypes import Vector3 from hippolyzer.lib.base.message.message import Block, Message diff --git a/addon_examples/pixel_artist.py b/addon_examples/pixel_artist.py index 071bf8c..d8885fb 100644 --- a/addon_examples/pixel_artist.py +++ b/addon_examples/pixel_artist.py @@ -9,7 +9,7 @@ import asyncio import struct from typing import * -from PySide2.QtGui import QImage +from PySide6.QtGui import QImage from hippolyzer.lib.base.datatypes import UUID, Vector3, Quaternion from hippolyzer.lib.base.helpers import to_chunks @@ -42,7 +42,7 @@ class PixelArtistAddon(BaseAddon): return img = QImage() with open(filename, "rb") as f: - img.loadFromData(f.read(), aformat=None) + img.loadFromData(f.read(), format=None) img = img.convertToFormat(QImage.Format_RGBA8888) height = img.height() width = img.width() diff --git a/hippolyzer/apps/model.py b/hippolyzer/apps/model.py index d3d2872..c849631 100644 --- a/hippolyzer/apps/model.py +++ b/hippolyzer/apps/model.py @@ -2,7 +2,7 @@ import enum import logging import typing -from PySide2 import QtCore, QtGui +from PySide6 import QtCore, QtGui from hippolyzer.lib.proxy.region import ProxiedRegion from hippolyzer.lib.proxy.message_logger import FilteringMessageLogger diff --git a/hippolyzer/apps/proxy_gui.py b/hippolyzer/apps/proxy_gui.py index e670c41..3d8738d 100644 --- a/hippolyzer/apps/proxy_gui.py +++ b/hippolyzer/apps/proxy_gui.py @@ -18,7 +18,7 @@ from typing import * import multidict from qasync import QEventLoop, asyncSlot -from PySide2 import QtCore, QtWidgets, QtGui +from PySide6 import QtCore, QtWidgets, QtGui from hippolyzer.apps.model import MessageLogModel, MessageLogHeader, RegionListModel from hippolyzer.apps.proxy import start_proxy @@ -300,7 +300,7 @@ class MessageLogWindow(QtWidgets.QMainWindow): def _populateFilterMenu(self): def _addFilterAction(text, filter_str): - filter_action = QtWidgets.QAction(text, self) + filter_action = QtGui.QAction(text, self) filter_action.triggered.connect(lambda: self.setFilter(filter_str)) self._filterMenu.addAction(filter_action) diff --git a/hippolyzer/lib/base/jp2_utils.py b/hippolyzer/lib/base/jp2_utils.py index 07bf3d5..aabe762 100644 --- a/hippolyzer/lib/base/jp2_utils.py +++ b/hippolyzer/lib/base/jp2_utils.py @@ -1,7 +1,6 @@ import os import tempfile from io import BytesIO -from typing import * import defusedxml.ElementTree from glymur import jp2box, Jp2k @@ -10,12 +9,6 @@ from glymur import jp2box, Jp2k jp2box.ET = defusedxml.ElementTree -SL_DEFAULT_ENCODE = { - "cratios": (1920.0, 480.0, 120.0, 30.0, 10.0), - "irreversible": True, -} - - class BufferedJp2k(Jp2k): """ For manipulating JP2K from within a binary buffer. @@ -24,12 +17,7 @@ class BufferedJp2k(Jp2k): based on filename, so this is the least brittle approach. """ - def __init__(self, contents: bytes, encode_kwargs: Optional[Dict] = None): - if encode_kwargs is None: - self.encode_kwargs = SL_DEFAULT_ENCODE.copy() - else: - self.encode_kwargs = encode_kwargs - + def __init__(self, contents: bytes): stream = BytesIO(contents) self.temp_file = tempfile.NamedTemporaryFile(delete=False) stream.seek(0) @@ -44,11 +32,12 @@ class BufferedJp2k(Jp2k): os.remove(self.temp_file.name) self.temp_file = None - def _write(self, img_array, verbose=False, **kwargs): - # Glymur normally only lets you control encode params when a write happens within - # the constructor. Keep around the encode params from the constructor and pass - # them to successive write calls. - return super()._write(img_array, verbose=False, **self.encode_kwargs, **kwargs) + def _populate_cparams(self, img_array): + if self._cratios is None: + self._cratios = (1920.0, 480.0, 120.0, 30.0, 10.0) + if self._irreversible is None: + self.irreversible = True + return super()._populate_cparams(img_array) def __bytes__(self): with open(self.temp_file.name, "rb") as f: diff --git a/hippolyzer/lib/base/ui_helpers.py b/hippolyzer/lib/base/ui_helpers.py index fa56d0a..8ca7c6f 100644 --- a/hippolyzer/lib/base/ui_helpers.py +++ b/hippolyzer/lib/base/ui_helpers.py @@ -1,5 +1,5 @@ -from PySide2.QtCore import QMetaObject -from PySide2.QtUiTools import QUiLoader +from PySide6.QtCore import QMetaObject +from PySide6.QtUiTools import QUiLoader class UiLoader(QUiLoader): diff --git a/requirements.txt b/requirements.txt index 7113caa..ff755d1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,65 +1,66 @@ -aiohttp==3.7.4.post0 +aiohttp==3.8.1 +aiosignal==1.2.0 appdirs==1.4.4 Arpeggio==1.10.2 asgiref==3.4.1 -async-timeout==3.0.1 +async-timeout==4.0.1 attrs==21.2.0 blinker==1.4 Brotli==1.0.9 -certifi==2021.5.30 -cffi==1.14.6 -chardet==4.0.0 -charset-normalizer==2.0.3 -click==8.0.1 -cryptography==3.4.7 +certifi==2021.10.8 +cffi==1.15.0 +charset-normalizer==2.0.9 +click==8.0.3 +cryptography==3.4.8 defusedxml==0.7.1 -Flask==2.0.1 -Glymur==0.9.3 +Flask==2.0.2 +frozenlist==1.2.0 +Glymur==0.9.6 h11==0.12.0 -h2==4.0.0 +h2==4.1.0 hpack==4.0.0 hyperframe==6.0.1 idna==2.10 itsdangerous==2.0.1 -jedi==0.18.0 -Jinja2==3.0.1 +jedi==0.18.1 +Jinja2==3.0.3 kaitaistruct==0.9 lazy-object-proxy==1.6.0 -ldap3==2.9 +ldap3==2.9.1 llbase==1.2.11 -lxml==4.6.3 +lxml==4.6.4 MarkupSafe==2.0.1 -mitmproxy==7.0.3 -msgpack==1.0.2 -multidict==5.1.0 -numpy==1.21.0 -parso==0.8.2 +mitmproxy==7.0.4 +msgpack==1.0.3 +multidict==5.2.0 +numpy==1.21.4 +parso==0.8.3 passlib==1.7.4 -prompt-toolkit==3.0.19 -protobuf==3.17.3 -ptpython==3.0.19 +prompt-toolkit==3.0.23 +protobuf==3.18.1 +ptpython==3.0.20 publicsuffix2==2.20191221 pyasn1==0.4.8 -pycparser==2.20 -Pygments==2.9.0 +pycparser==2.21 +Pygments==2.10.0 pyOpenSSL==20.0.1 pyparsing==2.4.7 pyperclip==1.8.2 -PySide2==5.15.2 -qasync==0.17.0 +PySide6==6.2.2 +qasync==0.22.0 recordclass==0.14.3 requests==2.26.0 -ruamel.yaml==0.17.10 +ruamel.yaml==0.17.16 ruamel.yaml.clib==0.2.6 -shiboken2==5.15.2 +shiboken6==6.2.2 six==1.16.0 sortedcontainers==2.4.0 tornado==6.1 -typing-extensions==3.10.0.0 -urllib3==1.26.6 +typing-extensions==4.0.1 +urllib3==1.26.7 urwid==2.1.2 wcwidth==0.2.5 -Werkzeug==2.0.1 +Werkzeug==2.0.2 wsproto==1.0.0 -yarl==1.6.3 +yarl==1.7.2 zstandard==0.15.2 diff --git a/setup.py b/setup.py index 8f4bbb0..7eb30b4 100644 --- a/setup.py +++ b/setup.py @@ -44,6 +44,7 @@ setup( "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: Implementation :: CPython", "Topic :: System :: Networking :: Monitoring", "Topic :: Software Development :: Libraries :: Python Modules", @@ -92,10 +93,10 @@ setup( # For REPLs 'ptpython<4.0', # JP2 codec - 'Glymur<1.0', + 'Glymur<0.9.7', 'numpy<2.0', # These could be in extras_require if you don't want a GUI. - 'pyside2<6.0', + 'pyside6', 'qasync', ], tests_require=[