-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conditionally ignore collection of setuptools dirnames #12918
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Conditionally ignore collection of setuptools artifacts dirnames only if the | ||
directories reside inside a setuptools project, i.e. `setup.cfg`, is present, etc. | ||
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -63,9 +63,7 @@ | |||||
"*.egg", | ||||||
".*", | ||||||
"_darcs", | ||||||
"build", | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that the description string above should mention that these are still conditionally excluded by default. |
||||||
"CVS", | ||||||
"dist", | ||||||
"node_modules", | ||||||
"venv", | ||||||
"{arch}", | ||||||
|
@@ -367,6 +365,47 @@ | |||||
return True | ||||||
|
||||||
|
||||||
def _is_setuptools_in_pyproject_toml(toml: Path) -> bool: | ||||||
"""Attempt to decode a toml file into a dict, returning None if fails.""" | ||||||
if sys.version_info >= (3, 11): | ||||||
import tomllib | ||||||
else: | ||||||
import tomli as tomllib | ||||||
|
||||||
try: | ||||||
toml_text = toml.read_text(encoding="utf-8") | ||||||
parsed_toml = tomllib.loads(toml_text) | ||||||
build_system = parsed_toml.get("build-system", {}).get("requires") | ||||||
if "setuptools" in build_system: | ||||||
return True | ||||||
except Exception: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would prefer to avoid using a Did you account that |
||||||
pass | ||||||
|
||||||
return False | ||||||
|
||||||
|
||||||
def _in_build(path: Path) -> bool: | ||||||
"""Attempt to detect if ``path`` is the root of a buildsystem's artifacts | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It feels like this isn't just an attempt but a complete piece of logic. So I'd just go with “Detect” since it seems more accurate.
Suggested change
|
||||||
by checking known dirnames patterns, and the presence of configuration in | ||||||
the parent dir by checking for a setup.py, setup.cfg, or pyproject.toml. | ||||||
""" | ||||||
if not path.is_dir(): | ||||||
return False | ||||||
|
||||||
if any(fnmatch_ex(pat, path) for pat in ("build", "dist")): | ||||||
setup_cfg = path.parent / "setup.cfg" | ||||||
if (setup_cfg).is_file(): | ||||||
setup_py = path.parent / "setup.py" | ||||||
if setup_py.is_file(): | ||||||
return True | ||||||
|
||||||
toml = path.parent / "pyproject.toml" | ||||||
if toml.is_file() and _is_setuptools_in_pyproject_toml(toml): | ||||||
return True | ||||||
|
||||||
return False | ||||||
|
||||||
|
||||||
def _in_venv(path: Path) -> bool: | ||||||
"""Attempt to detect if ``path`` is the root of a Virtual Environment by | ||||||
checking for the existence of the pyvenv.cfg file. | ||||||
|
@@ -418,6 +457,10 @@ | |||||
if not allow_in_venv and _in_venv(collection_path): | ||||||
return True | ||||||
|
||||||
allow_in_build = False # config.getoption("collect_in_build") | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Left over? |
||||||
if not allow_in_build and _in_build(collection_path): | ||||||
return True | ||||||
|
||||||
if collection_path.is_dir(): | ||||||
norecursepatterns = config.getini("norecursedirs") | ||||||
if any(fnmatch_ex(pat, collection_path) for pat in norecursepatterns): | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please, enumerate all the files taken into consideration in this logic. Change notes are targeting the end-users who would not be able to guess. It might also be a good idea to mention the same somewhere in the regular docs, additionally.