Skip to content

Proposal: root spec import mode to replace legacy importing and importmode - #10824

Draft
RonnyPfannschmidt wants to merge 3 commits into
pytest-dev:mainfrom
RonnyPfannschmidt:draft-importmode-rootspec
Draft

Proposal: root spec import mode to replace legacy importing and importmode#10824
RonnyPfannschmidt wants to merge 3 commits into
pytest-dev:mainfrom
RonnyPfannschmidt:draft-importmode-rootspec

Conversation

@RonnyPfannschmidt

Copy link
Copy Markdown
Member

this pr is a starting point for a import-mode that supports modern importing

the key ideas are

  • correctly setup import toplevels
  • in case of non-editable installation compare files to correctly fail collection when reinstall is needed

@RonnyPfannschmidt
RonnyPfannschmidt force-pushed the draft-importmode-rootspec branch from a03a8fa to c37f550 Compare March 20, 2023 15:27
@RonnyPfannschmidt

Copy link
Copy Markdown
Member Author

Note on implementation,

This will require py3.9+ importlib_metadata apis for the details on resource

An accompanying note to migrate to their apis seems necessary (so that pytest can warn on stale resources as well

The best way to register test root namespaces is still unclear

@RonnyPfannschmidt

Copy link
Copy Markdown
Member Author

@bluetech i wonder if this proposal/idea could integrate with directory/package collection enhancements/changes in a way that allows migration

:orphan:

===================================
PROPOSAL: Parametrize with fixtures

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to adjust this

Comment on lines +16 to +17
test module discovery in pytest currently is is pre-pep40 and create pains for users
by adding anything things to sys.path and creating easy conflicts in sys.modules

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
test module discovery in pytest currently is is pre-pep40 and create pains for users
by adding anything things to sys.path and creating easy conflicts in sys.modules
Test module discovery in pytest currently is is pre-PEP420 and creates pain for users
by adding things to ``sys.path`` and creating easy conflicts in ``sys.modules``.

A new import mode take a definition of import roots.

a import root is either a folder in the worktree that will no be installed,
or a folder that will be installed either normally or editable.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is installation done? Like pytest will install to the venv with pip?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Users Will have to manage install, pytest should never do that part


In any case pytest will collect the file tree in the working directory.

If normal install us used and the content of the imported file differs from the working directory,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If normal install us used and the content of the imported file differs from the working directory,
If normal install is used and the content of the imported file differs from the working directory,

@gpshead

gpshead commented Apr 4, 2025

Copy link
Copy Markdown

... any chance this proposal might happen? (I realize that's probably just asking if anyone is going to take on the work and I"m not here volunteering so... mostly just poking it to see if there is interest)

@RonnyPfannschmidt

Copy link
Copy Markdown
Member Author

I have 2 refactoring of horror higher on my priority Lust ans im currently very thin stretched for time on that

RonnyPfannschmidt and others added 2 commits July 24, 2026 11:28
Rename the proposal from importmode_root_spec to import_roots and
reposition it as a declarative alternative that replaces --import-mode
instead of adding a fourth mode:

* update the problem statement for the pytest 8 importlib rework
  (real module names, sys.modules insertion) and ground it in the
  modern import system (PEP 420/451/610/660, importlib.metadata)
* specify implied roots for simple layouts with a hard failure on
  ambiguity instead of guessing
* specify minimal editable vs real vs stale install classification
  via PEP 610 direct_url.json, with StaleInstallError on divergence
* fix the copy-pasted title and turn the todo notes into a proper
  test case matrix

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Collection targets must map to exactly one root, testpaths entries act
as an inference signal for local roots, and conftest files above every
root are recorded as an open naming question.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@RonnyPfannschmidt
RonnyPfannschmidt force-pushed the draft-importmode-rootspec branch from c37f550 to e690aff Compare July 24, 2026 09:38
@RonnyPfannschmidt RonnyPfannschmidt added the skip news used on prs to opt out of the changelog requirement label Jul 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip news used on prs to opt out of the changelog requirement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants