package_manager_example.py
1 #!/usr/bin/env python3 2 """ 3 Package Manager Example 4 5 This example demonstrates: 6 1. Checking package index configuration 7 2. Searching for packages on PyPI 8 3. Listing installed packages 9 4. Security features (safe defaults) 10 11 Requirements: 12 - praisonai installed 13 - No external API keys required 14 15 Note: This example does NOT actually install/uninstall packages 16 to avoid modifying your environment. It demonstrates read-only 17 operations and shows the commands for install/uninstall. 18 """ 19 20 import sys 21 import json 22 import subprocess 23 24 25 def run_command(args, description): 26 """Run a praisonai command and display results.""" 27 print(f"\n[{description}]") 28 print(f"Command: praisonai {' '.join(args)}") 29 print("-" * 40) 30 31 result = subprocess.run( 32 ["python3", "-m", "praisonai"] + args, 33 capture_output=True, 34 text=True 35 ) 36 37 if result.returncode == 0: 38 try: 39 data = json.loads(result.stdout) 40 print(json.dumps(data, indent=2)) 41 return data 42 except json.JSONDecodeError: 43 print(result.stdout) 44 return None 45 else: 46 print(f"Error (exit code {result.returncode}):") 47 print(result.stderr or result.stdout) 48 return None 49 50 51 def main(): 52 print("=" * 60) 53 print("PraisonAI Package Manager Example") 54 print("=" * 60) 55 print("\nThis example demonstrates package manager features.") 56 print("No packages will be installed or uninstalled.") 57 58 # 1. Show index configuration 59 print("\n" + "=" * 60) 60 print("1. PACKAGE INDEX CONFIGURATION") 61 print("=" * 60) 62 63 data = run_command( 64 ["package", "index", "show", "--json"], 65 "Show current index settings" 66 ) 67 68 if data: 69 print(f"\n✓ Primary index: {data.get('index_url', 'N/A')}") 70 print(f"✓ Extra indexes allowed: {data.get('allow_extra_index', False)}") 71 72 # 2. Search for packages 73 print("\n" + "=" * 60) 74 print("2. SEARCH PACKAGES") 75 print("=" * 60) 76 77 data = run_command( 78 ["package", "search", "requests", "--json"], 79 "Search for 'requests' package" 80 ) 81 82 if data and data.get("results"): 83 pkg = data["results"][0] 84 print(f"\n✓ Found: {pkg.get('name')} v{pkg.get('version')}") 85 print(f" Summary: {pkg.get('summary', 'N/A')}") 86 87 # 3. List installed packages (sample) 88 print("\n" + "=" * 60) 89 print("3. LIST INSTALLED PACKAGES") 90 print("=" * 60) 91 92 data = run_command( 93 ["package", "list", "--json"], 94 "List installed packages" 95 ) 96 97 if data and data.get("packages"): 98 print(f"\n✓ Total packages: {len(data['packages'])}") 99 print(" Sample (first 5):") 100 for pkg in data["packages"][:5]: 101 print(f" - {pkg['name']}=={pkg['version']}") 102 103 # 4. Show install/uninstall commands (without executing) 104 print("\n" + "=" * 60) 105 print("4. INSTALL/UNINSTALL COMMANDS (NOT EXECUTED)") 106 print("=" * 60) 107 108 print("\nTo install packages, use:") 109 print(" praisonai install requests") 110 print(" praisonai install 'requests>=2.28'") 111 print(" praisonai install requests httpx --upgrade") 112 113 print("\nTo uninstall packages, use:") 114 print(" praisonai uninstall requests") 115 print(" praisonai uninstall requests --yes") 116 117 # 5. Security features 118 print("\n" + "=" * 60) 119 print("5. SECURITY FEATURES") 120 print("=" * 60) 121 122 print("\nDependency Confusion Prevention:") 123 print(" - By default, only PyPI is used as package source") 124 print(" - Extra index URLs are blocked unless explicitly allowed") 125 print(" - Use --allow-extra-index to enable (shows warning)") 126 127 print("\nExample (blocked by default):") 128 print(" praisonai install pkg --extra-index-url https://other.index.com/simple") 129 print(" → Error: Extra index URLs not allowed") 130 131 print("\nExample (explicitly allowed):") 132 print(" praisonai install pkg --extra-index-url https://other.index.com/simple --allow-extra-index") 133 print(" → Warning shown, then proceeds") 134 135 print("\n" + "=" * 60) 136 print("Example completed!") 137 print("=" * 60) 138 139 return 0 140 141 142 if __name__ == "__main__": 143 sys.exit(main())