B
    ds                 @   s   d Z ddlZddlZddlmZ ddlmZ yddl	Z	W n e
k
rL   Y nX ddlmZ ddlmZ ddlmZ d	Zd
ej ZejZdd Zdd ZG dd dejZdd ZdS )z(
High-level support for Param elements.
    N)escape)AttributesImpl)git_version   )ligolw)typesz"Kipp Cannon <kipp.cannon@ligo.org>z	git id %sc             C   s2   t | |}t|dkr*tdt | |d S )za
	Scan xmldoc for a param named name.  Raises ValueError if not
	exactly 1 such param is found.
	r   z*document must contain exactly one %s paramr   )ParamgetParamsByNamelen
ValueError	ParamName)Zxmldocnameparams r   ^/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/glue/ligolw/param.py	get_param>   s    r   c             C   s   t | |jS )zq
	Convenience wrapper for get_param() that recovers an instance of a
	Python builtin type from a Param element.
	)r   pcdata)xmlr   r   r   r   get_pyvalueI   s    r   c               @   s   e Zd ZdZG dd dejZejdejedZ	ejde
jd e
jd dZejdd	d
Zdd ZejdfddZedddZedd Zedd ZdS )r   z~
	High-level Param element.  The value is stored in the pcdata
	attribute as the native Python type rather than as a string.
	c               @   s   e Zd ZedZdZdS )zParam.ParamNamez(?P<Name>[a-z0-9_:]+):param\Zz%s:paramN)__name__
__module____qualname__recompileZdec_patternZenc_patternr   r   r   r   r   r   s   
r   Name)encdecScaleZreal_8TypeZlstring)defaultc             C   sf   | j d k	rb| jdkrJyt W n tk
r8   tdY nX t| j | _ ntj| j | j  | _ d S )Nyamlzyaml support not installed)	r   r   r    	NameErrorNotImplementedErrorloadligolwtypesToPyTypestrip)selfr   r   r   
endElementz   s    

zParam.endElement c             C   s   | | | xB| jD ]8}|j| jkr>td|j| jf | ||tj  qW | jd k	r| j	dkryt
 W n tk
r   tdY nX | tt
| j  n&| ttj| j	 | jdpd | | dd  d S )Nzinvalid child %s for %sr    zyaml support not installed" r)   
)writeZ	start_tagZ
childNodestagNameZvalidchildrenr   ZElementErrorZIndentr   r   r    r!   r"   	xmlescapedumpr&   r$   
FormatFuncZend_tag)r'   fileobjindentcr   r   r   r-      s    

&zParam.writeNc	       
      C   sl   |  }	||	_ ||	_||	_|dk	r&||	_|dk	r4||	_|dk	rB||	_|dk	rP||	_|dk	rh||	t	 _|	S )zd
		Construct a LIGO Light Weight XML Param document subtree.
		FIXME: document keyword arguments.
		N)
r   r   r   ZDataUnitr   ZStartZUnitZappendChildr   Comment)
clsr   r   valuestartscaleunitZdataunitcommentelemr   r   r   build   s    zParam.buildc             K   s6   |dk	r$| j |tjt| |f|S | j |ddf|S )z
		Convenience wrapper for .build() that constructs a Param
		element from an instance of a Python builtin type.  See
		.build() for a description of the valid keyword arguments.
		N)r=   r$   Z
FromPyTypetype)r6   r   r7   kwargsr   r   r   from_pyvalue   s    zParam.from_pyvaluec                s     | fddS )z8
		Return a list of params with name name under elem.
		c                s   | j  j ko| jkS )N)r.   r   )e)r6   r   r   r   <lambda>       z'Param.getParamsByName.<locals>.<lambda>)r   ZgetElements)r6   r<   r   r   )r6   r   r   r	      s    
zParam.getParamsByName)NNNNN)r   r   r   __doc__r   ZLLWNameAttrr   Zattributeproxyr   r   r$   r1   r%   r   r   r(   sysstdoutr-   classmethodr=   r@   r	   r   r   r   r   r   m   s   "r   c             C   s   dd }|| _ | S )a8  
	Modify ContentHandler, a sub-class of
	glue.ligolw.LIGOLWContentHandler, to cause it to use the Param
	class defined in this module when parsing XML documents.

	Example:

	>>> from glue.ligolw import ligolw
	>>> def MyContentHandler(ligolw.LIGOLWContentHandler):
	...	pass
	...
	>>> use_in(MyContentHandler)
	c             S   s   t |S )N)r   )r'   parentattrsr   r   r   
startParam   s    zuse_in.<locals>.startParam)rJ   )ZContentHandlerrJ   r   r   r   use_in   s    rK   )rD   r   rE   Zxml.sax.saxutilsr   r/   Zxml.sax.xmlreaderr   
Attributesr    ImportErrorZgluer   r)   r   r   r$   
__author__id__version__date__date__r   r   r   rK   r   r   r   r   <module>   s$   
$u