From 2fe7e65f46d7a5b7fdfeec9e420dbda98305768e Mon Sep 17 00:00:00 2001 From: Ilya Vouk Date: Wed, 14 Feb 2024 14:01:25 +0100 Subject: [PATCH 1/2] [Issue-35] Fix the critical bug in requirements writing --- CHANGELOG.md | 5 +++ aliases/base.py | 2 +- requirements_txt/utils/pip/service.py | 64 ++++++++++++++++----------- tests/integrationtests/test_pip.py | 24 +++++----- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c0bed4..3e2af43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.0.5] - 2024-02-14 +### Fixes +- Critical bug with requirements overriding + + ## [2.0.4] - 2024-02-14 ### Fixed - Local packages and git packages installation doesn't add version to the end. diff --git a/aliases/base.py b/aliases/base.py index 88f26a3..39d920e 100644 --- a/aliases/base.py +++ b/aliases/base.py @@ -22,7 +22,7 @@ def run_setup(package_name: str, directory: str = '.'): packages=find_packages(directory), # Start with a small number and increase it with # every change you make https://semver.org - version='2.0.4', + version='2.0.5', # Chose a license from here: https: // # help.github.com / articles / licensing - a - # repository. For example: MIT diff --git a/requirements_txt/utils/pip/service.py b/requirements_txt/utils/pip/service.py index 235f2ed..5bbdd24 100644 --- a/requirements_txt/utils/pip/service.py +++ b/requirements_txt/utils/pip/service.py @@ -75,27 +75,31 @@ def add_installed_packages_to_requirements_txt(args: Iterable): packages_without_version.append(package_name) else: requirements_dict[package_name] = package_version + for package_name in clustered_packages_names['git_packages']: + requirements_dict[package_name] = None + for package_name in clustered_packages_names['file_system_packages']: + requirements_dict[package_name] = None + clustered_packages_names = cluster_package_names(list(requirements_dict.keys())) + print(clustered_packages_names) with open(requirements_txt_path, "w+") as f: - f.writelines([f"{package_name}\n" for package_name in packages_without_version]) - f.writelines( - [ - f"{package_name}=={requirements_dict[package_name]}\n" - for package_name in clustered_packages_names["pypi_packages"] - ] - ) - f.writelines( - [ - f"{package_name}\n" - for package_name in clustered_packages_names["git_packages"] - ] - ) - f.writelines( - [ - f"{package_name}\n" - for package_name in clustered_packages_names["file_system_packages"] - ] - ) + lines_to_write = [] + lines_to_write += [ + f"{package_name}\n" for package_name in packages_without_version + ] + lines_to_write += [ + f"{package_name}=={requirements_dict[package_name]}\n" + for package_name in clustered_packages_names["pypi_packages"] + ] + lines_to_write += [ + f"{package_name}\n" + for package_name in clustered_packages_names["git_packages"] + ] + lines_to_write += [ + f"{package_name}\n" + for package_name in clustered_packages_names["file_system_packages"] + ] + f.writelines(lines_to_write) def remove_uninstalled_packages_from_requirements_txt(args: Iterable): @@ -122,13 +126,23 @@ def remove_uninstalled_packages_from_requirements_txt(args: Iterable): if package_name in args_packages_names and package_name not in packages: del requirements_dict[package_name] + clustered_packages_names = cluster_package_names(list(requirements_dict.keys())) + with open(requirements_txt_path, "w+") as f: - f.writelines( - [ - f"{package_name}=={package_version}\n" - for package_name, package_version in requirements_dict.items() - ] - ) + lines_to_write = [] + lines_to_write += [ + f"{package_name}=={requirements_dict[package_name]}\n" + for package_name in clustered_packages_names["pypi_packages"] + ] + lines_to_write += [ + f"{package_name}\n" + for package_name in clustered_packages_names["git_packages"] + ] + lines_to_write += [ + f"{package_name}\n" + for package_name in clustered_packages_names["file_system_packages"] + ] + f.writelines(lines_to_write) __all__ = [ diff --git a/tests/integrationtests/test_pip.py b/tests/integrationtests/test_pip.py index 079aff0..c39352d 100644 --- a/tests/integrationtests/test_pip.py +++ b/tests/integrationtests/test_pip.py @@ -1,3 +1,4 @@ +import re import sys import tempfile import os @@ -50,8 +51,9 @@ def test_package_installation(self): with open(requirements_txt_path, 'r') as requirements_file: requirements = [x.strip() for x in requirements_file.readlines()] - assert len(requirements) == 1 - assert requirements[0] == 'appdata==2.2.1' + assert len(requirements) == 3 + assert re.compile('to-requirements\.txt==.*').fullmatch(requirements[0]) + assert requirements[1] == 'appdata==2.2.1' assert is_importable('appdata') def test_local_package_installation(self): @@ -65,9 +67,9 @@ def test_local_package_installation(self): requirements_txt_path = os.path.join(path, 'requirements.txt') with open(requirements_txt_path, 'r') as requirements_file: requirements = [x.strip() for x in requirements_file.readlines()] - - assert len(requirements) == 1 - assert requirements[0] == path_to_local_package + assert len(requirements) == 3 + assert re.compile('to-requirements\.txt==.*').fullmatch(requirements[0]) + assert requirements[2] == path_to_local_package assert is_importable('test_package') def test_git_package_installation(self): @@ -79,8 +81,9 @@ def test_git_package_installation(self): with open(requirements_txt_path, 'r') as requirements_file: requirements = [x.strip() for x in requirements_file.readlines()] - assert len(requirements) == 1 - assert requirements[0] == package_name + assert len(requirements) == 3 + assert re.compile('to-requirements\.txt==.*').fullmatch(requirements[0]) + assert requirements[1] == package_name assert is_importable('appdata') def test_package_uninstallation(self): @@ -91,13 +94,14 @@ def test_package_uninstallation(self): with open(requirements_txt_path, 'r') as requirements_file: requirements = [x.strip() for x in requirements_file.readlines()] - assert len(requirements) == 1 - assert requirements[0] == 'appdata==2.2.1' + assert len(requirements) == 3 + assert re.compile('to-requirements\.txt==.*').fullmatch(requirements[0]) + assert requirements[1] == 'appdata==2.2.1' assert is_importable('appdata') uninstall_package('appdata') with open(requirements_txt_path, 'r') as requirements_file: requirements = [x.strip() for x in requirements_file.readlines()] - assert len(requirements) == 0 + assert len(requirements) == 2 assert not is_importable('appdata') From bafba3aca47500f92c94851461b3e0a0bec20e95 Mon Sep 17 00:00:00 2001 From: Ilya Vouk Date: Wed, 14 Feb 2024 14:02:36 +0100 Subject: [PATCH 2/2] [Issue-35] Fix formatting --- requirements_txt/utils/pip/service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements_txt/utils/pip/service.py b/requirements_txt/utils/pip/service.py index 5bbdd24..205f85b 100644 --- a/requirements_txt/utils/pip/service.py +++ b/requirements_txt/utils/pip/service.py @@ -75,9 +75,9 @@ def add_installed_packages_to_requirements_txt(args: Iterable): packages_without_version.append(package_name) else: requirements_dict[package_name] = package_version - for package_name in clustered_packages_names['git_packages']: + for package_name in clustered_packages_names["git_packages"]: requirements_dict[package_name] = None - for package_name in clustered_packages_names['file_system_packages']: + for package_name in clustered_packages_names["file_system_packages"]: requirements_dict[package_name] = None clustered_packages_names = cluster_package_names(list(requirements_dict.keys()))