66from dataclasses import dataclass
77from io import StringIO
88from itertools import chain , repeat
9+ from json import JSONDecodeError
910from pathlib import Path
1011from re import MULTILINE , escape , search
1112from shlex import join
@@ -1784,22 +1785,29 @@ def uv_pip_list(
17841785 for outdated in [False , True ]
17851786 ]
17861787 text_base , text_outdated = [
1787- run (* cmds , return_ = True ) for cmds in [cmds_base , cmds_outdated ]
1788- ]
1789- dicts_base , dicts_outdated = [
1790- json .loads (text ) for text in [text_base , text_outdated ]
1788+ run (* cmds , return_stdout = True ) for cmds in [cmds_base , cmds_outdated ]
17911789 ]
1790+ dicts_base , dicts_outdated = list (
1791+ map (_uv_pip_list_loads , [text_base , text_outdated ])
1792+ )
17921793 return [_uv_pip_list_assemble_output (d , dicts_outdated ) for d in dicts_base ]
17931794
17941795
1796+ def _uv_pip_list_loads (text : str , / ) -> list [StrMapping ]:
1797+ try :
1798+ return json .loads (text )
1799+ except JSONDecodeError :
1800+ raise _UvPipListJsonError (text = text ) from None
1801+
1802+
17951803def _uv_pip_list_assemble_output (
17961804 dict_ : StrMapping , outdated : Iterable [StrMapping ], /
17971805) -> _UvPipListOutput :
17981806 name = dict_ ["name" ]
17991807 try :
18001808 version = parse_version_2_or_3 (dict_ ["version" ])
18011809 except ParseVersion2Or3Error :
1802- raise _UvPipListBaseError (data = dict_ ) from None
1810+ raise _UvPipListBaseVersionError (data = dict_ ) from None
18031811 try :
18041812 location = Path (dict_ ["editable_project_location" ])
18051813 except KeyError :
@@ -1812,7 +1820,7 @@ def _uv_pip_list_assemble_output(
18121820 try :
18131821 latest_version = parse_version_2_or_3 (outdated_i ["latest_version" ])
18141822 except ParseVersion2Or3Error :
1815- raise _UvPipListOutdatedError (data = outdated_i ) from None
1823+ raise _UvPipListOutdatedVersionError (data = outdated_i ) from None
18161824 latest_filetype = outdated_i ["latest_filetype" ]
18171825 return _UvPipListOutput (
18181826 name = dict_ ["name" ],
@@ -1824,7 +1832,20 @@ def _uv_pip_list_assemble_output(
18241832
18251833
18261834@dataclass (kw_only = True , slots = True )
1827- class UvPipListError (Exception ):
1835+ class UvPipListError (Exception ): ...
1836+
1837+
1838+ @dataclass (kw_only = True , slots = True )
1839+ class _UvPipListJsonError (UvPipListError ):
1840+ text : str
1841+
1842+ @override
1843+ def __str__ (self ) -> str :
1844+ return f"Unable to parse JSON; got { self .text !r} "
1845+
1846+
1847+ @dataclass (kw_only = True , slots = True )
1848+ class _UvPipListBaseVersionError (UvPipListError ):
18281849 data : StrMapping
18291850
18301851 @override
@@ -1833,10 +1854,12 @@ def __str__(self) -> str:
18331854
18341855
18351856@dataclass (kw_only = True , slots = True )
1836- class _UvPipListBaseError (UvPipListError ): ...
1837-
1857+ class _UvPipListOutdatedVersionError (UvPipListError ):
1858+ data : StrMapping
18381859
1839- class _UvPipListOutdatedError (UvPipListError ): ...
1860+ @override
1861+ def __str__ (self ) -> str :
1862+ return f"Unable to parse version; got { self .data } "
18401863
18411864
18421865def uv_pip_list_cmd (
0 commit comments