From 17b37d938fb32f9d94daee8ca7a1721015ef2cda Mon Sep 17 00:00:00 2001 From: MarcusArdelean Date: Fri, 23 Feb 2024 10:49:33 +0200 Subject: [PATCH] fix: add support for dev/alpha/beta/rc python versions --- pysrc/pip_resolve.py | 36 +++++++++++++++---- test/system/inspect.spec.ts | 14 ++++++++ .../requirements.txt | 1 + 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 test/workspaces/pip-app-dev-alpha-beta-python-version/requirements.txt diff --git a/pysrc/pip_resolve.py b/pysrc/pip_resolve.py index 8d0e32b0..3f33a541 100644 --- a/pysrc/pip_resolve.py +++ b/pysrc/pip_resolve.py @@ -135,25 +135,47 @@ def create_package_as_root(package, dir_as_root): dir_as_root[DEPENDENCIES][package_as_root[NAME]] = package_tree return dir_as_root -def satisfies_python_requirement(parsed_operator, py_version_str): + +def satisfies_python_requirement(parsed_operator, py_version): + """Check if a package required python versions matches the one of the system + + Args: + parsed_operator (str): operator to compare by i.e. >, <=, == + py_version (str): The python version that is required by the package + + Returns: + bool: True if the version matches, False otherwise + """ # TODO: use python semver library to compare versions - operator_func = { + operator = { ">": gt, "==": eq, "<": lt, "<=": le, ">=": ge, '!=': ne, - }[parsed_operator] + } + operator_func = operator.get(parsed_operator) system_py_version_tuple = (sys.version_info[0], sys.version_info[1]) - py_version_tuple = tuple(py_version_str.split('.')) # string tuple + py_version_tuple = tuple(py_version.split('.')) # tuple of strings + + # For wildcard versions like 3.9.* if py_version_tuple[-1] == '*': system_py_version_tuple = system_py_version_tuple[0] - py_version_tuple = int(py_version_tuple[0]) # int tuple + py_version_tuple = int(py_version_tuple[0]) # tuple of integers + + # For dev/alpha/beta/rc versions like 3.9.dev0 + elif not py_version_tuple[-1].isdigit(): + py_version_tuple = (int(py_version_tuple[0]), int(py_version_tuple[1])) + + # For stable releases like 3.9.2 else: - py_version_tuple = tuple(int(x) for x in py_version_tuple) # int tuple + py_version_tuple = tuple(int(x) for x in py_version_tuple) + + result = operator_func(system_py_version_tuple, py_version_tuple) + + return result - return operator_func(system_py_version_tuple, py_version_tuple) def get_markers_text(requirement): if isinstance(requirement, pipfile.PipfileRequirement): diff --git a/test/system/inspect.spec.ts b/test/system/inspect.spec.ts index b9af61db..6e811426 100644 --- a/test/system/inspect.spec.ts +++ b/test/system/inspect.spec.ts @@ -256,6 +256,20 @@ describe('inspect', () => { }, ], }, + { + workspace: 'pip-app-dev-alpha-beta-python-version', + uninstallPackages: [], + pluginOpts: {}, + expected: [ + { + pkg: { + name: 'requests', + version: '2.31.0', + }, + directDeps: ['requests'], + }, + ], + }, ])( 'should get a valid dependency graph for workspace = $workspace', async ({ workspace, uninstallPackages, pluginOpts, expected }) => { diff --git a/test/workspaces/pip-app-dev-alpha-beta-python-version/requirements.txt b/test/workspaces/pip-app-dev-alpha-beta-python-version/requirements.txt new file mode 100644 index 00000000..1a4443fc --- /dev/null +++ b/test/workspaces/pip-app-dev-alpha-beta-python-version/requirements.txt @@ -0,0 +1 @@ +requests==2.31.0 ; python_version >= "3.8.dev0"