
    ܖiP                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
Z G d de      Zy)zX
Functionality for formatting vulnerability results as a set of human-readable columns.
    )annotations)Iterable)zip_longest)Anycast)VersionN   )VulnerabilityFormatc           
     \   | D cg c]  }t        t        t        |             } }t        | ddiD cg c]  }t	        t        t
        |             }}| D cg c]:  }dj                  t        t        j                  ||            j                         < }}||fS c c}w c c}w c c}w )zReturn a list of formatted rows and a list of column sizes.
    For example::
    >>> tabulate([['foobar', 2000], [0xdeadbeef]])
    (['foobar     2000', '3735928559'], [10, 4])
    	fillvalue  )	tuplemapstrr   maxlenjoinljustrstrip)rowsrowcolsizestables        ]/var/www/html/content-pipeline/venv/lib/python3.12/site-packages/pip_audit/_format/columns.pytabulater      s     -11SE#c3- 1D1+6+K+KLCSS#LELFJKsSXXc#))S%0188:KEK%< 2LKs    B B$?B)c                  n    e Zd ZdZd
dZedd       Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
ddZy	)ColumnsFormatzp
    An implementation of `VulnerabilityFormat` that formats vulnerability results as a set of
    columns.
    c                     || _         || _        y)a  
        Create a new `ColumnFormat`.

        `output_desc` is a flag to determine whether descriptions for each vulnerability should be
        included in the output as they can be quite long and make the output difficult to read.

        `output_aliases` is a flag to determine whether aliases (such as CVEs) for each
        vulnerability should be included in the output.
        N)output_descoutput_aliases)selfr!   r"   s      r   __init__zColumnsFormat.__init__%   s     ',    c                     y)z8
        See `VulnerabilityFormat.is_manifest`.
        F )r#   s    r   is_manifestzColumnsFormat.is_manifest2   s    
 r%   c           	     V   g }g d}|r|j                  d       | j                  r|j                  d       | j                  r|j                  d       |j                  |       |j                         D ]n  \  }j	                         rt        t        j                        t        fd|D        d      }|D ]$  }|j                  | j                  ||             & p d}t        |      dkD  r[t        |      \  }	}
t        |      d	kD  r,|	j                  dd
j                  t        d |
                   |	D ]  }|r|dz  }||z  } g }ddg}|j                  |       |j                         D ]P  \  }j	                         st        t        j                        |j                  | j!                               R t        |      dk  r|S t        |      \  }}
|j                  dd
j                  t        d |
                   |D ]  }|r|dz  }||z  } |S )z
        Returns a column formatted string for a given mapping of dependencies to vulnerability
        results.

        See `VulnerabilityFormat.format`.
        )Namer   IDzFix VersionszApplied FixAliasesDescriptionc              3  B   K   | ]  }|j                   k(  s|  y wN)dep).0fr0   s     r   	<genexpr>z'ColumnsFormat.format.<locals>.<genexpr>Q   s     AaAEESLAs   Nr   r	   r   r   c                    d| z  S N-r'   xs    r   <lambda>z&ColumnsFormat.format.<locals>.<lambda>]   s
    cAg r%   
r*   zSkip Reasonc                    d| z  S r5   r'   r7   s    r   r9   z&ColumnsFormat.format.<locals>.<lambda>v   s
    cAg r%   )appendr"   r!   items
is_skippedr   serviceResolvedDependencynext_format_vulnr   r   insertr   r   SkippedDependency_format_skipped_dep)r#   resultfixes	vuln_dataheadervulnsapplied_fixvulncolumns_stringvuln_stringsr   r   	skip_dataskip_header_skip_stringsr0   s                   @r   formatzColumnsFormat.format9   s,    &(	:MM-(MM)$MM-(  ,,. 	LJC~~w1137CA5A4HK L  !2!23k!JKL	L  y>A"*9"5L% 9~!##Asxx4Eu0M'NO# &!"d*N#%& &(	}-%lln 	@FC~~744c:  !9!9#!>?	@ y>Q!!&y1e 	Asxx,=u(EFG 	"C$&c!N	"
 r%   c                ~   |j                   |j                  |j                  | j                  |j                        g}| |j                  | j                  |             | j                  r*|j                  dj                  |j                               | j                  r|j                  |j                         |S )Nz, )canonical_nameversionid_format_fix_versionsfix_versionsr<   _format_applied_fixr"   r   aliasesr!   description)r#   r0   rL   rK   rH   s        r   rB   zColumnsFormat._format_vuln   s     KKGG%%d&7&78	
	 "T55kBCTYYt||45T--.r%   c                \    dj                  |D cg c]  }t        |       c}      S c c}w )N,)r   r   )r#   rY   rV   s      r   rX   z"ColumnsFormat._format_fix_versions   s#    xx\B'WBCCBs   )c                2    |j                   |j                  gS r/   )rU   skip_reason)r#   r0   s     r   rE   z!ColumnsFormat._format_skipped_dep   s    OO
 	
r%   c                   |j                         rWt        t        j                  |      }d|j                  j
                   d|j                  j                   d|j                   S t        t        j                  |      }d|j                  j
                   d|j                  j                   d|j                   dS )NzFailed to fix z (z): zSuccessfully upgraded z => ))	r>   r   fixSkippedFixVersionr0   rU   rV   r`   ResolvedFixVersion)r#   rK   s     r   rZ   z!ColumnsFormat._format_applied_fix   s    !!#s44kBK !?!? @;??CZCZB[[^**+- 311;?$[__%C%C$DB{G^G^F_ `%%&a)	
r%   N)r!   boolr"   rf   )returnrf   )rF   z;dict[service.Dependency, list[service.VulnerabilityResult]]rG   zlist[fix.FixVersion]rg   r   )r0   zservice.ResolvedDependencyrL   zservice.VulnerabilityResultrK   zfix.FixVersion | Nonerg   	list[Any])rY   zlist[Version]rg   r   )r0   zservice.SkippedDependencyrg   rh   )rK   zfix.FixVersionrg   r   )__name__
__module____qualname____doc__r$   propertyr(   rS   rB   rX   rE   rZ   r'   r%   r   r   r      s    
-  DKD $D 
	DL' * +	
 
(D

r%   r   )r   zIterable[Iterable[Any]]rg   ztuple[list[str], list[int]])rl   
__future__r   collections.abcr   	itertoolsr   typingr   r   packaging.versionr   pip_audit._fix_fixrc   pip_audit._service_servicer?   	interfacer
   r   r   r'   r%   r   <module>rx      s8    # $ !  %  $ *	H
' H
r%   