ezmsg-org / ezmsg

Pure-Python DAG-based high-performance SHM-backed pub-sub and multi-processing pattern
https://ezmsg.readthedocs.io/en/latest/
MIT License
15 stars 6 forks source link

IDE indexing namespace packages #69

Closed cboulay closed 11 months ago

cboulay commented 11 months ago

My scripts run fine whether in debug via IDE or in a terminal; no issue importing the various ezmsg namespaced packages.

However, my two preferred IDEs (PyCharm & VS Code) recognize only some namespace packages which makes for an annoying dev experience because I don't get code completion or type checking.

Pycharm: image

VS Code:

image

Until today, I was satisfied adding the other ezmsg packages directly to my workspace and manually setting the path, but this didn't always work. I seem to have lost whatever magic I had and now a bunch that were previous working are no longer.

So I was messing around today and "discovered" that my packages that used a src-layout and used poetry for package-config didn't have this problem.

One minor caveat: Poetry doesn't seem to support single-source for versioning unless that source is in pyproject.toml. So I use the toml file for versioning and then ezmsg.package.init.py has a couple lines to inspect the package to get the version. Thus, the package must be installed! Editable mode is ok: pip install -e . I usually tag on --no-deps so I don't overwrite my core ezmsg.

So, I refactored a couple packages from IDE-not-recognized to IDE-recognized. See:

Something really strange though: ezmsg.sigproc seems to work fine, but nothing else from the main ezmsg repo works. Not core, util, zmq, websocket, nothing.

So I'm sure the fix isn't specific to poetry and/or src-layout, because ezmsg.sigproc doesn't use that.

cboulay commented 11 months ago

I gave the same treatment to ezmsg (containing core, util, etc) and it similarly fixed my IDE problems! No more issues inspecting / indexing ezmsg.core and ezmsg.util.

Here is what I did:

  1. I moved ezmsg/ezmsg to ezmsg/src/ezmsg

  2. deleted setup.cfg, setup.py, and src/ezmsg/version/__version__.py.

  3. I modified pyproject.toml to look like:

[tool.poetry]
name = "ezmsg"
version = "3.3.4"
description = "A simple DAG-based computation model"
authors = ["Griffin Milsap <griffin.milsap@jhuapl.edu>"]
readme = "README.md"
homepage = "https://github.com/iscoe/ezmsg"
packages = [
  { include = "ezmsg", from = "src" }
]

[tool.poetry.dependencies]
python = ">=3.8,<3.13"
typing_extensions = "*"

[tool.poetry.scripts]
ezmsg = "ezmsg.core.command:cmdline"

[tool.poetry.extras]
all_ext = ["ezmsg-websocket", "ezmsg-sigproc", "ezmsg-zmq"]

[tool.poetry.group.test.dependencies]
pytest = "*"
pytest-asyncio = "*"
pytest-cov = "*"
numpy = "^1.24.2"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
  1. And src/ezmsg/version/__init__.py as follows:
import importlib.metadata

__version__ = importlib.metadata.version("ezmsg")

I haven't tested the [extras] install.

poetry.patch

griffinmilsap commented 11 months ago

I'm glad you spent some time to track down these issues! I found a workaround for myself was to not use pip install but to instead invoke setup.py directly (which is suboptimal for a number of reasons). Eager to move to poetry as well. @pperanich -- does this look right to you? I'm going to play with these changes to see if we can move the packaging to poetry this week.

cboulay commented 11 months ago

Fixed in #72