/ examples / package_manager / package_manager_example.py
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())