pypi-query-mcp/test_real_packages.py
Ryan Malloy 8b43927493 chore: upgrade all Python packages and fix linting issues
- Update all dependencies to latest versions (fastmcp, httpx, packaging, etc.)
- Downgrade click from yanked 8.2.2 to stable 8.1.7
- Fix code formatting and linting issues with ruff
- Most tests passing (2 test failures in dependency resolver need investigation)
2025-08-15 20:23:14 -06:00

107 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""Test script to verify semantic version sorting with real PyPI packages."""
import asyncio
import logging
from pypi_query_mcp.tools.package_query import query_package_versions
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def test_real_package_versions():
"""Test with real PyPI packages that have complex version histories."""
print("=" * 60)
print("Testing Real Package Version Sorting")
print("=" * 60)
# Test packages known to have complex version histories
test_packages = [
"django", # Known for alpha, beta, rc versions
"numpy", # Long history with various formats
"requests", # Simple but well-known package
]
for package_name in test_packages:
try:
print(f"\nTesting {package_name}:")
result = await query_package_versions(package_name)
recent_versions = result.get("recent_versions", [])[:10]
print(f" Recent versions (first 10): {recent_versions}")
# Show older-style string sorting for comparison
all_versions = result.get("versions", [])
if all_versions:
# Use basic string sorting (the old way)
string_sorted = sorted(all_versions[:20], reverse=True)
print(f" String-sorted (first 10): {string_sorted[:10]}")
print(" Semantic vs String comparison:")
for i in range(min(5, len(recent_versions))):
semantic = recent_versions[i] if i < len(recent_versions) else "N/A"
string_sort = string_sorted[i] if i < len(string_sorted) else "N/A"
match = "" if semantic == string_sort else ""
print(f" {i + 1}: {semantic} vs {string_sort} {match}")
except Exception as e:
print(f" Error querying {package_name}: {e}")
print()
async def test_specific_version_ordering():
"""Test specific version ordering scenarios."""
print("=" * 60)
print("Specific Version Ordering Tests")
print("=" * 60)
# Let's test django which is known to have alpha, beta, rc versions
try:
print("Testing Django version ordering:")
result = await query_package_versions("django")
all_versions = result.get("versions", [])
# Find versions around a specific release to verify ordering
django_4_versions = [v for v in all_versions if v.startswith("4.2")][:15]
print(f" Django 4.2.x versions: {django_4_versions}")
# Check if pre-release versions are properly ordered
pre_release_pattern = ["4.2a1", "4.2b1", "4.2rc1", "4.2.0"]
found_versions = [v for v in django_4_versions if v in pre_release_pattern]
print(f" Found pre-release sequence: {found_versions}")
if len(found_versions) > 1:
print(" Checking pre-release ordering:")
for i in range(len(found_versions) - 1):
current = found_versions[i]
next_ver = found_versions[i + 1]
print(f" {current} comes before {next_ver}")
except Exception as e:
print(f" Error testing Django versions: {e}")
print()
async def main():
"""Main test function."""
print("Real Package Version Sorting Test")
print("=" * 60)
# Test with real packages
await test_real_package_versions()
# Test specific version ordering scenarios
await test_specific_version_ordering()
print("=" * 60)
print("Real package test completed!")
if __name__ == "__main__":
asyncio.run(main())