
    5iF5                         d Z ddlmZmZmZ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mZ ddlmZ ddlZddlmZ dd	lmZmZmZ dd
lmZ ddlmZ d ZddZ G d de      Zy)z
Logic for managing environment variable values and corresponding dxpy
configuration values.  See external documentation
https://documentation.dnanexus.com/user/helpstrings-of-sdk-command-line-utilities#overriding-environment-variables
for more details.
    )print_functionunicode_literalsdivisionabsolute_importN)rmtree)MutableMapping   )warn   )DEFAULT_APISERVER_PROTOCOLDEFAULT_APISERVER_HOSTDEFAULT_APISERVER_PORT)format_exception)fillc                 N    	 t        j                  |        y # t        $ r Y y w xY wN)osremove	Exception)filenames    s/home/marpiech/ifpan-abm-pgxpred/analysis/marpiech-gwas-test/venv/lib/python3.12/site-packages/dxpy/utils/config.py_remove_ignore_errorsr   %   s%    
		( s    	$$c                     t        |        t        j                  t        j                  | t        j                  t        j
                  z  |      d      S )Nw)r   r   fdopenopenO_CREATO_WRONLY)r   permss     r   "_open_for_writing_with_permissionsr    +   s5    (#99RWWXrzzBKK'?GMM    c                       e Zd ZdZh dZh dZ	 ej                  ee      Z e	j                  ddd      eeeddZd	Zdd
Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ddZ!y)DXConfiga  This class provides the dxpy configuration manager, available as
    ``dxpy.config``. When first accessed, the config manager looks up
    environment variables used to configure dxpy, and if they are not
    found, then attempts to resolve them by looking in the file
    ~/.dnanexus_config/environment, followed by the installed defaults
    in /etc/dnanexus.

    To assign to and access variables managed by the configuration
    manager, use ``dxpy.config["VAR_NAME"]``. When assigning a
    variable, the manager sets it as a process environment variable
    and updates any dxpy variable bound to it
    (e.g. dxpy.SECURITY_CONTEXT when setting
    DX_SECURITY_CONTEXT). When accessing a variable, it is looked up
    from the process environment.

    To save (serialize) the value of a variable to a persistent dxpy
    configuration file, use ``dxpy.config.write(key, value)`` or
    ``dxpy.config.save()`` after assigning variable values. To clear
    the values in persistent dxpy configuration, use
    ``dxpy.config.clear()``.
    >   	DX_JOB_IDDX_WORKSPACE_IDDX_APISERVER_HOSTDX_APISERVER_PORTDX_SECURITY_CONTEXTDX_APISERVER_PROTOCOLDX_PROJECT_CONTEXT_ID>   	DX_CLI_WDDX_USERNAMEDX_PROJECT_CONTEXT_NAMEPUBLICBearer)
auth_tokenauth_token_type/)r(   r)   r&   r'   r+   z/etc/dnanexusc                    	 t        t        j                  j                  dd            t        _        	 t        t        j                  j                  dd            t        _	        t        j                  j                  t        j                  j                  dd            | _        t        j                  j                  | j                  d	      t        _        t        j                  j                  t        j                        rPt        j                  j!                  t        j                        t#        j"                         d
z
  kD  rdt        _        | j%                  | j'                               }|j)                  | j%                  | j+                                      |j)                  | j%                  | j-                  d                   g }| j.                  D ]e  }|t        j                  v s||v r6|j                  |      t        j                  |   k7  r|j1                  |       t        j                  |   ||<   g |D ]  }||   	||   t        j                  |<     t2        j4                  j7                         rR|sPt9        |      dkD  rBd}t        t;        |dj                  |      z   d             d}t        t;        |d             | j=                          y# t        $ r3}t        dt        j                  d          dt        _        Y d}~d}~ww xY w#  dt        _	        Y xY w)z
        :param suppress_warning:
            Whether to suppress the warning message for any mismatch found in the environment variables and the dx
            configuration file
        :type suppress_warning: boolean
        	_DX_DEBUGr   z5WARNING: Expected _DX_DEBUG to be an integer, but gotN_DX_INJECT_ERRORFDX_USER_CONF_DIRz~/.dnanexus_configz.upgrade_notifyiQ T)cleanupzkWARNING: The following environment variables were found to be different than the values last stored by dx: z, P   )widthzTo use the values stored by dx, unset the environment variables in your shell by running "source ~/.dnanexus_config/unsetenv".  To clear the dx-stored values, run "dx clearenv".)intr   environgetdxpy_DEBUG
ValueErrorr
   bool_INJECT_ERRORpath
expanduser_user_conf_dirjoin_UPGRADE_NOTIFYexistsgetmtimetime_read_conf_dirget_global_conf_dirupdateget_user_conf_dirget_session_conf_dir	VAR_NAMESappendsysstdoutisattylenr   _sync_dxpy_state)selfsuppress_warningeenv_varsenv_overridesvarmsgs          r   __init__zDXConfig.__init__W   si   	bjjnn[!<=DK
	'!%bjjnn5G&K!LD !gg00@RTh1ij!ww||D,?,?ARS77>>$../BGG4D4DTEYEY4Z]a]f]f]hkp]p4p#(D &&t'?'?'AB++D,B,B,DEF++D,E,Ed,E,STU>> 	0Cbjj (?x||C'8BJJsO'K!((- "

3		0  	0C}("*3-

3	0 ::#M(:Q(>,T#		- 88CDqT#R()O  	H"**U`JabDKK		'!&Ds"   2K0 2L/ 0	L,9(L''L,/L?c                    t        j                  t        j                  j	                  dd       t        j                  j	                  dd       t        j                  j	                  dd              dt        j                  v r9t        j
                  t        j                  t        j                  d                dt        j                  v rYt        j                  t        j                  d          t        j                  t        j                  j	                  d             nGt        j                  d        t        j                  t        j                  j	                  d             d	t        j                  v r3t        j                  t        j                  j	                  d	             nt        j                  d        t        j                  t        j                  j	                  d             y )
Nr&   r'   r)   )hostportprotocolr(   r$   r%   r*   DX_WATCH_PORT)r=   set_api_server_infor   r;   r<   set_security_contextjsonloads
set_job_idset_workspace_idset_watch_portset_project_contextrV   s    r   rU   zDXConfig._sync_dxpy_state   s/     bjjnn5H$&O&(jjnn5H$&O*,**..9PRV*W	Y !BJJ.%%djj<Q1R&ST"**$OOBJJ{34!!"**..1B"CDOOD!!!"**..1H"IJbjj(

 ?@%  0G!HIr!   c                     | j                   S r   )_global_conf_dirrk   s    r   rK   zDXConfig.get_global_conf_dir   s    $$$r!   c                     | j                   S r   )rD   rk   s    r   rM   zDXConfig.get_user_conf_dir   s    """r!   c           	         t         j                  j                  | j                  d      }	 ddlm}m} |r]	 t        j                  |      }|D ]B  }	 t        |      } ||      rt        t         j                  j                  ||      d       D  |t        j                               j                         }	|	 |t        j                               }	t         j                  j                  |t        |	j                              }
|	|	j                  dk7  rvt         j                  j                  |t        |	j                              }t         j                  j!                  |      r|S |	j                         }	|	|	j                  dk7  rv|
S # t        $ r}g }Y d}~Xd}~ww xY w# t        $ r Y jw xY w# t"        t$        t&        f$ rA}t)        j*                         dk7  r t-        t/        dt1        |      z                Y d}~n9d}~wt2        $ r*}t-        t/        d	t1        |      z                Y d}~nd}~ww xY w| j5                  |      S )
a  
        Tries to find the session configuration directory by looking in ~/.dnanexus_config/sessions/<PID>,
        where <PID> is pid of the parent of this process, then its parent, and so on.
        If none of those exist, the path for the immediate parent is given, even if it doesn't exist.

        If *cleanup* is True, looks up and deletes all session configuration directories that belong to nonexistent
        processes.
        sessionsr   )Process
pid_existsNTignore_errorsWindowsz.Error while retrieving session configuration: 9Unexpected error while retrieving session configuration: )r   rB   rE   rD   psutilrq   rr   listdirOSErrorr:   r?   r   getpidparentstrpidrG   ImportErrorIOErrorAttributeErrorplatformsystemr
   r   r   r   _get_ppid_session_conf_dir)rV   r7   sessions_dirrq   rr   session_dirsrX   session_dirsession_pidparent_processdefault_session_dirs              r   rN   zDXConfig.get_session_conf_dir   s    ww||D$7$7D&	j2&#%::l#;L $0 \K!&)+&6
 &k2rww||L+FVZ[\ %RYY[188:N%!(!5"$'',,|SASAS=T"U ,1C1Cq1H ggll<^=O=O9PQ77>>+.&&!/!6!6!8	 !,1C1Cq1H
 '&3  &
 $&L& & ! !!" Wn5 	c  I-TJM]^_M``ab 	jQTdefTgghii	j..|<<s   
F< F F< F,F< &DF< /!F< F< 	F)F$F< $F))F< ,	F95F< 8F99F< <I7HI H==Ic           	      p   	 t         j                  j                  |t        t        j                                     S # t
        $ r Y n5t        $ r*}t        t        dt        |      z                Y d }~nd }~ww xY wt         j                  j                  |t        t        j                                     S )Nrv   )r   rB   rE   r|   getppidr   r   r
   r   r   rz   )rV   r   rX   s      r   r   z#DXConfig._get_ppid_session_conf_dir   s    	j77<<c"**,.?@@ 	 	jQTdefTgghii	jww||L#biik*:;;s   := 	A:A: A55A:c                    	 t        t        j                  j                  |d            5 }t	        j
                  |      }d d d        | j                  D ]H  }	 t        t        j                  j                  ||            5 }|j                         |<   d d d        J S # 1 sw Y   bxY w# t        $ r i }Y rw xY w# 1 sw Y   *xY w# t        $ r Y w xY w)Nenvironment.json)	r   r   rB   rE   re   loadr   STANDALONE_VAR_NAMESread)rV   dirnamefdrY   standalone_vars        r   rJ   zDXConfig._read_conf_dir   s    	bggll7,>?@ )B99R=)
 #77 	N"'',,w?@ 9B/1wwyH^,9	 ) ) 	H	
9 9 sR   )B. B"B. )CB?C"B+'B. .B<;B<?C	C	CCc                 Z    || j                   vrt        |      t        j                  |   S r   )rO   KeyErrorr   r;   rV   items     r   __getitem__zDXConfig.__getitem__   s'    t~~%4. zz$r!   c                     || j                   vrt        |      || j                  j                  |d      }|t        j
                  |<   || j                  v r| j                          y y )N )rO   r   defaultsr<   r   r;   CORE_VAR_NAMESrU   )rV   keyvalues      r   __setitem__zDXConfig.__setitem__   s_    dnn$3-=MM%%c2.E

3$%%%!!# &r!   c                     || j                   vrt        |      t        j                  |= || j                  v r| j                          y y r   )rO   r   r   r;   r   rU   )rV   r   s     r   __delitem__zDXConfig.__delitem__   sB    dnn$3-JJsO$%%%!!# &r!   c              #   \   K   | j                   D ]  }|t        j                  v s|  y wr   )rO   r   r;   r   s     r   __iter__zDXConfig.__iter__  s*     NN 	Drzz!
	s   ",,c                 x    t        | j                  D cg c]  }|t        j                  v s| c}      S c c}w r   )rT   rO   r   r;   )rV   r[   s     r   __len__zDXConfig.__len__
  s*    4>>GCSBJJ5FCGHHGs   77c                     d}|j                  | j                  | j                  j                  t	        |       t        |             S )Nz6<{module}.{classname} object at 0x{mem_loc:x}: {data}>)module	classnamemem_locdata)format
__module__	__class____name__iddict)rV   descs     r   __repr__zDXConfig.__repr__  s>    G{{$//%)^^%<%<#%d8 $T
  , 	,r!   c                 .    || |<   | j                          y r   )save)rV   r   r   s      r   writezDXConfig.write  s    T
		r!   c                     | j                  | j                         | j                  | j                                | j                  | j                         y r   )_write_conf_dirrD   rN   _write_unsetenvrk   s    r   r   zDXConfig.save  sA    T001T6689T001r!   c                 B   t         j                  j                  t         j                  j                  |d            sVt	        t         j                  j                  |d      d      5 }|j                  d | j                  D               d d d        y y # 1 sw Y   y xY w)Nunsetenvr   c              3   >   K   | ]  }d j                  |        yw)z	unset {}
N)r   ).0r[   s     r   	<genexpr>z+DXConfig._write_unsetenv.<locals>.<genexpr>   s     V3l11#6Vs   )r   rB   rG   rE   r   
writelinesr   )rV   conf_dirr   s      r   r   zDXConfig._write_unsetenv  sy    ww~~bggll8Z@Abggll8Z8#> W"V$BUBUVVW W BW Ws   (#BBc                 X   	 t        j                  |d       t         j                  j                  |d      }t        |d      5 }t        j                  | D ci c].  }|| j                  || j                  j                  |            0 c}|d       |j                  d       d d d        | j                  D ]r  }t        t         j                  j                  ||      d      5 }| j                  || j                  j                  |d            }|j                  |       d d d        t y # t        $ rS 	 t        j                  |d       n7# t        $ r+}t	        t        dt        |      z                Y d }~Y y d }~ww xY wY sw xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY w)	Ni  z(Error while writing configuration data: r        )indent
r   )r   makedirsry   chmodr
   r   r   rB   rE   r    re   dumpr<   r   r   r   )rV   r   rX   env_jsonfile_pathr   kr[   r   s           r   r   zDXConfig._write_conf_dir"  sj   	KK%( GGLL3EF/0A5I 	RIITJq$((1dmm&7&7&:;;JBWXYHHTN	 ,, 	 C3BGGLL34OQVW  []dmm&7&7R&@A   	   	5) TDGWXYGZZ[\ *	 K	 	   se   D0 F3F
F'>F 0	F:EF	F F :F FFFFF F)	c                    t        | j                         d       t        t        j                  j                  | j                  d             t        t        j                  j                  | j                  d             | j                  D ]5  }t        t        j                  j                  | j                  |             7 |rA| j                  D ]!  }| j                  j                  |d      | |<   # | j                          y y )NTrs   environmentr   r   )r   rN   r   r   rB   rE   rD   r   rO   r   r<   r   )rV   resetfr[   s       r   clearzDXConfig.clear8  s    t((*$?bggll4+>+>NObggll4+>+>@RST** 	HA!"'',,t/B/BA"FG	H ~~ 7 MM--c26S	7IIK r!   N)F)"r   r   __qualname____doc__r   r   setunionrO   re   dumpsr   r   r   r   rm   r]   rU   rK   rM   rN   r   rJ   r   r   r   r   r   r   r   r   r   r   r    r!   r   r#   r#   /   s    *MN7 		.*>?I)tzzV^*_`!;33H '0 dJ,%#1=f< 
$$
I,2
W
 ,
r!   r#   )r   )r   
__future__r   r   r   r   r   rQ   re   rI   r   shutilr   collections.abcr   r=   r   r
   r   r   r   
exceptionsr   printingr   r   r    r#   r   r!   r   <module>r      sM   " S R     *   Y Y ) NS~ Sr!   