The dependency parser was stripping environment markers but not checking if they indicated optional or platform-specific packages. This caused packages like jaraco.path to pull in pyobjc (324 sub-packages) even on non-macOS systems. Changes: - Filter dependencies with 'extra ==' markers (optional extras) - Filter dependencies with 'sys_platform' or 'platform_system' markers - Add diagnostic logging for depth exceeded errors - Add unit tests for dependency filtering Fixes tensorflow dependency resolution exceeding max depth.
86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
"""Unit tests for PyPI proxy functionality."""
|
|
|
|
import pytest
|
|
from app.pypi_proxy import _parse_requires_dist
|
|
|
|
|
|
class TestParseRequiresDist:
|
|
"""Tests for _parse_requires_dist function."""
|
|
|
|
def test_simple_package(self):
|
|
"""Test parsing a simple package name."""
|
|
name, version = _parse_requires_dist("numpy")
|
|
assert name == "numpy"
|
|
assert version is None
|
|
|
|
def test_package_with_version(self):
|
|
"""Test parsing package with version constraint."""
|
|
name, version = _parse_requires_dist("numpy>=1.21.0")
|
|
assert name == "numpy"
|
|
assert version == ">=1.21.0"
|
|
|
|
def test_package_with_parenthesized_version(self):
|
|
"""Test parsing package with parenthesized version."""
|
|
name, version = _parse_requires_dist("requests (>=2.25.0)")
|
|
assert name == "requests"
|
|
assert version == ">=2.25.0"
|
|
|
|
def test_package_with_python_version_marker(self):
|
|
"""Test that python_version markers are preserved but marker stripped."""
|
|
name, version = _parse_requires_dist("typing-extensions; python_version < '3.8'")
|
|
assert name == "typing-extensions"
|
|
assert version is None
|
|
|
|
def test_filters_extra_dependencies(self):
|
|
"""Test that extra dependencies are filtered out."""
|
|
# Extra dependencies should return (None, None)
|
|
name, version = _parse_requires_dist("pytest; extra == 'test'")
|
|
assert name is None
|
|
assert version is None
|
|
|
|
name, version = _parse_requires_dist("sphinx; extra == 'docs'")
|
|
assert name is None
|
|
assert version is None
|
|
|
|
def test_filters_platform_specific_darwin(self):
|
|
"""Test that macOS-specific dependencies are filtered out."""
|
|
name, version = _parse_requires_dist("pyobjc; sys_platform == 'darwin'")
|
|
assert name is None
|
|
assert version is None
|
|
|
|
def test_filters_platform_specific_win32(self):
|
|
"""Test that Windows-specific dependencies are filtered out."""
|
|
name, version = _parse_requires_dist("pywin32; sys_platform == 'win32'")
|
|
assert name is None
|
|
assert version is None
|
|
|
|
def test_filters_platform_system_marker(self):
|
|
"""Test that platform_system markers are filtered out."""
|
|
name, version = _parse_requires_dist("jaraco-windows; platform_system == 'Windows'")
|
|
assert name is None
|
|
assert version is None
|
|
|
|
def test_normalizes_package_name(self):
|
|
"""Test that package names are normalized (PEP 503)."""
|
|
name, version = _parse_requires_dist("Typing_Extensions>=3.7.4")
|
|
assert name == "typing-extensions"
|
|
assert version == ">=3.7.4"
|
|
|
|
def test_complex_version_constraint(self):
|
|
"""Test parsing complex version constraints."""
|
|
name, version = _parse_requires_dist("gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1")
|
|
assert name == "gast"
|
|
assert version == "!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1"
|
|
|
|
def test_version_range(self):
|
|
"""Test parsing version range constraints."""
|
|
name, version = _parse_requires_dist("grpcio<2.0,>=1.24.3")
|
|
assert name == "grpcio"
|
|
assert version == "<2.0,>=1.24.3"
|
|
|
|
def test_tilde_version(self):
|
|
"""Test parsing tilde version constraints."""
|
|
name, version = _parse_requires_dist("tensorboard~=2.20.0")
|
|
assert name == "tensorboard"
|
|
assert version == "~=2.20.0"
|