Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pyinstaller-hooks-contrib for
openSUSE:Factory checked in at 2022-11-12 17:40:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pyinstaller-hooks-contrib (Old)
and /work/SRC/openSUSE:Factory/.python-pyinstaller-hooks-contrib.new.1597
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyinstaller-hooks-contrib"
Sat Nov 12 17:40:54 2022 rev:2 rq:1035241 version:2022.12
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-pyinstaller-hooks-contrib/python-pyinstaller-hooks-contrib.changes
2022-09-30 17:58:57.861398663 +0200
+++
/work/SRC/openSUSE:Factory/.python-pyinstaller-hooks-contrib.new.1597/python-pyinstaller-hooks-contrib.changes
2022-11-12 17:41:10.430169664 +0100
@@ -1,0 +2,24 @@
+Wed Nov 9 18:30:17 UTC 2022 - Yogalakshmi Arunachalam <[email protected]>
+
+- Update to version 2022.12
+ New hooks
+ * Add hook for discid. (#506)
+ * Add hook for exchangelib. (#508)
+
+- Update to versino 2022.11
+ * New hooks
+ Add a hook for spiceypy, which has binary files. (#482)
+ Added a hook for ldfparser. (#483)
+ * Updated hooks
+ Extend the sounddevice and soundfile hooks to collect system-installed
shared libraries in cases when the libraries are
+ not bundled with the package (i.e., linux PyPI wheels, Anaconda on all
OSes). (#487)
+ Fix a TypeError raised by the clr hook when pythonnet dist lacks the file
list metadata. (#486)
+ Have clr hook check for availability of the pythonnet before trying to query
its metadata. Fixes an importlib.metadata.PackageNotFoundError
+ raised by the clr hook when the hook is triggered by a module or a package
named clr other than the clr extension module from pythonnet. (#486)
+ Have the pyqtgraph hook collect the colormap files and their license files
from the package. (#501)
+ Implement preliminary support for handling subprocesses used by
pyqtgraph.multiprocess, for example in pyqtgraph RemoteGraphicsView widget.
+ The user is still required to ensure that stdlib's
multiprocessing.freeze_support is called in the entry-point script before using
pyqtgraph.
+ In addition, with onefile builds, the user must set the _MEIPASS2
environment variable to the value of sys._MEIPASS before using pyqtgraph. (#501)
+ In clr hook for pythonnet collect the Python.Runtime.dll as a data file on
non-Windows OSes to prevent errors during binary dependency analysis. (#500)
+
+-------------------------------------------------------------------
Old:
----
pyinstaller-hooks-contrib-2022.10.tar.gz
New:
----
pyinstaller-hooks-contrib-2022.12.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pyinstaller-hooks-contrib.spec ++++++
--- /var/tmp/diff_new_pack.9bu8JQ/_old 2022-11-12 17:41:11.946178689 +0100
+++ /var/tmp/diff_new_pack.9bu8JQ/_new 2022-11-12 17:41:11.950178712 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package python-pyinstaller-hooks-contrib
+# spec file
#
# Copyright (c) 2022 SUSE LLC
#
@@ -26,7 +26,7 @@
%bcond_with test
%endif
Name: python-pyinstaller-hooks-contrib%{psuffix}
-Version: 2022.10
+Version: 2022.12
Release: 0
Summary: Community maintained hooks for PyInstaller
License: Apache-2.0 OR GPL-2.0-only
++++++ pyinstaller-hooks-contrib-2022.10.tar.gz ->
pyinstaller-hooks-contrib-2022.12.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pyinstaller-hooks-contrib-2022.10/PKG-INFO
new/pyinstaller-hooks-contrib-2022.12/PKG-INFO
--- old/pyinstaller-hooks-contrib-2022.10/PKG-INFO 2022-08-31
23:20:44.628484500 +0200
+++ new/pyinstaller-hooks-contrib-2022.12/PKG-INFO 2022-11-05
12:25:21.953024400 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pyinstaller-hooks-contrib
-Version: 2022.10
+Version: 2022.12
Summary: Community maintained hooks for PyInstaller
Home-page: https://github.com/pyinstaller/pyinstaller-hooks-contrib
Maintainer: Legorooj
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/__init__.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/__init__.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/__init__.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/__init__.py
2022-11-05 12:25:11.000000000 +0100
@@ -10,6 +10,6 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# ------------------------------------------------------------------
-__version__ = '2022.10'
+__version__ = '2022.12'
__maintainer__ = 'Legorooj, bwoodsend'
__uri__ = 'https://github.com/pyinstaller/pyinstaller-hooks-contrib'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyqtgraph_multiprocess.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyqtgraph_multiprocess.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyqtgraph_multiprocess.py
1970-01-01 01:00:00.000000000 +0100
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyqtgraph_multiprocess.py
2022-11-05 12:25:11.000000000 +0100
@@ -0,0 +1,51 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2022, PyInstaller Development Team.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#
+# SPDX-License-Identifier: Apache-2.0
+#-----------------------------------------------------------------------------
+
+import sys
+import os
+
+
+def _setup_pyqtgraph_multiprocess_hook():
+ # NOTE: pyqtgraph.multiprocess spawns the sub-process using
subprocess.Popen (or equivalent). This means that in
+ # onefile builds, the executable in subprocess will unpack itself again,
into different sys._MEIPASS, because
+ # the _MEIPASS2 environment variable is not set (bootloader / bootstrap
script cleans it up). This will make the
+ # argv[1] check below fail, due to different sys._MEIPASS value in the
subprocess.
+ #
+ # To work around this, at the time of writing (PyInstaller 5.5), the user
needs to set _MEIPASS2 environment
+ # variable to sys._MEIPASS before using `pyqtgraph.multiprocess` in
onefile builds. And stlib's
+ # `multiprocessing.freeze_support` needs to be called in the entry-point
program, due to `pyqtgraph.multiprocess`
+ # internally using stdlib's `multiprocessing` primitives.
+ if len(sys.argv) == 2 and sys.argv[1] == os.path.join(sys._MEIPASS,
'pyqtgraph', 'multiprocess', 'bootstrap.py'):
+ # Load as module; this requires --hiddenimport
pyqtgraph.multiprocess.bootstrap
+ try:
+ mod_name = 'pyqtgraph.multiprocess.bootstrap'
+ mod = __import__(mod_name)
+ bootstrap_co = mod.__loader__.get_code(mod_name)
+ except Exception:
+ bootstrap_co = None
+
+ if bootstrap_co:
+ exec(bootstrap_co)
+ sys.exit(0)
+
+ # Load from file; requires pyqtgraph/multiprocess/bootstrap.py
collected as data file
+ bootstrap_file = os.path.join(sys._MEIPASS, 'pyqtgraph',
'multiprocess', 'bootstrap.py')
+ if os.path.isfile(bootstrap_file):
+ with open(bootstrap_file, 'r') as fp:
+ bootstrap_code = fp.read()
+ exec(bootstrap_code)
+ sys.exit(0)
+
+ raise RuntimeError("Could not find pyqtgraph.multiprocess bootstrap
code or script!")
+
+
+_setup_pyqtgraph_multiprocess_hook()
+del _setup_pyqtgraph_multiprocess_hook
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/rthooks.dat
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/rthooks.dat
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/rthooks.dat
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/rthooks.dat
2022-11-05 12:25:11.000000000 +0100
@@ -7,5 +7,6 @@
'pyproj': ['pyi_rth_pyproj.py'],
'pygraphviz': ['pyi_rth_pygraphviz.py'],
'pythoncom': ['pyi_rth_pythoncom.py'],
+ 'pyqtgraph': ['pyi_rth_pyqtgraph_multiprocess.py'],
'pywintypes': ['pyi_rth_pywintypes.py'],
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-clr.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-clr.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-clr.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-clr.py
2022-11-05 12:25:11.000000000 +0100
@@ -11,39 +11,52 @@
# ------------------------------------------------------------------
-"""
-pythonnet requires both clr.pyd and Python.Runtime.dll,
-but the latter isn't found by PyInstaller.
-"""
-
-
-import ctypes.util
-from PyInstaller.log import logger
-
-try:
- from importlib.metadata import files
-except ImportError:
- from importlib_metadata import files
-
-datas = []
-
-filepaths = [f for f in files('pythonnet') if 'Python.Runtime.dll' in str(f)]
-if len(filepaths) == 1:
- pyruntime_path = filepaths[0]
- datas = [(pyruntime_path.locate(), pyruntime_path.parent.as_posix())]
-elif len(filepaths) > 1:
- logger.warning('More than one Python.Runtime.dll found in site packages!
Cannot resolve.')
-
-if len(datas) == 0:
- # Fallback to legacy way of finding Python.Runtime dependency
- library = ctypes.util.find_library('Python.Runtime')
- if library:
- datas = [(library, '.')]
- logger.warning('Legacy method of finding Python.Runtime.dll was used!')
+# There is a name clash between pythonnet's clr module/extension (which this
hooks is for) and clr package that provides
+# the terminal styling library (https://pypi.org/project/clr/). Therefore, we
must first check if pythonnet is actually
+# available...
+from PyInstaller.utils.hooks import is_module_satisfies
+from PyInstaller.compat import is_win
+
+
+if is_module_satisfies("pythonnet"):
+ # pythonnet requires both clr.pyd and Python.Runtime.dll, but the latter
isn't found by PyInstaller.
+ import ctypes.util
+ from PyInstaller.log import logger
+
+ try:
+ import importlib.metadata as importlib_metadata
+ except ImportError:
+ import importlib_metadata
+
+ collected_runtime_files = []
+
+ # Try finding Python.Runtime.dll via distribution's file list
+ dist_files = importlib_metadata.files('pythonnet')
+ if dist_files is not None:
+ runtime_dll_files = [f for f in dist_files if
f.match('Python.Runtime.dll')]
+ if len(runtime_dll_files) == 1:
+ runtime_dll_file = runtime_dll_files[0]
+ collected_runtime_files = [(runtime_dll_file.locate(),
runtime_dll_file.parent.as_posix())]
+ logger.debug("hook-clr: Python.Runtime.dll discovered via
metadata.")
+ elif len(runtime_dll_files) > 1:
+ logger.warning("hook-clr: multiple instances of Python.Runtime.dll
listed in metadata - cannot resolve.")
+
+ # Fall back to the legacy way
+ if not collected_runtime_files:
+ runtime_dll_file = ctypes.util.find_library('Python.Runtime')
+ if runtime_dll_file:
+ collected_runtime_files = [(runtime_dll_file, '.')]
+ logger.debug('hook-clr: Python.Runtime.dll discovered via legacy
method.')
+
+ if not collected_runtime_files:
+ raise Exception('Python.Runtime.dll not found')
+
+ # On Windows, collect runtime DLL file(s) as binaries; on other OSes,
collect them as data files, to prevent fatal
+ # errors in binary dependency analysis.
+ if is_win:
+ binaries = collected_runtime_files
+ else:
+ datas = collected_runtime_files
-if not datas:
- raise Exception('Python.Runtime.dll not found')
-
-
-# These modules are imported inside Python.Runtime.dll
-hiddenimports = ["platform", "warnings"]
+ # These modules are imported inside Python.Runtime.dll
+ hiddenimports = ["platform", "warnings"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-discid.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-discid.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-discid.py
1970-01-01 01:00:00.000000000 +0100
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-discid.py
2022-11-05 12:25:11.000000000 +0100
@@ -0,0 +1,41 @@
+# ------------------------------------------------------------------
+# Copyright (c) 2022 PyInstaller Development Team.
+#
+# This file is distributed under the terms of the GNU General Public
+# License (version 2.0 or later).
+#
+# The full license is available in LICENSE.GPL.txt, distributed with
+# this software.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+# ------------------------------------------------------------------
+
+import os
+
+from PyInstaller.utils.hooks import get_module_attribute, logger
+from PyInstaller.depend.utils import _resolveCtypesImports
+
+
+binaries = []
+
+# Use the _LIB_NAME attribute of discid.libdiscid to resolve the shared
library name. This saves us from having to
+# duplicate the name guessing logic from discid.libdiscid.
+# On error, PyInstaller >= 5.0 raises exception, earlier versions return an
empty string.
+try:
+ lib_name = get_module_attribute("discid.libdiscid", "_LIB_NAME")
+except Exception:
+ lib_name = None
+
+if lib_name:
+ lib_name = os.path.basename(lib_name)
+ try:
+ resolved_binary = _resolveCtypesImports([lib_name])
+ lib_file = resolved_binary[0][1]
+ except Exception as e:
+ lib_file = None
+ logger.warning("Error while trying to resolve %s: %s", lib_name, e)
+
+ if lib_file:
+ binaries += [(lib_file, '.')]
+else:
+ logger.warning("Failed to determine name of libdiscid shared library from
_LIB_NAME attribute of discid.libdiscid!")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-exchangelib.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-exchangelib.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-exchangelib.py
1970-01-01 01:00:00.000000000 +0100
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-exchangelib.py
2022-11-05 12:25:11.000000000 +0100
@@ -0,0 +1,12 @@
+# ------------------------------------------------------------------
+# Copyright (c) 2022 PyInstaller Development Team.
+#
+# This file is distributed under the terms of the GNU General Public
+# License (version 2.0 or later).
+#
+# The full license is available in LICENSE.GPL.txt, distributed with
+# this software.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+# ------------------------------------------------------------------
+hiddenimports = ['tzdata']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ldfparser.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ldfparser.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ldfparser.py
1970-01-01 01:00:00.000000000 +0100
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ldfparser.py
2022-11-05 12:25:11.000000000 +0100
@@ -0,0 +1,15 @@
+# ------------------------------------------------------------------
+# Copyright (c) 2022 PyInstaller Development Team.
+#
+# This file is distributed under the terms of the GNU General Public
+# License (version 2.0 or later).
+#
+# The full license is available in LICENSE.GPL.txt, distributed with
+# this software.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#-----------------------------------------------------------------------------
+
+from PyInstaller.utils.hooks import collect_data_files
+
+datas = collect_data_files('ldfparser')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-pyqtgraph.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-pyqtgraph.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-pyqtgraph.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-pyqtgraph.py
2022-11-05 12:25:11.000000000 +0100
@@ -12,9 +12,8 @@
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
-# include all .ui and image files
-datas = collect_data_files("pyqtgraph",
- includes=["**/*.ui", "**/*.png", "**/*.svg"])
+# Collect all data files, excluding the examples' data
+datas = collect_data_files('pyqtgraph', excludes=['**/examples/*'])
# pyqtgraph uses Qt-version-specific templates for the UI elements.
# There are templates for different versions of PySide and PyQt, e.g.
@@ -34,3 +33,8 @@
# Tested with pyqtgraph master branch (commit c1900aa).
all_imports = collect_submodules("pyqtgraph")
hiddenimports = [name for name in all_imports if "Template" in name]
+
+# Collect the pyqtgraph/multiprocess/bootstrap.py as a module; this is
required by our pyqtgraph.multiprocess runtime
+# hook to handle the pyqtgraph's multiprocessing implementation. The
pyqtgraph.multiprocess seems to be imported
+# automatically on the import of pyqtgraph itself, so there is no point in
creating a separate hook for this.
+hiddenimports += ['pyqtgraph.multiprocess.bootstrap']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-sounddevice.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-sounddevice.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-sounddevice.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-sounddevice.py
2022-11-05 12:25:11.000000000 +0100
@@ -9,25 +9,55 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ------------------------------------------------------------------
-# -----------------------------------------------------------------------------
"""
sounddevice:
https://github.com/spatialaudio/python-sounddevice/
"""
-import os
+import pathlib
-from PyInstaller.compat import is_darwin, is_win
-from PyInstaller.utils.hooks import get_module_file_attribute
+from PyInstaller.utils.hooks import get_module_file_attribute, logger
-module_dir = os.path.dirname(get_module_file_attribute("sounddevice"))
+binaries = []
+datas = []
-path = None
-if is_win:
- path = os.path.join(module_dir, "_sounddevice_data", "portaudio-binaries")
-elif is_darwin:
- path = os.path.join(module_dir, "_sounddevice_data", "portaudio-binaries",
"libportaudio.dylib")
+# PyPI wheels for Windows and macOS ship the sndfile shared library in
_sounddevice_data directory,
+# located next to the sounddevice.py module file (i.e., in the site-packages
directory).
+module_dir = pathlib.Path(get_module_file_attribute('sounddevice')).parent
+data_dir = module_dir / '_sounddevice_data' / 'portaudio-binaries'
+if data_dir.is_dir():
+ destdir = str(data_dir.relative_to(module_dir))
+
+ # Collect the shared library (known variants: libportaudio64bit.dll,
libportaudio32bit.dll, libportaudio.dylib)
+ for lib_file in data_dir.glob("libportaudio*.*"):
+ binaries += [(str(lib_file), destdir)]
+
+ # Collect the README.md file
+ readme_file = data_dir / "README.md"
+ if readme_file.is_file():
+ datas += [(str(readme_file), destdir)]
+else:
+ # On linux and in Anaconda in all OSes, the system-installed portaudio
library needs to be collected.
+ def _find_system_portaudio_library():
+ import os
+ import ctypes.util
+ from PyInstaller.depend.utils import _resolveCtypesImports
+
+ libname = ctypes.util.find_library("portaudio")
+ if libname is not None:
+ resolved_binary =
_resolveCtypesImports([os.path.basename(libname)])
+ if resolved_binary:
+ return resolved_binary[0][1]
+
+ try:
+ lib_file = _find_system_portaudio_library()
+ except Exception as e:
+ logger.warning("Error while trying to find system-installed portaudio
library: %s", e)
+ lib_file = None
-if path is not None and os.path.exists(path):
- binaries = [(path, os.path.join("_sounddevice_data",
"portaudio-binaries"))]
+ if lib_file:
+ binaries += [(lib_file, '.')]
+
+if not binaries:
+ logger.warning("portaudio shared library not found - sounddevice will
likely fail to work!")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-soundfile.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-soundfile.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-soundfile.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-soundfile.py
2022-11-05 12:25:11.000000000 +0100
@@ -15,21 +15,49 @@
https://github.com/bastibe/SoundFile
"""
-import os
+import pathlib
-from PyInstaller.compat import is_win, is_darwin
-from PyInstaller.utils.hooks import get_module_file_attribute
+from PyInstaller.utils.hooks import get_module_file_attribute, logger
-# get path of soundfile
-module_dir = os.path.dirname(get_module_file_attribute('soundfile'))
+binaries = []
+datas = []
-# add binaries packaged by soundfile on OSX and Windows
-# an external dependency (libsndfile) is used on GNU/Linux
-path = None
-if is_win:
- path = os.path.join(module_dir, '_soundfile_data')
-elif is_darwin:
- path = os.path.join(module_dir, '_soundfile_data', 'libsndfile.dylib')
+# PyPI wheels for Windows and macOS ship the sndfile shared library in
_soundfile_data directory,
+# located next to the soundfile.py module file (i.e., in the site-packages
directory).
+module_dir = pathlib.Path(get_module_file_attribute('soundfile')).parent
+data_dir = module_dir / '_soundfile_data'
+if data_dir.is_dir():
+ destdir = str(data_dir.relative_to(module_dir))
-if path is not None and os.path.exists(path):
- binaries = [(path, "_soundfile_data")]
+ # Collect the shared library (known variants: libsndfile64bit.dll,
libsndfile32bit.dll, libsndfile.dylib)
+ for lib_file in data_dir.glob("libsndfile*.*"):
+ binaries += [(str(lib_file), destdir)]
+
+ # Collect the COPYING file
+ copying_file = data_dir / "COPYING"
+ if copying_file.is_file():
+ datas += [(str(copying_file), destdir)]
+else:
+ # On linux and in Anaconda in all OSes, the system-installed sndfile
library needs to be collected.
+ def _find_system_sndfile_library():
+ import os
+ import ctypes.util
+ from PyInstaller.depend.utils import _resolveCtypesImports
+
+ libname = ctypes.util.find_library("sndfile")
+ if libname is not None:
+ resolved_binary =
_resolveCtypesImports([os.path.basename(libname)])
+ if resolved_binary:
+ return resolved_binary[0][1]
+
+ try:
+ lib_file = _find_system_sndfile_library()
+ except Exception as e:
+ logger.warning("Error while trying to find system-installed sndfile
library: %s", e)
+ lib_file = None
+
+ if lib_file:
+ binaries += [(lib_file, '.')]
+
+if not binaries:
+ logger.warning("sndfile shared library not found - soundfile will likely
fail to work!")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spiceypy.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spiceypy.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spiceypy.py
1970-01-01 01:00:00.000000000 +0100
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spiceypy.py
2022-11-05 12:25:11.000000000 +0100
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------
+# Copyright (c) 2020 PyInstaller Development Team.
+#
+# This file is distributed under the terms of the GNU General Public
+# License (version 2.0 or later).
+#
+# The full license is available in LICENSE.GPL.txt, distributed with
+# this software.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+# ------------------------------------------------------------------
+
+# Hook for spiceypy: https://pypi.org/project/spiceypy/
+# Tested on Ubuntu 20.04 with spiceypy 5.1.1
+
+from PyInstaller.utils.hooks import collect_dynamic_libs
+
+binaries = collect_dynamic_libs("spiceypy")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/tests/data/netcore5_runtime_config.json
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/tests/data/netcore5_runtime_config.json
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/tests/data/netcore5_runtime_config.json
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/tests/data/netcore5_runtime_config.json
1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-{
- "runtimeOptions": {
- "tfm": "net5.0",
- "framework": {
- "name": "Microsoft.NETCore.App",
- "version": "5.0.2"
- }
- }
-}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/tests/test_libraries.py
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/tests/test_libraries.py
---
old/pyinstaller-hooks-contrib-2022.10/src/_pyinstaller_hooks_contrib/tests/test_libraries.py
2022-08-31 23:20:31.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/_pyinstaller_hooks_contrib/tests/test_libraries.py
2022-11-05 12:25:11.000000000 +0100
@@ -799,12 +799,10 @@
@requires('pythonnet >= 3.dev')
def test_pythonnet3(pyi_builder):
- runtime_cfg_path = str((Path(__file__) /
'../data/netcore5_runtime_config.json').resolve(strict=True).as_posix())
pyi_builder.test_source(f"""
- from pathlib import Path
from clr_loader import get_coreclr
from pythonnet import set_runtime
- set_runtime(get_coreclr('{runtime_cfg_path}'))
+ set_runtime(get_coreclr()) # Pick up and use any installed .NET
runtime.
import clr
""")
@@ -1287,10 +1285,62 @@
import pyqtgraph.graphicsItems.PlotItem
import pyqtgraph.graphicsItems.ViewBox.ViewBoxMenu
import pyqtgraph.imageview.ImageView
+ """,
+ pyi_args=['--exclude', 'PySide2', '--exclude', 'PySide6', '--exclude',
'PyQt6']
+ )
+
+
+@importorskip('pyqtgraph')
+def test_pyqtgraph_colormap(pyi_builder):
+ pyi_builder.test_source(
+ """
+ import pyqtgraph.colormap
+ assert pyqtgraph.colormap.listMaps()
"""
)
+@importorskip('pyqtgraph')
+@importorskip('PyQt5')
+def test_pyqtgraph_remote_graphics_view(pyi_builder):
+ pyi_builder.test_source(
+ """
+ import sys
+ import os
+ import signal
+
+ from PyQt5 import QtCore, QtWidgets
+ import pyqtgraph
+
+ # Multiprocessing is used internally by pyqtgraph.multiprocess
+ import multiprocessing
+ multiprocessing.freeze_support()
+
+ # pyqtgraph.multiprocess also uses a subprocess.Popen() to spawn its
+ # sub-process, so we need to restore _MEIPASS2 to prevent the
executable
+ # to unpacking itself again in the subprocess.
+ os.environ['_MEIPASS2'] = sys._MEIPASS
+
+ # Create a window with remote graphics view
+ app = QtWidgets.QApplication(sys.argv)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
+
+ window = QtWidgets.QWidget()
+ layout = QtWidgets.QVBoxLayout(window)
+ remote_view = pyqtgraph.widgets.RemoteGraphicsView.RemoteGraphicsView()
+ layout.addWidget(remote_view)
+
+ window.show()
+
+ # Quit after a second
+ QtCore.QTimer.singleShot(1000, app.exit)
+
+ sys.exit(app.exec_())
+ """,
+ pyi_args=['--exclude', 'PySide2', '--exclude', 'PySide6', '--exclude',
'PyQt6']
+ )
+
+
@importorskip('hydra')
def test_hydra(pyi_builder, tmpdir):
config_file = str((Path(__file__) /
'../data/test_hydra/config.yaml').resolve(strict=True).as_posix())
@@ -1328,3 +1378,35 @@
pyi_builder.test_source("""
import pythoncom
""")
+
+
+@importorskip('spiceypy')
+def test_spiceypy(pyi_builder):
+ pyi_builder.test_source("""
+ import spiceypy
+ """)
+
+
+@importorskip('discid')
+def test_discid(pyi_builder):
+ pyi_builder.test_source(
+ """
+ # Basic import check
+ import discid
+
+ # Check that shared library is in fact collected into application
bundle.
+ # We expect the hook to collect it to top-level directory
(sys._MEIPASS).
+ import discid.libdiscid
+ lib_name = discid.libdiscid._LIB_NAME
+
+ lib_file = os.path.join(sys._MEIPASS, lib_name)
+ assert os.path.isfile(lib_file), f"Shared library {lib_name} not
collected to _MEIPASS!"
+ """
+ )
+
+
+@importorskip('exchangelib')
+def test_exchangelib(pyi_builder):
+ pyi_builder.test_source("""
+ import exchangelib
+ """)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/pyinstaller_hooks_contrib.egg-info/PKG-INFO
new/pyinstaller-hooks-contrib-2022.12/src/pyinstaller_hooks_contrib.egg-info/PKG-INFO
---
old/pyinstaller-hooks-contrib-2022.10/src/pyinstaller_hooks_contrib.egg-info/PKG-INFO
2022-08-31 23:20:44.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/pyinstaller_hooks_contrib.egg-info/PKG-INFO
2022-11-05 12:25:21.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pyinstaller-hooks-contrib
-Version: 2022.10
+Version: 2022.12
Summary: Community maintained hooks for PyInstaller
Home-page: https://github.com/pyinstaller/pyinstaller-hooks-contrib
Maintainer: Legorooj
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pyinstaller-hooks-contrib-2022.10/src/pyinstaller_hooks_contrib.egg-info/SOURCES.txt
new/pyinstaller-hooks-contrib-2022.12/src/pyinstaller_hooks_contrib.egg-info/SOURCES.txt
---
old/pyinstaller-hooks-contrib-2022.10/src/pyinstaller_hooks_contrib.egg-info/SOURCES.txt
2022-08-31 23:20:44.000000000 +0200
+++
new/pyinstaller-hooks-contrib-2022.12/src/pyinstaller_hooks_contrib.egg-info/SOURCES.txt
2022-11-05 12:25:21.000000000 +0100
@@ -19,6 +19,7 @@
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_osgeo.py
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pygraphviz.py
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyproj.py
+src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pyqtgraph_multiprocess.py
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pythoncom.py
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_pywintypes.py
src/_pyinstaller_hooks_contrib/hooks/rthooks/pyi_rth_traitlets.py
@@ -85,6 +86,7 @@
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-dask.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-dateparser.utils.strptime.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-dclab.py
+src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-discid.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-distorm3.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-dns.rdata.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-docutils.py
@@ -99,6 +101,7 @@
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-eth_hash.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-eth_keyfile.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-eth_utils.py
+src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-exchangelib.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-fabric.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-faker.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ffpyplayer.py
@@ -152,6 +155,7 @@
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-langcodes.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-langdetect.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-lark.py
+src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-ldfparser.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-lensfunpy.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-libaudioverse.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-lightgbm.py
@@ -294,6 +298,7 @@
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-soundfile.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spacy.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-speech_recognition.py
+src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spiceypy.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-spnego.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-srsly.msgpack._packer.py
src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-statsmodels.tsa.statespace.py
@@ -348,7 +353,6 @@
src/_pyinstaller_hooks_contrib/tests/__init__.py
src/_pyinstaller_hooks_contrib/tests/conftest.py
src/_pyinstaller_hooks_contrib/tests/test_libraries.py
-src/_pyinstaller_hooks_contrib/tests/data/netcore5_runtime_config.json
src/_pyinstaller_hooks_contrib/tests/data/test_hydra/config.yaml
src/_pyinstaller_hooks_contrib/tests/scripts/pyi_lib_boto.py
src/_pyinstaller_hooks_contrib/tests/scripts/pyi_lib_enchant.py