Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build from source fails (Void Linux xbps template file) #165

Open
6 of 9 tasks
MechDR opened this issue Dec 20, 2023 · 11 comments
Open
6 of 9 tasks

Build from source fails (Void Linux xbps template file) #165

MechDR opened this issue Dec 20, 2023 · 11 comments
Labels
bug Something isn't working dependencies Pull requests that update a dependency file enhancement New feature or request help wanted Extra attention is needed packaging Software Packaging

Comments

@MechDR
Copy link

MechDR commented Dec 20, 2023

Please follow the guide below

  • You will be asked some questions and requested to provide some information, please read them carefully and answer honestly
  • Put an x into all the boxes [ ] relevant to your issue (like that [x])
  • Use Preview tab to see how your issue will actually look like

WARNING

All invalid issues will be rejected!!


Before going further

  • If your problem is a bug with youtube-dl or a request for new site support please report it here

  • Make sure you are using the latest yt-dlg version (Click the Settings icon and then About to view the current version)

  • Make sure you are using the latest youtube-dl version (Click the Settings icon and then Update to update to the latest youtube-dl version)

  • Make sure you searched the bugtracker for similar issues including closed ones

  • Make sure to read the FAQs file

    • I think my problem is NOT with youtube-dl
    • I've verified and i assure that I'm running yt-dlg 1.8.5
    • I assure that i am using the lxatest version of youtube-dl
    • Searched bugtracker
    • I've read the FAQs file

What is the purpose of your issue?

  • Bug report
  • Feature request (request for a new functionality)
  • Question
  • Other

Please remove any sections between (---) if they are not related to your issue


What operating system do you use ?

Void Linux

List of actions to perform to reproduce the problem:

  1. Copy/paste the xbps-src template I use.
  2. Try to build from source. You can do xbps-src from void-packages even if you're not on Void Linux, the thing is a shell script with chroot to emulate a working Void install. You can use whatever shell you like (bash is default in the xbps-src script).

What is the expected behaviour ?

It should build from source if all dependencies are present, which I believe they are (correct me if wrong).

What happens instead ?

It doesn't build...

So, I managed to get a working template with all dependencies satisfied (correct me if I'm wrong).

# Template file for 'yt-dlg'
pkgname=yt-dlg
version=1.8.5
revision=1
#build_wrksrc=
build_style=gnu-makefile
create_wrksrc=yes
#configure_args=""
#make_build_args=""
#make_install_args=""
#conf_files=""
#make_dirs="/var/log/dir 0755 root root"
hostmakedepends="python3 pkg-config which"
makedepends="libxml2-devel libxslt-devel gtk+3-devel libSM-devel libfreeglut-devel
 libsecret-devel gspell-devel SDL2-devel libnotify-devel webkit2gtk-devel
 libcurl-devel gst-plugins-base1-devel python3-devel" # base-devel
depends="ffmpeg gettext"
short_desc="yt-dlg is a cross platform front-end GUI for youtube-dl and yt-dlp"
maintainer="MechDR <[email protected]>"
license="Unlicense"
homepage="https://oleksis.github.io/youtube-dl-gui/"
distfiles="https://github.com/oleksis/youtube-dl-gui/archive/refs/tags/v${version}.tar.gz"
checksum="8b1f9815857228a002680e2f64fc421055098c6dcfed6f6be17274b0cf45ca4a"

pre_build() {
        cd "youtube-dl-gui-${version}"
        make clean-requirements
        make venv
        source venv/bin/activate
        python3 -m pip install attrdict3 # Needs to be installed in a separate transation.
        echo "PyYAML==5.3.1" >> requirements/requirements-dev.in # Latest version has a confirmed bug, breaks the build process.
        sed -i 's@-o requirements/requirements.txt --no-header --no-annotate@--no-header --no-annotate --no-strip-extras --allow-unsafe --output-file requirements/requirements.txt@g' Makefile
        sed -i 's@-o requirements/requirements-binaries.txt --no-header --no-annotate@--no-header --no-annotate --no-strip-extras --allow-unsafe --output-file requirements/requirements-binaries.txt@g' Makefile
        sed -i 's@-o requirements/requirements-dev.txt --no-header --no-annotate@--no-header --no-annotate --no-strip-extras --allow-unsafe --output-file requirements/requirements-dev.txt@g' Makefile
#        sed -i 's@sync requirements/requirements.txt requirements/requirements-binaries.txt@sync --force requirements/requirements.txt requirements/requirements-binaries.txt@g' Makefile
#        sed -i 's@sync requirements/requirements.txt requirements/requirements-dev.txt@sync --force requirements/requirements.txt requirements/requirements-dev.txt@g' Makefile
}

do_build() {
        cd "youtube-dl-gui-${version}"
        make
}

There are also some minor bugs in the current makefiile/build process, but that's beside the point. The point is, it doesn't build...

Here is the error log (truncated).

      make[2]: Leaving directory '/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/wxbld/gtk3/utils/wxrc'
      make[1]: Leaving directory '/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/wxbld/gtk3'
      WARNING: msgfmt and/or make commands not found, message catalogs not
               rebuilt. Please install gettext and associated tools.
      Finished command: build_wx (23m56.822s)
      Running command: build_py
      Checking for /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/bin/waf-2.0.24...
      "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3" /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/bin/waf-2.0.24 --wx_config=/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/wxbld/gtk3/wx-config --gtk3 --python="/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3" --out=build/waf/3.12/gtk3 configure build
      Setting top to                           : /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35
      Setting out to                           : /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/waf/3.12/gtk3
      Checking for 'gcc' (C compiler)          : cc
      Checking for 'g++' (C++ compiler)        : g++
      Checking for program 'python'            : /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3
      Checking for python version >= 3.7.0     : 3.12.1
      python-config                            : /usr/bin/python3.12-config
      Asking python-config for pyext '--cflags --libs --ldflags' flags : yes
      Testing pyext configuration                                      : yes
      Finding libs for WX                                              : yes
      Finding libs for WXADV                                           : yes
      Finding libs for WXSTC                                           : yes
      Finding libs for WXHTML                                          : yes
      Finding libs for WXGL                                            : yes
      Finding libs for WXWEBVIEW                                       : yes
      Finding libs for WXXML                                           : yes
      Finding libs for WXXRC                                           : yes
      Finding libs for WXRICHTEXT                                      : yes
      Finding libs for WXMEDIA                                         : yes
      Finding libs for WXRIBBON                                        : yes
      Finding libs for WXPROPGRID                                      : yes
      Finding libs for WXAUI                                           : yes
      'configure' finished successfully (3.231s)
      Waf: Entering directory `/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/waf/3.12/gtk3'
      **** Compiler: cc --version
           cc (GCC) 12.2.0
           Copyright (C) 2022 Free Software Foundation, Inc.
           This is free software; see the source for copying conditions.  There is NO
           warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/sphinxtools/constants.py:226: SyntaxWarning: invalid escape sequence '\w'
        CONSTANT_RE = re.compile('^([\w\s,]+)=', re.M)
      [  1/937] Compiling sip/siplib/sip_array.c
      [  2/937] Compiling sip/siplib/descriptors.c
      [  3/937] Compiling sip/siplib/apiversions.c
      [  4/937] Compiling sip/siplib/qtlib.c
      [  5/937] Compiling sip/siplib/voidptr.c
      [  6/937] Compiling sip/siplib/objmap.c
      [  7/937] Compiling sip/siplib/threads.c
      [  8/937] Compiling sip/siplib/siplib.c
      [  9/937] Compiling sip/siplib/bool.cpp
      [ 10/937] Compiling sip/siplib/int_convertors.c
      [ 11/937] Compiling sip/cpp/sip_corewxListView.cpp
      [ 12/937] Compiling sip/cpp/sip_corewxEventLoopActivator.cpp
      [ 13/937] Compiling sip/cpp/sip_corewxCollapsibleHeaderCtrl.cpp
      [ 14/937] Compiling sip/cpp/sip_corewxAutoBufferedPaintDC.cpp
      [ 15/937] Compiling sip/cpp/sip_corewxAccessible.cpp
      [ 16/937] Linking build/waf/3.12/gtk3/siplib.cpython-312-x86_64-linux-gnu.so
      [ 17/937] Compiling sip/cpp/sip_corewxWrapSizer.cpp
      [ 18/937] Compiling sip/cpp/sip_corewxWindowList.cpp
      [ 19/937] Compiling sip/cpp/sip_corewxWindowIDRef.cpp
      [ 20/937] Compiling sip/cpp/sip_corewxWithImages.cpp
      [ 21/937] Compiling sip/cpp/sip_corewxCloseEvent.cpp
      [ 22/937] Compiling sip/cpp/sip_corewxWindowDisabler.cpp
      [ 23/937] Compiling sip/cpp/sip_corewxLayoutConstraints.cpp
      [ 24/937] Compiling sip/cpp/sip_corewxEvent.cpp
      [ 25/937] Compiling sip/cpp/sip_corewxWindowDC.cpp
      [ 26/937] Compiling sip/cpp/sip_corewxWindowCreateEvent.cpp
      [ 27/937] Compiling sip/cpp/sip_corewxLanguageInfo.cpp
      [ 28/937] Compiling sip/cpp/sip_corewxWindowChildrenRepositioningGuard.cpp
      [ 29/937] Compiling sip/cpp/sip_corewxHelpProvider.cpp
      [ 30/937] Compiling sip/cpp/sip_corewxLinuxDistributionInfo.cpp
      [ 31/937] Compiling sip/cpp/sip_corewxKeyboardState.cpp
      [ 32/937] Compiling sip/cpp/sip_corewxWindowBase.cpp
      [ 33/937] Compiling sip/cpp/sip_corewxClipboardTextEvent.cpp
      [ 34/937] Compiling sip/cpp/sip_corewxArtProvider.cpp
      [ 35/937] Compiling sip/cpp/sip_corewxWindow.cpp
      [ 36/937] Compiling sip/cpp/sip_corewxEraseEvent.cpp
      [ 37/937] Compiling sip/cpp/sip_corewxKeyEvent.cpp
      [ 38/937] Compiling sip/cpp/sip_corewxVideoMode.cpp
      [ 39/937] Compiling sip/cpp/sip_corewxVersionInfo.cpp
      [ 40/937] Compiling sip/cpp/sip_corewxVisualAttributes.cpp
      [ 41/937] Compiling sip/cpp/sip_corewxDropTarget.cpp
      [ 42/937] Compiling sip/cpp/sip_corewxVector0100wxBitmapBundle.cpp
      [ 43/937] Compiling sip/cpp/sip_corewxVector0100wxBitmap.cpp
      [ 44/937] Compiling sip/cpp/sip_corewxJPEGHandler.cpp
      [ 45/937] Compiling sip/cpp/sip_corewxVariantList.cpp
      [ 46/937] Compiling sip/cpp/sip_corewxVariant.cpp
      [ 47/937] Compiling sip/cpp/sip_corewxItemContainerImmutable.cpp
      [ 48/937] Compiling sip/cpp/sip_corewxDropSource.cpp
      [ 49/937] Compiling sip/cpp/sip_corewxJoystickEvent.cpp
      [ 50/937] Compiling sip/cpp/sip_corewxVarVScrollHelper.cpp
      [ 51/937] Compiling sip/cpp/sip_corewxVarScrollHelperBase.cpp
      [ 52/937] Compiling sip/cpp/sip_corewxItemContainer.cpp
      [ 53/937] Compiling sip/cpp/sip_corewxClipboard.cpp
      [ 54/937] Compiling sip/cpp/sip_corewxVarHScrollHelper.cpp
      [ 55/937] Compiling sip/cpp/sip_corewxItemAttr.cpp
      [ 56/937] Compiling sip/cpp/sip_corewxDropFilesEvent.cpp
      [ 57/937] Compiling sip/cpp/sip_corewxVarHVScrollHelper.cpp
      [ 58/937] Compiling sip/cpp/sip_corewxVScrolledWindow.cpp
      [ 59/937] Compiling sip/cpp/sip_corewxInternetFSHandler.cpp
      [ 60/937] Compiling sip/cpp/sip_corewxVListBox.cpp
      [ 61/937] Compiling sip/cpp/sip_corewxUpdateUIEvent.cpp
      [ 62/937] Compiling sip/cpp/sip_corewxIntPtr.cpp
      [ 63/937] Compiling sip/cpp/sip_corewxValidator.cpp
      [ 64/937] Compiling sip/cpp/sip_corewxDragImage.cpp
      [ 65/937] Compiling sip/cpp/sip_corewxArrayVideoModes.cpp
      [ 66/937] Compiling sip/cpp/sip_corewxAcceleratorTable.cpp
      [ 67/937] Compiling sip/cpp/sip_corewxUniChar.cpp
      [ 68/937] Compiling sip/cpp/sip_corewxURLDataObject.cpp
      [ 69/937] Compiling sip/cpp/sip_corewxIntCArrayHolder.cpp
      [ 70/937] Compiling sip/cpp/sip_corewxULongLong.cpp
      [ 71/937] Compiling sip/cpp/sip_corewxUIntPtr.cpp
      [ 72/937] Compiling sip/cpp/sip_corewxInputStream.cpp
      [ 73/937] Compiling sip/cpp/sip_corewxDisplayChangedEvent.cpp
      [ 74/937] Compiling sip/cpp/sip_corewxUIActionSimulator.cpp
      [ 75/937] Compiling sip/cpp/sip_corewxTwoFingerTapEvent.cpp
      [ 76/937] Compiling sip/cpp/sip_corewxInitDialogEvent.cpp
      [ 77/937] Compiling sip/cpp/sip_corewxTreebook.cpp
      [ 78/937] Compiling sip/cpp/sip_corewxTreeItemId.cpp
      [ 79/937] Compiling sip/cpp/sip_corewxInfoBar.cpp
      [ 80/937] Compiling sip/cpp/sip_corewxDisplay.cpp
      [ 81/937] Compiling sip/cpp/sip_corewxClientData.cpp
      [ 82/937] Compiling sip/cpp/sip_corewxTreeItemData.cpp
      [ 83/937] Compiling sip/cpp/sip_corewxTreeEvent.cpp
      [ 84/937] Compiling sip/cpp/sip_corewxIndividualLayoutConstraint.cpp
      [ 85/937] Compiling sip/cpp/sip_corewxTreeCtrl.cpp
      [ 86/937] Compiling sip/cpp/sip_corewxClientDataContainer.cpp
      [ 87/937] Compiling sip/cpp/sip_corewxImageRGBValue.cpp
      [ 88/937] Compiling sip/cpp/sip_corewxDirPickerCtrl.cpp
      [ 89/937] Compiling sip/cpp/sip_corewxTranslations.cpp
      [ 90/937] Compiling sip/cpp/sip_corewxTranslationsLoader.cpp
      [ 91/937] Compiling sip/cpp/sip_corewxImageList.cpp
      [ 92/937] Compiling sip/cpp/sip_corewxTopLevelWindowGeometrySerializer.cpp
      [ 93/937] Compiling sip/cpp/sip_corewxTopLevelWindow.cpp
      [ 94/937] Compiling sip/cpp/sip_corewxImageHistogram.cpp
      [ 95/937] Compiling sip/cpp/sip_corewxTrackable.cpp
      [ 96/937] Compiling sip/cpp/sip_corewxClientDC.cpp
      [ 97/937] Compiling sip/cpp/sip_corewxDirFilterListCtrl.cpp
      [ 98/937] Compiling sip/cpp/sip_corewxToolbook.cpp
      [ 99/937] Compiling sip/cpp/sip_corewxToolTip.cpp
      [100/937] Compiling sip/cpp/sip_corewxImageHandler.cpp
      [101/937] Compiling sip/cpp/sip_corewxToolBarToolBase.cpp
      [102/937] Compiling sip/cpp/sip_corewxToolBar.cpp
      [103/937] Compiling sip/cpp/sip_corewxArrayString.cpp
      [104/937] Compiling sip/cpp/sip_corewxDirDialog.cpp
      [105/937] Compiling sip/cpp/sip_corewxToggleButton.cpp
      ../../../../sip/cpp/sip_corewxArrayString.cpp: In function 'int convertTo_wxArrayString(PyObject*, void**, int*, PyObject*)':
      ../../../../sip/cpp/sip_corewxArrayString.cpp:91:26: error: 'PyUnicode_GET_SIZE' was not declared in this scope; did you mean 'PyDict_GET_SIZE'?
         91 |             size_t len = PyUnicode_GET_SIZE(item);
            |                          ^~~~~~~~~~~~~~~~~~
            |                          PyDict_GET_SIZE
      
      Waf: Leaving directory `/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/waf/3.12/gtk3'
      Build failed
       -> task in '_core' failed with exit status 1 (run with -v to display more information)
      Command '"/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3" /tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/bin/waf-2.0.24 --wx_config=/tmp/pip-install-h28940_m/wxpython_292c9996ed404a0491fe3fcf47e27c35/build/wxbld/gtk3/wx-config --gtk3 --python="/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3" --out=build/waf/3.12/gtk3 configure build ' failed with exit code 1.
      Finished command: build_py (5m31.782s)
      Finished command: build (29m28.605s)
      Command '"/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3" -u build.py build' failed with exit code 1.
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for wxpython
  Running setup.py clean for wxpython
Successfully built pyyaml
Failed to build wxpython
ERROR: Could not build wheels for wxpython, which is required to install pyproject.toml-based projects
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/piptools/__main__.py", line 19, in <module>
    cli()
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/piptools/scripts/sync.py", line 205, in cli
    sync.sync(
  File "/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/piptools/sync.py", line 263, in sync
    run(  # nosec
  File "/usr/lib/python3.12/subprocess.py", line 571, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3', '-m', 'pip', 'install', '-r', '/tmp/tmpwe7fpw7u']' returned non-zero exit status 1.
make: *** [Makefile:49: dev] Error 1

This seems like a build code issue to me... once again, correct me if I'm wrong.

@oleksis
Copy link
Owner

oleksis commented Dec 20, 2023

Thanks for testing and sharing the logs. Python 3.12 (today) is the latest version and early release. wxPython (wxWidgets) recently fixed some issue with cython and sip

Try compile only wxPython from the source in GitHub in your GNU/Linux OS

Other alternative is find the binary wheel of wxPython for your default Python in your system

If you look in the README.md Notes can see how compile wxPython in other distros

@oleksis oleksis added dependencies Pull requests that update a dependency file packaging Software Packaging labels Dec 20, 2023
@MechDR
Copy link
Author

MechDR commented Dec 20, 2023

@oleksis I have these packages at my disposal from the repo. Can any of these help?

wxFormBuilder        (Package)  wxPython-devel-32bit          (Package)  wxWidgets-devel             (Package)
wxFormBuilder-32bit  (Package)  wxWidgets                     (Package)  wxWidgets-devel-32bit       (Package)
wxMaxima             (Package)  wxWidgets-32bit               (Package)  wxWidgets-gtk3              (Package)
wxPython             (Package)  wxWidgets-common              (Package)  wxWidgets-gtk3-32bit        (Package)
wxPython4            (Package)  wxWidgets-common-32bit        (Package)  wxWidgets-gtk3-devel        (Package)
wxPython-32bit       (Package)  wxWidgets-common-devel        (Package)  wxWidgets-gtk3-devel-32bit  (Package)
wxPython-devel       (Package)  wxWidgets-common-devel-32bit  (Package)  

@oleksis
Copy link
Owner

oleksis commented Dec 20, 2023

Can help…

wxPython             (Package)  wxWidgets-common              (Package)  wxWidgets-gtk3-32bit        (Package)
wxPython4            (Package)  wxWidgets-common-32bit        (Package)  wxWidgets-gtk3-devel        (Package)

Try in your distro. If have some issues please try compile wxpython from the source for you distro.

@oleksis oleksis added the help wanted Extra attention is needed label Dec 20, 2023
@MechDR
Copy link
Author

MechDR commented Dec 20, 2023

OK, will try all of what you mentioned, will report back.

@MechDR
Copy link
Author

MechDR commented Dec 21, 2023

@oleksis OK, I managed to get wheel for wxPython 4.2.1 built from source after I did a few more modifications to the template file (patches to source files). I went this route since I thought it's probably the most painless one, regarding template changes and all that. Plus, I believe it should work.

And it seemed like an almost win 😆, but it failed, right at the end it seems 😄 .

  Created wheel for wxpython: filename=wxPython-4.2.1-cp312-cp312-linux_x86_64.whl size=150203949 sha256=2d3552e60feb0db339f894b4f6dcd41bb2fadcb9eea2a1e9542c3dc96ec3c4c6
  Stored in directory: /tmp/.cache/pip/wheels/4a/74/97/07cd85f108df83da0682e5560884e6a74ead00ea31538b6959
Successfully built pyyaml wxpython
Installing collected packages: distlib, typing-extensions, tokenize-rt, pyyaml, pypubsub, pyproject-api, pyflakes, pycodestyle, pluggy, platformdirs, pipdeptree, pillow, pathspec, nodeenv, mypy-extensions, mccabe, lxml, isort, iniconfig, identify, filelock, coverage, colorama, chardet, cfgv, cachetools, attrs, wxpython, virtualenv, pyupgrade, pytest, pip-tools, mypy, flake8, black, tox, pytest-cov, pre-commit
  Attempting uninstall: pip-tools
    Found existing installation: pip-tools 7.3.0
    Uninstalling pip-tools-7.3.0:
      Successfully uninstalled pip-tools-7.3.0
Successfully installed attrs-23.1.0 black-23.1.0 cachetools-5.3.2 cfgv-3.4.0 chardet-5.2.0 colorama-0.4.6 coverage-7.3.4 distlib-0.3.8 filelock-3.13.1 flake8-6.0.0 identify-2.5.33 iniconfig-2.0.0 isort-5.12.0 lxml-4.9.4 mccabe-0.7.0 mypy-1.0.0 mypy-extensions-1.0.0 nodeenv-1.8.0 pathspec-0.12.1 pillow-10.1.0 pip-tools-6.12.2 pipdeptree-2.3.3 platformdirs-4.1.0 pluggy-1.3.0 pre-commit-3.0.4 pycodestyle-2.10.0 pyflakes-3.0.1 pyproject-api-1.6.1 pypubsub-4.0.3 pytest-7.2.1 pytest-cov-4.0.0 pyupgrade-3.3.1 pyyaml-5.3.1 tokenize-rt-5.2.0 tox-4.4.4 typing-extensions-4.9.0 virtualenv-20.25.0 wxpython-4.2.1
python3 -m black .
All done! ✨ 🍰 ✨
39 files left unchanged.
python3 -m flake8
./youtube_dl_gui/downloaders.py:463:60: E231 missing whitespace after ':'
./youtube_dl_gui/downloadmanager.py:225:55: E231 missing whitespace after ','
./youtube_dl_gui/utils.py:292:27: E231 missing whitespace after ':'
make: *** [Makefile:53: lint] Error 1
=> ERROR: yt-dlg-1.8.5_1: do_build: 'make' exited with 2
=> ERROR:   in do_build() at srcpkgs/yt-dlg/template:43

Any suggestions?

@oleksis
Copy link
Owner

oleksis commented Dec 21, 2023

@MechDR Thanks for the feedback. From the logs look like when run tool for linting flake8 is not happy.

Is in the plans for the next release test the code base with the new tools 🧰

@oleksis oleksis added the enhancement New feature or request label Dec 21, 2023
@MechDR
Copy link
Author

MechDR commented Dec 23, 2023

@oleksis I managed to fix those syntax errors as well, so now, wheel for wxPython 4.2.1 builds successfully. But, I have other problems now...

Successfully built pyyaml wxpython
Installing collected packages: distlib, typing-extensions, tokenize-rt, pyyaml, pypubsub, pyproject-api, pyflakes, pycodestyle, pluggy, platformdirs, pipdeptree, pillow, pathspec, nodeenv, mypy-extensions, mccabe, lxml, isort, iniconfig, identify, filelock, coverage, colorama, chardet, cfgv, cachetools, attrs, wxpython, virtualenv, pyupgrade, pytest, pip-tools, mypy, flake8, black, tox, pytest-cov, pre-commit
  Attempting uninstall: pip-tools
    Found existing installation: pip-tools 7.3.0
    Uninstalling pip-tools-7.3.0:
      Successfully uninstalled pip-tools-7.3.0
Successfully installed attrs-23.1.0 black-23.1.0 cachetools-5.3.2 cfgv-3.4.0 chardet-5.2.0 colorama-0.4.6 coverage-7.3.4 distlib-0.3.8 filelock-3.13.1 flake8-6.0.0 identify-2.5.33 iniconfig-2.0.0 isort-5.12.0 lxml-4.9.4 mccabe-0.7.0 mypy-1.0.0 mypy-extensions-1.0.0 nodeenv-1.8.0 pathspec-0.12.1 pillow-10.1.0 pip-tools-6.12.2 pipdeptree-2.3.3 platformdirs-4.1.0 pluggy-1.3.0 pre-commit-3.0.4 pycodestyle-2.10.0 pyflakes-3.0.1 pyproject-api-1.6.1 pypubsub-4.0.3 pytest-7.2.1 pytest-cov-4.0.0 pyupgrade-3.3.1 pyyaml-5.3.1 tokenize-rt-5.2.0 tox-4.4.4 typing-extensions-4.9.0 virtualenv-20.25.0 wxpython-4.2.1
python3 -m black .
All done! ✨ 🍰 ✨
39 files left unchanged.
python3 -m flake8
python3 -m pytest --cov-report term-missing --cov=youtube_dl_gui tests/ -vv
============================= test session starts ==============================
platform linux -- Python 3.12.1, pytest-7.2.1, pluggy-1.3.0 -- /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3
cachedir: .pytest_cache
rootdir: /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5
plugins: cov-4.0.0
collecting ... collected 131 items

tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options FAILED    [  0%]
tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options_extra_args FAILED [  1%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans FAILED    [  2%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_exist FAILED [  3%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_numbers FAILED [  3%]
tests/test_2_ButtonsChoiceDialog.py::TestButtonsChoiceDialog::test_init_dark FAILED [  4%]
tests/test_3_MessageDialog.py::TestMessageDialog::test_init_dark FAILED  [  5%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_append FAILED     [  6%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_append_items FAILED [  6%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_clear FAILED      [  7%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_delete FAILED     [  8%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_get_value FAILED  [  9%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_init FAILED       [  9%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_false FAILED [ 10%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_true FAILED [ 11%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_false FAILED [ 12%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_true FAILED [ 12%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_header FAILED [ 13%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_item FAILED [ 14%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_header FAILED [ 15%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_invalid_string FAILED [ 16%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_item FAILED [ 16%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_header FAILED [ 17%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_with_prefix FAILED [ 18%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_without_prefix FAILED [ 19%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_with_prefix FAILED [ 19%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_without_prefix FAILED [ 20%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append FAILED [ 21%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append_items FAILED [ 22%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_clear FAILED [ 22%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_delete FAILED [ 23%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_found FAILED [ 24%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_not_found FAILED [ 25%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_found FAILED [ 25%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_not_found FAILED [ 26%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_header FAILED [ 27%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item FAILED [ 28%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_negative_index FAILED [ 29%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_not_found FAILED [ 29%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection FAILED [ 30%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection_empty FAILED [ 31%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_insert_items FAILED [ 32%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_header FAILED [ 32%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_invalid_index FAILED [ 33%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_valid_index FAILED [ 34%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_header FAILED [ 35%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_item FAILED [ 35%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_header FAILED [ 36%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_item FAILED [ 37%]
tests/test_ditem.py::TestItemInit::test_init PASSED                      [ 38%]
tests/test_ditem.py::TestGetFiles::test_get_files PASSED                 [ 38%]
tests/test_ditem.py::TestGetFiles::test_get_files_no_data PASSED         [ 39%]
tests/test_ditem.py::TestItemComparison::test_equal_false PASSED         [ 40%]
tests/test_ditem.py::TestItemComparison::test_equal_true PASSED          [ 41%]
tests/test_ditem.py::TestSetItemStage::test_set_stage_invalid PASSED     [ 41%]
tests/test_ditem.py::TestSetItemStage::test_set_stage_valid PASSED       [ 42%]
tests/test_ditem.py::TestUpdateStats::test_update_stats PASSED           [ 43%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_empty_strings PASSED [ 44%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_invalid_input PASSED [ 45%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_not_string PASSED [ 45%]
tests/test_ditem.py::TestDownloadItemPrivate::test_calc_post_proc_size FAILED [ 46%]
tests/test_ditem.py::TestDownloadItemPrivate::test_set_stage PASSED      [ 47%]
tests/test_ditem.py::TestReset::test_reset_active_stage PASSED           [ 48%]
tests/test_ditem.py::TestReset::test_reset_completed_stage PASSED        [ 48%]
tests/test_ditem.py::TestReset::test_reset_error_stage PASSED            [ 49%]
tests/test_ditem.py::TestReset::test_reset_paused_stage PASSED           [ 50%]
tests/test_dlist.py::TestInit::test_init PASSED                          [ 51%]
tests/test_dlist.py::TestInit::test_init_empty PASSED                    [ 51%]
tests/test_dlist.py::TestInit::test_init_invalid_args PASSED             [ 52%]
tests/test_dlist.py::TestInsert::test_insert PASSED                      [ 53%]
tests/test_dlist.py::TestRemove::test_remove PASSED                      [ 54%]
tests/test_dlist.py::TestRemove::test_remove_active PASSED               [ 54%]
tests/test_dlist.py::TestRemove::test_remove_not_exist PASSED            [ 55%]
tests/test_dlist.py::TestFetchNext::test_fetch_next PASSED               [ 56%]
tests/test_dlist.py::TestFetchNext::test_fetch_next_empty_list PASSED    [ 57%]
tests/test_dlist.py::TestMoveUp::test_move_up PASSED                     [ 58%]
tests/test_dlist.py::TestMoveUp::test_move_up_already_on_top PASSED      [ 58%]
tests/test_dlist.py::TestMoveUp::test_move_up_not_exist PASSED           [ 59%]
tests/test_dlist.py::TestMoveDown::test_move_down PASSED                 [ 60%]
tests/test_dlist.py::TestMoveDown::test_move_down_already_on_bottom PASSED [ 61%]
tests/test_dlist.py::TestMoveDown::test_move_down_not_exist PASSED       [ 61%]
tests/test_dlist.py::TestGetItem::test_get_item PASSED                   [ 62%]
tests/test_dlist.py::TestGetItem::test_get_item_not_exist PASSED         [ 63%]
tests/test_dlist.py::TestGetLength::test_get_length PASSED               [ 64%]
tests/test_dlist.py::TestGetLength::test_get_length_empty_list PASSED    [ 64%]
tests/test_dlist.py::TestHasItem::test_has_item_false PASSED             [ 65%]
tests/test_dlist.py::TestHasItem::test_has_item_true PASSED              [ 66%]
tests/test_dlist.py::TestGetItems::test_get_items PASSED                 [ 67%]
tests/test_dlist.py::TestGetItems::test_get_items_empty_list PASSED      [ 67%]
tests/test_dlist.py::TestClear::test_clear PASSED                        [ 68%]
tests/test_dlist.py::TestChangeStage::test_change_stage PASSED           [ 69%]
tests/test_dlist.py::TestChangeStage::test_change_stage_id_not_exist PASSED [ 70%]
tests/test_dlist.py::TestIndex::test_index PASSED                        [ 70%]
tests/test_dlist.py::TestIndex::test_index_not_exist PASSED              [ 71%]
tests/test_dlist.py::TestSynchronizeDecorator::test_synchronize PASSED   [ 72%]
tests/test_downloaders.py::TestDownloaders::test_extract_data_playlist PASSED [ 73%]
tests/test_downloaders.py::TestDownloaders::test_extract_data_video PASSED [ 74%]
tests/test_downloadmanager.py::TestDownloadManager::test_downloadmanager PASSED [ 74%]
tests/test_downloadmanager.py::TestDownloadManager::test_init_check_sig PASSED [ 75%]
tests/test_logmanager.py::TestLogManager::test_init PASSED               [ 76%]
tests/test_logmanager.py::TestLogManager::test_log PASSED                [ 77%]
tests/test_optionsmanager.py::TestOptionsManager::test_init PASSED       [ 77%]
tests/test_optionsmanager.py::TestOptionsManager::test_save_to_file PASSED [ 78%]
tests/test_parsers.py::TestParse::test_parse_cmd_args_with_quotes PASSED [ 79%]
tests/test_parsers.py::TestParse::test_parse_to_audio_requirement_bug PASSED [ 80%]
tests/test_updatemanager.py::TestUpdateThread::test_downloadmanager PASSED [ 80%]
tests/test_updatemanager.py::TestUpdateThread::test_init_check_sig PASSED [ 81%]
tests/test_utils.py::TestUtils::test_decode_tuple PASSED                 [ 82%]
tests/test_utils.py::TestUtils::test_encode_tuple PASSED                 [ 83%]
tests/test_utils.py::TestUtils::test_get_config_path PASSED              [ 83%]
tests/test_utils.py::TestUtils::test_get_encoding SKIPPED (cp65001 encoding is only available on Windows) [ 84%]
tests/test_utils.py::TestUtils::test_get_encoding_error PASSED           [ 85%]
tests/test_utils.py::TestUtils::test_get_key PASSED                      [ 86%]
tests/test_utils.py::TestUtils::test_get_time PASSED                     [ 87%]
tests/test_utils.py::TestToBytes::test_to_bytes_bytes PASSED             [ 87%]
tests/test_utils.py::TestToBytes::test_to_bytes_gigabytes PASSED         [ 88%]
tests/test_utils.py::TestToBytes::test_to_bytes_kilobytes PASSED         [ 89%]
tests/test_utils.py::TestToBytes::test_to_bytes_megabytes PASSED         [ 90%]
tests/test_utils.py::TestToBytes::test_to_bytes_terabytes PASSED         [ 90%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_bytes FAILED     [ 91%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_gigabytes FAILED [ 92%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_kilobytes FAILED [ 93%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_megabytes FAILED [ 93%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_terabytes FAILED [ 94%]
tests/test_utils.py::TestBuildCommand::test_build_command_with_spaces_linux PASSED [ 95%]
tests/test_utils.py::TestBuildCommand::test_build_command_with_spaces_windows PASSED [ 96%]
tests/test_utils.py::TestBuildCommand::test_build_command_without_spaces_linux PASSED [ 96%]
tests/test_utils.py::TestBuildCommand::test_build_command_without_spaces_windows PASSED [ 97%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang PASSED    [ 98%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang_empty PASSED [ 99%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang_none PASSED [100%]

Do you think any of this is related to wxPython 4.2.1, as opposed to using 4.2.0? Here is the rest of the build log (too long for just a code tag).

platform linux -- Python 3.12.1, pytest-7.2.1, pluggy-1.3.0 -- /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/bin/python3
cachedir: .pytest_cache
rootdir: /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5
plugins: cov-4.0.0
collecting ... collected 131 items

tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options FAILED    [  0%]
tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options_extra_args FAILED [  1%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans FAILED    [  2%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_exist FAILED [  3%]
tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_numbers FAILED [  3%]
tests/test_2_ButtonsChoiceDialog.py::TestButtonsChoiceDialog::test_init_dark FAILED [  4%]
tests/test_3_MessageDialog.py::TestMessageDialog::test_init_dark FAILED  [  5%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_append FAILED     [  6%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_append_items FAILED [  6%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_clear FAILED      [  7%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_delete FAILED     [  8%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_get_value FAILED  [  9%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_init FAILED       [  9%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_false FAILED [ 10%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_true FAILED [ 11%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_false FAILED [ 12%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_true FAILED [ 12%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_header FAILED [ 13%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_item FAILED [ 14%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_header FAILED [ 15%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_invalid_string FAILED [ 16%]
tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_item FAILED [ 16%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_header FAILED [ 17%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_with_prefix FAILED [ 18%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_without_prefix FAILED [ 19%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_with_prefix FAILED [ 19%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_without_prefix FAILED [ 20%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append FAILED [ 21%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append_items FAILED [ 22%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_clear FAILED [ 22%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_delete FAILED [ 23%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_found FAILED [ 24%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_not_found FAILED [ 25%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_found FAILED [ 25%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_not_found FAILED [ 26%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_header FAILED [ 27%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item FAILED [ 28%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_negative_index FAILED [ 29%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_not_found FAILED [ 29%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection FAILED [ 30%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection_empty FAILED [ 31%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_insert_items FAILED [ 32%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_header FAILED [ 32%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_invalid_index FAILED [ 33%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_valid_index FAILED [ 34%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_header FAILED [ 35%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_item FAILED [ 35%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_header FAILED [ 36%]
tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_item FAILED [ 37%]
tests/test_ditem.py::TestItemInit::test_init PASSED                      [ 38%]
tests/test_ditem.py::TestGetFiles::test_get_files PASSED                 [ 38%]
tests/test_ditem.py::TestGetFiles::test_get_files_no_data PASSED         [ 39%]
tests/test_ditem.py::TestItemComparison::test_equal_false PASSED         [ 40%]
tests/test_ditem.py::TestItemComparison::test_equal_true PASSED          [ 41%]
tests/test_ditem.py::TestSetItemStage::test_set_stage_invalid PASSED     [ 41%]
tests/test_ditem.py::TestSetItemStage::test_set_stage_valid PASSED       [ 42%]
tests/test_ditem.py::TestUpdateStats::test_update_stats PASSED           [ 43%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_empty_strings PASSED [ 44%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_invalid_input PASSED [ 45%]
tests/test_ditem.py::TestUpdateStats::test_update_stats_not_string PASSED [ 45%]
tests/test_ditem.py::TestDownloadItemPrivate::test_calc_post_proc_size FAILED [ 46%]
tests/test_ditem.py::TestDownloadItemPrivate::test_set_stage PASSED      [ 47%]
tests/test_ditem.py::TestReset::test_reset_active_stage PASSED           [ 48%]
tests/test_ditem.py::TestReset::test_reset_completed_stage PASSED        [ 48%]
tests/test_ditem.py::TestReset::test_reset_error_stage PASSED            [ 49%]
tests/test_ditem.py::TestReset::test_reset_paused_stage PASSED           [ 50%]
tests/test_dlist.py::TestInit::test_init PASSED                          [ 51%]
tests/test_dlist.py::TestInit::test_init_empty PASSED                    [ 51%]
tests/test_dlist.py::TestInit::test_init_invalid_args PASSED             [ 52%]
tests/test_dlist.py::TestInsert::test_insert PASSED                      [ 53%]
tests/test_dlist.py::TestRemove::test_remove PASSED                      [ 54%]
tests/test_dlist.py::TestRemove::test_remove_active PASSED               [ 54%]
tests/test_dlist.py::TestRemove::test_remove_not_exist PASSED            [ 55%]
tests/test_dlist.py::TestFetchNext::test_fetch_next PASSED               [ 56%]
tests/test_dlist.py::TestFetchNext::test_fetch_next_empty_list PASSED    [ 57%]
tests/test_dlist.py::TestMoveUp::test_move_up PASSED                     [ 58%]
tests/test_dlist.py::TestMoveUp::test_move_up_already_on_top PASSED      [ 58%]
tests/test_dlist.py::TestMoveUp::test_move_up_not_exist PASSED           [ 59%]
tests/test_dlist.py::TestMoveDown::test_move_down PASSED                 [ 60%]
tests/test_dlist.py::TestMoveDown::test_move_down_already_on_bottom PASSED [ 61%]
tests/test_dlist.py::TestMoveDown::test_move_down_not_exist PASSED       [ 61%]
tests/test_dlist.py::TestGetItem::test_get_item PASSED                   [ 62%]
tests/test_dlist.py::TestGetItem::test_get_item_not_exist PASSED         [ 63%]
tests/test_dlist.py::TestGetLength::test_get_length PASSED               [ 64%]
tests/test_dlist.py::TestGetLength::test_get_length_empty_list PASSED    [ 64%]
tests/test_dlist.py::TestHasItem::test_has_item_false PASSED             [ 65%]
tests/test_dlist.py::TestHasItem::test_has_item_true PASSED              [ 66%]
tests/test_dlist.py::TestGetItems::test_get_items PASSED                 [ 67%]
tests/test_dlist.py::TestGetItems::test_get_items_empty_list PASSED      [ 67%]
tests/test_dlist.py::TestClear::test_clear PASSED                        [ 68%]
tests/test_dlist.py::TestChangeStage::test_change_stage PASSED           [ 69%]
tests/test_dlist.py::TestChangeStage::test_change_stage_id_not_exist PASSED [ 70%]
tests/test_dlist.py::TestIndex::test_index PASSED                        [ 70%]
tests/test_dlist.py::TestIndex::test_index_not_exist PASSED              [ 71%]
tests/test_dlist.py::TestSynchronizeDecorator::test_synchronize PASSED   [ 72%]
tests/test_downloaders.py::TestDownloaders::test_extract_data_playlist PASSED [ 73%]
tests/test_downloaders.py::TestDownloaders::test_extract_data_video PASSED [ 74%]
tests/test_downloadmanager.py::TestDownloadManager::test_downloadmanager PASSED [ 74%]
tests/test_downloadmanager.py::TestDownloadManager::test_init_check_sig PASSED [ 75%]
tests/test_logmanager.py::TestLogManager::test_init PASSED               [ 76%]
tests/test_logmanager.py::TestLogManager::test_log PASSED                [ 77%]
tests/test_optionsmanager.py::TestOptionsManager::test_init PASSED       [ 77%]
tests/test_optionsmanager.py::TestOptionsManager::test_save_to_file PASSED [ 78%]
tests/test_parsers.py::TestParse::test_parse_cmd_args_with_quotes PASSED [ 79%]
tests/test_parsers.py::TestParse::test_parse_to_audio_requirement_bug PASSED [ 80%]
tests/test_updatemanager.py::TestUpdateThread::test_downloadmanager PASSED [ 80%]
tests/test_updatemanager.py::TestUpdateThread::test_init_check_sig PASSED [ 81%]
tests/test_utils.py::TestUtils::test_decode_tuple PASSED                 [ 82%]
tests/test_utils.py::TestUtils::test_encode_tuple PASSED                 [ 83%]
tests/test_utils.py::TestUtils::test_get_config_path PASSED              [ 83%]
tests/test_utils.py::TestUtils::test_get_encoding SKIPPED (cp65001 encoding is only available on Windows) [ 84%]
tests/test_utils.py::TestUtils::test_get_encoding_error PASSED           [ 85%]
tests/test_utils.py::TestUtils::test_get_key PASSED                      [ 86%]
tests/test_utils.py::TestUtils::test_get_time PASSED                     [ 87%]
tests/test_utils.py::TestToBytes::test_to_bytes_bytes PASSED             [ 87%]
tests/test_utils.py::TestToBytes::test_to_bytes_gigabytes PASSED         [ 88%]
tests/test_utils.py::TestToBytes::test_to_bytes_kilobytes PASSED         [ 89%]
tests/test_utils.py::TestToBytes::test_to_bytes_megabytes PASSED         [ 90%]
tests/test_utils.py::TestToBytes::test_to_bytes_terabytes PASSED         [ 90%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_bytes FAILED     [ 91%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_gigabytes FAILED [ 92%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_kilobytes FAILED [ 93%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_megabytes FAILED [ 93%]
tests/test_utils.py::TestFormatBytes::test_format_bytes_terabytes FAILED [ 94%]
tests/test_utils.py::TestBuildCommand::test_build_command_with_spaces_linux PASSED [ 95%]
tests/test_utils.py::TestBuildCommand::test_build_command_with_spaces_windows PASSED [ 96%]
tests/test_utils.py::TestBuildCommand::test_build_command_without_spaces_linux PASSED [ 96%]
tests/test_utils.py::TestBuildCommand::test_build_command_without_spaces_windows PASSED [ 97%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang PASSED    [ 98%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang_empty PASSED [ 99%]
tests/test_utils.py::TestGetDefaultLang::test_get_default_lang_none PASSED [100%]

=================================== FAILURES ===================================
______________________ TestClipDialog.test_clean_options _______________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d05d640>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestClipDialog.test_clean_options_extra_args _________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37920>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________________ TestClipDialog.test_get_timespans _______________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37e30>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________________ TestClipDialog.test_get_timespans_no_exist __________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37ec0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestClipDialog.test_get_timespans_no_numbers _________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37da0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________________ TestButtonsChoiceDialog.test_init_dark ____________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37ad0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_______________________ TestMessageDialog.test_init_dark _______________________
tests/wtc.py:15: in setUp
   self.app = wx.App()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37f50>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
________________________ TestCustomComboBox.test_append ________________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_append>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35250>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_____________________ TestCustomComboBox.test_append_items _____________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_append_items>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37d10>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
________________________ TestCustomComboBox.test_clear _________________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_clear>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf351c0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
________________________ TestCustomComboBox.test_delete ________________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_delete>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37bf0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________________ TestCustomComboBox.test_get_value _______________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_get_value>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35130>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________________ TestCustomComboBox.test_init _________________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_init>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35400>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestCustomComboBox.test_is_list_empty_false __________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_is_list_empty_false>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35370>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________________ TestCustomComboBox.test_is_list_empty_true __________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_is_list_empty_true>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37bf0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestCustomComboBox.test_is_text_empty_false __________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_is_text_empty_false>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf351c0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________________ TestCustomComboBox.test_is_text_empty_true __________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_is_text_empty_true>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37d10>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestCustomComboBox.test_set_selection_header _________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_set_selection_header>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35640>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________________ TestCustomComboBox.test_set_selection_item __________________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_set_selection_item>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35400>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_____________ TestCustomComboBox.test_set_string_selection_header ______________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_set_string_selection_header>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf356d0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________ TestCustomComboBox.test_set_string_selection_invalid_string __________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_set_string_selection_invalid_string>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf351c0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________ TestCustomComboBox.test_set_string_selection_item _______________

self = <tests.test_CustomComboBox.TestCustomComboBox testMethod=test_set_string_selection_item>

   def setUp(self) -> None:
>       self.app = wx.App()

tests/test_CustomComboBox.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35130>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________________ TestListBoxWithHeaders.test_add_header ____________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_add_header>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d274050>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_______________ TestListBoxWithHeaders.test_add_item_with_prefix _______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_add_item_with_prefix>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d2740e0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_____________ TestListBoxWithHeaders.test_add_item_without_prefix ______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_add_item_without_prefix>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35490>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________ TestListBoxWithHeaders.test_add_items_with_prefix _______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_add_items_with_prefix>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf357f0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_____________ TestListBoxWithHeaders.test_add_items_without_prefix _____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_add_items_without_prefix>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35130>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________________ TestListBoxWithHeaders.test_append ______________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_append>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d274050>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
___________________ TestListBoxWithHeaders.test_append_items ___________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_append_items>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35490>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________________ TestListBoxWithHeaders.test_clear _______________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_clear>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf359a0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________________ TestListBoxWithHeaders.test_delete ______________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_delete>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35ac0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_____________ TestListBoxWithHeaders.test_find_string_header_found _____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_find_string_header_found>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35910>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
___________ TestListBoxWithHeaders.test_find_string_header_not_found ___________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_find_string_header_not_found>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35c70>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
______________ TestListBoxWithHeaders.test_find_string_item_found ______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_find_string_item_found>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35e20>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________ TestListBoxWithHeaders.test_find_string_item_not_found ____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_find_string_item_not_found>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf359a0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
________________ TestListBoxWithHeaders.test_get_string_header _________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_header>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35fd0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestListBoxWithHeaders.test_get_string_item __________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_item>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf36690>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________ TestListBoxWithHeaders.test_get_string_item_negative_index __________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_item_negative_index>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf368d0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________ TestListBoxWithHeaders.test_get_string_item_not_found _____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_item_not_found>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf36a80>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_______________ TestListBoxWithHeaders.test_get_string_selection _______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_selection>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35c70>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________ TestListBoxWithHeaders.test_get_string_selection_empty ____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_get_string_selection_empty>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf36de0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
___________________ TestListBoxWithHeaders.test_insert_items ___________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_insert_items>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37140>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_______________ TestListBoxWithHeaders.test_set_selection_header _______________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_selection_header>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf36600>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________ TestListBoxWithHeaders.test_set_selection_item_invalid_index _________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_selection_item_invalid_index>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d05cdd0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
__________ TestListBoxWithHeaders.test_set_selection_item_valid_index __________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_selection_item_valid_index>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf35c70>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
________________ TestListBoxWithHeaders.test_set_string_header _________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_string_header>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708d05d640>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_________________ TestListBoxWithHeaders.test_set_string_item __________________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_string_item>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708cf37140>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
___________ TestListBoxWithHeaders.test_set_string_selection_header ____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_string_selection_header>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708c9ca3c0>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
____________ TestListBoxWithHeaders.test_set_string_selection_item _____________

self = <tests.test_ListBoxWithHeaders.TestListBoxWithHeaders testMethod=test_set_string_selection_item>

   def setUp(self):
>       self.app = wx.App()

tests/test_ListBoxWithHeaders.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wx.core.App object at 0x7f708c9ca690>, redirect = False, filename = None
useBestVisual = False, clearSigInt = True

   def __init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True):
       """
       Construct a ``wx.App`` object.
   
       :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
           redirected?  Defaults to False. If ``filename`` is None
           then output will be redirected to a window that pops up
           as needed.  (You can control what kind of window is created
           for the output by resetting the class variable
           ``outputWindowClass`` to a class of your choosing.)
   
       :param filename: The name of a file to redirect output to, if
           redirect is True.
   
       :param useBestVisual: Should the app try to use the best
           available visual provided by the system (only relevant on
           systems that have more than one visual.)  This parameter
           must be used instead of calling `SetUseBestVisual` later
           on because it must be set before the underlying GUI
           toolkit is initialized.
   
       :param clearSigInt: Should SIGINT be cleared?  This allows the
           app to terminate upon a Ctrl-C in the console like other
           GUI apps will.
   
       :note: You should override OnInit to do application
           initialization to ensure that the system, toolkit and
           wxWidgets are fully initialized.
       """
       PyApp.__init__(self)
   
       # make sure we can create a GUI
       if not self.IsDisplayAvailable():
   
           if wx.Port == "__WXMAC__":
               msg = "This program needs access to the screen. Please run with a\n" \
                     "Framework build of python, and only when you are logged in\n" \
                     "on the main display of your Mac."
   
           elif wx.Port == "__WXGTK__":
               msg ="Unable to access the X Display, is $DISPLAY set properly?"
   
           else:
               msg = "Unable to create GUI"
               # TODO: more description is needed for wxMSW...
   
>           raise SystemExit(msg)
E           SystemExit: Unable to access the X Display, is $DISPLAY set properly?

venv/lib/python3.12/site-packages/wx/core.py:2197: SystemExit
_______________ TestDownloadItemPrivate.test_calc_post_proc_size _______________

self = <tests.test_ditem.TestDownloadItemPrivate testMethod=test_calc_post_proc_size>

   def test_calc_post_proc_size(self):
       # REFACTOR Not an actual method
       # should transfer to TestUpdateStats
       ditem = DownloadItem("url", ["-f", "flv"])
   
       ditem.update_stats(
           {
               "filename": "file.f123",
               "extension": ".webm",
               "filesize": "10.00MiB",
               "percent": "100%",
               "speed": "",
               "eta": "",
               "status": "Downloading",
               "path": "/home/user",
           }
       )
   
       ditem.update_stats(
           {
               "filename": "file.f456",
               "extension": ".m4a",
               "filesize": "3.45MiB",
               "percent": "100%",
               "speed": "",
               "eta": "",
               "status": "Downloading",
               "path": "/home/user",
           }
       )
   
       # Mimic youtube-dl post process behaviour
       ditem.update_stats(
           {
               "filename": "file",
               "extension": ".webm",
               "percent": "100%",
               "speed": "",
               "eta": "",
               "status": "Post Processing",
           }
       )
   
       self.assertEqual(ditem.filesizes, [10485760.00, 3617587.20, 14103347.20])
   
>       self.assertEqual(
           ditem.progress_stats,
           {
               "filename": "file",
               "extension": ".webm",
               "filesize": "13.45MiB",
               "percent": "100%",
               "speed": "-",
               "eta": "-",
               "status": "Post Processing",
               "playlist_size": "",
               "playlist_index": "",
           },
       )
E       AssertionError: {'fil[46 chars]e': ' 13.45MiB', 'percent': '100%', 'speed': '[82 chars]: ''} != {'fil[46 chars]e': '13.45MiB', 'percent': '100%', 'speed': '-[81 chars]: ''}
E         {'eta': '-',
E          'extension': '.webm',
E          'filename': 'file',
E       -  'filesize': ' 13.45MiB',
E       ?               -
E       
E       +  'filesize': '13.45MiB',
E          'percent': '100%',
E          'playlist_index': '',
E          'playlist_size': '',
E          'speed': '-',
E          'status': 'Post Processing'}

tests/test_ditem.py:478: AssertionError
___________________ TestFormatBytes.test_format_bytes_bytes ____________________

self = <tests.test_utils.TestFormatBytes testMethod=test_format_bytes_bytes>

   def test_format_bytes_bytes(self):
>       self.assertEqual(utils.format_bytes(518.00), "518.00B")
E       AssertionError: ' 518.00B' != '518.00B'
E       -  518.00B
E       ? -
E       + 518.00B

tests/test_utils.py:93: AssertionError
_________________ TestFormatBytes.test_format_bytes_gigabytes __________________

self = <tests.test_utils.TestFormatBytes testMethod=test_format_bytes_gigabytes>

   def test_format_bytes_gigabytes(self):
>       self.assertEqual(utils.format_bytes(1073741824.00), "1.00GiB")
E       AssertionError: ' 1.00GiB' != '1.00GiB'
E       -  1.00GiB
E       ? -
E       + 1.00GiB

tests/test_utils.py:102: AssertionError
_________________ TestFormatBytes.test_format_bytes_kilobytes __________________

self = <tests.test_utils.TestFormatBytes testMethod=test_format_bytes_kilobytes>

   def test_format_bytes_kilobytes(self):
>       self.assertEqual(utils.format_bytes(1024.00), "1.00KiB")
E       AssertionError: ' 1.00KiB' != '1.00KiB'
E       -  1.00KiB
E       ? -
E       + 1.00KiB

tests/test_utils.py:96: AssertionError
_________________ TestFormatBytes.test_format_bytes_megabytes __________________

self = <tests.test_utils.TestFormatBytes testMethod=test_format_bytes_megabytes>

   def test_format_bytes_megabytes(self):
>       self.assertEqual(utils.format_bytes(1048576.00), "1.00MiB")
E       AssertionError: ' 1.00MiB' != '1.00MiB'
E       -  1.00MiB
E       ? -
E       + 1.00MiB

tests/test_utils.py:99: AssertionError
_________________ TestFormatBytes.test_format_bytes_terabytes __________________

self = <tests.test_utils.TestFormatBytes testMethod=test_format_bytes_terabytes>

   def test_format_bytes_terabytes(self):
>       self.assertEqual(utils.format_bytes(1099511627776.00), "1.00TiB")
E       AssertionError: ' 1.00TiB' != '1.00TiB'
E       -  1.00TiB
E       ? -
E       + 1.00TiB

tests/test_utils.py:105: AssertionError
=============================== warnings summary ===============================
venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:675: 15 warnings
 /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:675: DeprecationWarning: ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead
   and isinstance(item.value, ast.Str)

venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:677: 15 warnings
 /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/venv/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:677: DeprecationWarning: Attribute s is deprecated and will be removed in Python 3.14; use value instead
   doc = item.value.s

tests/test_1_ClipDialog.py: 5 warnings
tests/test_2_ButtonsChoiceDialog.py: 1 warning
tests/test_3_MessageDialog.py: 1 warning
tests/test_CustomComboBox.py: 15 warnings
tests/test_ListBoxWithHeaders.py: 27 warnings
tests/test_ditem.py: 17 warnings
tests/test_dlist.py: 29 warnings
tests/test_downloaders.py: 2 warnings
tests/test_downloadmanager.py: 2 warnings
tests/test_logmanager.py: 2 warnings
tests/test_optionsmanager.py: 2 warnings
tests/test_parsers.py: 2 warnings
tests/test_updatemanager.py: 2 warnings
tests/test_utils.py: 23 warnings
 /usr/lib/python3.12/unittest/case.py:580: RuntimeWarning: TestResult has no addDuration method
   warnings.warn("TestResult has no addDuration method",

tests/test_optionsmanager.py::TestOptionsManager::test_init
 /builddir/yt-dlg-1.8.5/youtube-dl-gui-1.8.5/youtube_dl_gui/utils.py:324: DeprecationWarning: 'locale.getdefaultlocale' is deprecated and slated for removal in Python 3.15. Use setlocale(), getencoding() and getlocale() instead.
   default_lang, _ = locale_getdefaultlocale()

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

---------- coverage: platform linux, python 3.12.1-final-0 -----------
Name                                Stmts   Miss  Cover   Missing
-----------------------------------------------------------------
youtube_dl_gui/darktheme.py            33     24    27%   14-23, 29-38, 44-57
youtube_dl_gui/downloaders.py         219    133    39%   45-49, 53-68, 72, 75-76, 130-138, 160-195, 199-219, 223, 228-229, 233-235, 239-258, 269-280, 284-285, 289-290, 294, 307-313, 322-347, 397, 437-438, 442-447, 451, 456-464, 479-483, 487-491
youtube_dl_gui/downloadmanager.py     314     78    75%   225, 351, 414, 420, 424, 432-454, 458, 482-485, 505, 511-515, 518, 530, 568-603, 607-623, 637-639, 643, 647-648, 652, 656, 660-664, 669, 673-674, 686-687, 701, 735-741, 746
youtube_dl_gui/logmanager.py           29      5    83%   58-60, 64-65, 74
youtube_dl_gui/optionsmanager.py       70     19    73%   322, 329, 337-338, 342-346, 436, 439, 455, 459, 464, 472-481
youtube_dl_gui/parsers.py              92     11    88%   239, 242-249, 268, 287, 292
youtube_dl_gui/updatemanager.py        65      8    88%   75-76, 97-98, 119-122, 149
youtube_dl_gui/utils.py               135     51    62%   23, 27, 50-53, 60-65, 75, 86-91, 108, 123, 143-180, 205, 224-226, 239-249, 260-268
youtube_dl_gui/widgets.py             417    332    20%   26, 68-82, 86-88, 92-94, 97, 100-102, 107-113, 116, 119-125, 128-129, 132-135, 138-144, 147-155, 160-163, 166-167, 170-175, 180-181, 189-192, 195-196, 206-210, 213-218, 222-224, 230, 234-243, 246, 254, 257, 260, 263, 266-270, 273-280, 283-284, 287, 290-292, 298-301, 304-308, 311-316, 319-320, 325-336, 339-342, 345-346, 349-352, 363-411, 414, 425-496, 499, 513-593, 600-613, 623-651, 654-663, 676-719, 722, 726-730, 733-734, 752-767, 771-772
-----------------------------------------------------------------
TOTAL                                1374    661    52%

=========================== short test summary info ============================
FAILED tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options - Syste...
FAILED tests/test_1_ClipDialog.py::TestClipDialog::test_clean_options_extra_args
FAILED tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans - Syste...
FAILED tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_exist
FAILED tests/test_1_ClipDialog.py::TestClipDialog::test_get_timespans_no_numbers
FAILED tests/test_2_ButtonsChoiceDialog.py::TestButtonsChoiceDialog::test_init_dark
FAILED tests/test_3_MessageDialog.py::TestMessageDialog::test_init_dark - Sys...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_append - System...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_append_items - ...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_clear - SystemE...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_delete - System...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_get_value - Sys...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_init - SystemEx...
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_false
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_is_list_empty_true
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_false
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_is_text_empty_true
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_header
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_set_selection_item
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_header
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_invalid_string
FAILED tests/test_CustomComboBox.py::TestCustomComboBox::test_set_string_selection_item
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_header
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_with_prefix
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_item_without_prefix
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_with_prefix
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_add_items_without_prefix
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_append_items
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_clear
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_delete
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_found
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_header_not_found
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_found
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_find_string_item_not_found
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_header
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_negative_index
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_item_not_found
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_get_string_selection_empty
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_insert_items
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_header
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_invalid_index
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_selection_item_valid_index
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_header
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_item
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_header
FAILED tests/test_ListBoxWithHeaders.py::TestListBoxWithHeaders::test_set_string_selection_item
FAILED tests/test_ditem.py::TestDownloadItemPrivate::test_calc_post_proc_size
FAILED tests/test_utils.py::TestFormatBytes::test_format_bytes_bytes - Assert...
FAILED tests/test_utils.py::TestFormatBytes::test_format_bytes_gigabytes - As...
FAILED tests/test_utils.py::TestFormatBytes::test_format_bytes_kilobytes - As...
FAILED tests/test_utils.py::TestFormatBytes::test_format_bytes_megabytes - As...
FAILED tests/test_utils.py::TestFormatBytes::test_format_bytes_terabytes - As...
=========== 55 failed, 75 passed, 1 skipped, 161 warnings in 18.09s ============
make: *** [Makefile:72: test-cov] Segmentation fault

@oleksis
Copy link
Owner

oleksis commented Dec 23, 2023

Good work! Thanks 🙏🏾 Next iteration is test all the development tools and yt-dlg with the last Python today (3.12.1) and updating

@oleksis oleksis added the bug Something isn't working label Dec 23, 2023
@MechDR
Copy link
Author

MechDR commented Dec 23, 2023

@oleksis If you'd like, I can post the template, the source corrections are there.

@oleksis
Copy link
Owner

oleksis commented Dec 23, 2023

That will great and if you can open a PR related to this issue 👍🏾

@MechDR
Copy link
Author

MechDR commented Dec 23, 2023

@oleksis OK.

Some are related to general syntax issues, others to syntax changes in python 3.12 and above... maybe it's best if I split them up in a few (most probably 2) PRs?

Also, I'll try and use terminal git (still learning), but is it OK if I just use the web UI if things get too hairy?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working dependencies Pull requests that update a dependency file enhancement New feature or request help wanted Extra attention is needed packaging Software Packaging
Projects
None yet
Development

No branches or pull requests

2 participants