
    Xh!)                    *   d Z ddlmZ ddlZddlZddlZddlZddlZddl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mZ dd
lmZ ddlmZ dZdZ ej:                  d       ej<                  dd        G d de      Z G d de      Z y)z3Manager and Tornado handlers for license reporting.    )annotationsN)ThreadPoolExecutor)Path)TYPE_CHECKINGAny)
APIHandler)web)ListUnicode)LoggingConfigurable   )get_federated_extensionszthird-party-licenses.jsonUNKNOWNtext/markdownz.mdc                      e Zd ZdZ ed      Z e e       ede gd      Z	e
dd       Z	 d	 	 	 	 	 	 	 ddZdd	Zdd
ZddZdddZddZddZdddZy)LicensesManagerzA manager for listing the licenses for all frontend end code distributed
    by an application and any federated extensions
    r   )max_workerszstatic/z=the license report data in built app and federated extensions)default_valuehelpc                    t         rddlm} t        | j                  |      sJ | j                  j
                  | j                  j                  g}|D cg c]  }|D ]  }|  }}}t        |      S c c}}w )zLazily load the currrently-available federated extensions.

        This is expensive, but probably the only way to be sure to get
        up-to-date license information for extensions installed interactively.
        r   LabServerApp)r   appr   
isinstanceparentlabextensions_pathextra_labextensions_pathr   )selfr   	per_paths
extensions	extensionr   s         V/var/www/html/myenv/lib/python3.12/site-packages/jupyterlab_server/licenses_handler.pyfederated_extensionsz$LicensesManager.federated_extensions1   sw     )dkk<888 KK**KK00
	 ;D`JU_`	i`i``'(:;; as   A4c                   K   t        j                  | j                  j                  | j                  |||             d{   S 7 w)zrAsynchronous wrapper around the potentially slow job of locating
        and encoding all of the licenses
        report_formatbundles_pattern	full_textN)asynciowrap_futureexecutorsubmitreport)r   r&   r'   r(   s       r"   report_asynczLicensesManager.report_asyncD   sL      ((MM  + /#	 ! 
 
 	
 
s   A A	AA	c                    | j                  |      }|dk(  r| j                  |      dfS |dk(  r| j                  |      dfS |dk(  r| j                  ||      dfS d	| d
}t	        |      )z*create a human- or machine-readable report)r'   jsonzapplication/jsoncsvztext/csvmarkdown)r(   r   zUnsupported report format .)bundlesreport_json
report_csvreport_markdown
ValueError)r   r&   r'   r(   r4   msgs         r"   r-   zLicensesManager.reportS   s    ,,,?F"##G,.@@@E!??7+Z77J&$$W	$B 
 +=/;o    c                6    t        j                  d|idd      S )z0create a JSON report
        TODO: SPDX
        r4      T)indent	sort_keys)r0   dumps)r   r4   s     r"   r5   zLicensesManager.report_jsonc   s     zz9g.qDIIr:   c                \   t        j                         }g d}t        j                  |dg|      }|j	                          |j                         D ]C  \  }}|d   D ]6  }|j                  d|i|D ci c]  }||j                  |d       c}       8 E |j                         S c c}w )zcreate a CSV report)nameversionInfo	licenseIdextractedTextbundle)
fieldnamespackages )	ioStringIOr1   
DictWriterwriteheaderitemswriterowgetgetvalue)	r   r4   outfilerF   writerbundle_namerE   packagefields	            r"   r6   zLicensesManager.report_csvi   s    ++-J
X4K
4KL#*==? 	K!*-  +FPQU5'++eR"88Q	 !! Rs   3B)c                @   g }|j                         D cg c];  \  }}|j                  dg       D ]!  }t        |j                  dt                    # = }}}}|rt	        |      nd}|j                         D ]
  \  }}|d| dgz  }|j                  dg       }	|	s|ddgz  }-|	D ]  }|j                  dt              j                         }
|j                  dt              j                         }|j                  dt              j                         }|j                  d	d      }|d
dj                  d|
 dj                  |      d| dj                  d      |g      z   gz  }|s|s|g dz  }|ddd|ddgz  }  dj                  |      S c c}}}w )zcreate a markdown reportrG   rA   r   z# rH   z> No licenses foundrB   rC   rD   z## 	z**`   )rH   z> No license text availablerH   z<pre/>z</pre>
)rM   rO   lenUNKNOWN_PACKAGE_NAMEmaxstripjoinljust)r   r4   r(   linesrS   rE   rT   library_nameslongest_namerG   rA   version_info
license_idextracted_texts                 r"   r7   zLicensesManager.report_markdowny   s    (/}}
 
#V!::j"5
  F$89:
:
 

 .;s=)#*==?  	RK;-("--Ezz*b1H/44# R{{6+?@FFH&{{=:NOUUW$[[6JKQQS
!(_b!A		$&tfB 1 7 7 E$%l^1 7 = =b A *	  )!HH"b(NHb!QQ/R 	RB yyQ
s   A Fc                4   dg i}g }| j                   D ]x  }||z  }| j                  j                  d|       |j                         s||gz  };	 t	        j
                  |j                  d            }	 |d   j                  |d          z |d   s| j                  j                  d||       |S # t        $ r(}| j                  j                  d|||       Y d}~d}~ww xY w# t        $ r(}| j                  j                  d|||       Y d}~d}~ww xY w)	z2Return the content of a packages's license bundlesrG   zLoading licenses from %sutf-8encodingz1Failed to open third-party licenses for %s: %s
%sNz%Failed to find packages for %s: %s
%sz)Third-party licenses not found for %s: %s)
third_party_licenses_fileslogdebugexistsr0   loads	read_text	Exceptionwarningextend)	r   pathrE   bundle_jsonchecked_pathslicense_filelicenses_path	file_jsonerrs	            r"   license_bundlezLicensesManager.license_bundle   s-   ', ;; 	L </MHHNN5}E '')-0	 JJ}'>'>'>'PQ		J'..y/DE'	: :&HHH&R_`/    H!	     <!	 s0   %B25C&2	C#;CC#&	D/DDc                P   t         rddlm} t        | j                  |      sJ t        | j                  j                        }|dz  }|j                         s#|j                  dz  }|j                         r|}nyt        j                  |j                  d            d   }||fS )zget the static directory for this app

        This will usually be in `static_dir`, but may also appear in the
        parent of `static_dir`.
        r   r   zpackage.json)NNrh   ri   rA   )r   r   r   r   r   r   
static_dirrn   r0   ro   rp   )r   r   rt   package_jsonparent_package_jsonrA   s         r"   app_static_infozLicensesManager.app_static_info   s     )dkk<888DKK**+n,""$"&++">"))+2!zz,00'0BCFKTzr:   c                   | j                   j                         D ci c]:  \  }}t        j                  ||      r|| j	                  t        |d         |      < }}}| j                         \  }}|/|J t        j                  ||      r| j	                  ||      ||<   |s| j                  j                  d       |S c c}}w )z6Read all of the licenses
        TODO: schema
        ext_pathzNo license bundles found at all)	r#   rM   rematchr{   r   r   rl   rr   )r   r'   rA   extr4   app_pathapp_names          r"   r4   zLicensesManager.bundles   s     "66<<>
cxx. $%%d3z?&;TBB
 
 "113('''xx2$($7$7($K!HH>?
s   ?CN)returndict[str, Any])r2   .*F)r&   strr'   r   r(   boolr   ztuple[str, str])r4   r   r   r   )T)r4   r   r(   r   r   r   )rt   r   rE   z
str | Noner   r   )r   ztuple[Path | None, str | None])r   )r'   r   r   r   )__name__
__module____qualname____doc__r   r+   r
   r    DEFAULT_THIRD_PARTY_LICENSE_FILErk   propertyr#   r.   r-   r5   r6   r7   r{   r   r4    r:   r"   r   r   !   s     "a0H!%	,678
 M" < <& _d
 
@C
W[
	
 J" + Z%N*r:   r   c                  f     e Zd ZdZd fdZej                  dd       Z	 	 	 	 	 	 	 	 d fdZ xZ	S )LicensesHandlerz6A handler for serving licenses used by the applicationc                0    t         |           || _        y)zInitialize the handler.N)super
initializemanager)r   r   	__class__s     r"   r   zLicensesHandler.initialize   s    r:   c                  K   t        t        j                  | j                  dd                  }| j                  dd      }| j                  dd      }t        t        j                  | j                  dd                  }| j                  j                  |||	       d
{   \  }}t        r(ddlm} t        | j                  j                  |      sJ |rbdj                  | j                  j                  j                  j                         t        j                  |            }	| j!                  |	       | j#                  |       | j%                  |       d
{    y
7 7 w)z Return all the frontend licensesr(   trueformatr0   r4   r   download0r%   Nr   r   z{}-licenses{})
_mime_type)r   r0   ro   get_argumentr   r.   r   r   r   r   r   r   r   lower	mimetypesguess_extensionset_attachment_headerwritefinish)
r   _argsr(   r&   r'   r   r-   mimer   filenames
             r"   rO   zLicensesHandler.get   s1     D$5$5k6$JKL	))(F;++It<

4#4#4Z#EFG!\\66'+ 7 
 
 )dll11<@@@&--##,,224i6O6OPT6UH &&x0

6kkTk***#
" 	+s%   B"E.$E*%B?E.$E,%E.,E.c                   K   | j                          | j                  d|       t        t        |   |i | d{   S 7 w)z>Overload the regular finish, which (sensibly) always sets JSONzContent-TypeN)update_api_activity
set_headerr   r   r   )r   r   argskwargsr   s       r"   r   zLicensesHandler.finish  s@      	  "
3:t3TDVDDDDs   9AAA)r   r   r   None)r   r   r   r   )r   r   r   r   r   r   r   r   )
r   r   r   r   r   r	   authenticatedrO   r   __classcell__)r   s   @r"   r   r      sU    @
 	+ +4EE&)E58E	E Er:   r   )!r   
__future__r   r)   r1   rI   r0   r   r   concurrent.futuresr   pathlibr   typingr   r   jupyter_server.base.handlersr   tornador	   	traitletsr
   r   traitlets.configr   configr   r   r\   r   add_typer   r   r   r:   r"   <module>r      s    9 #  
 	   	 1  % 3  # 0 , $?    9_-5I.T) Tn)Ej )Er:   