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

Tests fail under Python 3.12 #9

Closed
ns-rse opened this issue Nov 24, 2023 · 2 comments
Closed

Tests fail under Python 3.12 #9

ns-rse opened this issue Nov 24, 2023 · 2 comments

Comments

@ns-rse
Copy link

ns-rse commented Nov 24, 2023

Hi,

Thanks for continuing the development of igor, really useful to our project (TopoStats).

We're in the process of ensuring we can support Python 3.12 and I've found that igor2 doesn't play ball with Python 3.12. To investigate I've tried running the tests under Python 3.11.6 (all pass)...

❱ python --version
Python 3.11.6

❱ pytest          
=============================================================================== test session starts ================================================================================
platform linux -- Python 3.11.6, pytest-7.4.2, pluggy-1.3.0
Matplotlib: 3.8.0
Freetype: 2.6.1
rootdir: /home/neil/work/git/hub/ns-rse/igor2
plugins: mock-3.11.1, mpl-0.16.1, github-actions-annotate-failures-0.2.0, xdist-3.3.1, napari-plugin-engine-0.2.0, regtest-1.5.1, cov-4.1.0, hypothesis-6.87.1, lazy-fixture-0.6.3, anyio-4.0.0, typeguard-4.1.5
collected 12 items                                                                                                                                                                 

tests/test_ibw.py ...........                                                                                                                                                [ 91%]
tests/test_pxp.py .                                                                                                                                                          [100%]

================================================================================ 12 passed in 0.95s ================================================================================

...and Python 3.12.0 (none start due to noted error)...

❱ python --version
Python 3.12.0
 12:44:36 pm GMT  •100  neil  ~/work/git/hub/ns-rse/igor2  G  master  @  + + ⭑ ⭑ - - ?  
❱ pytest          
=============================================================================== test session starts ================================================================================
platform linux -- Python 3.12.0, pytest-7.4.3, pluggy-1.3.0
Matplotlib: 3.8.2
Freetype: 2.6.1
rootdir: /home/neil/work/git/hub/ns-rse/igor2
plugins: mpl-0.16.1, github-actions-annotate-failures-0.2.0, regtest-1.5.1, cov-4.1.0, lazy-fixture-0.6.3
collected 0 items / 2 errors                                                                                                                                                       

====================================================================================== ERRORS ======================================================================================
________________________________________________________________________ ERROR collecting tests/test_ibw.py ________________________________________________________________________
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/runner.py:341: in from_call
    result: Optional[TResult] = func()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/runner.py:372: in <lambda>
    call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:531: in collect
    self._inject_setup_module_fixture()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:545: in _inject_setup_module_fixture
    self.obj, ("setUpModule", "setup_module")
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:310: in obj
    self._obj = obj = self._getobj()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:528: in _getobj
    return self._importtestmodule()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:617: in _importtestmodule
    mod = import_path(self.path, mode=importmode, root=self.config.rootpath)
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/pathlib.py:567: in import_path
    importlib.import_module(module_name)
/home/neil/miniconda3/envs/topo312/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
<frozen importlib._bootstrap>:1381: in _gcd_import
    ???
<frozen importlib._bootstrap>:1354: in _find_and_load
    ???
<frozen importlib._bootstrap>:1325: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:929: in _load_unlocked
    ???
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
    exec(co, module.__dict__)
tests/test_ibw.py:1: in <module>
    from helper import assert_equal_dump_no_whitespace_no_byte, dumpibw
tests/helper.py:4: in <module>
    from igor2.binarywave import load as loadibw
igor2/__init__.py:5: in <module>
    from . import binarywave
igor2/binarywave.py:114: in <module>
    BinHeader1 = _Structure(
E   TypeError: Struct() takes at most 1 keyword argument (2 given)
________________________________________________________________________ ERROR collecting tests/test_pxp.py ________________________________________________________________________
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/runner.py:341: in from_call
    result: Optional[TResult] = func()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/runner.py:372: in <lambda>
    call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:531: in collect
    self._inject_setup_module_fixture()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:545: in _inject_setup_module_fixture
    self.obj, ("setUpModule", "setup_module")
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:310: in obj
    self._obj = obj = self._getobj()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:528: in _getobj
    return self._importtestmodule()
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/python.py:617: in _importtestmodule
    mod = import_path(self.path, mode=importmode, root=self.config.rootpath)
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/pathlib.py:567: in import_path
    importlib.import_module(module_name)
/home/neil/miniconda3/envs/topo312/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
<frozen importlib._bootstrap>:1381: in _gcd_import
    ???
<frozen importlib._bootstrap>:1354: in _find_and_load
    ???
<frozen importlib._bootstrap>:1325: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:929: in _load_unlocked
    ???
/home/neil/miniconda3/envs/topo312/lib/python3.12/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
    exec(co, module.__dict__)
tests/test_pxp.py:3: in <module>
    from igor2.packed import load as loadpxp
igor2/__init__.py:5: in <module>
    from . import binarywave
igor2/binarywave.py:114: in <module>
    BinHeader1 = _Structure(
E   TypeError: Struct() takes at most 1 keyword argument (2 given)
============================================================================= short test summary info ==============================================================================
ERROR tests/test_ibw.py - TypeError: Struct() takes at most 1 keyword argument (2 given)
ERROR tests/test_pxp.py - TypeError: Struct() takes at most 1 keyword argument (2 given)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
================================================================================ 2 errors in 0.41s =================================================================================

I'm confused, I can see the igor2.struct.Structure class inherits struct.Struct but don't understand how or why the error is thrown because the __init__() for igor2.struct.Structure defines three arguments (two required, one with default).

It almost looks like the from .struct import Structure as _Structure is actually importing the struct.Struct class by mistake. 🤷

ns-rse pushed a commit to ns-rse/igor2 that referenced this issue Dec 9, 2023
Whilst checking up on AFM-analysis#9 I was browsing the other issues and thought I might be
Work related to AFM-analysis#6

Fixes the entry points (also known as Command Line Interface) by...

* Adding `if __name__ == "__main__:"` to each of the `cll.*` submodules to instantiate and run the classes defined
  within.
* Changes some of the dependencies (`matplotlib`) to not be conditional on installing the CLI optional dependencies.
* Corrects the entry points defined in `pyproject.toml`

```bash
(igor2) ❱ pip install -e .
(igor2) ❱ igorbinarywave -f tests/data/mac-double.ibw
5
4
3
2
1
(igor2) ❱ igorpackedexperiment -f tests/data/polar-graphs-demo.pxp
[<UnknownRecord-11 139944549273552>,
 <UnknownRecord-12 139944553167504>,
 <UnknownRecord-13 139944550564240>,
 <UnknownRecord-13 139944549266768>,
 <UnknownRecord-13 139944550696400>,
 <UnknownRecord-13 139944561918096>,
 <UnknownRecord-13 139944549482768>,
 <UnknownRecord-13 139944549486032>,
 <UnknownRecord-13 139944549484816>,
 <UnknownRecord-14 139944561920272>,
 <UnknownRecord-15 139944549492432>,
 <UnknownRecord-16 139944549498448>,
 <UnknownRecord-16 139944549491792>,
 <UnknownRecord-17 139944549496784>,
 <UnknownRecord-17 139944549498704>,
 <UnknownRecord-17 139944549496912>,
 <UnknownRecord-17 139944549497040>,
 <UnknownRecord-17 139944549497232>,
 <UnknownRecord-17 139944549497296>,
 <UnknownRecord-16 139944549497424>,
 <UnknownRecord-17 139944549497552>,
 <UnknownRecord-17 139944549497680>,
 <UnknownRecord-17 139944549497872>,
 <UnknownRecord-17 139944549498512>,
 <UnknownRecord-17 139944549532496>,
 <UnknownRecord-17 139944549532816>,
 <UnknownRecord-18 139944549532112>,
 <UnknownRecord-11 139944549532176>,
 <UnknownRecord-26 139944549531984>,
 <UnknownRecord-26 139944549533072>,
 <VariablesRecord 139944549532944>,
 <HistoryRecord 139944549536208>,
 <WaveRecord 139944549536528>,
 <WaveRecord 139944549361232>,
 <WaveRecord 139944552677264>,
 <WaveRecord 139944558782928>,
 <WaveRecord 139944551312848>,
 <WaveRecord 139944552724496>,
 <WaveRecord 139944578160784>,
 <WaveRecord 139944548687696>,
 <FolderStartRecord 139944560740304>,
 <FolderStartRecord 139944561017296>,
 <VariablesRecord 139944549535312>,
 <FolderEndRecord 139944549482640>,
 <FolderStartRecord 139944548760272>,
 <VariablesRecord 139944561920208>,
 <FolderEndRecord 139944548686224>,
 <FolderEndRecord 139944556294736>,
 <RecreationRecord 139944548890320>,
 <GetHistoryRecord 139944549546960>,
 <ProcedureRecord 139944554896400>]
```

I'm not sure if this is the expected output but the entry points work in some manner. I couldn't work out the difference
between the test data files (I'm on GNU/Linux rather than OSX/Windows).

However, I don't think this should be the final solution as there is still a dependency on the original `igor` as the
[`Script`](https://github.com/wking/igor/blob/master/igor/script.py) module is imported and it would make more sense to
have the entry points defined wholly within `igor2`.
@kmnhan
Copy link

kmnhan commented Mar 6, 2024

This seems to be due to a regression in cpython that was fixed in 3.12.2: python/cpython#112358

@ns-rse
Copy link
Author

ns-rse commented Mar 6, 2024

I noticed the other day that TopoStats now ran under Python 3.12.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants