Skip to content

Pull Request: Refactor Codebase and Enhance CLI Functionality #3

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

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
recursive-include pwp/utils *
File renamed without changes.
86 changes: 10 additions & 76 deletions pwp/main.py
Original file line number Diff line number Diff line change
@@ -1,70 +1,6 @@
import os
import sys
from pip._internal.cli.main import main as pip_main

def create_or_update_requirements(package_names, action='install'):
requirements_file = 'requirements.txt'

if action == 'install':
if not os.path.exists(requirements_file):
with open(requirements_file, 'w') as f:
for package in package_names:
f.write(f"{package}\n")
print(f"Created {requirements_file} and added {', '.join(package_names)}")
else:
with open(requirements_file, 'r') as f:
existing_packages = set(line.strip() for line in f)

new_packages = [pkg for pkg in package_names if pkg not in existing_packages]

if new_packages:
with open(requirements_file, 'a') as f:
for package in new_packages:
f.write(f"{package}\n")
print(f"Added {', '.join(new_packages)} to {requirements_file}")

existing = set(package_names) & existing_packages
if existing:
print(f"Packages already in {requirements_file}: {', '.join(existing)}")

elif action == 'uninstall':
if os.path.exists(requirements_file):
with open(requirements_file, 'r') as f:
packages = set(line.strip() for line in f)

packages_to_remove = set(package_names) & packages
remaining_packages = packages - packages_to_remove

with open(requirements_file, 'w') as f:
for package in remaining_packages:
f.write(f"{package}\n")

if packages_to_remove:
print(f"Removed {', '.join(packages_to_remove)} from {requirements_file}")

not_found = set(package_names) - packages
if not_found:
print(f"Packages not found in {requirements_file}: {', '.join(not_found)}")
else:
print(f"{requirements_file} not found")

def pwp_install():
if len(sys.argv) < 3:
print("Usage: pwp install <package_name1> [<package_name2> ...]")
return

package_names = sys.argv[2:]
pip_main(['install'] + package_names)
create_or_update_requirements(package_names, 'install')

def pwp_uninstall():
if len(sys.argv) < 3:
print("Usage: pwp uninstall <package_name1> [<package_name2> ...]")
return

package_names = sys.argv[2:]
pip_main(['uninstall', '-y'] + package_names)
create_or_update_requirements(package_names, 'uninstall')
from pwp.utils.pwp_manager import install, uninstall
from pwp.utils.pwp_parser import create_parser

def main():
if len(sys.argv) < 2:
Expand Down Expand Up @@ -94,14 +30,12 @@ def main():

return

command = sys.argv[1]

if command == 'install':
pwp_install()
elif command == 'uninstall':
pwp_uninstall()
parser = create_parser()
args, unknown_args = parser.parse_known_args()

if args.command == "install":
install(args, unknown_args)
elif args.command == "uninstall":
uninstall(args, unknown_args)
else:
print(f"Unknown command: {command}")

if __name__ == "__main__":
main()
parser.print_help()
Empty file added pwp/utils/__init__.py
Empty file.
23 changes: 23 additions & 0 deletions pwp/utils/pwp_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import sys

from pip._internal.cli.main import main as pip
from pwp.utils.requirements_manager import add_requirement, rm_requirement


def install(args,unknown_args):
if len(sys.argv) < 3:
print("Usage: pwp install <package_name1> [<package_name2> ...]")
return
pip_args = ['install'] + args.packages + unknown_args
pip(pip_args)
add_requirement(package_names=args.packages,
requirements_file=args.req_file)

def uninstall(args,unknown_args):
if len(sys.argv) < 3:
print("Usage: pwp uninstall <package_name1> [<package_name2> ...]")
return
pip_args = ['uninstall', '-y'] + args.packages + unknown_args
pip(pip_args)
rm_requirement(package_names=args.packages,
requirements_file=args.req_file)
23 changes: 23 additions & 0 deletions pwp/utils/pwp_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import argparse

def create_parser():
parser = argparse.ArgumentParser(description="Python package manager wrapper")
parser.add_argument(
"--req-file",
type=str,
default="requirements.txt",
help="Specify the name of the requirements file (default: requirements.txt)"
)
subparsers = parser.add_subparsers(dest="command", help="Available commands :\n\tpwp install <package1> [<package2> ...]\n\tpwp uninstall <package1> [<package2> ...]")

# Install command
install_parser = subparsers.add_parser("install", help="Install packages")
install_parser.add_argument("packages", nargs="+", help="Package(s) to install")


# Uninstall command
uninstall_parser = subparsers.add_parser("uninstall", help="Uninstall packages")
uninstall_parser.add_argument("packages", nargs="+", help="Package(s) to uninstall")

return parser

62 changes: 62 additions & 0 deletions pwp/utils/requirements_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import os
from pip._internal.cli.main import main as pip_main
import subprocess

def get_package_version(package):
if "==" in package:
return package
try:
# Run `pip show <package>` to get the version
result = subprocess.run(['pip', 'show', package], capture_output=True, text=True, check=True)
output = result.stdout
for line in output.splitlines():
if line.startswith('Version:'):
print(f"{package} version: {line.split(':', 1)[1].strip()}")
return f"{package}=={line.split(':', 1)[1].strip()}"
except subprocess.CalledProcessError as e:
print(f"Error getting version for {package}: {e}")
return package

def add_requirement(package_names, requirements_file = 'requirements.txt'):
if not os.path.exists(requirements_file):
with open(requirements_file, 'w') as f:
for package in package_names:
f.write(f"{get_package_version(package)}\n")

print(f"Created {requirements_file} and added {', '.join(package_names)}")
else:
with open(requirements_file, 'r') as f:
existing_packages = set(line.strip() for line in f)

new_packages = [pkg for pkg in package_names if pkg not in existing_packages]

if new_packages:
with open(requirements_file, 'a') as f:
for package in new_packages:
f.write(f"{get_package_version(package)}\n")
print(f"Added {', '.join(new_packages)} to {requirements_file}")

existing = set(package_names) & existing_packages
if existing:
print(f"Packages already in {requirements_file}: {', '.join(existing)}")

def rm_requirement(package_names, requirements_file = 'requirements.txt'):
if os.path.exists(requirements_file):
with open(requirements_file, 'r') as f:
packages = set(line.strip().split("==")[0] for line in f)

packages_to_remove = set(package_names) & packages
remaining_packages = packages - packages_to_remove

with open(requirements_file, 'w') as f:
for package in remaining_packages:
f.write(f"{package}\n")

if packages_to_remove:
print(f"Removed {', '.join(packages_to_remove)} from {requirements_file}")

not_found = set(package_names) - packages
if not_found:
print(f"Packages not found in {requirements_file}: {', '.join(not_found)}")
else:
print(f"{requirements_file} not found")