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)
This commit is contained in:
Ryan Malloy 2025-08-15 20:23:14 -06:00
parent 503ea589f1
commit 8b43927493
34 changed files with 2276 additions and 1593 deletions

View file

@ -3,38 +3,43 @@
import asyncio
import logging
import sys
import os
import sys
# Add the project root to the Python path
sys.path.insert(0, os.path.dirname(__file__))
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
async def test_our_implementation():
"""Test our actual implementation directly."""
# Import just the core pieces we need
from pypi_query_mcp.core.exceptions import (
InvalidPackageNameError,
PackageNotFoundError,
)
from pypi_query_mcp.core.pypi_client import PyPIClient
from pypi_query_mcp.tools.package_query import (
query_package_dependencies,
format_dependency_info,
query_package_dependencies,
validate_version_format,
format_dependency_info
)
from pypi_query_mcp.core.exceptions import PackageNotFoundError, InvalidPackageNameError
logger.info("Testing our actual implementation...")
# Test 1: Version validation
logger.info("Testing version validation...")
assert validate_version_format("1.0.0") == True
assert validate_version_format("invalid!") == False
assert validate_version_format(None) == True
logger.info("✅ Version validation works correctly")
# Test 2: PyPI Client with version
logger.info("Testing PyPIClient with version parameter...")
async with PyPIClient() as client:
@ -42,82 +47,94 @@ async def test_our_implementation():
data = await client.get_package_info("django", version="4.2.0")
assert data["info"]["version"] in ["4.2", "4.2.0"]
logger.info(f"✅ Got Django 4.2.0: {data['info']['version']}")
# Test latest version
data = await client.get_package_info("django", version=None)
latest_version = data["info"]["version"]
logger.info(f"✅ Got Django latest: {latest_version}")
# Verify they're different (unless 4.2 is latest, which is unlikely)
if latest_version not in ["4.2", "4.2.0"]:
logger.info("✅ Confirmed version-specific queries work differently than latest")
logger.info(
"✅ Confirmed version-specific queries work differently than latest"
)
# Test 3: Dependency formatting
logger.info("Testing dependency formatting...")
async with PyPIClient() as client:
data = await client.get_package_info("django", version="4.2.0")
formatted = format_dependency_info(data)
assert "package_name" in formatted
assert "version" in formatted
assert "runtime_dependencies" in formatted
assert "dependency_summary" in formatted
assert formatted["version"] in ["4.2", "4.2.0"]
logger.info(f"✅ Dependency formatting works: {len(formatted['runtime_dependencies'])} runtime deps")
logger.info(
f"✅ Dependency formatting works: {len(formatted['runtime_dependencies'])} runtime deps"
)
# Test 4: Full query_package_dependencies function
logger.info("Testing query_package_dependencies function...")
# Test with Django 4.2.0
result = await query_package_dependencies("django", "4.2.0")
assert result["package_name"].lower() == "django"
assert result["version"] in ["4.2", "4.2.0"]
logger.info(f"✅ Django 4.2.0 dependencies: {len(result['runtime_dependencies'])} runtime deps")
logger.info(
f"✅ Django 4.2.0 dependencies: {len(result['runtime_dependencies'])} runtime deps"
)
# Test with Django latest
result_latest = await query_package_dependencies("django", None)
assert result_latest["package_name"].lower() == "django"
logger.info(f"✅ Django latest dependencies: {len(result_latest['runtime_dependencies'])} runtime deps")
logger.info(
f"✅ Django latest dependencies: {len(result_latest['runtime_dependencies'])} runtime deps"
)
# Verify they might be different
if result["version"] != result_latest["version"]:
logger.info("✅ Confirmed: version-specific query returns different version than latest")
logger.info(
"✅ Confirmed: version-specific query returns different version than latest"
)
# Test 5: Error cases
logger.info("Testing error cases...")
# Invalid version format
try:
await query_package_dependencies("django", "invalid!")
assert False, "Should have raised InvalidPackageNameError"
except InvalidPackageNameError:
logger.info("✅ Invalid version format correctly rejected")
# Non-existent version
try:
await query_package_dependencies("django", "999.999.999")
assert False, "Should have raised PackageNotFoundError"
except PackageNotFoundError:
logger.info("✅ Non-existent version correctly rejected")
# Test 6: Multiple packages
logger.info("Testing multiple packages...")
packages_and_versions = [
("fastapi", "0.100.0"),
("numpy", "1.20.0"),
("requests", "2.25.1"),
]
for package, version in packages_and_versions:
try:
result = await query_package_dependencies(package, version)
assert result["package_name"].lower() == package.lower()
assert result["version"] == version
logger.info(f"{package} {version}: {len(result['runtime_dependencies'])} runtime deps")
logger.info(
f"{package} {version}: {len(result['runtime_dependencies'])} runtime deps"
)
except Exception as e:
logger.warning(f"⚠️ {package} {version} failed (may not exist): {e}")
return True
@ -134,10 +151,11 @@ async def main():
except Exception as e:
logger.error(f"❌ Test failed with exception: {e}")
import traceback
traceback.print_exc()
return 1
if __name__ == "__main__":
exit_code = asyncio.run(main())
sys.exit(exit_code)
sys.exit(exit_code)