1
0
mirror of https://github.com/thp/pyotherside.git synced 2025-01-28 23:52:55 +08:00

Implement Python 3.12 compatible loader. Fixes #130. (#131)

This commit is contained in:
Florian Apolloner 2024-04-24 20:04:48 +02:00 committed by GitHub
parent 45c6cee562
commit 29c5148598
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 36 additions and 23 deletions

View File

@ -28,7 +28,7 @@ jobs:
- name: Install dependencies (macOS)
if: matrix.os == 'macos-latest'
run: |
brew install qt@5 python@3.8
brew install qt@5 python@3.12
echo PATH=/usr/local/opt/qt@5/bin:$PATH >> ${GITHUB_ENV}
- run: qmake
- run: make

View File

@ -11,7 +11,7 @@ Requirements
------------
* Qt 5.1.0 or newer (Qt 6.x also supported)
* Python 3.3.0 or newer
* Python 3.8.0 or newer
Building
@ -28,7 +28,7 @@ make install
To build against a specific Python version, use:
```
qmake PYTHON_CONFIG=python3.3-config # use "qmake6" for Qt 6
qmake PYTHON_CONFIG=python3.8-config # use "qmake6" for Qt 6
make
make install
```

View File

@ -1169,7 +1169,7 @@ Building PyOtherSide
The following build requirements have to be satisfied to build PyOtherSide:
* Qt 5.1.0 or newer (Qt 6.x also supported)
* Python 3.3.0 or newer
* Python 3.8.0 or newer
If you have the required build-dependencies installed, building and installing
the PyOtherSide plugin should be as simple as:
@ -1185,7 +1185,7 @@ pass a suitable ``python-config`` to ``qmake`` at configure time:
.. code-block:: sh
qmake PYTHON_CONFIG=python3.3-config # For Qt 6, use "qmake6"
qmake PYTHON_CONFIG=python3.8-config # For Qt 6, use "qmake6"
make
make install
@ -1199,6 +1199,8 @@ ChangeLog
Version UNRELEASED (YYYY-MM-DD)
-------------------------------
* Dropped support for Python < 3.8 (PR#131)
* Added support for Python 3.12 (PR#131)
* Support for Qt 6.5 and newer (backwards-incompatible ``Q_RETURN_ARG()`` change) (fixes #128)
Version 1.6.0 (2022-08-05)

View File

@ -16,32 +16,43 @@
#
import sys
from importlib import abc
from importlib.util import spec_from_loader
import pyotherside
from importlib import abc
class PyOtherSideQtRCImporter(abc.MetaPathFinder, abc.SourceLoader):
def find_module(self, fullname, path):
if path is None or all(x.startswith('qrc:') for x in path):
if self.get_filename(fullname):
return self
def get_filename(self, fullname):
basename = fullname.replace('.', '/')
def get_filename(fullname):
basename = fullname.replace(".", "/")
for import_path in sys.path:
if not import_path.startswith('qrc:'):
if not import_path.startswith("qrc:"):
continue
for candidate in ('{}/{}.py', '{}/{}/__init__.py'):
for candidate in ("{}/{}.py", "{}/{}/__init__.py"):
filename = candidate.format(import_path, basename)
if pyotherside.qrc_is_file(filename[len('qrc:'):]):
if pyotherside.qrc_is_file(filename[len("qrc:") :]):
return filename
def get_data(self, path):
return pyotherside.qrc_get_file_contents(path[len('qrc:'):])
def module_repr(self, m):
return "<module '{}' from '{}'>".format(m.__name__, m.__file__)
class PyOtherSideQtRCLoader(abc.SourceLoader):
def __init__(self, filepath):
self.filepath = filepath
def get_data(self, path):
return pyotherside.qrc_get_file_contents(self.filepath[len("qrc:") :])
def get_filename(self, fullname):
return get_filename(fullname)
class PyOtherSideQtRCImporter(abc.MetaPathFinder):
def find_spec(self, fullname, path, target=None):
if path is None:
fname = get_filename(fullname)
if fname:
return spec_from_loader(fullname, PyOtherSideQtRCLoader(fname))
return None
sys.meta_path.append(PyOtherSideQtRCImporter())