B
    d}#                 @   s   d Z ddlZddlZddlmZ ddlZddlmZm	Z	m
Z
 ddlmZ ddlm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   )
__author____date____version__)ligolw)typesc             C   s   t | |S )z2
	Deprecated.  Use Param.get_param(xmldoc, name)
	)Param	get_param)xmldocname r   Z/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/ligo/lw/param.pyr
   4   s    r
   c             C   s   t | |jS )z5
	Deprecated.  Use Param.get_param(xml, name).value
	)r	   r
   value)xmlr   r   r   r   get_pyvalue;   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 Zejdd ZedddZedd Zedd Zed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   	ParamNamea   s   
r   Name)encdecScaleZreal_8TypeZlstring)defaultc             C   s@   | j d k	r<| jdkr$t| j | _ ntj| j | j  | _ d S )Nyaml)pcdatar   r   loadligolwtypesToPyTypestrip)selfr   r   r   
endElementi   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r| t
t| j  n&| t
tj| j	 | jdpd | | dd  d S )Nzinvalid child %s for %sr   " r&   
)writeZ	start_tagZ
childNodestagNameZvalidchildrenr   ZElementErrorZIndentr   r   	xmlescaper   dumpr#   r!   
FormatFuncZend_tag)r$   fileobjindentcr   r   r   r*   q   s    

&zParam.writec             C   s   | j S )a  
		Synonym of .pcdata.  Makes calling code easier to
		understand.  In the parent class .pcdata is text only.
		Here it has been translated into a native Python type, but
		it's not obvious in calling code that that is what has
		happened so it can be unclear when reading calling codes if
		one should be expecting a string or a native value.  Using
		this synonym can clarify the meaning.
		)r   )r$   r   r   r   r      s    zParam.valuec             C   s
   || _ d S )N)r   )r$   r   r   r   r   r      s    Nc	       
      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   r   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 )a8  
		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.

		Examples:

		>>> import sys
		>>> # float
		>>> Param.from_pyvalue(u"example", 3.0).write(sys.stdout)
		<Param Name="example:param" Type="real_8">3</Param>
		>>> # string
		>>> Param.from_pyvalue(u"example", u"test").write(sys.stdout)
		<Param Name="example:param" Type="lstring">test</Param>
		>>> # short string (non-empty data = not NULL)
		>>> Param.from_pyvalue(u"example", u"").write(sys.stdout)
		<Param Name="example:param" Type="lstring"> </Param>
		>>> # None (empty data = NULL)
		>>> Param.from_pyvalue(u"example", None).write(sys.stdout)
		<Param Name="example:param" Type="None"></Param>

		Note that any type of Param may be NULL-valued.  These
		examples demonstrate the use of the automatic encoding
		helper function, which translates None into a None-typed
		Param because it doesn't know what else it might be, but,
		for example, a float-typed Param may also be set to None.
		N)r9   r!   Z
FromPyTypetype)r3   r   r   kwargsr   r   r   from_pyvalue   s    zParam.from_pyvaluec                s     | fddS )zR
		Return a list of params with name name under elem.

		See also .get_param().
		c                s   | j  j ko| jkS )N)r+   r   )e)r3   r   r   r   <lambda>       z'Param.getParamsByName.<locals>.<lambda>)r   ZgetElements)r3   r8   r   r   )r3   r   r   getParamsByName   s    
zParam.getParamsByNamec             C   s@   |dkr| j }t||}t|dkr8td| | |d S )a4  
		Scan xmldoc for a param named name.  Raises ValueError if
		not exactly 1 such param is found.  If name is None
		(default), then the .paramName attribute of this class is
		used.  The Param class does not provide a .paramName
		attribute, but sub-classes may choose to.

		See also .getParamsByName().
		Nr   z*document must contain exactly one %s paramr   )Z	paramNamer	   r@   len
ValueErrorr   )r3   r   r   Zelemsr   r   r   r
      s    zParam.get_param)NNNNN)N)r   r   r   __doc__r   ZLLWNameAttrr   Zattributeproxyr   r   r!   r.   r"   r   r   r%   sysstdoutr*   propertyr   setterclassmethodr9   r<   r@   r
   r   r   r   r   r	   \   s   !
r	   c             C   s   dd }|| _ | S )ac  
	Modify ContentHandler, a sub-class of
	ligo.lw.ligolw.LIGOLWContentHandler, to cause it to use the Param
	class defined in this module when parsing XML documents.

	Example:

	>>> from ligo.lw import ligolw
	>>> class MyContentHandler(ligolw.LIGOLWContentHandler):
	...	pass
	...
	>>> use_in(MyContentHandler)
	<class 'ligo.lw.param.MyContentHandler'>
	c             S   s   t |S )N)r	   )r$   parentattrsr   r   r   
startParam  s    zuse_in.<locals>.startParam)rK   )ZContentHandlerrK   r   r   r   use_in  s    rL   )rC   r   rD   Zxml.sax.saxutilsr   r,   r   r&   r   r   r   r   r   r!   r
   r   r	   rL   r   r   r   r   <module>   s   ! )