
    ԸBeG                        d dl mZmZmZ ddlm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 Zd&dZd'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Zej6                  Zd
ZdZdZdZ dZ!g dZ"dZ#dZ$dZ%dZ& G d de'      Z(ddde!e ddfdZ)ejT                  efdZ+ G d de'      Z,d Z-d Z.d'dZ/d(dZ0d Z1d  Z2d! Z3d)d"Z4d# Z5d)d$Z6d% Z7y# e$ r dZY w xY w)*    )print_functionabsolute_importdivision   )__version__)reportNc                    t         j                  j                  t        j                  t        j                  |                   }t         j                  j                  |d      t         j                  j                  |dd      g}|D ]%  }t         j                  j                  |      s#|c S  t        d| d|      )Nexamplesz..zCould not find examples for z at any of )
ospathdirnameinspectgetfile	importlibimport_modulejoinexists
ValueError)namemodule_path
candidates	candidates       (lib/python3.12/site-packages/pyct/cmd.py_find_examplesr      s    ''//'//)2I2I$2O"PQK 	[,
[j1	3J   	77>>)$ DT
UU    c                 @    t        | |||       t        | |d||       y)z
    Copy examples and fetch data (if any) to the supplied path.
    See copy-examples and fetch-data for more flexibility.

    NOTE: force operates both on example and data over-writing
    pre-existing files.
    F)require_datasetsuse_test_dataforceN)copy_examples
fetch_data)r   r   verboser   r   s        r   r
   r
      s#     $gu-tD%mRWXr   c                 6   t        |       }t        j                  j                  |      }t        j                  j	                  |      r|st        d|z        |rt        d|z         t        j                  j                  |||       t        d|z         y)z#Copy examples to the supplied path.zSPath %s already exists; please move it away, choose a different path, or use force.zCopying examples from %s)r"   zCopied examples to %sN)
r   r   r   abspathr   r   print	distutilsdir_util	copy_tree)r   r   r"   r   sources        r   r    r    *   s|    D!F77??4 D	ww~~dEnosstt(/0  w ?	
!$
&'r   )OrderedDictz%s[%s%s] %i/%i - %sz%s %s %i/%i.# )|/-\	   dataz.data_stubsc                   B    e Zd Zd Zd ZdddeeddfdZddZd	 Z	d
 Z
y)Barc                     | S N selfs    r   	__enter__zBar.__enter__r   s    r   c                 $    | j                          y)NF)done)r:   exc_typeexc_valexc_tbs       r   __exit__zBar.__exit__u   s    		r        Nr   c                    || _         || _        || _        |	 t        j	                          | _        || _        || _        || _        || _	        t        j                         | _        g | _        d| _        t        j                         | _        | j                  | j                        | _        d| _        | j                  r| j%                  d       yy# t
        $ r
 d| _        Y w xY w)z3Bar is a class for printing the status of downloadsNTr   )labelwidthhideSTREAMisattyAttributeError
empty_charfilled_charexpected_sizeeverytimestartittimesetaetadeltaformat_timeetadisplast_progressshow)r:   rE   rF   rG   rK   rL   rM   rN   s           r   __init__zBar.__init__y   s     

	<! &/	 ((*"
!YY[
!YY[!--dhh7IIaL  " ! 	!s   C C('C(c           	         ||| _         | j                   t        d      || _        t        j                         | j                  z
  t
        kD  rt        j                         | _        | j                  t         d  | j                  t        j                         z
   |dz   z  gz   | _        t        | j                        t        t        | j                              z  | j                   |z
  z  | _        | j                  | j                        | _        t        | j                   |z  | j                   z        }| j"                  s|| j$                  z  dk(  s|| j                   k(  r|t&        j)                  t*        | j,                  | j.                  |z  | j0                  | j                   |z
  z  || j                   | j                  fz         t&        j3                          y y y )Nzexpected_size not initializedr   r   )rM   	ExceptionrV   rO   rS   ETA_INTERVALrQ   ETA_SMA_WINDOWrP   sumfloatlenrR   rT   rU   intrF   rG   rN   rH   writeBAR_TEMPLATErE   rL   rK   flush)r:   progresscountxs       r   rW   zBar.show   s   !&D%;<<%IIK$--'<7 IIKDMn_-.zzDIIK/0HQJ?@A L DLL!E#dll*;$<<##h.0 H  ++DHH5DL

X%(:(::;yyDJJ&1,T///\JJ 0 01 4OOtzzA~6&&-6 6 7  0 r   c           	         t        j                          | j                  z
  | _        | j                  | j                        }| j                  st
        j                  t        | j                  | j                  | j                  z  | j                  dz  | j                  | j                  |fz         t
        j                  d       t
        j                          y y )Nr   
)rO   rP   elapsedrT   rG   rH   ra   rb   rE   rL   rF   rK   rV   rM   rc   )r:   elapsed_disps     r   r=   zBar.done   s    yy{TZZ/''5yyLL

D,,tzz9!#T%7%7""L)2 2 3 LLLLN r   c                 T    t        j                  dt        j                  |            S )Nz%H:%M:%S)rO   strftimegmtime)r:   secondss     r   rT   zBar.format_time   s    }}ZW)=>>r   r7   )__name__
__module____qualname__r;   rA   BAR_EMPTY_CHARBAR_FILLED_CHARrX   rW   r=   rT   r8   r   r   r5   r5   q   s2      r,D22
?r   r5   rB   rC   c           	   #      K   |t        |       n|}t        |||t        t        ||      5 }	t	        |       D ]  \  }
}| |	j                  |
dz           	 ddd       y# 1 sw Y   yxY ww)z/Progress iterator. Wrap your iterables with it.N)rE   rF   rG   rK   rL   rM   rN   r   )r_   r5   rr   rs   	enumeraterW   )itrE   rF   rG   rK   rL   rM   rN   re   bariitems               r   rw   rw      sr      %,CG-E	5D^(U
L  } 	GAtJHHQUO	  s   *A.,A"	A."A+'A.c                      G d d|      }fd}|j                  t        j                  j                  j                  |       t        j
                  | |      S )Nc                       e Zd Zy)#ordered_load.<locals>.OrderedLoaderN)ro   rp   rq   r8   r   r   OrderedLoaderr|      s    r   r}   c                 T    | j                  |        | j                  |            S r7   )flatten_mappingconstruct_pairs)loadernodeobject_pairs_hooks     r   construct_mappingz'ordered_load.<locals>.construct_mapping   s'    t$ !7!7!=>>r   )add_constructoryamlresolverBaseResolverDEFAULT_MAPPING_TAGload)streamLoaderr   r}   r   s     `  r   ordered_loadr      sM     ? !!""66 99V]++r   c                   "    e Zd ZdZd Zd Zd Zy)DirectoryContextz2
    Context Manager for changing directories
    c                 D    t        j                         | _        || _        y r7   )r   getcwdold_dirnew_dir)r:   r   s     r   rX   zDirectoryContext.__init__   s    yy{r   c                 B    t        j                  | j                         y r7   )r   chdirr   r9   s    r   r;   zDirectoryContext.__enter__       
r   c                 B    t        j                  | j                         y r7   )r   r   r   )r:   argss     r   rA   zDirectoryContext.__exit__   r   r   N)ro   rp   rq   __doc__rX   r;   rA   r8   r   r   r   r      s    r   r   c                    t        dj                  |             t        j                  | d      }	 t	        |d      5 }t        |j                  j                  d            }t        |j                  d      |dz  dz   d	
      D ]&  }|s|j                  |       |j                          ( 	 ddd       y# 1 sw Y   yxY w#  t        j                  j                  |      rt        j                  |        xY w)zGiven a url, output_path and title,
    write the contents of a requests get operation to
    the url in binary mode and print the title of operationzDownloading {0}T)r   wbzcontent-lengthi   )
chunk_sizer   i  )rM   rN   N)r%   formatrequestsgetopenr`   headersrw   iter_contentra   rc   r   r   r   remove)urloutput_pathtitlerespftotal_lengthchunks          r   _url_to_binary_writer      s     


"
"5
)*<<D)D+t$ 	t||//0@ABLT..$.?P\]aPaefOfnrs GGENGGI	 	 	77>>+&IIk"s/   C AB;#B;2C ;C C C 7C>c                    | j                  d      rEt        j                  | d      5 }|j                          ddd       t	        j
                  |        y| j                  d      rEt        j                  | d      5 }|j                          ddd       t	        j
                  |        y| j                  d      rEt        j                  | d      5 }|j                          ddd       t	        j
                  |        y| j                  d      rEt        j                  | d	      5 }|j                          ddd       t	        j
                  |        yy# 1 sw Y   #xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ExY w)
zEExtract a local archive, e.g. zip or tar, then
    delete the archiveztar.gzzr:gzNtarzr:ztar.bz2zr:bz2zipr)endswithtarfiler   
extractallr   r   zipfileZipFile)r   r   zipfs      r   _extract_downloaded_archiver      s-    H%\\+v. 	#NN	
		+			e	$\\+t, 	NN	
		+			i	(\\+w/ 	3NN	
		+			e	$__[#. 	$OO	
		+ 
%	 		 		 		 	s/   E>E'E3*E?E$'E03E<?Fc                    t         j                  j                  |      st        j                  |       t	        |      5  d}| j                  dg       D ]%  }t         j                  j                  |      r#d} n |du r)|s't        dj                  | d                	 ddd       y| d   }| d   dz   }|j                  d	      r| d   D cg c]  }||z   	 }	}| d   D 
cg c]'  }
t         j                  j                  |t        |
      ) }}
|D cg c];  }d
j                  |j                  d
      d|j                  d      rdnd       dz   = }}nD|g}	t         j                  j                  |      d   g}| d   }t        |t        t        f      s|g}t        |	||      }t!        |      D ]w  \  }\  }}}|j                  |dz   t#        |	            }|du r_t%        j$                  |      s/t         j                  j                  |j'                  dd            rt        dj                  |             t         j                  j                  |t(        |      }|rrt         j                  j                  |      rSt         j                  j                  ||      }t        dj                  ||             t+        j,                  ||       %|r9t         j                  j                  |      st        dj                  |             t/        |||       t1        |       z 	 ddd       t2        !t        d       t5        j6                  d       yyc c}w c c}
w c c}w # 1 sw Y   @xY w)ay  Process each download spec in datasets.yml

    Typically each dataset list entry in the yml has
    "files" and "url" and "title" keys/values to show
    local files that must be present / extracted from
    a decompression of contents downloaded from the url.

    If a url endswith '/', then all files given
    are assumed to be added to the url pattern at the
    end
    FfilesTzSkipping {0}r   Nr   z	 {} of {}r/   r+   gz*r   rB   z%Copying test data file '{0}' to '{1}'z6No test file found for: {}. Using regular file insteadzIthis download script requires the requests module: conda install requests)r   r   r   makedirsr   r   r%   r   r   r   DATA_DIRsplit
isinstancetuplelistr   ru   r_   globreplaceDATA_STUBS_DIRshutilcopyfiler   r   r   sysexit)dataset
output_dirherer   r   requires_downloadr   r   	title_fmturlsfnameoutput_pathsr   unpackedzippedidxunpackrunning_titletesttargets                       r   _process_datasetr     s    77>>*%
J	*	% *5!Wb) 	A77>>!$$(!	
 E>"3.''(89:*5 *5 enG${2	<<%,W%56C!G6D6)0)9; % GGLLx? ;L ; ,89' !2!23!78c@T@TUY@Z"`b!dehkk 9H 9 5DGGMM#.q12Lw'Hh6$:T<2/8/@ 	5+C+#{F%,,S1Wc$i@M~499V#4v~~VYZ\G]8^ n++M:;77<<
NFCD!5j&9=DDT6RSf-rww~~d';NUUVZ[\ k=A'4!	55*5Z YZ A 7;9#*5 *5sD    7M08)M0*%M0M!	M0$,M&M0A M+GM0!M00M9c           
         t         j                  j                  |      }t         j                  j                  ||      }t         j                  j	                  |      s)t         j                  j                  t        |       |      }t         j                  j	                  |      s|du rt        d       yt        d|dt         j                  j                  |t                     t        |      5 }t        |j                               }|j                         D ]<  \  }	}
t         j                  j                  ||	      }|
D ]  }t        |||||        > 	 ddd       y# 1 sw Y   yxY w)zFetch sample datasets as defined by path/datasets if it exists or else module's own examples/datasets otherwise.

    Datasets are placed in path/data
    FzNo datasets to downloadNzFetching data defined in z and placing in )r   r   )r   r   r$   r   r   r   r%   r   r   r   readitemsr   )r   r   datasetsr   r   r   	info_filer   infotopic	downloadsr   ds                r   r!   r!   M  s   
 77??4 DT(+I77>>)$GGLL!5h?	77>>)$)9U)B'(	9RWW\\RVW_E`
ab	i `AAFFH% $

 	`E9dE2J ` JMY^_`	`` ` `s   5A)E((E1c                    t         j                  j                  |      }t         j                  j                  |      st	        |       }t         j                  j                  |t              }t         j                  j                  |t              }t         j                  j                  |      r!t        t        j                  |            dk(  rt        d       yt        j                  |      D ]  }t         j                  j                  ||      }t         j                  j                  |      st        d|       Pt         j                  j                  ||      }t         j                  j                  |      st         j                  j                  |      }t         j                  j                  |      }||k(  r"t        d|       t        j                  |       t        dj                  ||              y)z=Remove up any data files that are copied from test files
    r   zNo test files foundNz!Test file was not copied to data:zRemoving copied test file:z?Size of test file {:.2e} did not match size of data file {:.2e})r   r   r$   r   r   r   r   r   r_   listdirr%   isfilegetsizer   r   )	r   r   data_dirtest_dirr   	data_file	test_filedata_stest_ss	            r   
clean_datar   d  sV    77??4 D77>>$d#ww||D(+Hww||Hn5H77>>(#s2::h+?'@A'E#$ZZ! IGGLL1-	ww~~i(5q9GGLL1-	77>>)$WW__Y/FWW__Y/F2A6		)$ 1171GIIr   c                     d|v r| j                  dddd       d|v r)| j                  dt        ddj                  |      	       y y )
N-vz	--verbosere   r   )actiondefault--pathzwhere to place outputz{}-examples)typehelpr   )add_argumentstrr   )parserr   r   s      r   _add_common_argsr     sR    t|D+gqI4H#4KUbUiUijnUop r   c                 4    | j                  fd       y )Nc                 p     fi t        |       D ci c]  }|dk7  s	|t        | |       c}S c c}w )Nfunc)varsgetattr)r   kfnr   s     r   <lambda>z_set_defaults.<locals>.<lambda>  s:    "T*lRVW[R\5jQ`aci`iaa6H5j*l 5js   
33r   )set_defaults)r   r   r   s    ``r   _set_defaultsr    s    
lmr   c                 p   |g d}d|v r]| j                  dt        j                  t                    }|j	                  ddd       t        ||d	d
       t        ||t               d|v r| j                  dt        j                  t                    }|j	                  dt        dd       |j	                  ddd       |j	                  ddd       t        ||d
       t        ||t               d|v rq| j                  dt        j                  t                    }|j	                  ddd       |j	                  ddd       t        ||d	d
       t        ||t               d|v rI| j                  dt        j                  t                    }t        ||d
       t        ||t               yy)zF
    Add all commands in pyct.cmd unless specific cmds are listed
    N)r
   copy-examples
fetch-data
clean-datar  r   z--force
store_truezQif PATH already exists, force overwrite existing files if older than source files)r   r   r   r   r  z
--datasetsdatasets.ymlz^*name* of datasets file; must exist either in path specified by --path or in package/examples/)r   r   r   z,Force any existing data files to be replacedz--use-test-datazUse data's test files, if any, instead of fetching full data. If test file not in '.data_stubs', fall back to fetching full data.r
   zif PATH already exists, force overwrite existing examples if older than source examples. ALSO force any existing data files to be replacedr  )
add_parserr   getdocr    r   r   r  r!   r   r
   r   )r   r   cmdsr   	eg_parserd_parser
egd_parser	cd_parsers           r   add_commandsr    s    |E $%%oGNN=<Y%Z	y&H 	 	J 	D$9i}5t$$\z8R$Sln%R 	 	T 	iCqr/%j 	 	l 	42hj1T&&zx8P&Q
	,'p 	  	r 	 1,'l 	  	n 	T4:j$1t%%l
9S%T	D(3iz2 r   c                 p    t        j                  |      }| j                  ddd|j                  z          y )N	--versionversion	%(prog)s r   r  )r   r   r   r   )r   r   mods      r   add_versionr    s0    

!
!$
'C
I{S__?\]r   c                    t        j                  d| z        }|j                  d      }t        || ||       t	        ||        |j                         }t        |d      r|j                  |       y|j                  d       y)z_
    If module has no other commands, use this function to add all of the ones in pyct.cmd
    z%s commandsdescriptionavailable commandsr   r   must supply command to runN)	argparseArgumentParseradd_subparsersr  r  
parse_argshasattrr   error)r   r  r   r   
subparserss        r   substitute_mainr'    ss     $$t1CDF&&-A&BJT4.DtF+DIIdO>Z1[r   c                     t        j                  d      } | j                  dddt        z          | j	                  d      }|j                  d	t        j                  t              
      }|j                  t               |j                  ddt        dd       | j                         }t        |d      r |j                  |j                    y | j                  d       y )NzCommands relating to versioningr  r  r  r  r  r  r  r   r  r  packagespackage+zname of package)metavarr   nargsr   r   r  )r   r!  r   r   r"  r  r   r  r   r  r   r#  r$  r   r)  r%  )r   r&  report_parserr   s       r   mainr/    s    $$1RSF
I{;?VW&&-A&BJ))(9O)PMF+z)3$5  7 DtF		4==!12r   )FFF)FF)r
  TFF)NN)8
__future__r   r   r   rB   r   r   r   r   r   r   distutils.dir_utilr&   r   r   r
   r    collectionsr*   r   r   r   rO   r   r   r   ImportErrorstderrrH   rb   MILL_TEMPLATE	DOTS_CHARrs   rr   
MILL_CHARSr[   r\   r   r   objectr5   rw   r   r   r   r   r   r   r!   r   r   r  r  r  r'  r/  r8   r   r   <module>r9     s4  
 A @   	     V	Y	(* $  
     
&	"
  G?& G?T BTn#4q !%{ 	,v (*>@`.I<qn*3X^
\3i  Hs   C C! C!