U
    e»{j„  ã                +   @   sÊ   d 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dgZ	ej
d8dd„ƒZd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3h+Zd9d5d„Zd6d7„ ZdS ):z-
Various utilities and cookbook-like things.
é    N)ÚVersionÚconvert_to_writable_filelikeÚstc_reference_framesÚcoerce_range_list_paramFc              	   c   sH  t | tƒr˜tj | ¡} |  d¡s$|rlt | d¡�4}tj	|dd�}|V  | 
¡  | 
¡  W 5 Q R £ dS Q R X n*t| ddd��}|V  W 5 Q R £ dS Q R X n¬t| dƒ�r<t| jƒs²t‚|rÂtj| d�} d	}z|  d
¡ W n tk
rì   d}Y nX t| dƒ�r| jdk�r
d}|�r*t d¡| ƒV  |  
¡  n| V  |  
¡  dS tdƒ‚dS )a  
    Returns a writable file-like object suitable for streaming output.

    Parameters
    ----------
    fd : str or file-like
        May be:

            - a file path string, in which case it is opened, and the file
              object is returned.

            - an object with a :meth:``write`` method, in which case that
              object is returned.

    compressed : bool, optional
        If `True`, create a gzip-compressed file.  (Default is `False`).

    Returns
    -------
    fd : writable file-like
    z.gzÚwbÚutf8)ÚencodingNÚwÚwrite)ÚfileobjFÚ Tr   zutf-8z/Can not be coerced to writable file-like object)Ú
isinstanceÚstrÚosÚpathÚ
expanduserÚendswithÚgzipÚGzipFileÚioÚTextIOWrapperÚflushÚopenÚhasattrÚcallabler
   ÚAssertionErrorÚ	TypeErrorr   ÚcodecsÚ	getwriter)ÚfdÚ
compressedZreal_fdZ
encoded_fdZneeds_wrapper© r!   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/votable/util.pyr      s<    


ZFK4ZFK5ZECLIPTICZICRSZGALACTICZ
GALACTIC_IZGALACTIC_IIZSUPER_GALACTICZAZ_ELZBODYZGEO_CZGEO_DZMAGZGSEZGSMZSMZHGCZHGSZHEEQZHRTNZHPCZHPRZHCCZHGIZ	MERCURY_CZVENUS_CZLUNA_CZMARS_CZJUPITER_C_IIIZSATURN_C_IIIZURANUS_C_IIIZNEPTUNE_C_IIIZPLUTO_CZ	MERCURY_GZVENUS_GZLUNA_GZMARS_GZJUPITER_G_IIIZSATURN_G_IIIZURANUS_G_IIIZNEPTUNE_G_IIIZPLUTO_GZUNKNOWNFrameTc                    sÊ  ‡ fdd„‰‡fdd„‰dd„ }| dkr,dS t | ttfƒrÜt| ƒd	koP|| d
 ƒ}|rd| dd
… }n| dd… }d ‡fdd„|D ƒ¡}t|ƒ}|rÔ|dk	r¼| d
 |kr¼td| d
 › d�ƒ‚|d| d
  7 }|d	7 }||fS t | tƒ�rˆd}ˆ � sþd| d }t d| d | d | ¡}	|	dk�r4td| › d�ƒ‚|	 	¡ d }
|dk	�rl|
dk	�rl|
|k�rlt|
›d�ƒ‚| |  
d¡|  
d¡ d	 fS zt| ƒ t| ƒd	fW S  tk
�rÄ   td| › d�ƒ‚Y nX dS )a©  
    Coerces and/or verifies the object *p* into a valid range-list-format parameter.

    As defined in `Section 8.7.2 of Simple
    Spectral Access Protocol
    <http://www.ivoa.net/documents/REC/DAL/SSA-20080201.html>`_.

    Parameters
    ----------
    p : str or sequence
        May be a string as passed verbatim to the service expecting a
        range-list, or a sequence.  If a sequence, each item must be
        either:

            - a numeric value

            - a named value, such as, for example, 'J' for named
              spectrum (if the *numeric* kwarg is False)

            - a 2-tuple indicating a range

            - the last item my be a string indicating the frame of
              reference

    frames : sequence of str, optional
        A sequence of acceptable frame of reference keywords.  If not
        provided, the default set in ``set_reference_frames`` will be
        used.

    numeric : bool, optional
        TODO

    Returns
    -------
    parts : tuple
        The result is a tuple:
            - a string suitable for passing to a service as a range-list
              argument

            - an integer counting the number of elements
    c                    s    | d krdS ˆ rt | ƒ} t| ƒS )Nr   )Úfloatr   ©Úx)Únumericr!   r"   Ústr_or_none´   s
    z,coerce_range_list_param.<locals>.str_or_nonec                    s@   t | tƒr4t| ƒdkr4ˆ | d ƒ› dˆ | d ƒ› �S ˆ | ƒS d S )Né   r   ú/é   )r   ÚtupleÚlenr$   )r'   r!   r"   Únumeric_or_range»   s    z1coerce_range_list_param.<locals>.numeric_or_rangec                 S   s
   t | tƒS )N)r   r   r$   r!   r!   r"   Úis_frame_of_referenceÁ   s    z6coerce_range_list_param.<locals>.is_frame_of_referenceN)Nr   r*   éÿÿÿÿú,c                    s   g | ]}ˆ |ƒ‘qS r!   r!   )Ú.0r%   )r-   r!   r"   Ú
<listcomp>Î   s     z+coerce_range_list_param.<locals>.<listcomp>ú'z#' is not a valid frame of referenceú;z)([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)?ú(z)|([A-Z_]+)ú^z([,/]z )+(;(?P<frame>[<A-Za-z_0-9]+))?$z' is not a valid range listÚframez" is not a valid frame of reference)r   r+   Úlistr,   ÚjoinÚ
ValueErrorr   ÚreÚmatchÚ	groupdictÚcountr#   r   )ÚpÚframesr&   r.   Zhas_frame_of_referenceZpointsÚoutÚlengthÚnumberr<   r7   r!   )r&   r-   r'   r"   r   ‰   sJ    + ÿ
c                 C   s(   dd„ }|| ƒ}||ƒ}||k||k  S )z2
    Compare two VOTable version identifiers.
    c                 S   s$   | d   ¡ dkr| dd … } t| ƒS )Nr   Úvr*   )Úlowerr   )rD   r!   r!   r"   Úversion_to_tupleô   s    z)version_compare.<locals>.version_to_tupler!   )ÚaÚbrF   ÚavZbvr!   r!   r"   Úversion_compareï   s    rJ   )F)NT)Ú__doc__r   Ú
contextlibr   r   r   r;   Zpackaging.versionr   Ú__all__Úcontextmanagerr   r   r   rJ   r!   r!   r!   r"   Ú<module>   sv   ýBÕ/
f