-
Notifications
You must be signed in to change notification settings - Fork 306
run pip check only once for PythonBundle
#3432
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
Conversation
|
@Flamefire Can you look into fixing the merge conflicts? I'm keen on getting this merged soon, but there's a lot of code shuffling going on here that makes the review a bit tough... |
19789d6 to
f78c6f6
Compare
|
Ok, the merge conflict mostly originated from the addition of a max-Python version. I added that to the moved code. I split up the change into one commit that should only be a refactoring without any effective changes, then the actual change(s) While doing the refactoring I noticed some weirdness with specifying the required Python version in ECs using the system Python dependency:
I fixed both in separate commits to avoid having to test this code again. I can split this into 3 PRs though if preferred (refactoring, pip-check, pyver fixes) |
cde58b6 to
286d365
Compare
|
I copied the refactoring to #3475 for easier review Both tested with a random selection of recent-ish PythonBundle and PythonPackage ECs |
|
Test report by @Flamefire Overview of tested easyconfigs (in order)
Build succeeded for 13 out of 13 (13 easyconfigs in total) |
|
This needs rebasing on #3475 now |
e3f4293 to
06ab742
Compare
pip check only once for PythonBundle
|
@Flamefire I changed to target branch in this PR from |
|
Should i look into getting this PR merged or #3428 |
dc2bb92 to
c227e72
Compare
This used to be for 5.x while the other was for develop. I updated both and compared them so I could combine outstanding changes. |
There's a lot of extra code in here, and since this doesn't require any backwards incompatible changes, we opted not to block the release of EasyBuild 5.0.0 over this. We should get back to this indeed though, I would definitely like to see this fixed, but given the easyblocks this is touching, we'll need to tread carefully here... |
c227e72 to
0177e4b
Compare
…age easyblock + add dedicated unit test for it
…improve deprecation warnings if sanity_pip_check and unversioned_packages are set for specific extensions in PythonBundle
54cd746 to
12febcc
Compare
|
Test report by @boegel Overview of tested easyconfigs (in order)
Build succeeded for 6 out of 6 (6 easyconfigs in total) |
boegel
left a comment
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.
I've thoroughly reviewed this, reworked it a bit, added tests for the standalone functions that have been lifted out of the PythonPackage easyblock, and tested it.
Finally good to go now, thanks for the effort @Flamefire!
| msg = ('Package %s in unversioned_packages was not found in the installed packages. ' | ||
| 'Check that the name from `python -m pip list` is used which may be different ' | ||
| 'than the module name.' % unversioned_package) | ||
| msg = f"Package '{unversioned_package}' in unversioned_packages was not found in " |
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.
@boegel What was wrong with the original syntax? I find the repetition of the variable name overly verbose and IMO introduces a new source for errors. It seems like PEP even recommends this, although I have only found a secondary source
PEP 8 recommends the use of implicit string concatenation within parentheses
| # If the main easyblock (e.g. PythonBundle) defines the variable | ||
| # we trust it does the pip check if requested and checks for mismatches | ||
| sanity_pip_check = False | ||
| msg = "Sanity 'pip check' disabled for {self.name} extension, " |
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.
@boegel Related to the above: If we don't define msg as a single-use variable but put the string inside the function call we get line-continuation fro free
(created using
eb --new-pr)We have 2 checks in PythonPackage:
pip checkpip list-> Check for "0.0.0" versionsIn
PythonBundlethose are run for every extension after the build of the whole EC even though running it once is enough because the result will always be the same.This PR uses the following logic:
sanity_pip_checkshould be set at the top ofPythonBundleand not for the individual extensions. Currently if any extension has it enabled the check will be run so it does not make sense to disable/enable it for individual extensions.PythonBundlepasses its value for this to every extension as a default so a deprecation is added in case it gets changed in an extension.Similar reasoning applies to
unversioned_packages: Only a single value for the whole bundle is useful and hence should be set at the top. For kind of backwards compatibility during the deprecation an union of all those values is used in the check.PythonPackage does no longer do the pip checks if it is an extension and the parent EC (e.g.
PythonBundle) has a value forsanity_pip_checkset.PythonBundledoes the pip check if itself or any extension has requested it issuing a deprecation if something differs.Refactoring
To make this possible some refactoring was required.
This makes the diff look large although it is mostly moved code. Explanation follows to help navigate the changes
run_pip_checkis moved out ofsanity_check_stepofPythonPackagesuch that it can be used byPythonBundledet_installed_python_packagesout of the class too, the originalPythonPackage.get_installed_python_packagesneeds to stay for backwards compatibility which prevents giving the same name to the free function. Maybe in EB 5 we can remove it and useget_installed_python_packagesfor the global method?det_-prefix is chosen similar todet_py_libdirsPythonBundle.sanity_check_stepnow requirespython_cmdto be available which was only set in theprepare_stepthat is skipped in--sanity-check-only--> Factor outprepare_pythonfromprepare_stepsimilar toPythonPackagepythoncommand to use although I see no reason for that. I factored outfind_python_cmdfromPythonPackage.prepare_pythonand call it fromPythonBundle. I left the check for a loadedPythonmodule inPythonBundleas I don't know the reason for that check. IMO it should either be in both or neitherFixes #3418
I overwrite
_sanity_check_step_extensionsnow for this. This also ensures that the extensions are initialized. Related PR: easybuilders/easybuild-framework#4620