xeus-python icon indicating copy to clipboard operation
xeus-python copied to clipboard

OSX: JupyterLab debugger doesn’t work with xeus-python

Open arjxn-py opened this issue 2 months ago • 10 comments

Summary
When using xeus-python as the kernel, the JupyterLab debugger freezes as soon as a breakpoint is hit. The code pauses, but the debugger never updates — no variables, no stack, nothing. The UI becomes stuck until the kernel is interrupted.

https://github.com/user-attachments/assets/47fd1693-71ea-4c55-80fc-a261bc16e00c


Steps to Reproduce

  1. Open JupyterLab.
  2. Create a new notebook.
  3. Select xeus-python as the kernel.
  4. Open the Debugger panel.
  5. Click Enable Debugger.
  6. Add the following code in a cell
  7. Set a breakpoint on any line
  8. Execute the code cells

Code snippet for testing convenience

 def inner(n):
  if n <= 0:
      return 0
  return n + inner(n - 1)
def outer(n):
    x = inner(n)
    return x * 2
result = outer(3)
result

arjxn-py avatar Dec 06 '25 18:12 arjxn-py

Can you check if the version of Python you have? If it is 3.13, can you test with 3.12 or 3.14?

JohanMabille avatar Dec 06 '25 20:12 JohanMabille

The last time I had tested in python version 3.12, I can try with 3.13 and 3.14 and report accordingly

arjxn-py avatar Dec 06 '25 23:12 arjxn-py

With python 3.13 i don't even see the debugger button enabled and i also see an error in the terminal

Error Logs
[I 2025-12-07 18:53:22.419 ServerApp] Kernel started: 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63
Cmd click to launch VS Code Native REPL
[I 2025-12-07 18:53:22.613 ServerApp] Connecting to kernel 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63.
[W 2025-12-07 18:53:27.018 ServerApp] 404 GET /.well-known/appspecific/com.chrome.devtools.json (c4717ff5982649f4ae61eff25a72b425@::1) 20.21ms referer=None
[E 2025-12-07 18:54:02.449 ServerApp] Uncaught exception in ZMQStream callback
    Traceback (most recent call last):
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
        f = callback(*args, **kwargs)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
        msg = session.deserialize(fed_msg_list, content=False)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
        raise ValueError(msg)
    ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
[E 2025-12-07 18:54:02.456 ServerApp] Uncaught exception in zmqstream callback
    Traceback (most recent call last):
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 600, in _handle_events
        self._handle_recv()
        ~~~~~~~~~~~~~~~~~^^
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 629, in _handle_recv
        self._run_callback(callback, msg)
        ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
        f = callback(*args, **kwargs)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
        msg = session.deserialize(fed_msg_list, content=False)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
        raise ValueError(msg)
    ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
Exception in callback BaseAsyncIOLoop._handle_events()
handle: <Handle BaseAsyncIOLoop._handle_events()>
Traceback (most recent call last):
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/asyncio/events.py", line 89, in _run
    self._context.run(self._callback, *self._args)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/tornado/platform/asyncio.py", line 208, in _handle_events
    handler_func(fileobj, events)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 600, in _handle_events
    self._handle_recv()
    ~~~~~~~~~~~~~~~~~^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 629, in _handle_recv
    self._run_callback(callback, msg)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
    f = callback(*args, **kwargs)
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
    msg = session.deserialize(fed_msg_list, content=False)
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
    raise ValueError(msg)
ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
[E 2025-12-07 18:54:02.460 ServerApp] Uncaught exception in ZMQStream callback
    Traceback (most recent call last):
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
        f = callback(*args, **kwargs)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
        msg = session.deserialize(fed_msg_list, content=False)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
        raise ValueError(msg)
    ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
[E 2025-12-07 18:54:02.460 ServerApp] Uncaught exception in zmqstream callback
    Traceback (most recent call last):
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 600, in _handle_events
        self._handle_recv()
        ~~~~~~~~~~~~~~~~~^^
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 629, in _handle_recv
        self._run_callback(callback, msg)
        ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
        f = callback(*args, **kwargs)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
        msg = session.deserialize(fed_msg_list, content=False)
      File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
        raise ValueError(msg)
    ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
Exception in callback BaseAsyncIOLoop._handle_events()
handle: <Handle BaseAsyncIOLoop._handle_events()>
Traceback (most recent call last):
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/asyncio/events.py", line 89, in _run
    self._context.run(self._callback, *self._args)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/tornado/platform/asyncio.py", line 208, in _handle_events
    handler_func(fileobj, events)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 600, in _handle_events
    self._handle_recv()
    ~~~~~~~~~~~~~~~~~^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 629, in _handle_recv
    self._run_callback(callback, msg)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/zmq/eventloop/zmqstream.py", line 550, in _run_callback
    f = callback(*args, **kwargs)
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_server/services/kernels/kernelmanager.py", line 602, in record_activity
    msg = session.deserialize(fed_msg_list, content=False)
  File "/Users/arjunverma/mambaforge/envs/xptest13/lib/python3.13/site-packages/jupyter_client/session.py", line 1074, in deserialize
    raise ValueError(msg)
ValueError: Invalid Signature: b'0000000000000000000000000000000000000000000000000000000000000000'
[I 2025-12-07 18:54:02.568 ServerApp] Kernel restarted: 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63
[I 2025-12-07 18:54:02.571 ServerApp] Starting buffering for 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63:eb024ea1-b2f6-40d7-a94e-91ddf648d4fa
[I 2025-12-07 18:54:02.573 ServerApp] Connecting to kernel 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63.
[I 2025-12-07 18:54:02.573 ServerApp] Restoring connection for 1837a1ce-b3b9-4e83-ade1-b4a1a310fe63:eb024ea1-b2f6-40d7-a94e-91ddf648d4fa
Cmd click to launch VS Code Native REPL

arjxn-py avatar Dec 07 '25 13:12 arjxn-py

With python 3.14 I see the exact similar behaviour as shown in screencast in https://github.com/jupyter-xeus/xeus-python/issues/679#issue-3702152161

arjxn-py avatar Dec 07 '25 13:12 arjxn-py

I cannot reproduce with latest xeus-python. How did you install it? If you installed it (or its dependencies) with micromamba, can you copy/paste the result of micromamba list ? Also, on which OS (and which version) do you have the issue?

JohanMabille avatar Dec 08 '25 08:12 JohanMabille

I created environment and installed dependencies with mamba - here is the output of mamba list in my env:

`mamba list` output
(xptest14) arjunverma@Arjuns-MacBook-Air jupyterlab % mamba list
List of packages in environment: "/Users/arjunverma/mambaforge/envs/xptest14"

  Name                           Version       Build               Channel    
────────────────────────────────────────────────────────────────────────────────
  _python_abi3_support           1.0           hd8ed1ab_2          conda-forge
  anyio                          4.12.0        pyhcf101f3_0        conda-forge
  appnope                        0.1.4         pyhd8ed1ab_1        conda-forge
  argon2-cffi                    25.1.0        pyhd8ed1ab_0        conda-forge
  argon2-cffi-bindings           25.1.0        py314h0612a62_2     conda-forge
  arrow                          1.4.0         pyhcf101f3_0        conda-forge
  asttokens                      3.0.1         pyhd8ed1ab_0        conda-forge
  async-lru                      2.0.5         pyh29332c3_0        conda-forge
  attrs                          25.4.0        pyhcf101f3_1        conda-forge
  babel                          2.17.0        pyhd8ed1ab_0        conda-forge
  backports.zstd                 1.2.0         py314h680f03e_0     conda-forge
  beautifulsoup4                 4.14.3        pyha770c72_0        conda-forge
  bleach                         6.3.0         pyhcf101f3_0        conda-forge
  bleach-with-css                6.3.0         h5f6438b_0          conda-forge
  brotli-python                  1.2.0         py314h3daef5d_1     conda-forge
  bzip2                          1.0.8         hd037594_8          conda-forge
  ca-certificates                2025.11.12    hbd8a1cb_0          conda-forge
  cached-property                1.5.2         hd8ed1ab_1          conda-forge
  cached_property                1.5.2         pyha770c72_1        conda-forge
  certifi                        2025.11.12    pyhd8ed1ab_0        conda-forge
  cffi                           2.0.0         py314h44086f9_1     conda-forge
  charset-normalizer             3.4.4         pyhd8ed1ab_0        conda-forge
  comm                           0.2.3         pyhe01879c_0        conda-forge
  cpython                        3.14.2        py314hd8ed1ab_100   conda-forge
  debugpy                        1.8.17        py314hf820bb6_1     conda-forge
  decorator                      5.2.1         pyhd8ed1ab_0        conda-forge
  defusedxml                     0.7.1         pyhd8ed1ab_0        conda-forge
  exceptiongroup                 1.3.1         pyhd8ed1ab_0        conda-forge
  executing                      2.2.1         pyhd8ed1ab_0        conda-forge
  fqdn                           1.5.1         pyhd8ed1ab_1        conda-forge
  h11                            0.16.0        pyhd8ed1ab_0        conda-forge
  h2                             4.3.0         pyhcf101f3_0        conda-forge
  hpack                          4.1.0         pyhd8ed1ab_0        conda-forge
  httpcore                       1.0.9         pyh29332c3_0        conda-forge
  httpx                          0.28.1        pyhd8ed1ab_0        conda-forge
  hyperframe                     6.1.0         pyhd8ed1ab_0        conda-forge
  idna                           3.11          pyhd8ed1ab_0        conda-forge
  importlib-metadata             8.7.0         pyhe01879c_1        conda-forge
  ipykernel                      7.1.0         pyh5552912_0        conda-forge
  ipython                        9.8.0         pyh53cf698_0        conda-forge
  ipython_pygments_lexers        1.1.1         pyhd8ed1ab_0        conda-forge
  isoduration                    20.11.0       pyhd8ed1ab_1        conda-forge
  jedi                           0.19.2        pyhd8ed1ab_1        conda-forge
  jinja2                         3.1.6         pyhcf101f3_1        conda-forge
  json5                          0.12.1        pyhd8ed1ab_0        conda-forge
  jsonpointer                    3.0.0         pyhcf101f3_3        conda-forge
  jsonschema                     4.25.1        pyhe01879c_0        conda-forge
  jsonschema-specifications      2025.9.1      pyhcf101f3_0        conda-forge
  jsonschema-with-format-nongpl  4.25.1        he01879c_0          conda-forge
  jupyter-lsp                    2.3.0         pyhcf101f3_0        conda-forge
  jupyter_client                 8.6.3         pyhd8ed1ab_1        conda-forge
  jupyter_core                   5.9.1         pyhc90fa1f_0        conda-forge
  jupyter_events                 0.12.0        pyh29332c3_0        conda-forge
  jupyter_server                 2.17.0        pyhcf101f3_0        conda-forge
  jupyter_server_terminals       0.5.3         pyhd8ed1ab_1        conda-forge
  jupyterlab                     4.5.0         pyhd8ed1ab_0        conda-forge
  jupyterlab_pygments            0.3.0         pyhd8ed1ab_2        conda-forge
  jupyterlab_server              2.28.0        pyhcf101f3_0        conda-forge
  krb5                           1.21.3        h237132a_0          conda-forge
  lark                           1.3.1         pyhd8ed1ab_0        conda-forge
  libcxx                         21.1.7        hf598326_0          conda-forge
  libedit                        3.1.20250104  pl5321hafb1f1b_0    conda-forge
  libexpat                       2.7.3         haf25636_0          conda-forge
  libffi                         3.5.2         he5f378a_0          conda-forge
  liblzma                        5.8.1         h39f12f2_2          conda-forge
  libmpdec                       4.0.0         h5505292_0          conda-forge
  libsodium                      1.0.20        h99b78c6_0          conda-forge
  libsqlite                      3.51.1        h9a5124b_0          conda-forge
  libzlib                        1.3.1         h8359307_2          conda-forge
  markupsafe                     3.0.3         pyh7db6752_0        conda-forge
  matplotlib-inline              0.2.1         pyhd8ed1ab_0        conda-forge
  mistune                        3.1.4         pyhcf101f3_0        conda-forge
  nbclient                       0.10.2        pyhd8ed1ab_0        conda-forge
  nbconvert-core                 7.16.6        pyhcf101f3_1        conda-forge
  nbformat                       5.10.4        pyhd8ed1ab_1        conda-forge
  ncurses                        6.5           h5e97a16_3          conda-forge
  nest-asyncio                   1.6.0         pyhd8ed1ab_1        conda-forge
  nlohmann_json-abi              3.12.0        h0f90c79_1          conda-forge
  notebook-shim                  0.2.4         pyhd8ed1ab_1        conda-forge
  openssl                        3.6.0         h5503f6c_0          conda-forge
  overrides                      7.7.0         pyhd8ed1ab_1        conda-forge
  packaging                      25.0          pyh29332c3_1        conda-forge
  pandocfilters                  1.5.0         pyhd8ed1ab_0        conda-forge
  parso                          0.8.5         pyhcf101f3_0        conda-forge
  pexpect                        4.9.0         pyhd8ed1ab_1        conda-forge
  pip                            25.3          pyh145f28c_0        conda-forge
  platformdirs                   4.5.1         pyhcf101f3_0        conda-forge
  prometheus_client              0.23.1        pyhd8ed1ab_0        conda-forge
  prompt-toolkit                 3.0.52        pyha770c72_0        conda-forge
  psutil                         7.1.3         py314h9d33bd4_0     conda-forge
  ptyprocess                     0.7.0         pyhd8ed1ab_1        conda-forge
  pure_eval                      0.2.3         pyhd8ed1ab_1        conda-forge
  pycparser                      2.22          pyh29332c3_1        conda-forge
  pygments                       2.19.2        pyhd8ed1ab_0        conda-forge
  pyobjc-core                    12.1          py314h3a4d195_0     conda-forge
  pyobjc-framework-cocoa         12.1          py314h36abed7_0     conda-forge
  pysocks                        1.7.1         pyha55dd90_7        conda-forge
  python                         3.14.2        h40d2674_100_cp314  conda-forge
  python-dateutil                2.9.0.post0   pyhe01879c_2        conda-forge
  python-fastjsonschema          2.21.2        pyhe01879c_0        conda-forge
  python-gil                     3.14.2        h4df99d1_100        conda-forge
  python-json-logger             2.0.7         pyhd8ed1ab_0        conda-forge
  python-tzdata                  2025.2        pyhd8ed1ab_0        conda-forge
  python_abi                     3.14          8_cp314             conda-forge
  pytz                           2025.2        pyhd8ed1ab_0        conda-forge
  pyyaml                         6.0.3         pyh7db6752_0        conda-forge
  pyzmq                          27.1.0        py312hd65ceae_0     conda-forge
  readline                       8.2           h1d1bf99_2          conda-forge
  referencing                    0.37.0        pyhcf101f3_0        conda-forge
  requests                       2.32.5        pyhd8ed1ab_0        conda-forge
  rfc3339-validator              0.1.4         pyhd8ed1ab_1        conda-forge
  rfc3986-validator              0.1.1         pyh9f0ad1d_0        conda-forge
  rfc3987-syntax                 1.1.0         pyhe01879c_1        conda-forge
  rpds-py                        0.30.0        py314haad56a0_0     conda-forge
  send2trash                     1.8.3         pyh31c8845_1        conda-forge
  setuptools                     80.9.0        pyhff2d567_0        conda-forge
  six                            1.17.0        pyhe01879c_1        conda-forge
  sniffio                        1.3.1         pyhd8ed1ab_2        conda-forge
  soupsieve                      2.8           pyhd8ed1ab_0        conda-forge
  stack_data                     0.6.3         pyhd8ed1ab_1        conda-forge
  terminado                      0.18.1        pyh31c8845_0        conda-forge
  tinycss2                       1.5.1         pyhcf101f3_0        conda-forge
  tk                             8.6.13        h892fb3f_3          conda-forge
  tomli                          2.3.0         pyhcf101f3_0        conda-forge
  tornado                        6.5.2         py314h0612a62_2     conda-forge
  traitlets                      5.14.3        pyhd8ed1ab_1        conda-forge
  typing-extensions              4.15.0        h396c80c_0          conda-forge
  typing_extensions              4.15.0        pyhcf101f3_0        conda-forge
  typing_utils                   0.1.0         pyhd8ed1ab_1        conda-forge
  tzdata                         2025b         h78e105d_0          conda-forge
  uri-template                   1.3.0         pyhd8ed1ab_1        conda-forge
  urllib3                        2.6.0         pyhd8ed1ab_0        conda-forge
  wcwidth                        0.2.14        pyhd8ed1ab_0        conda-forge
  webcolors                      25.10.0       pyhd8ed1ab_0        conda-forge
  webencodings                   0.5.1         pyhd8ed1ab_3        conda-forge
  websocket-client               1.9.0         pyhd8ed1ab_0        conda-forge
  xeus                           5.2.6         h49c215f_0          conda-forge
  xeus-python                    0.17.6        py314hb7f56de_0     conda-forge
  xeus-python-shell              0.6.4         pyhff2d567_0        conda-forge
  xeus-python-shell-raw          0.6.4         pyhd8ed1ab_0        conda-forge
  xeus-zmq                       3.1.1         h8b721d0_0          conda-forge
  yaml                           0.2.5         h925e9cb_3          conda-forge
  zeromq                         4.3.5         h888dc83_9          conda-forge
  zipp                           3.23.0        pyhcf101f3_1        conda-forge
  zstd                           1.5.7         hbf9d68e_6          conda-forge

I am on MacOS Sequoia 15.5

arjxn-py avatar Dec 08 '25 09:12 arjxn-py

Although I haven't used micromamba to do this but when i run micromamba list - I get these nasty error logs:

Error Logs

              "Operating System :: POSIX :: BSD :: NetBSD",
              "Operating System :: POSIX :: BSD :: OpenBSD",
              "Operating System :: POSIX :: BSD",
              "Operating System :: POSIX :: Linux",
              "Operating System :: POSIX :: SunOS/Solaris",
              "Operating System :: POSIX",
              "Programming Language :: C",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: Implementation :: CPython",
              "Programming Language :: Python :: Implementation :: PyPy",
              "Programming Language :: Python",
              "Topic :: Software Development :: Libraries :: Python Modules",
              "Topic :: Software Development :: Libraries",
              "Topic :: System :: Benchmark",
              "Topic :: System :: Hardware",
              "Topic :: System :: Monitoring",
              "Topic :: System :: Networking :: Monitoring :: Hardware Watchdog",
              "Topic :: System :: Networking :: Monitoring",
              "Topic :: System :: Networking",
              "Topic :: System :: Operating System",
              "Topic :: System :: Systems Administration",
              "Topic :: Utilities"
            ],
            "requires_dist": [
              "pytest; extra == \"dev\"",
              "pytest-instafail; extra == \"dev\"",
              "pytest-subtests; extra == \"dev\"",
              "pytest-xdist; extra == \"dev\"",
              "setuptools; extra == \"dev\"",
              "pywin32; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"dev\"",
              "wheel; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"dev\"",
              "wmi; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"dev\"",
              "abi3audit; extra == \"dev\"",
              "black; extra == \"dev\"",
              "check-manifest; extra == \"dev\"",
              "colorama; os_name == \"nt\" and extra == \"dev\"",
              "coverage; extra == \"dev\"",
              "packaging; extra == \"dev\"",
              "pylint; extra == \"dev\"",
              "pyperf; extra == \"dev\"",
              "pypinfo; extra == \"dev\"",
              "pyreadline; os_name == \"nt\" and extra == \"dev\"",
              "pytest-cov; extra == \"dev\"",
              "requests; extra == \"dev\"",
              "rstcheck; extra == \"dev\"",
              "ruff; extra == \"dev\"",
              "sphinx; extra == \"dev\"",
              "sphinx_rtd_theme; extra == \"dev\"",
              "toml-sort; extra == \"dev\"",
              "twine; extra == \"dev\"",
              "validate-pyproject[all]; extra == \"dev\"",
              "virtualenv; extra == \"dev\"",
              "vulture; extra == \"dev\"",
              "wheel; extra == \"dev\"",
              "pytest; extra == \"test\"",
              "pytest-instafail; extra == \"test\"",
              "pytest-subtests; extra == \"test\"",
              "pytest-xdist; extra == \"test\"",
              "setuptools; extra == \"test\"",
              "pywin32; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"test\"",
              "wheel; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"test\"",
              "wmi; (os_name == \"nt\" and platform_python_implementation != \"PyPy\") and extra == \"test\""
            ],
            "requires_python": ">=3.6",
            "provides_extra": [
              "dev",
              "test"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/psutil-7.1.3.dist-info",
          "direct_url": {
            "url": "file:///Users/runner/miniforge3/conda-bld/bld/rattler-build_psutil_1762093068/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "zipp",
            "version": "3.23.0",
            "dynamic": [
              "license-file"
            ],
            "summary": "Backport of pathlib-compatible object wrapper for zip files",
            "description": ".. image:: https://img.shields.io/pypi/v/zipp.svg\n   :target: https://pypi.org/project/zipp\n\n.. image:: https://img.shields.io/pypi/pyversions/zipp.svg\n\n.. image:: https://github.com/jaraco/zipp/actions/workflows/main.yml/badge.svg\n   :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22tests%22\n   :alt: tests\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\n    :target: https://github.com/astral-sh/ruff\n    :alt: Ruff\n\n.. image:: https://readthedocs.org/projects/zipp/badge/?version=latest\n..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest\n\n.. image:: https://img.shields.io/badge/skeleton-2025-informational\n   :target: https://blog.jaraco.com/skeleton\n\n.. image:: https://tidelift.com/badges/package/pypi/zipp\n   :target: https://tidelift.com/subscription/pkg/pypi-zipp?utm_source=pypi-zipp&utm_medium=readme\n\n\nA pathlib-compatible Zipfile object wrapper. Official backport of the standard library\n`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.\n\n\nCompatibility\n=============\n\nNew features are introduced in this third-party library and later merged\ninto CPython. The following table indicates which versions of this library\nwere contributed to different versions in the standard library:\n\n.. list-table::\n   :header-rows: 1\n\n   * - zipp\n     - stdlib\n   * - 3.18\n     - 3.13\n   * - 3.16\n     - 3.12\n   * - 3.5\n     - 3.11\n   * - 3.2\n     - 3.10\n   * - 3.3 ??\n     - 3.9\n   * - 1.0\n     - 3.8\n\n\nUsage\n=====\n\nUse ``zipp.Path`` in place of ``zipfile.Path`` on any Python.\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nThis project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-zipp?utm_source=pypi-zipp&utm_medium=referral&utm_campaign=github>`_.\n",
            "description_content_type": "text/x-rst",
            "author_email": "\"Jason R. Coombs\" <[email protected]>",
            "license_expression": "MIT",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 5 - Production/Stable",
              "Intended Audience :: Developers",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3 :: Only"
            ],
            "requires_dist": [
              "pytest!=8.1.*,>=6; extra == \"test\"",
              "jaraco.itertools; extra == \"test\"",
              "jaraco.functools; extra == \"test\"",
              "more_itertools; extra == \"test\"",
              "big-O; extra == \"test\"",
              "pytest-ignore-flaky; extra == \"test\"",
              "jaraco.test; extra == \"test\"",
              "sphinx>=3.5; extra == \"doc\"",
              "jaraco.packaging>=9.3; extra == \"doc\"",
              "rst.linker>=1.9; extra == \"doc\"",
              "furo; extra == \"doc\"",
              "sphinx-lint; extra == \"doc\"",
              "jaraco.tidelift>=1.4; extra == \"doc\"",
              "pytest-checkdocs>=2.4; extra == \"check\"",
              "pytest-ruff>=0.2.1; sys_platform != \"cygwin\" and extra == \"check\"",
              "pytest-cov; extra == \"cover\"",
              "pytest-enabler>=2.2; extra == \"enabler\"",
              "pytest-mypy; extra == \"type\""
            ],
            "requires_python": ">=3.9",
            "project_url": [
              "Source, https://github.com/jaraco/zipp"
            ],
            "provides_extra": [
              "test",
              "doc",
              "check",
              "cover",
              "enabler",
              "type"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/zipp-3.23.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_zipp_1764460141/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "wcwidth",
            "version": "0.2.14",
            "dynamic": [
              "author",
              "author-email",
              "classifier",
              "description",
              "home-page",
              "keywords",
              "license",
              "license-file",
              "requires-python",
              "summary"
            ],
            "summary": "Measures the displayed width of unicode strings in a terminal",
            "description": "|pypi_downloads| |codecov| |license|\n\n============\nIntroduction\n============\n\nThis library is mainly for CLI programs that carefully produce output for\nTerminals, or make pretend to be an emulator.\n\n**Problem Statement**: The printable length of *most* strings are equal to the\nnumber of cells they occupy on the screen ``1 character : 1 cell``.  However,\nthere are categories of characters that *occupy 2 cells* (full-wide), and\nothers that *occupy 0* cells (zero-width).\n\n**Solution**: POSIX.1-2001 and POSIX.1-2008 conforming systems provide\n`wcwidth(3)`_ and `wcswidth(3)`_ C functions of which this python module's\nfunctions precisely copy.  *These functions return the number of cells a\nunicode string is expected to occupy.*\n\nInstallation\n------------\n\nThe stable version of this package is maintained on pypi, install using pip::\n\n    pip install wcwidth\n\nExample\n-------\n\n**Problem**: given the following phrase (Japanese),\n\n   >>>  text = u'コンニチハ'\n\nPython **incorrectly** uses the *string length* of 5 codepoints rather than the\n*printable length* of 10 cells, so that when using the `rjust` function, the\noutput length is wrong::\n\n    >>> print(len('コンニチハ'))\n    5\n\n    >>> print('コンニチハ'.rjust(20, '_'))\n    _______________コンニチハ\n\nBy defining our own \"rjust\" function that uses wcwidth, we can correct this::\n\n   >>> def wc_rjust(text, length, padding=' '):\n   ...    from wcwidth import wcswidth\n   ...    return padding * max(0, (length - wcswidth(text))) + text\n   ...\n\nOur **Solution** uses wcswidth to determine the string length correctly::\n\n   >>> from wcwidth import wcswidth\n   >>> print(wcswidth('コンニチハ'))\n   10\n\n   >>> print(wc_rjust('コンニチハ', 20, '_'))\n   __________コンニチハ\n\n\nChoosing a Version\n------------------\n\nExport an environment variable, ``UNICODE_VERSION``. This should be done by\n*terminal emulators* or those developers experimenting with authoring one of\ntheir own, from shell::\n\n   $ export UNICODE_VERSION=13.0\n\nIf unspecified, the latest version is used. If your Terminal Emulator does not\nexport this variable, you can use the `jquast/ucs-detect`_ utility to\nautomatically detect and export it to your shell.\n\nwcwidth, wcswidth\n-----------------\nUse function ``wcwidth()`` to determine the length of a *single unicode\ncharacter*, and ``wcswidth()`` to determine the length of many, a *string\nof unicode characters*.\n\nBriefly, return values of function ``wcwidth()`` are:\n\n``-1``\n  Indeterminate (not printable).\n\n``0``\n  Does not advance the cursor, such as NULL or Combining.\n\n``2``\n  Characters of category East Asian Wide (W) or East Asian\n  Full-width (F) which are displayed using two terminal cells.\n\n``1``\n  All others.\n\nFunction ``wcswidth()`` simply returns the sum of all values for each character\nalong a string, or ``-1`` when it occurs anywhere along a string.\n\nFull API Documentation at https://wcwidth.readthedocs.io\n\n==========\nDeveloping\n==========\n\nInstall wcwidth in editable mode::\n\n   pip install -e .\n\nExecute unit tests using tox_ for all supported Python versions::\n\n   tox -e py36,py37,py38,py39,py310,py311,py312,py313,py314\n\nUpdating Unicode Version\n------------------------\n\nRegenerate python code tables from latest Unicode Specification data files::\n\n   tox -e update\n\nThe script is located at ``bin/update-tables.py``, requires Python 3.9 or\nlater. It is recommended but not necessary to run this script with the newest\nPython, because the newest Python has the latest ``unicodedata`` for generating\ncomments.\n\nBuilding Documentation\n----------------------\n\nThis project is using `sphinx`_ 4.5 to build documentation::\n\n   tox -e sphinx\n\nThe output will be in ``docs/_build/html/``.\n\nUpdating Requirements\n---------------------\n\nThis project is using `pip-tools`_ to manage requirements.\n\nTo upgrade requirements for updating unicode version, run::\n\n   tox -e update_requirements_update\n\nTo upgrade requirements for testing, run::\n\n   tox -e update_requirements37,update_requirements39\n\nTo upgrade requirements for building documentation, run::\n\n   tox -e update_requirements_docs\n\nUtilities\n---------\n\nSupplementary tools for browsing and testing terminals for wide unicode\ncharacters are found in the `bin/`_ of this project's source code.  Just ensure\nto first ``pip install -r requirements-develop.txt`` from this projects main\nfolder. For example, an interactive browser for testing::\n\n  python ./bin/wcwidth-browser.py\n\n====\nUses\n====\n\nThis library is used in:\n\n- `jquast/blessed`_: a thin, practical wrapper around terminal capabilities in\n  Python.\n\n- `prompt-toolkit/python-prompt-toolkit`_: a Library for building powerful\n  interactive command lines in Python.\n\n- `dbcli/pgcli`_: Postgres CLI with autocompletion and syntax highlighting.\n\n- `thomasballinger/curtsies`_: a Curses-like terminal wrapper with a display\n  based on compositing 2d arrays of text.\n\n- `selectel/pyte`_: Simple VTXXX-compatible linux terminal emulator.\n\n- `astanin/python-tabulate`_: Pretty-print tabular data in Python, a library\n  and a command-line utility.\n\n- `rspeer/python-ftfy`_: Fixes mojibake and other glitches in Unicode\n  text.\n\n- `nbedos/termtosvg`_: Terminal recorder that renders sessions as SVG\n  animations.\n\n- `peterbrittain/asciimatics`_: Package to help people create full-screen text\n  UIs.\n\n- `python-cmd2/cmd2`_: A tool for building interactive command line apps\n\n- `stratis-storage/stratis-cli`_: CLI for the Stratis project\n\n- `ihabunek/toot`_: A Mastodon CLI/TUI client\n\n- `saulpw/visidata`_: Terminal spreadsheet multitool for discovering and\n  arranging data\n\n===============\nOther Languages\n===============\n\n- `timoxley/wcwidth`_: JavaScript\n- `janlelis/unicode-display_width`_: Ruby\n- `alecrabbit/php-wcwidth`_: PHP\n- `Text::CharWidth`_: Perl\n- `bluebear94/Terminal-WCWidth`_: Perl 6\n- `mattn/go-runewidth`_: Go\n- `grepsuzette/wcwidth`_: Haxe\n- `aperezdc/lua-wcwidth`_: Lua\n- `joachimschmidt557/zig-wcwidth`_: Zig\n- `fumiyas/wcwidth-cjk`_: `LD_PRELOAD` override\n- `joshuarubin/wcwidth9`_: Unicode version 9 in C\n\n=======\nHistory\n=======\n\n0.2.14 *2025-09-22*\n  * **Drop Support** for Python 2.7 and 3.5. `PR #117`_.\n  * **Update** tables to include Unicode Specifications 16.0.0 and 17.0.0.\n    `PR #146`_.\n  * **Bugfix** U+00AD SOFT HYPHEN should measure as 1, versions 0.2.9 through\n    0.2.13 measured as 0. `PR #149`_.\n\n0.2.13 *2024-01-06*\n  * **Bugfix** zero-width support for Hangul Jamo (Korean)\n\n0.2.12 *2023-11-21*\n  * re-release to remove .pyi file misplaced in wheel files `Issue #101`_.\n\n0.2.11 *2023-11-20*\n  * Include tests files in the source distribution (`PR #98`_, `PR #100`_).\n\n0.2.10 *2023-11-13*\n  * **Bugfix** accounting of some kinds of emoji sequences using U+FE0F\n    Variation Selector 16 (`PR #97`_).\n  * **Updated** `Specification <Specification_from_pypi_>`_.\n\n0.2.9 *2023-10-30*\n  * **Bugfix** zero-width characters used in Emoji ZWJ sequences, Balinese,\n    Jamo, Devanagari, Tamil, Kannada and others (`PR #91`_).\n  * **Updated** to include `Specification <Specification_from_pypi_>`_ of\n    character measurements.\n\n0.2.8 *2023-09-30*\n  * Include requirements files in the source distribution (`PR #82`_).\n\n0.2.7 *2023-09-28*\n  * **Updated** tables to include Unicode Specification 15.1.0.\n  * Include ``bin``, ``docs``, and ``tox.ini`` in the source distribution\n\n0.2.6 *2023-01-14*\n  * **Updated** tables to include Unicode Specification 14.0.0 and 15.0.0.\n  * **Changed** developer tools to use pip-compile, and to use jinja2 templates\n    for code generation in `bin/update-tables.py` to prepare for possible\n    compiler optimization release.\n\n0.2.1 .. 0.2.5 *2020-06-23*\n  * **Repository** changes to update tests and packaging issues, and\n    begin tagging repository with matching release versions.\n\n0.2.0 *2020-06-01*\n  * **Enhancement**: Unicode version may be selected by exporting the\n    Environment variable ``UNICODE_VERSION``, such as ``13.0``, or ``6.3.0``.\n    See the `jquast/ucs-detect`_ CLI utility for automatic detection.\n  * **Enhancement**:\n    API Documentation is published to readthedocs.io.\n  * **Updated** tables for *all* Unicode Specifications with files\n    published in a programmatically consumable format, versions 4.1.0\n    through 13.0\n\n0.1.9 *2020-03-22*\n  * **Performance** optimization by `Avram Lubkin`_, `PR #35`_.\n  * **Updated** tables to Unicode Specification 13.0.0.\n\n0.1.8 *2020-01-01*\n  * **Updated** tables to Unicode Specification 12.0.0. (`PR #30`_).\n\n0.1.7 *2016-07-01*\n  * **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).\n\n0.1.6 *2016-01-08 Production/Stable*\n  * ``LICENSE`` file now included with distribution.\n\n0.1.5 *2015-09-13 Alpha*\n  * **Bugfix**:\n    Resolution of \"combining_ character width\" issue, most especially\n    those that previously returned -1 now often (correctly) return 0.\n    resolved by `Philip Craig`_ via `PR #11`_.\n  * **Deprecated**:\n    The module path ``wcwidth.table_comb`` is no longer available,\n    it has been superseded by module path ``wcwidth.table_zero``.\n\n0.1.4 *2014-11-20 Pre-Alpha*\n  * **Feature**: ``wcswidth()`` now determines printable length\n    for (most) combining_ characters.  The developer's tool\n    `bin/wcwidth-browser.py`_ is improved to display combining_\n    characters when provided the ``--combining`` option\n    (`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).\n  * **Feature**: added static analysis (prospector_) to testing\n    framework.\n\n0.1.3 *2014-10-29 Pre-Alpha*\n  * **Bugfix**: 2nd parameter of wcswidth was not honored.\n    (`Thomas Ballinger`_, `PR #4`_).\n\n0.1.2 *2014-10-28 Pre-Alpha*\n  * **Updated** tables to Unicode Specification 7.0.0.\n    (`Thomas Ballinger`_, `PR #3`_).\n\n0.1.1 *2014-05-14 Pre-Alpha*\n  * Initial release to pypi, Based on Unicode Specification 6.3.0\n\nThis code was originally derived directly from C code of the same name,\nwhose latest version is available at\nhttps://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::\n\n * Markus Kuhn -- 2007-05-26 (Unicode 5.0)\n *\n * Permission to use, copy, modify, and distribute this software\n * for any purpose and without fee is hereby granted. The author\n * disclaims all warranties with regard to this software.\n\n.. _`Specification_from_pypi`: https://wcwidth.readthedocs.io/en/latest/specs.html\n.. _`tox`: https://tox.wiki/en/latest/\n.. _`prospector`: https://github.com/landscapeio/prospector\n.. _`combining`: https://en.wikipedia.org/wiki/Combining_character\n.. _`bin/`: https://github.com/jquast/wcwidth/tree/master/bin\n.. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/blob/master/bin/wcwidth-browser.py\n.. _`Thomas Ballinger`: https://github.com/thomasballinger\n.. _`Leta Montopoli`: https://github.com/lmontopo\n.. _`Philip Craig`: https://github.com/philipc\n.. _`PR #3`: https://github.com/jquast/wcwidth/pull/3\n.. _`PR #4`: https://github.com/jquast/wcwidth/pull/4\n.. _`PR #5`: https://github.com/jquast/wcwidth/pull/5\n.. _`PR #11`: https://github.com/jquast/wcwidth/pull/11\n.. _`PR #18`: https://github.com/jquast/wcwidth/pull/18\n.. _`PR #30`: https://github.com/jquast/wcwidth/pull/30\n.. _`PR #35`: https://github.com/jquast/wcwidth/pull/35\n.. _`PR #82`: https://github.com/jquast/wcwidth/pull/82\n.. _`PR #91`: https://github.com/jquast/wcwidth/pull/91\n.. _`PR #97`: https://github.com/jquast/wcwidth/pull/97\n.. _`PR #98`: https://github.com/jquast/wcwidth/pull/98\n.. _`PR #100`: https://github.com/jquast/wcwidth/pull/100\n.. _`PR #117`: https://github.com/jquast/wcwidth/pull/117\n.. _`PR #146`: https://github.com/jquast/wcwidth/pull/146\n.. _`PR #149`: https://github.com/jquast/wcwidth/pull/149\n.. _`Issue #101`: https://github.com/jquast/wcwidth/issues/101\n.. _`jquast/blessed`: https://github.com/jquast/blessed\n.. _`selectel/pyte`: https://github.com/selectel/pyte\n.. _`thomasballinger/curtsies`: https://github.com/thomasballinger/curtsies\n.. _`dbcli/pgcli`: https://github.com/dbcli/pgcli\n.. _`prompt-toolkit/python-prompt-toolkit`: https://github.com/prompt-toolkit/python-prompt-toolkit\n.. _`timoxley/wcwidth`: https://github.com/timoxley/wcwidth\n.. _`wcwidth(3)`:  https://man7.org/linux/man-pages/man3/wcwidth.3.html\n.. _`wcswidth(3)`: https://man7.org/linux/man-pages/man3/wcswidth.3.html\n.. _`astanin/python-tabulate`: https://github.com/astanin/python-tabulate\n.. _`janlelis/unicode-display_width`: https://github.com/janlelis/unicode-display_width\n.. _`rspeer/python-ftfy`: https://github.com/rspeer/python-ftfy\n.. _`alecrabbit/php-wcwidth`: https://github.com/alecrabbit/php-wcwidth\n.. _`Text::CharWidth`: https://metacpan.org/pod/Text::CharWidth\n.. _`bluebear94/Terminal-WCWidth`: https://github.com/bluebear94/Terminal-WCWidth\n.. _`mattn/go-runewidth`: https://github.com/mattn/go-runewidth\n.. _`grepsuzette/wcwidth`: https://github.com/grepsuzette/wcwidth\n.. _`jquast/ucs-detect`: https://github.com/jquast/ucs-detect\n.. _`Avram Lubkin`: https://github.com/avylove\n.. _`nbedos/termtosvg`: https://github.com/nbedos/termtosvg\n.. _`peterbrittain/asciimatics`: https://github.com/peterbrittain/asciimatics\n.. _`aperezdc/lua-wcwidth`: https://github.com/aperezdc/lua-wcwidth\n.. _`joachimschmidt557/zig-wcwidth`: https://github.com/joachimschmidt557/zig-wcwidth\n.. _`fumiyas/wcwidth-cjk`: https://github.com/fumiyas/wcwidth-cjk\n.. _`joshuarubin/wcwidth9`: https://github.com/joshuarubin/wcwidth9\n.. _`python-cmd2/cmd2`: https://github.com/python-cmd2/cmd2\n.. _`stratis-storage/stratis-cli`: https://github.com/stratis-storage/stratis-cli\n.. _`ihabunek/toot`: https://github.com/ihabunek/toot\n.. _`saulpw/visidata`: https://github.com/saulpw/visidata\n.. _`pip-tools`: https://pip-tools.readthedocs.io/\n.. _`sphinx`: https://www.sphinx-doc.org/\n.. |pypi_downloads| image:: https://img.shields.io/pypi/dm/wcwidth.svg?logo=pypi\n    :alt: Downloads\n    :target: https://pypi.org/project/wcwidth/\n.. |codecov| image:: https://codecov.io/gh/jquast/wcwidth/branch/master/graph/badge.svg\n    :alt: codecov.io Code Coverage\n    :target: https://app.codecov.io/gh/jquast/wcwidth/\n.. |license| image:: https://img.shields.io/pypi/l/wcwidth.svg\n    :target: https://pypi.org/project/wcwidth/\n    :alt: MIT License\n",
            "keywords": [
              "cjk",
              "combining",
              "console",
              "eastasian",
              "emoji",
              "emulator",
              "terminal",
              "unicode",
              "wcswidth",
              "wcwidth",
              "xterm"
            ],
            "home_page": "https://github.com/jquast/wcwidth",
            "author": "Jeff Quast",
            "author_email": "[email protected]",
            "license": "MIT",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Intended Audience :: Developers",
              "Natural Language :: English",
              "Development Status :: 5 - Production/Stable",
              "Environment :: Console",
              "License :: OSI Approved :: MIT License",
              "Operating System :: POSIX",
              "Programming Language :: Python :: 3.6",
              "Programming Language :: Python :: 3.7",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13",
              "Programming Language :: Python :: 3.14",
              "Topic :: Software Development :: Libraries",
              "Topic :: Software Development :: Localization",
              "Topic :: Software Development :: Internationalization",
              "Topic :: Terminals"
            ],
            "requires_python": ">=3.6"
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/wcwidth-0.2.14.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/wcwidth_1758622279606/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "tomli",
            "version": "2.3.0",
            "summary": "A lil' TOML parser",
            "description": "[![Build Status](https://github.com/hukkin/tomli/actions/workflows/tests.yaml/badge.svg?branch=master)](https://github.com/hukkin/tomli/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)\n[![codecov.io](https://codecov.io/gh/hukkin/tomli/branch/master/graph/badge.svg)](https://codecov.io/gh/hukkin/tomli)\n[![PyPI version](https://img.shields.io/pypi/v/tomli)](https://pypi.org/project/tomli)\n\n# Tomli\n\n> A lil' TOML parser\n\n**Table of Contents** *generated with [mdformat-toc](https://github.com/hukkin/mdformat-toc)*\n\n<!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->\n\n- [Intro](#intro)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Parse a TOML string](#parse-a-toml-string)\n  - [Parse a TOML file](#parse-a-toml-file)\n  - [Handle invalid TOML](#handle-invalid-toml)\n  - [Construct `decimal.Decimal`s from TOML floats](#construct-decimaldecimals-from-toml-floats)\n  - [Building a `tomli`/`tomllib` compatibility layer](#building-a-tomlitomllib-compatibility-layer)\n- [FAQ](#faq)\n  - [Why this parser?](#why-this-parser)\n  - [Is comment preserving round-trip parsing supported?](#is-comment-preserving-round-trip-parsing-supported)\n  - [Is there a `dumps`, `write` or `encode` function?](#is-there-a-dumps-write-or-encode-function)\n  - [How do TOML types map into Python types?](#how-do-toml-types-map-into-python-types)\n- [Performance](#performance)\n  - [Pure Python](#pure-python)\n  - [Mypyc generated wheel](#mypyc-generated-wheel)\n\n<!-- mdformat-toc end -->\n\n## Intro<a name=\"intro\"></a>\n\nTomli is a Python library for parsing [TOML](https://toml.io).\nIt is fully compatible with [TOML v1.0.0](https://toml.io/en/v1.0.0).\n\nA version of Tomli, the `tomllib` module,\nwas added to the standard library in Python 3.11\nvia [PEP 680](https://www.python.org/dev/peps/pep-0680/).\nTomli continues to provide a backport on PyPI for Python versions\nwhere the standard library module is not available\nand that have not yet reached their end-of-life.\n\nTomli uses [mypyc](https://github.com/mypyc/mypyc)\nto generate binary wheels for most of the widely used platforms,\nso Python 3.11+ users may prefer it over `tomllib` for improved performance.\nPure Python wheels are available on any platform and should perform the same as `tomllib`.\n\n## Installation<a name=\"installation\"></a>\n\n```bash\npip install tomli\n```\n\n## Usage<a name=\"usage\"></a>\n\n### Parse a TOML string<a name=\"parse-a-toml-string\"></a>\n\n```python\nimport tomli\n\ntoml_str = \"\"\"\n[[players]]\nname = \"Lehtinen\"\nnumber = 26\n\n[[players]]\nname = \"Numminen\"\nnumber = 27\n\"\"\"\n\ntoml_dict = tomli.loads(toml_str)\nassert toml_dict == {\n    \"players\": [{\"name\": \"Lehtinen\", \"number\": 26}, {\"name\": \"Numminen\", \"number\": 27}]\n}\n```\n\n### Parse a TOML file<a name=\"parse-a-toml-file\"></a>\n\n```python\nimport tomli\n\nwith open(\"path_to_file/conf.toml\", \"rb\") as f:\n    toml_dict = tomli.load(f)\n```\n\nThe file must be opened in binary mode (with the `\"rb\"` flag).\nBinary mode will enforce decoding the file as UTF-8 with universal newlines disabled,\nboth of which are required to correctly parse TOML.\n\n### Handle invalid TOML<a name=\"handle-invalid-toml\"></a>\n\n```python\nimport tomli\n\ntry:\n    toml_dict = tomli.loads(\"]] this is invalid TOML [[\")\nexcept tomli.TOMLDecodeError:\n    print(\"Yep, definitely not valid.\")\n```\n\nNote that error messages are considered informational only.\nThey should not be assumed to stay constant across Tomli versions.\n\n### Construct `decimal.Decimal`s from TOML floats<a name=\"construct-decimaldecimals-from-toml-floats\"></a>\n\n```python\nfrom decimal import Decimal\nimport tomli\n\ntoml_dict = tomli.loads(\"precision-matters = 0.982492\", parse_float=Decimal)\nassert isinstance(toml_dict[\"precision-matters\"], Decimal)\nassert toml_dict[\"precision-matters\"] == Decimal(\"0.982492\")\n```\n\nNote that `decimal.Decimal` can be replaced with another callable that converts a TOML float from string to a Python type.\nThe `decimal.Decimal` is, however, a practical choice for use cases where float inaccuracies can not be tolerated.\n\nIllegal types are `dict` and `list`, and their subtypes.\nA `ValueError` will be raised if `parse_float` produces illegal types.\n\n### Building a `tomli`/`tomllib` compatibility layer<a name=\"building-a-tomlitomllib-compatibility-layer\"></a>\n\nPython versions 3.11+ ship with a version of Tomli:\nthe `tomllib` standard library module.\nTo build code that uses the standard library if available,\nbut still works seamlessly with Python 3.6+,\ndo the following.\n\nInstead of a hard Tomli dependency, use the following\n[dependency specifier](https://packaging.python.org/en/latest/specifications/dependency-specifiers/)\nto only require Tomli when the standard library module is not available:\n\n```\ntomli >= 1.1.0 ; python_version < \"3.11\"\n```\n\nThen, in your code, import a TOML parser using the following fallback mechanism:\n\n```python\nimport sys\n\nif sys.version_info >= (3, 11):\n    import tomllib\nelse:\n    import tomli as tomllib\n\ntomllib.loads(\"['This parses fine with Python 3.6+']\")\n```\n\n## FAQ<a name=\"faq\"></a>\n\n### Why this parser?<a name=\"why-this-parser\"></a>\n\n- it's lil'\n- pure Python with zero dependencies\n- the fastest pure Python parser [\\*](#pure-python):\n  18x as fast as [tomlkit](https://pypi.org/project/tomlkit/),\n  2.1x as fast as [toml](https://pypi.org/project/toml/)\n- outputs [basic data types](#how-do-toml-types-map-into-python-types) only\n- 100% spec compliant: passes all tests in\n  [BurntSushi/toml-test](https://github.com/BurntSushi/toml-test)\n  test suite\n- thoroughly tested: 100% branch coverage\n\n### Is comment preserving round-trip parsing supported?<a name=\"is-comment-preserving-round-trip-parsing-supported\"></a>\n\nNo.\n\nThe `tomli.loads` function returns a plain `dict` that is populated with builtin types and types from the standard library only.\nPreserving comments requires a custom type to be returned so will not be supported,\nat least not by the `tomli.loads` and `tomli.load` functions.\n\nLook into [TOML Kit](https://github.com/sdispater/tomlkit) if preservation of style is what you need.\n\n### Is there a `dumps`, `write` or `encode` function?<a name=\"is-there-a-dumps-write-or-encode-function\"></a>\n\n[Tomli-W](https://github.com/hukkin/tomli-w) is the write-only counterpart of Tomli, providing `dump` and `dumps` functions.\n\nThe core library does not include write capability, as most TOML use cases are read-only, and Tomli intends to be minimal.\n\n### How do TOML types map into Python types?<a name=\"how-do-toml-types-map-into-python-types\"></a>\n\n| TOML type        | Python type         | Details                                                      |\n| ---------------- | ------------------- | ------------------------------------------------------------ |\n| Document Root    | `dict`              |                                                              |\n| Key              | `str`               |                                                              |\n| String           | `str`               |                                                              |\n| Integer          | `int`               |                                                              |\n| Float            | `float`             |                                                              |\n| Boolean          | `bool`              |                                                              |\n| Offset Date-Time | `datetime.datetime` | `tzinfo` attribute set to an instance of `datetime.timezone` |\n| Local Date-Time  | `datetime.datetime` | `tzinfo` attribute set to `None`                             |\n| Local Date       | `datetime.date`     |                                                              |\n| Local Time       | `datetime.time`     |                                                              |\n| Array            | `list`              |                                                              |\n| Table            | `dict`              |                                                              |\n| Inline Table     | `dict`              |                                                              |\n\n## Performance<a name=\"performance\"></a>\n\nThe `benchmark/` folder in this repository contains a performance benchmark for comparing the various Python TOML parsers.\n\nBelow are the results for commit [0724e2a](https://github.com/hukkin/tomli/tree/0724e2ab1858da7f5e05a9bffdb24c33589d951c).\n\n### Pure Python<a name=\"pure-python\"></a>\n\n```console\nfoo@bar:~/dev/tomli$ python --version\nPython 3.12.7\nfoo@bar:~/dev/tomli$ pip freeze\nattrs==21.4.0\nclick==8.1.7\npytomlpp==1.0.13\nqtoml==0.3.1\nrtoml==0.11.0\ntoml==0.10.2\ntomli @ file:///home/foo/dev/tomli\ntomlkit==0.13.2\nfoo@bar:~/dev/tomli$ python benchmark/run.py\nParsing data.toml 5000 times:\n------------------------------------------------------\n    parser |  exec time | performance (more is better)\n-----------+------------+-----------------------------\n     rtoml |    0.647 s | baseline (100%)\n  pytomlpp |    0.891 s | 72.62%\n     tomli |     3.14 s | 20.56%\n      toml |     6.69 s | 9.67%\n     qtoml |     8.27 s | 7.82%\n   tomlkit |     56.1 s | 1.15%\n```\n\n### Mypyc generated wheel<a name=\"mypyc-generated-wheel\"></a>\n\n```console\nfoo@bar:~/dev/tomli$ python benchmark/run.py\nParsing data.toml 5000 times:\n------------------------------------------------------\n    parser |  exec time | performance (more is better)\n-----------+------------+-----------------------------\n     rtoml |    0.668 s | baseline (100%)\n  pytomlpp |    0.893 s | 74.81%\n     tomli |     1.96 s | 34.18%\n      toml |     6.64 s | 10.07%\n     qtoml |     8.26 s | 8.09%\n   tomlkit |     52.9 s | 1.26%\n```\n\n",
            "description_content_type": "text/markdown",
            "keywords": [
              "toml"
            ],
            "author_email": "Taneli Hukkinen <[email protected]>",
            "license_expression": "MIT",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Operating System :: MacOS",
              "Operating System :: Microsoft :: Windows",
              "Operating System :: POSIX :: Linux",
              "Programming Language :: Python :: 3 :: Only",
              "Programming Language :: Python :: Implementation :: CPython",
              "Programming Language :: Python :: Implementation :: PyPy",
              "Topic :: Software Development :: Libraries :: Python Modules",
              "Typing :: Typed"
            ],
            "requires_python": ">=3.8",
            "project_url": [
              "Changelog, https://github.com/hukkin/tomli/blob/master/CHANGELOG.md",
              "Homepage, https://github.com/hukkin/tomli"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/tomli-2.3.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_tomli_1760014679/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "arrow",
            "version": "1.4.0",
            "summary": "Better dates & times for Python",
            "description": "Arrow: Better dates & times for Python\n======================================\n\n.. start-inclusion-marker-do-not-remove\n\n.. image:: https://github.com/arrow-py/arrow/workflows/tests/badge.svg?branch=master\n   :alt: Build Status\n   :target: https://github.com/arrow-py/arrow/actions?query=workflow%3Atests+branch%3Amaster\n\n.. image:: https://codecov.io/gh/arrow-py/arrow/branch/master/graph/badge.svg\n   :alt: Coverage\n   :target: https://codecov.io/gh/arrow-py/arrow\n\n.. image:: https://img.shields.io/pypi/v/arrow.svg\n   :alt: PyPI Version\n   :target: https://pypi.python.org/pypi/arrow\n\n.. image:: https://img.shields.io/pypi/pyversions/arrow.svg\n   :alt: Supported Python Versions\n   :target: https://pypi.python.org/pypi/arrow\n\n.. image:: https://img.shields.io/pypi/l/arrow.svg\n   :alt: License\n   :target: https://pypi.python.org/pypi/arrow\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n   :alt: Code Style: Black\n   :target: https://github.com/psf/black\n\n\n**Arrow** is a Python library that offers a sensible and human-friendly approach to creating, manipulating, formatting and converting dates, times and timestamps. It implements and updates the datetime type, plugging gaps in functionality and providing an intelligent module API that supports many common creation scenarios. Simply put, it helps you work with dates and times with fewer imports and a lot less code.\n\nArrow is named after the `arrow of time <https://en.wikipedia.org/wiki/Arrow_of_time>`_ and is heavily inspired by `moment.js <https://github.com/moment/moment>`_ and `requests <https://github.com/psf/requests>`_.\n\nWhy use Arrow over built-in modules?\n------------------------------------\n\nPython's standard library and some other low-level modules have near-complete date, time and timezone functionality, but don't work very well from a usability perspective:\n\n- Too many modules: datetime, time, calendar, dateutil, pytz and more\n- Too many types: date, time, datetime, tzinfo, timedelta, relativedelta, etc.\n- Timezones and timestamp conversions are verbose and unpleasant\n- Timezone naivety is the norm\n- Gaps in functionality: ISO 8601 parsing, timespans, humanization\n\nFeatures\n--------\n\n- Fully-implemented, drop-in replacement for datetime\n- Support for Python 3.8+\n- Timezone-aware and UTC by default\n- Super-simple creation options for many common input scenarios\n- ``shift`` method with support for relative offsets, including weeks\n- Format and parse strings automatically\n- Wide support for the `ISO 8601 <https://en.wikipedia.org/wiki/ISO_8601>`_ standard\n- Timezone conversion\n- Support for ``dateutil``, ``pytz``, and ``ZoneInfo`` tzinfo objects\n- Generates time spans, ranges, floors and ceilings for time frames ranging from microsecond to year\n- Humanize dates and times with a growing list of contributed locales\n- Extensible for your own Arrow-derived types\n- Full support for PEP 484-style type hints\n\nQuick Start\n-----------\n\nInstallation\n~~~~~~~~~~~~\n\nTo install Arrow, use `pip <https://pip.pypa.io/en/stable/quickstart/>`_ or `pipenv <https://docs.pipenv.org>`_:\n\n.. code-block:: console\n\n    $ pip install -U arrow\n\nExample Usage\n~~~~~~~~~~~~~\n\n.. code-block:: python\n\n    >>> import arrow\n    >>> arrow.get('2013-05-11T21:23:58.970460+07:00')\n    <Arrow [2013-05-11T21:23:58.970460+07:00]>\n\n    >>> utc = arrow.utcnow()\n    >>> utc\n    <Arrow [2013-05-11T21:23:58.970460+00:00]>\n\n    >>> utc = utc.shift(hours=-1)\n    >>> utc\n    <Arrow [2013-05-11T20:23:58.970460+00:00]>\n\n    >>> local = utc.to('US/Pacific')\n    >>> local\n    <Arrow [2013-05-11T13:23:58.970460-07:00]>\n\n    >>> local.timestamp()\n    1368303838.970460\n\n    >>> local.format()\n    '2013-05-11 13:23:58 -07:00'\n\n    >>> local.format('YYYY-MM-DD HH:mm:ss ZZ')\n    '2013-05-11 13:23:58 -07:00'\n\n    >>> local.humanize()\n    'an hour ago'\n\n    >>> local.humanize(locale='ko-kr')\n    '한시간 전'\n\n.. end-inclusion-marker-do-not-remove\n\nDocumentation\n-------------\n\nFor full documentation, please visit `arrow.readthedocs.io <https://arrow.readthedocs.io>`_.\n\nContributing\n------------\n\nContributions are welcome for both code and localizations (adding and updating locales). Begin by gaining familiarity with the Arrow library and its features. Then, jump into contributing:\n\n#. Find an issue or feature to tackle on the `issue tracker <https://github.com/arrow-py/arrow/issues>`_. Issues marked with the `\"good first issue\" label <https://github.com/arrow-py/arrow/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_ may be a great place to start!\n#. Fork `this repository <https://github.com/arrow-py/arrow>`_ on GitHub and begin making changes in a branch.\n#. Add a few tests to ensure that the bug was fixed or the feature works as expected.\n#. Run the entire test suite and linting checks by running one of the following commands: ``tox && tox -e lint,docs`` (if you have `tox <https://tox.readthedocs.io>`_ installed) **OR** ``make build39 && make test && make lint`` (if you do not have Python 3.9 installed, replace ``build39`` with the latest Python version on your system).\n#. Submit a pull request and await feedback 😃.\n\nIf you have any questions along the way, feel free to ask them `here <https://github.com/arrow-py/arrow/discussions>`_.\n\nSupport Arrow\n-------------\n\n`Open Collective <https://opencollective.com/>`_ is an online funding platform that provides tools to raise money and share your finances with full transparency. It is the platform of choice for individuals and companies to make one-time or recurring donations directly to the project. If you are interested in making a financial contribution, please visit the `Arrow collective <https://opencollective.com/arrow>`_.\n\n",
            "description_content_type": "text/x-rst",
            "keywords": [
              "arrow",
              "date",
              "time",
              "datetime",
              "timestamp",
              "timezone",
              "humanize"
            ],
            "author_email": "Chris Smith <[email protected]>",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 5 - Production/Stable",
              "Intended Audience :: Developers",
              "Intended Audience :: Information Technology",
              "License :: OSI Approved :: Apache Software License",
              "Topic :: Software Development :: Libraries :: Python Modules",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3 :: Only",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13",
              "Programming Language :: Python :: 3.14",
              "Operating System :: OS Independent"
            ],
            "requires_dist": [
              "python-dateutil>=2.7.0",
              "backports.zoneinfo==0.2.1;python_version<'3.9'",
              "tzdata;python_version>='3.9'",
              "doc8 ; extra == \"doc\"",
              "sphinx>=7.0.0 ; extra == \"doc\"",
              "sphinx-autobuild ; extra == \"doc\"",
              "sphinx-autodoc-typehints ; extra == \"doc\"",
              "sphinx_rtd_theme>=1.3.0 ; extra == \"doc\"",
              "dateparser==1.* ; extra == \"test\"",
              "pre-commit ; extra == \"test\"",
              "pytest ; extra == \"test\"",
              "pytest-cov ; extra == \"test\"",
              "pytest-mock ; extra == \"test\"",
              "pytz==2025.2 ; extra == \"test\"",
              "simplejson==3.* ; extra == \"test\""
            ],
            "requires_python": ">=3.8",
            "project_url": [
              "Documentation, https://arrow.readthedocs.io",
              "Issues, https://github.com/arrow-py/arrow/issues",
              "Source, https://github.com/arrow-py/arrow"
            ],
            "provides_extra": [
              "doc",
              "test"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/arrow-1.4.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_arrow_1760831179/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "rpds-py",
            "version": "0.30.0",
            "summary": "Python bindings to Rust's persistent data structures (rpds)",
            "description": "===========\n``rpds.py``\n===========\n\n|PyPI| |Pythons| |CI|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/rpds-py.svg\n  :alt: PyPI version\n  :target: https://pypi.org/project/rpds-py/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/rpds-py.svg\n  :alt: Supported Python versions\n  :target: https://pypi.org/project/rpds-py/\n\n.. |CI| image:: https://github.com/crate-py/rpds/workflows/CI/badge.svg\n  :alt: Build status\n  :target: https://github.com/crate-py/rpds/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\n   :alt: ReadTheDocs status\n   :target: https://referencing.readthedocs.io/en/stable/\n\n\nPython bindings to the `Rust rpds crate <https://docs.rs/rpds/>`_ for persistent data structures.\n\nWhat's here is quite minimal (in transparency, it was written initially to support replacing ``pyrsistent`` in the `referencing library <https://github.com/python-jsonschema/referencing>`_).\nIf you see something missing (which is very likely), a PR is definitely welcome to add it.\n\nInstallation\n------------\n\nThe distribution on PyPI is named ``rpds.py`` (equivalently ``rpds-py``), and thus can be installed via e.g.:\n\n.. code:: sh\n\n    $ pip install rpds-py\n\nNote that if you install ``rpds-py`` from source, you will need a Rust toolchain installed, as it is a build-time dependency.\nAn example of how to do so in a ``Dockerfile`` can be found `here <https://github.com/bowtie-json-schema/bowtie/blob/e77fd93598cb6e7dc1b8b1f53c00e5aa410c201a/implementations/python-jsonschema/Dockerfile#L1-L8>`_.\n\nIf you believe you are on a common platform which should have wheels built (i.e. and not need to compile from source), feel free to file an issue or pull request modifying the GitHub action used here to build wheels via ``maturin``.\n\nUsage\n-----\n\nMethods in general are named similarly to their ``rpds`` counterparts (rather than ``pyrsistent``\\ 's conventions, though probably a full drop-in ``pyrsistent``\\ -compatible wrapper module is a good addition at some point).\n\n.. code:: python\n\n    >>> from rpds import HashTrieMap, HashTrieSet, List\n\n    >>> m = HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\"})\n    >>> m.insert(\"spam\", 37) == HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\", \"spam\": 37})\n    True\n    >>> m.remove(\"foo\") == HashTrieMap({\"baz\": \"quux\"})\n    True\n\n    >>> s = HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\"})\n    >>> s.insert(\"spam\") == HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\", \"spam\"})\n    True\n    >>> s.remove(\"foo\") == HashTrieSet({\"bar\", \"baz\", \"quux\"})\n    True\n\n    >>> L = List([1, 3, 5])\n    >>> L.push_front(-1) == List([-1, 1, 3, 5])\n    True\n    >>> L.rest == List([3, 5])\n    True\n\n",
            "description_content_type": "text/x-rst; charset=UTF-8",
            "keywords": [
              "data structures",
              "rust",
              "persistent"
            ],
            "author_email": "Julian Berman <[email protected]>",
            "license_expression": "MIT",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 3 - Alpha",
              "Intended Audience :: Developers",
              "Operating System :: OS Independent",
              "Programming Language :: Rust",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13",
              "Programming Language :: Python :: 3.14",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: Implementation :: CPython",
              "Programming Language :: Python :: Implementation :: PyPy"
            ],
            "requires_python": ">=3.10",
            "project_url": [
              "Documentation, https://rpds.readthedocs.io/",
              "Homepage, https://github.com/crate-py/rpds",
              "Issues, https://github.com/crate-py/rpds/issues/",
              "Funding, https://github.com/sponsors/Julian",
              "Tidelift, https://tidelift.com/subscription/pkg/pypi-rpds-py?utm_source=pypi-rpds-py&utm_medium=referral&utm_campaign=pypi-link",
              "Source, https://github.com/crate-py/rpds",
              "Upstream, https://github.com/orium/rpds"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/rpds_py-0.30.0.dist-info",
          "direct_url": {
            "url": "file:///Users/runner/miniforge3/conda-bld/bld/rattler-build_rpds-py_1764543169/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "six",
            "version": "1.17.0",
            "dynamic": [
              "author",
              "author-email",
              "classifier",
              "description",
              "home-page",
              "license",
              "license-file",
              "requires-python",
              "summary"
            ],
            "summary": "Python 2 and 3 compatibility utilities",
            "description": ".. image:: https://img.shields.io/pypi/v/six.svg\n   :target: https://pypi.org/project/six/\n   :alt: six on PyPI\n\n.. image:: https://readthedocs.org/projects/six/badge/?version=latest\n   :target: https://six.readthedocs.io/\n   :alt: six's documentation on Read the Docs\n\n.. image:: https://img.shields.io/badge/license-MIT-green.svg\n   :target: https://github.com/benjaminp/six/blob/master/LICENSE\n   :alt: MIT License badge\n\nSix is a Python 2 and 3 compatibility library.  It provides utility functions\nfor smoothing over the differences between the Python versions with the goal of\nwriting Python code that is compatible on both Python versions.  See the\ndocumentation for more information on what is provided.\n\nSix supports Python 2.7 and 3.3+.  It is contained in only one Python\nfile, so it can be easily copied into your project. (The copyright and license\nnotice must be retained.)\n\nOnline documentation is at https://six.readthedocs.io/.\n\nBugs can be reported to https://github.com/benjaminp/six.  The code can also\nbe found there.\n",
            "home_page": "https://github.com/benjaminp/six",
            "author": "Benjamin Peterson",
            "author_email": "[email protected]",
            "license": "MIT",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 5 - Production/Stable",
              "Programming Language :: Python :: 2",
              "Programming Language :: Python :: 3",
              "Intended Audience :: Developers",
              "License :: OSI Approved :: MIT License",
              "Topic :: Software Development :: Libraries",
              "Topic :: Utilities"
            ],
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/six-1.17.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_six_1753199211/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.2",
            "name": "hyperframe",
            "version": "6.1.0",
            "summary": "Pure-Python HTTP/2 framing",
            "description": "======================================\nhyperframe: Pure-Python HTTP/2 framing\n======================================\n\n.. image:: https://github.com/python-hyper/hyperframe/workflows/CI/badge.svg\n    :target: https://github.com/python-hyper/hyperframe/actions\n    :alt: Build Status\n.. image:: https://codecov.io/gh/python-hyper/hyperframe/branch/master/graph/badge.svg\n    :target: https://codecov.io/gh/python-hyper/hyperframe\n    :alt: Code Coverage\n.. image:: https://readthedocs.org/projects/hyperframe/badge/?version=latest\n    :target: https://hyperframe.readthedocs.io/en/latest/\n    :alt: Documentation Status\n.. image:: https://img.shields.io/badge/chat-join_now-brightgreen.svg\n    :target: https://gitter.im/python-hyper/community\n    :alt: Chat community\n\nThis library contains the HTTP/2 framing code used in the `hyper`_ project. It\nprovides a pure-Python codebase that is capable of decoding a binary stream\ninto HTTP/2 frames.\n\nThis library is used directly by `hyper`_ and a number of other projects to\nprovide HTTP/2 frame decoding logic.\n\nContributing\n============\n\nhyperframe welcomes contributions from anyone! Unlike many other projects we\nare happy to accept cosmetic contributions and small contributions, in addition\nto large feature requests and changes.\n\nBefore you contribute (either by opening an issue or filing a pull request),\nplease `read the contribution guidelines`_.\n\n.. _read the contribution guidelines: http://hyper.readthedocs.org/en/development/contributing.html\n\nLicense\n=======\n\nhyperframe is made available under the MIT License. For more details, see the\n``LICENSE`` file in the repository.\n\nAuthors\n=======\n\nhyperframe is maintained by Cory Benfield, with contributions from others. For\nmore details about the contributors, please see ``CONTRIBUTORS.rst``.\n\n.. _hyper: http://python-hyper.org/\n",
            "description_content_type": "text/x-rst",
            "author_email": "Cory Benfield <[email protected]>",
            "maintainer_email": "Thomas Kriechbaumer <[email protected]>",
            "license": "The MIT License (MIT)\n\nCopyright (c) 2014 Cory Benfield\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 5 - Production/Stable",
              "Intended Audience :: Developers",
              "License :: OSI Approved :: MIT License",
              "Programming Language :: Python",
              "Programming Language :: Python :: 3 :: Only",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13",
              "Programming Language :: Python :: Implementation :: CPython",
              "Programming Language :: Python :: Implementation :: PyPy"
            ],
            "requires_python": ">=3.9",
            "project_url": [
              "Homepage, https://github.com/python-hyper/hyperframe/",
              "Bug Reports, https://github.com/python-hyper/hyperframe/issues",
              "Source, https://github.com/python-hyper/hyperframe/",
              "Documentation, https://python-hyper.org/"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/hyperframe-6.1.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/hyperframe_1737618333194/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.1",
            "name": "typing_utils",
            "version": "0.1.0",
            "summary": "utils to inspect Python type annotations",
            "description": "# typing-utils\n\nBackport Python3.8+ typing utils &amp; issubtype &amp; more\n\n- [Install](#install)\n- [API](#api)\n    - [issubtype](#issubtype)\n    - [get_origin](#get_origin)\n    - [get_args](#get_args)\n    - [get_type_hints](#get_type_hints)\n\n[![Python 3.6](https://github.com/bojiang/typing_utils/workflows/Python%203.6/badge.svg)](https://github.com/bojiang/typing_utils/actions/workflows/py36.yml)\n[![Python 3.7](https://github.com/bojiang/typing_utils/workflows/Python%203.7/badge.svg)](https://github.com/bojiang/typing_utils/actions/workflows/py37.yml)\n[![Python 3.8](https://github.com/bojiang/typing_utils/workflows/Python%203.8/badge.svg)](https://github.com/bojiang/typing_utils/actions/workflows/py38.yml)\n[![Python 3.9](https://github.com/bojiang/typing_utils/workflows/Python%203.9/badge.svg)](https://github.com/bojiang/typing_utils/actions/workflows/py39.yml)\n\n## Install\n\n``` bash\n    pip install typing_utils\n```\n\n\n## API\n\n- [issubtype](#issubtype)\n- [get_origin](#get_origin)\n- [get_args](#get_args)\n- [get_type_hints](#get_type_hints)\n\n\n### issubtype\n\nCheck that the left argument is a subtype of the right.\n\nFor unions, check if the type arguments of the left is a subset of the right.\nAlso works for nested types including ForwardRefs.\n\nExamples:\n\n```python\n    from typing_utils import issubtype\n\n    issubtype(typing.List, typing.Any) == True\n    issubtype(list, list) == True\n    issubtype(list, typing.List) == True\n    issubtype(list, typing.Sequence) == True\n    issubtype(typing.List[int], list) == True\n    issubtype(typing.List[typing.List], list) == True\n    issubtype(list, typing.List[int]) == False\n    issubtype(list, typing.Union[typing.Tuple, typing.Set]) == False\n    issubtype(typing.List[typing.List], typing.List[typing.Sequence]) == True\n    JSON = typing.Union[\n        int, float, bool, str, None, typing.Sequence[\"JSON\"],\n        typing.Mapping[str, \"JSON\"]\n    ]\n    issubtype(str, JSON, forward_refs={'JSON': JSON}) == True\n    issubtype(typing.Dict[str, str], JSON, forward_refs={'JSON': JSON}) == True\n    issubtype(typing.Dict[str, bytes], JSON, forward_refs={'JSON': JSON}) == False\n```\n\n\n### get_origin\n\nGet the unsubscripted version of a type.\n\nThis supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar.\nReturn None for unsupported types.\n\nExamples:\n\n```python\n    from typing_utils import get_origin\n\n    get_origin(Literal[42]) is Literal\n    get_origin(int) is None\n    get_origin(ClassVar[int]) is ClassVar\n    get_origin(Generic) is Generic\n    get_origin(Generic[T]) is Generic\n    get_origin(Union[T, int]) is Union\n    get_origin(List[Tuple[T, T]][int]) == list\n```\n\n\n### get_args\n\nGet type arguments with all substitutions performed.\n\nFor unions, basic simplifications used by Union constructor are performed.\n\nExamples:\n\n```python\n    from typing_utils import get_args\n\n    get_args(Dict[str, int]) == (str, int)\n    get_args(int) == ()\n    get_args(Union[int, Union[T, int], str][int]) == (int, str)\n    get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])\n    get_args(Callable[[], T][int]) == ([], int)\n```\n\n\n### get_type_hints\n\nReturn type hints for an object.\n\n\nThis is often the same as obj.__annotations__, but it handles\nforward references encoded as string literals, and if necessary\nadds Optional[t] if a default value equal to None is set.\n\nThe argument may be a module, class, method, or function. The annotations\nare returned as a dictionary. For classes, annotations include also\ninherited members.\n\nTypeError is raised if the argument is not of a type that can contain\nannotations, and an empty dictionary is returned if no annotations are\npresent.\n\nBEWARE -- the behavior of globalns and localns is counterintuitive\n(unless you are familiar with how eval() and exec() work).  The\nsearch order is locals first, then globals.\n\n- If no dict arguments are passed, an attempt is made to use the\n  globals from obj (or the respective module's globals for classes),\n  and these are also used as the locals.  If the object does not appear\n  to have globals, an empty dictionary is used.\n\n- If one dict argument is passed, it is used for both globals and\n  locals.\n\n- If two dict arguments are passed, they specify globals and\n  locals, respectively.\n",
            "description_content_type": "text/markdown",
            "home_page": "https://github.com/bojiang/typing_utils",
            "author": "bojiang",
            "author_email": "[email protected]",
            "license": "Apache License 2.0",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Operating System :: OS Independent",
              "Development Status :: 2 - Pre-Alpha",
              "Programming Language :: Python :: 3.6",
              "Programming Language :: Python :: 3.7",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: Implementation :: CPython"
            ],
            "requires_dist": [
              "pytest; extra == \"test\""
            ],
            "requires_python": ">=3.6.1",
            "provides_extra": [
              "test"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/typing_utils-0.1.0.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/typing_utils_1733331286120/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "mistune",
            "version": "3.1.4",
            "dynamic": [
              "license-file"
            ],
            "summary": "A sane and fast Markdown parser with useful plugins and renderers",
            "description": "Mistune v3\n==========\n\nA fast yet powerful Python Markdown parser with renderers and plugins.\n\nOverview\n--------\n\nConvert Markdown to HTML with ease:\n\n.. code-block:: python\n\n    import mistune\n    mistune.html(your_markdown_text)\n\nUseful Links\n------------\n\n1. GitHub: https://github.com/lepture/mistune\n2. Docs: https://mistune.lepture.com/\n\nLicense\n-------\n\nMistune is licensed under BSD. Please see LICENSE for licensing details.\n",
            "description_content_type": "text/x-rst",
            "author_email": "Hsiaoming Yang <[email protected]>",
            "license": "BSD-3-Clause",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Development Status :: 4 - Beta",
              "Environment :: Console",
              "Environment :: Web Environment",
              "Intended Audience :: Developers",
              "License :: OSI Approved :: BSD License",
              "Operating System :: OS Independent",
              "Programming Language :: Python",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13",
              "Programming Language :: Python :: Implementation :: CPython",
              "Programming Language :: Python :: Implementation :: PyPy",
              "Topic :: Text Processing :: Markup"
            ],
            "requires_dist": [
              "typing-extensions; python_version < \"3.11\""
            ],
            "requires_python": ">=3.8",
            "project_url": [
              "Documentation, https://mistune.lepture.com/",
              "Source, https://github.com/lepture/mistune",
              "Donate, https://github.com/sponsors/lepture"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/mistune-3.1.4.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_mistune_1756495311/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.2",
            "name": "pyzmq",
            "version": "27.1.0",
            "summary": "Python bindings for 0MQ",
            "description": "# PyZMQ: Python bindings for ØMQ\n\nThis package contains Python bindings for [ZeroMQ](https://zeromq.org).\nØMQ is a lightweight and fast messaging implementation.\n\nPyZMQ should work with any reasonable version of Python (≥ 3.8), as well as PyPy.\nPyZMQ supports libzmq ≥ 3.2.2 (including 4.x).\n\nFor a summary of changes to pyzmq, see our\n[changelog](https://pyzmq.readthedocs.io/en/latest/changelog.html).\n\n### ØMQ 3.x, 4.x\n\nPyZMQ fully supports the stable (not DRAFT) 3.x and 4.x APIs of libzmq,\ndeveloped at [zeromq/libzmq](https://github.com/zeromq/libzmq).\nNo code to change, no flags to pass,\njust build pyzmq against the latest and it should work.\n\n## Documentation\n\nSee PyZMQ's Sphinx-generated\ndocumentation [on Read the Docs](https://pyzmq.readthedocs.io) for API\ndetails, and some notes on Python and Cython development. If you want to\nlearn about using ØMQ in general, the excellent [ØMQ\nGuide](http://zguide.zeromq.org/py:all) is the place to start, which has a\nPython version of every example. We also have some information on our\n[wiki](https://github.com/zeromq/pyzmq/wiki).\n\n## Downloading\n\nUnless you specifically want to develop PyZMQ, we recommend downloading\nthe PyZMQ source code or wheels from\n[PyPI](https://pypi.io/project/pyzmq/),\nor install with conda.\n\nYou can also get the latest source code from our GitHub repository, but\nbuilding from the repository will require that you install recent Cython.\n\n## Building and installation\n\nFor more detail on building pyzmq, see [our docs](https://pyzmq.readthedocs.io/en/latest/howto/build.html).\n\nWe build wheels for macOS, Windows, and Linux, so you can get a binary on those platforms with:\n\n```\npip install pyzmq\n```\n\nbut compiling from source with `pip install pyzmq` should work in most environments.\nMake sure you are using the latest pip, or it may not find the right wheels.\n\nIf the wheel doesn't work for some reason, or you want to force pyzmq to be compiled\n(this is often preferable if you already have libzmq installed and configured the way you want it),\nyou can force installation from source with:\n\n```\npip install --no-binary=pyzmq pyzmq\n```\n\n## Old versions\n\npyzmq 16 drops support Python 2.6 and 3.2.\nIf you need to use one of those Python versions, you can pin your pyzmq version to before 16:\n\n```\npip install 'pyzmq<16'\n```\n\nFor libzmq 2.0.x, use 'pyzmq\\<2.1'\n\npyzmq-2.1.11 was the last version of pyzmq to support Python 2.5,\nand pyzmq ≥ 2.2.0 requires Python ≥ 2.6.\npyzmq-13.0.0 introduces PyPy support via CFFI, which only supports libzmq-3.2.2 and newer.\n\nPyZMQ releases ≤ 2.2.0 matched libzmq versioning, but this is no longer the case,\nstarting with PyZMQ 13.0.0 (it was the thirteenth release, so why not?).\nPyZMQ ≥ 13.0 follows semantic versioning conventions accounting only for PyZMQ itself.\n",
            "description_content_type": "text/markdown",
            "author": "Brian E. Granger, Min Ragan-Kelley",
            "author_email": "PyZMQ Contributors <[email protected]>",
            "license": "BSD 3-Clause License\n\n Copyright (c) 2009-2012, Brian Granger, Min Ragan-Kelley\n\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n 1. Redistributions of source code must retain the above copyright notice, this\n    list of conditions and the following disclaimer.\n\n 2. Redistributions in binary form must reproduce the above copyright notice,\n    this list of conditions and the following disclaimer in the documentation\n    and/or other materials provided with the distribution.\n\n 3. Neither the name of the copyright holder nor the names of its\n    contributors may be used to endorse or promote products derived from\n    this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n",
            "classifier": [
              "Development Status :: 5 - Production/Stable",
              "Intended Audience :: Developers",
              "Intended Audience :: Science/Research",
              "Intended Audience :: System Administrators",
              "License :: OSI Approved :: BSD License",
              "Operating System :: MacOS :: MacOS X",
              "Operating System :: Microsoft :: Windows",
              "Operating System :: POSIX",
              "Topic :: System :: Networking",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3 :: Only",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10",
              "Programming Language :: Python :: 3.11",
              "Programming Language :: Python :: 3.12",
              "Programming Language :: Python :: 3.13"
            ],
            "requires_dist": [
              "cffi; implementation_name == \"pypy\""
            ],
            "requires_python": ">=3.8",
            "project_url": [
              "Homepage, https://pyzmq.readthedocs.org",
              "Documentation, https://pyzmq.readthedocs.org",
              "Source, https://github.com/zeromq/pyzmq",
              "Tracker, https://github.com/zeromq/pyzmq/issues"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/pyzmq-27.1.0.dist-info",
          "direct_url": {
            "url": "file:///Users/runner/miniforge3/conda-bld/bld/rattler-build_pyzmq_1757387128/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.3",
            "name": "notebook_shim",
            "version": "0.2.4",
            "summary": "A shim layer for notebook traits and config",
            "description": "# Notebook Shim\n\nThis project provides a way for JupyterLab and other frontends to switch to [Jupyter Server](https://github.com/jupyter/jupyter_server/) for their Python Web application backend.\n\n## Basic Usage\n\nInstall from PyPI:\n\n```\npip install notebook_shim\n```\n\nThis will automatically enable the extension in Jupyter Server.\n\n## Usage\n\nThis project also includes an API for shimming traits that moved from `NotebookApp` in to `ServerApp` in Jupyter Server. This can be used by applications that subclassed `NotebookApp` to leverage the Python server backend of Jupyter Notebooks. Such extensions should *now* switch to `ExtensionApp` API in Jupyter Server and add `NotebookConfigShimMixin` in their inheritance list to properly handle moved traits.\n\nFor example, an application class that previously looked like:\n\n```python\nfrom notebook.notebookapp import NotebookApp\n\nclass MyApplication(NotebookApp):\n```\n\nshould switch to look something like:\n\n```python\nfrom jupyter_server.extension.application import ExtensionApp\nfrom notebook_shim.shim import NotebookConfigShimMixin\n\nclass MyApplication(NotebookConfigShimMixin, ExtensionApp):\n```",
            "description_content_type": "text/markdown",
            "keywords": [
              "ipython",
              "jupyter"
            ],
            "author_email": "Jupyter Development Team <[email protected]>",
            "license": "BSD 3-Clause License\n\nCopyright (c) 2022 Project Jupyter Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
            "classifier": [
              "Framework :: Jupyter",
              "Intended Audience :: Developers",
              "Intended Audience :: Science/Research",
              "Intended Audience :: System Administrators",
              "License :: OSI Approved :: BSD License",
              "Programming Language :: Python",
              "Programming Language :: Python :: 3",
              "Programming Language :: Python :: 3 :: Only",
              "Programming Language :: Python :: 3.7",
              "Programming Language :: Python :: 3.8",
              "Programming Language :: Python :: 3.9",
              "Programming Language :: Python :: 3.10"
            ],
            "requires_dist": [
              "jupyter-server<3,>=1.8",
              "pytest; extra == 'test'",
              "pytest-console-scripts; extra == 'test'",
              "pytest-jupyter; extra == 'test'",
              "pytest-tornasync; extra == 'test'"
            ],
            "requires_python": ">=3.7",
            "provides_extra": [
              "test"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/notebook_shim-0.2.4.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/notebook-shim_1733408315203/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        },
        {
          "metadata": {
            "metadata_version": "2.4",
            "name": "comm",
            "version": "0.2.3",
            "summary": "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc.",
            "description": "# Comm\n\nIt provides a way to register a Kernel Comm implementation, as per the Jupyter kernel protocol.\nIt also provides a base Comm implementation and a default CommManager that can be used.\n\n## Register a comm implementation in the kernel:\n\n### Case 1: Using the default CommManager and the BaseComm implementations\n\nWe provide default implementations for usage in IPython:\n\n```python\nimport comm\n\n\nclass MyCustomComm(comm.base_comm.BaseComm):\n    def publish_msg(self, msg_type, data=None, metadata=None, buffers=None, **keys):\n        # TODO implement the logic for sending comm messages through the iopub channel\n        pass\n\n\ncomm.create_comm = MyCustomComm\n```\n\nThis is typically what ipykernel and JupyterLite's pyolite kernel will do.\n\n### Case 2: Providing your own comm manager creation implementation\n\n```python\nimport comm\n\ncomm.create_comm = custom_create_comm\ncomm.get_comm_manager = custom_comm_manager_getter\n```\n\nThis is typically what xeus-python does (it has its own manager implementation using xeus's C++ messaging logic).\n\n## Comm users\n\nLibraries like ipywidgets can then use the comms implementation that has been registered by the kernel:\n\n```python\nfrom comm import create_comm, get_comm_manager\n\n# Create a comm\ncomm_manager = get_comm_manager()\ncomm = create_comm()\n\ncomm_manager.register_comm(comm)\n```\n",
            "description_content_type": "text/markdown",
            "keywords": [
              "ipykernel",
              "jupyter",
              "xeus-python"
            ],
            "author": "Jupyter contributors",
            "license": "BSD 3-Clause License\n\nCopyright (c) 2022, Jupyter\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
            "license_file": [
              "LICENSE"
            ],
            "classifier": [
              "Framework :: Jupyter",
              "License :: OSI Approved :: BSD License",
              "Programming Language :: Python",
              "Programming Language :: Python :: 3"
            ],
            "requires_dist": [
              "pytest; extra == 'test'"
            ],
            "requires_python": ">=3.8",
            "project_url": [
              "Homepage, https://github.com/ipython/comm"
            ],
            "provides_extra": [
              "test"
            ]
          },
          "metadata_location": "/Users/arjunverma/mambaforge/envs/xptest14/lib/python3.14/site-packages/comm-0.2.3.dist-info",
          "direct_url": {
            "url": "file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_comm_1753453984/work",
            "dir_info": {}
          },
          "installer": "conda",
          "requested": true
        }
      ],
      "environment": {
        "implementation_name": "cpython",
        "implementation_version": "3.14.2",
        "os_name": "posix",
        "platform_machine": "arm64",
        "platform_release": "24.5.0",
        "platform_system": "Darwin",
        "platform_version": "Darwin Kernel Version 24.5.0: Tue Apr 22 19:54:33 PDT 2025; root:xnu-11417.121.6~2/RELEASE_ARM64_T8122",
        "python_full_version": "3.14.2",
        "platform_python_implementation": "CPython",
        "python_version": "3.14",
        "sys_platform": "darwin"
      }
    }
    
    
    -> error output:

arjxn-py avatar Dec 08 '25 09:12 arjxn-py

Hi,

I gave this an attempt with @arjxn-py and yes I could reproduce this. Initially with latest jupyterlab, xeus-python (from conda-forge) and python 3.14 the debugger freezes as the breakpoint hits.

But after going through this comment, we lowered to python 3.12 and jupyterlab 4.4.7 (which was the version released when the above pr went in). Using this configuration we observed a couple working attempts where the debugger was working but overall it was all flaky (because restarting the kernel and executing the same again got us back to the same issue)

Also note : We enabled debugger tests through this PR and as can be seen here all of them pass on main. Which tells me that this might not be a xeus-python issue ?!

anutosh491 avatar Dec 09 '25 07:12 anutosh491

Do you have the same issue with ipykernel?

JohanMabille avatar Dec 09 '25 07:12 JohanMabille

Do you have the same issue with ipykernel?

No, it is working fine with ipykernel.

arjxn-py avatar Dec 09 '25 07:12 arjxn-py