# python/01-version-management.py"""Modern Python version management with pyenv and uv"""importsubprocessimportsysfrompathlibimportPathfromtypingimportList,OptionalclassPythonVersionManager:"""Manage Python versions and environments"""def__init__(self,version_manager:str="pyenv"):self.version_manager=version_managerself.available_versions=self._get_available_versions()def_get_available_versions(self)->List[str]:"""Get available Python versions"""try:ifself.version_manager=="pyenv":result=subprocess.run(["pyenv","install","--list"],capture_output=True,text=True,check=True)versions=[line.strip()forlineinresult.stdout.split('\n')ifline.strip()andnotline.startswith('Available')]return[vforvinversionsifv.startswith(('3.8','3.9','3.10','3.11','3.12'))]else:return[]exceptsubprocess.CalledProcessError:return[]definstall_python_version(self,version:str)->bool:"""Install a specific Python version"""try:ifself.version_manager=="pyenv":subprocess.run(["pyenv","install",version],check=True)returnTruereturnFalseexceptsubprocess.CalledProcessError:returnFalsedefset_local_version(self,version:str,project_path:Path)->bool:"""Set local Python version for a project"""try:ifself.version_manager=="pyenv":subprocess.run(["pyenv","local",version],cwd=project_path,check=True)returnTruereturnFalseexceptsubprocess.CalledProcessError:returnFalsedefget_current_version(self)->Optional[str]:"""Get current Python version"""try:result=subprocess.run(["python","--version"],capture_output=True,text=True,check=True)returnresult.stdout.strip()exceptsubprocess.CalledProcessError:returnNone# Usage exampledefsetup_python_environment(project_path:Path,python_version:str="3.11"):"""Setup Python environment for a project"""manager=PythonVersionManager()# Install Python version if not availableifpython_versionnotinmanager.available_versions:print(f"Installing Python {python_version}...")manager.install_python_version(python_version)# Set local versionmanager.set_local_version(python_version,project_path)print(f"Python environment setup complete: {manager.get_current_version()}")
# python/02-uv-package-manager.py"""Modern Python package management with uv"""importsubprocessimportjsonfrompathlibimportPathfromtypingimportDict,List,OptionalclassUVPackageManager:"""Manage Python packages with uv"""def__init__(self,project_path:Path):self.project_path=project_pathself.pyproject_toml=project_path/"pyproject.toml"self.uv_lock=project_path/"uv.lock"definit_project(self,name:str,version:str="0.1.0")->bool:"""Initialize a new Python project"""try:subprocess.run(["uv","init",name,"--python","3.11"],cwd=self.project_path,check=True)returnTrueexceptsubprocess.CalledProcessError:returnFalsedefadd_dependency(self,package:str,version:Optional[str]=None)->bool:"""Add a dependency to the project"""try:cmd=["uv","add",package]ifversion:cmd.append(f"=={version}")subprocess.run(cmd,cwd=self.project_path,check=True)returnTrueexceptsubprocess.CalledProcessError:returnFalsedefadd_dev_dependency(self,package:str,version:Optional[str]=None)->bool:"""Add a development dependency"""try:cmd=["uv","add","--dev",package]ifversion:cmd.append(f"=={version}")subprocess.run(cmd,cwd=self.project_path,check=True)returnTrueexceptsubprocess.CalledProcessError:returnFalsedefinstall_dependencies(self)->bool:"""Install project dependencies"""try:subprocess.run(["uv","sync"],cwd=self.project_path,check=True)returnTrueexceptsubprocess.CalledProcessError:returnFalsedefrun_command(self,command:str)->bool:"""Run a command in the project environment"""try:subprocess.run(["uv","run",command],cwd=self.project_path,check=True)returnTrueexceptsubprocess.CalledProcessError:returnFalsedefget_dependencies(self)->Dict[str,str]:"""Get project dependencies"""ifnotself.pyproject_toml.exists():return{}try:withopen(self.pyproject_toml,'r')asf:content=f.read()# Parse TOML content (simplified)dependencies={}in_deps=Falseforlineincontent.split('\n'):ifline.strip()=='[dependencies]':in_deps=Trueelifline.startswith('[')andline.strip()!='[dependencies]':in_deps=Falseelifin_depsand'='inline:key,value=line.split('=',1)dependencies[key.strip()]=value.strip().strip('"')returndependenciesexceptException:return{}# Usage exampledefsetup_project_with_uv(project_path:Path,project_name:str):"""Setup a new project with uv"""uv_manager=UVPackageManager(project_path)# Initialize projectuv_manager.init_project(project_name)# Add core dependenciesuv_manager.add_dependency("fastapi")uv_manager.add_dependency("uvicorn")uv_manager.add_dependency("pydantic")# Add development dependenciesuv_manager.add_dev_dependency("pytest")uv_manager.add_dev_dependency("black")uv_manager.add_dev_dependency("ruff")uv_manager.add_dev_dependency("mypy")# Install dependenciesuv_manager.install_dependencies()print("Project setup complete with uv")