fix: handle ~= and != version operators in Python dependency name parsing#447
fix: handle ~= and != version operators in Python dependency name parsing#447a-oren wants to merge 1 commit intoguacsec:mainfrom
Conversation
…sing getDependencyName() only recognized >, <, and = as version operator characters, causing ~ from ~= (compatibility) and ! from != (exclusion) to be included in the package name (e.g. "urllib3~", "click!"). Replaced the three-index approach with a loop that recognizes all PEP 508 version operator characters (>, <, =, ~, !). Fixes TC-4041 Assisted-by: Claude Code
Reviewer's GuideUpdates Python dependency name parsing to correctly detect all PEP 508 version operator characters (including ~= and !=) and adds tests to cover these cases, especially when combined with extras and markers. Class diagram for updated PythonControllerBase dependency parsingclassDiagram
class PythonControllerBase {
+static String getDependencyName(String dep)
+static List~String~ splitPipShowLines(String pipShowOutput)
}
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Strum355
left a comment
There was a problem hiding this comment.
PR looks good for the changes mentioned. Looking at TC-4041, we also need to make sure that version extraction in splitToNameVersion also handles environment markers properly. Note the following error case mentioned in TC-4041:
# Expected: Install if condition is true, compare version "2.25.1" against manifest
# Java actual: Compares installed version "2.25.1" against "2.25.1 ; python_version >= '3.6'"
# Results in version mismatch error even when versions match
idna==2.10 ; python_version >= "3.6"
six==1.16.0 ; python_version < "3.0" or python_version >= "3.3"
chardet==4.0.0 ; python_version >= "3.6" and sys_platform == "linux"
The environment markers are leaking here too when comparing the versions, so we need to correctly exclude markers in splitToNameVersion (according to Claude at least, thats the function responsible). I would be fine with including the fix for this in this PR.
Summary
getDependencyName()to recognize~and!as PEP 508 version operator characters, preventing them from being included in the package name (e.g.urllib3~=1.26.0was parsed as packageurllib3~instead ofurllib3)getFirstSign()approach with a simple loop over all PEP 508 operator characters (>,<,=,~,!)~=) and exclusion (!=) operators, including combined extras + special operatorsImplements TC-4041
Test plan
~=and!=parsingrequirements.txtfrom the ticket produces correct SBOM🤖 Generated with Claude Code
Summary by Sourcery
Fix Python requirement parsing to correctly extract dependency names when PEP 508 version operators are present, and extend tests to cover these cases.
Bug Fixes:
Enhancements:
Tests: