
    G@d"                     2   d dl Z d dlZd dl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
mZmZ d dlmZmZ d dlmZ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  ej        e           Z! G d
 de"          Z# G d de          Z$ G d de          Z%dS )    N)urlopenurlretrieve)URLError	HTTPError)QObjectSignal)__version__)_is_stable_version)is_text_string)is_anaconda)check_versionis_module_installedc                       e Zd ZdZdS ) UpdateDownloadCancelledExceptionz/Download for installer to update was cancelled.N)__name__
__module____qualname____doc__     6lib/python3.11/site-packages/spyder/workers/updates.pyr   r   !   s        99Dr   r   c                   :    e Zd ZdZ e            ZddZd Zd ZdS )WorkerUpdatesz
    Worker that checks for releases using either the Anaconda
    default channels or the Github Releases page without
    blocking the Spyder user interface, in case of connection
    issues.
     Nc                     t          j        |            || _        d | _        d | _        || _        || _        |st          | _        d S || _        d S )N)	r   __init___parenterrorlatest_releasestartupreleasesr	   version)selfparentr!   r#   r"   s        r   r   zWorkerUpdates.__init__/   sU    
"  	#&DLLL"DLLLr   c                      d j         v r	d j        fS t           j                   rd  j        D             }n fd j        D             }|d         }t	           j         |d          |fS )a  Checks if there is an update available.

        It takes as parameters the current version of Spyder and a list of
        valid cleaned releases in chronological order.
        Example: ['2.3.2', '2.3.3' ...] or with github ['2.3.4', '2.3.3' ...]
        devFc                 0    g | ]}t          |          |S r   )r   ).0rs     r   
<listcomp>z8WorkerUpdates.check_update_available.<locals>.<listcomp>I   s&    IIIa4Ea4H4HIIIIr   c                 D    g | ]}t          |          r	|j        v |S r   )r   r#   )r)   r*   r$   s     r   r+   z8WorkerUpdates.check_update_available.<locals>.<listcomp>K   sC     J J Ja033J78DL7H7H 7H7H7Hr   <)r#   r    r   r"   r   )r$   r"   r    s   `  r   check_update_availablez$WorkerUpdates.check_update_available<   s     DL  4.// T\** 	JII4=IIIHHJ J J J4= J J JH ""dlNC@@  	 r   c                    t                      rZd| _        t          j        dk    r| xj        dz  c_        n9t          j        dk    r| xj        dz  c_        n| xj        dz  c_        nd| _        d| _        t          | _        d	}	 t          t          d
          r*t          j                    }t          | j        |          }nt          | j                  }	 |                                }t          |          s|                                }t!          j        |          }t                      rz| j        ^g | _        |d         D ]N}d|v rHt'          j        d|          s3| j                            |                    d          d                    O|                                 }n>| j        7d |D             | _        t1          t3          | j                            | _        |                                 }|\  | _        | _        n# t4          $ r t7          d          }Y nw xY wnS# t8          $ r t7          d          }Y n8t:          $ r t7          d          }Y nt4          $ r t7          d          }Y nw xY w| j        r|4|| _        	 | j         !                                 d	S # tD          $ r Y d	S w xY wd	S )z'Main method of the WorkerUpdates workerz#https://repo.anaconda.com/pkgs/mainntz/win-64/repodata.jsondarwinz/osx-64/repodata.jsonz/linux-64/repodata.jsonz7https://api.github.com/repos/spyder-ide/spyder/releasesFN_create_unverified_context)contextpackagesspyderzspyder-[a-zA-Z]-   c                 F    g | ]}|d                               dd          S )tag_namevr   )replace)r)   items     r   r+   z'WorkerUpdates.start.<locals>.<listcomp>   s=     ); ); );-1 *.j)9)A)A#r)J)J ); ); );r   zUnable to retrieve information.XUnable to connect to the internet. <br><br>Make sure the connection is working properly.zUnable to check for updates.)#r   urlosnamesysplatformupdate_availabler	   r    hasattrsslr3   r   readr   decodejsonloadsr"   researchappendsplitr/   listreversed	Exceptionr
   r   r   r!   r   	sig_readyemitRuntimeError)r$   	error_msgr4   pagedatar=   results          r   startzWorkerUpdates.startS   s   == 
	6<DHw$33))33555DH %)	)	:s899 ) 8::tx999tx((Ayy{{ &d++ );;==Dz$''== F},(*$($4 I ID (D 0 0(*	2Dd(K(K !1 $ 4 4TZZ__Q5G H H H!88::FF},); );59); ); );(,Xdm-D-D(E(E4466=C:%t':': A A A?@@			A 	= 	= 	=;<<III 	F 	F 	F E F FIII 	: 	: 	:899III	:  	!6"DJ##%%%%%   	 "7!6sV   AH/ D4H H/ H+(H/ *H++H/ /I?
I?$I?>I?J. .
J<;J<)r   N)	r   r   r   r   r   rR   r   r/   rY   r   r   r   r   r   &   sb          I# # # #     .C C C C Cr   r   c                   \    e Zd ZdZ ee          Z	  eee          Z	 d Z	d Z
d Zd ZdS )WorkerDownloadInstallerz{
    Worker that donwloads standalone installers for Windows
    and MacOS without blocking the Spyder user interface.
    c                 t    t          j        |            || _        || _        d | _        d| _        d | _        d S )NF)r   r   r   latest_release_versionr   	cancelledinstaller_path)r$   r%   r]   s      r   r   z WorkerDownloadInstaller.__init__   s>    &<#
"r   c                     d}|dk    r||z  }| j         rt                      | j                            ||           dS )z'Calculate download progress and notify.r   N)r^   r   sig_download_progressrS   )r$   block_number	read_size
total_sizeprogresss        r   _progress_reporterz*WorkerDownloadInstaller._progress_reporter   sO    >>#i/H> 	52444"''*=====r   c                    t                               d           t          j                    }t	          d          pt	          d          }t
          j        dk    rd                    |rdnd          }nd                    |rd	nd
          }d| }t          j	        |dd          }t          j
        |d           t          j	        || j                  }t          j
        |d           t          j        |          D ];}|t          | j        fvr)t          j	        ||          }t          j        |           <t          j	        ||          }	|	| _        t          j        |	          s9t                               d| d|	            t#          ||	| j                   dS |                     dd           dS )z7Donwload latest Spyder standalone installer executable.z Downloading installer executablenumpypandasr1   zSpyder_64bit_{}.exefulllitezSpyder{}.dmgr   z-Litez>https://github.com/spyder-ide/spyder/releases/latest/download/r6   updatesT)exist_okzDownloading installer from z to )
reporthookr8   N)loggerdebugtempfile
gettempdirr   r@   rA   formatospjoinmakedirsr]   listdirr	   remover_   isfiler   rf   )
r$   tmpdiris_full_installerrA   r?   dir_pathinstaller_dir_pathfilerx   r_   s
             r   _download_installerz+WorkerDownloadInstaller._download_installer   s   7888$&&099 ;0:: 	7d??(//:K 1<5;= =DD "((/@)MgNND"" "8FHi88
Ht,,,, Xd13 3
&6666Jx(( 	" 	"DK)DEEE(D11	&!!!"4d;;,z.)) 	*LLGcGG~GGI I I^0GI I I I I I ##Aq)))))r   c                    d}	 |                                   n# t          $ r$ | j        rt          j        | j                   Y dS t
          $ r t          d          }Y n8t          $ r t          d          }Y nt          $ r t          d          }Y nw xY w|| _	        	 | j
                            | j                   dS # t          $ r Y dS w xY w)z2Main method of the WorkerDownloadInstaller worker.Nz)Unable to retrieve installer information.r>   z!Unable to download the installer.)r   r   r_   r@   rx   r   r
   r   rQ   r   rR   rS   rT   )r$   rU   s     r   rY   zWorkerDownloadInstaller.start   s)   		?$$&&&&/ 	 	 	" .y,---FF 	G 	G 	GEFFIII 	K 	K 	K J K KIII 	? 	? 	?=>>III	?
	N 344444 	 	 	DD	s3    *BB B:BB C 
CCN)r   r   r   r   r   strrR   intra   r   rf   r   rY   r   r   r   r[   r[      s         
 sI #F3,,	# # #> > > *  *  *D    r   r[   )&rI   loggingr@   os.pathpathrt   rK   rF   rB   rq   urllib.requestr   r   urllib.errorr   r   qtpy.QtCorer   r   r6   r	   spyder.config.baser
   r   spyder.py3compatr   spyder.config.utilsr   spyder.utils.programsr   r   	getLoggerr   ro   rQ   r   r   r[   r   r   r   <module>r      s     				       				 



 



  / / / / / / / / , , , , , , , , ( ' ' ' ' ' ' '       3 3 3 3 3 3 3 3 + + + + + + + + + + + + D D D D D D D D 
	8	$	$	 	 	 	 	y 	 	 	
p p p p pG p p pfc c c c cg c c c c cr   