@@ -1894,15 +1894,27 @@ def _process_lock_update(
18941894 ):
18951895 # type: (...) -> Result
18961896
1897- original_requirements_by_project_name = OrderedDict (
1898- (requirement .project_name , requirement ) for requirement in lock_file .requirements
1899- )
1900- requirements_by_project_name = OrderedDict (
1901- (requirement .project_name , requirement ) for requirement in lock_update .requirements
1902- )
1897+ original_requirements_by_project_name = (
1898+ OrderedDict ()
1899+ ) # type: OrderedDict[ProjectName, OrderedSet[Requirement]]
1900+ for requirement in lock_file .requirements :
1901+ original_requirements_by_project_name .setdefault (
1902+ requirement .project_name , OrderedSet ()
1903+ ).add (requirement )
19031904
1905+ requirements_by_project_name = (
1906+ OrderedDict ()
1907+ ) # type: OrderedDict[ProjectName, OrderedSet[Requirement]]
1908+ for requirement in lock_update .requirements :
1909+ requirements_by_project_name .setdefault (requirement .project_name , OrderedSet ()).add (
1910+ requirement
1911+ )
1912+
1913+ # TODO(John Sirois): Support multiple constraints for the same project name distinguished
1914+ # by markers.
19041915 original_constraints_by_project_name = OrderedDict (
1905- (constraint .project_name , constraint ) for constraint in lock_file .constraints
1916+ (constraint .project_name , OrderedSet ([constraint ]))
1917+ for constraint in lock_file .constraints
19061918 )
19071919 constraints_by_project_name = original_constraints_by_project_name .copy ()
19081920
@@ -1951,7 +1963,14 @@ def _process_lock_update(
19511963 "earlier. Found deleted project {project_name} in updated requirements:\n "
19521964 "{requirements}" ,
19531965 project_name = project_name ,
1954- requirements = "\n " .join (map (str , requirements_by_project_name .values ())),
1966+ requirements = "\n " .join (
1967+ map (
1968+ str ,
1969+ itertools .chain .from_iterable (
1970+ requirements_by_project_name .values ()
1971+ ),
1972+ )
1973+ ),
19551974 )
19561975 constraints_by_project_name .pop (project_name , None )
19571976 elif isinstance (update , VersionUpdate ):
@@ -1972,7 +1991,9 @@ def _process_lock_update(
19721991 # grab the latest version in the range already constrained by an existing
19731992 # requirement or constraint.
19741993 if update_req and str (update_req ) != update_req .name :
1975- constraints_by_project_name [project_name ] = update_req .as_constraint ()
1994+ constraints_by_project_name [project_name ] = OrderedSet (
1995+ [update_req .as_constraint ()]
1996+ )
19761997 else :
19771998 print (
19781999 " {lead_in} {project_name} {updated_version}" .format (
@@ -1983,7 +2004,9 @@ def _process_lock_update(
19832004 file = output ,
19842005 )
19852006 if update_req :
1986- requirements_by_project_name [project_name ] = update_req
2007+ requirements_by_project_name .setdefault (project_name , OrderedSet ()).add (
2008+ update_req
2009+ )
19872010 elif isinstance (update , ArtifactsUpdate ):
19882011 message_lines = [
19892012 " {lead_in} {project_name} {version} artifacts:" .format (
@@ -2053,50 +2076,50 @@ def _process_lock_update(
20532076 )
20542077
20552078 def process_req_edit (
2056- original , # type: Optional [Constraint]
2057- final , # type: Optional [Constraint]
2079+ original , # type: Iterable [Constraint]
2080+ final , # type: Iterable [Constraint]
20582081 ):
20592082 # type: (...) -> None
20602083 if not original :
20612084 print (
20622085 " {lead_in} {requirement!r}" .format (
20632086 lead_in = "Would add" if dry_run else "Added" ,
2064- requirement = str ( final ),
2087+ requirement = ", " . join ( map ( str , final ) ),
20652088 ),
20662089 file = output ,
20672090 )
20682091 elif not final :
20692092 print (
20702093 " {lead_in} {requirement!r}" .format (
20712094 lead_in = "Would delete" if dry_run else "Deleted" ,
2072- requirement = str ( original ),
2095+ requirement = ", " . join ( map ( str , original ) ),
20732096 ),
20742097 file = output ,
20752098 )
20762099 else :
20772100 print (
20782101 " {lead_in} {original!r} to {final!r}" .format (
20792102 lead_in = "Would update" if dry_run else "Updated" ,
2080- original = str ( original ),
2081- final = str ( final ),
2103+ original = ", " . join ( map ( str , original ) ),
2104+ final = ", " . join ( map ( str , final ) ),
20822105 ),
20832106 file = output ,
20842107 )
20852108
20862109 def process_req_edits (
20872110 requirement_type , # type: str
2088- original , # type: Mapping[ProjectName, Constraint]
2089- final , # type: Mapping[ProjectName, Constraint]
2111+ original , # type: Mapping[ProjectName, Iterable[ Constraint] ]
2112+ final , # type: Mapping[ProjectName, Iterable[ Constraint] ]
20902113 ):
2091- # type: (...) -> Tuple[Tuple[Optional [Constraint], Optional [Constraint]], ...]
2092- edits = [] # type: List[Tuple[Optional [Constraint], Optional [Constraint]]]
2093- for name , original_req in original .items ():
2094- final_req = final .get (name )
2095- if final_req != original_req :
2096- edits .append ((original_req , final_req ))
2097- for name , final_req in final .items ():
2114+ # type: (...) -> Tuple[Tuple[Iterable [Constraint], Iterable [Constraint]], ...]
2115+ edits = [] # type: List[Tuple[Iterable [Constraint], Iterable [Constraint]]]
2116+ for name , original_reqs in original .items ():
2117+ final_reqs = final .get (name , OrderedSet () )
2118+ if final_reqs != original_reqs :
2119+ edits .append ((original_reqs , final_reqs ))
2120+ for name , final_reqs in final .items ():
20982121 if name not in original :
2099- edits .append ((None , final_req ))
2122+ edits .append ((OrderedSet (), final_reqs ))
21002123 if not edits :
21012124 return ()
21022125
@@ -2138,8 +2161,13 @@ def process_req_edits(
21382161 lock_file = attr .evolve (
21392162 lock_file ,
21402163 pex_version = __version__ ,
2141- requirements = SortedTuple (requirements_by_project_name .values (), key = str ),
2142- constraints = SortedTuple (constraints_by_project_name .values (), key = str ),
2164+ requirements = SortedTuple (
2165+ itertools .chain .from_iterable (requirements_by_project_name .values ()),
2166+ key = str ,
2167+ ),
2168+ constraints = SortedTuple (
2169+ itertools .chain .from_iterable (constraints_by_project_name .values ()), key = str
2170+ ),
21432171 locked_resolves = SortedTuple (
21442172 resolve_update .updated_resolve for resolve_update in lock_update .resolves
21452173 ),
0 commit comments