o
    d`Q7                     @   sp  d Z 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Zddl	m
Z
 ddlmZ zddlZW n ey=   dZY nw zddlZW n ey_   zddlZW n ey\   dZY nw Y nw zddlmZ W n! ey   zddlmZ dd	 ZW n ey   dZY nw Y nw zdd
lmZ W n ey   zddlZW n ey   ddlmZ Y nw Y nw dZg dZg dZg dZg dZedd dej dd dgZ!ej"re!#e$dd d n
e!#e%dd d e&dd dZ'G dd de(Z)G dd de&Z*dd Z+dd Z,d d! Z-d"d# Z.d$d% Z/d7d&d'Z0d(d) Z1d8d+d,Z2d-d. Z3d/d0 Z4d9d3d4Z5d:d5d6Z6dS );zUtilities for pyActiveResource.zMark Roach (mrroach@google.com)    N)urllib)element_containers)parse)iso8601c                 C   s   t j t| S )zReturn a datetime object for the given ISO8601 string.

            Args:
                time_string: An ISO8601 timestamp.
            Returns:
                A datetime.datetime object.
            )datetimeutcfromtimestampr   r   )time_string r	   l/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/pyactiveresource/util.py
date_parse"   s   r   )cElementTree)ElementTrees'   <?xml version="1.0" encoding="UTF-8"?>
))z(quiz)$z\1zes)z^(ox)$z\1en)z([m|l])ouse$z\1ice)z(matr|vert|ind)(?:ix|ex)$z\1ices)z(x|ch|ss|sh)$\1es)z([^aeiouy]|qu)y$z\1ies)z(hive)$1s)z(?:([^f])fe|([lr])f)$z\1\2ves)zsis$ses)z	([ti])um$z\1a)z(buffal|tomat)o$z\1oes)z(bu)s$z\1ses)z(alias|status)$r   )z(octop|vir)us$z\1i)z(ax|test)is$r   )s$s)$r   ))z
(quiz)zes$\1)z(matr)ices$z\1ix)z(vert|ind)ices$z\1ex)z^(ox)enr   )z(alias|status)es$r   )z(octop|vir)i$z\1us)z(cris|ax|test)es$z\1is)z(shoe)s$r   )z(o)es$r   )z(bus)es$r   )z([m|l])ice$z\1ouse)z(x|ch|ss|sh)es$r   )z	(m)ovies$z\1ovie)z	(s)eries$z\1eries)z([^aeiouy]|qu)ies$z\1y)z
([lr])ves$z\1f)z(tive)s$r   )z(hive)s$r   )z
([^f])ves$z\1fe)z(^analy)ses$z\1sis)z=((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$z\1\2sis)z([ti])a$z\1um)z(n)ews$z\1ews)r    ))personpeople)manmen)childchildren)sexsexes)movemoves)	equipmentinformationricemoneyspeciesseriesfishsheepc                 C   s   dt |  fS )Nboolean)six	text_typelowervaluer	   r	   r
   <lambda>z   s    r.   )typemethodc                 C   s   dt | fS )Nintegerr)   r*   r,   r	   r	   r
   r.   |       c                 C   s   d t | dfS )Nutf-8)unicoder,   r	   r	   r
   r.      r3   c                 C   s   dt | dfS )Nbase64Binaryascii)base64	b64encodedecoder,   r	   r	   r
   r.      s    c                 C   s   d t | fS Nr2   r,   r	   r	   r
   r.      r3   c                   @   s   e Zd ZdZdS )Errorz%Base exception class for this module.N)__name__
__module____qualname____doc__r	   r	   r	   r
   r<      s    r<   c                   @   s   e Zd ZdZ		dddZdS )
FileObjectzRepresent a 'file' xml entity.untitledapplication/octet-streamc                 C   s   || _ || _|| _d S r;   )datanamecontent_type)selfrD   rE   rF   r	   r	   r
   __init__   s   
zFileObject.__init__N)rB   rC   )r=   r>   r?   r@   rH   r	   r	   r	   r
   rA      s
    rA   c                 C   sf   | t v r| S tD ]}|d | kr|d   S qtD ]}t|d | r0t|d |d |   S qdS )zConvert singular word to its plural form.

    Args:
        singular: A word in its singular form.

    Returns:
        The word in its plural form.
    r      N)UNCOUNTABLES	IRREGULARPLURALIZE_PATTERNSresearchsub)singularir	   r	   r
   	pluralize   s   	rR   c                 C   sf   | t v r| S tD ]}|d | kr|d   S qtD ]}t|d | r0t|d |d |   S q| S )zConvert plural word to its singular form.

    Args:
        plural: A word in its plural form.
    Returns:
        The word in its singular form.
    rI   r   )rJ   rK   SINGULARIZE_PATTERNSrM   rN   rO   )pluralrQ   r	   r	   r
   singularize   s   rU   c                 C   s(   d dd tdd|  dD S )zConvert a word from lower_with_underscores to CamelCase.

    Args:
        word: The string to convert.
    Returns:
        The modified string.
    r   c                 s   s(    | ]}|d    |dd  V  qdS )r   rI   N)upper).0wr	   r	   r
   	<genexpr>   s     zcamelize.<locals>.<genexpr>z[^A-Z^a-z^0-9^:]+ )joinrM   rO   stripsplitwordr	   r	   r
   camelize   s   
r`   c                 C   s   t dd|  S )zConvert a word from CamelCase to lower_with_underscores.

    Args:
        word: The string to convert.
    Returns:
        The modified string.
    z"\B((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))z_\1)rM   rO   r+   r^   r	   r	   r
   
underscore   s
   ra   c                    s"    fdd  | }t j|dS )zConvert a dictionary to url query parameters.

    Args:
        query_params: A dictionary of arguments.
    Returns:
        A string of query parameters.
    c                    s   i }t | D ]>\}}t|trd| }n,t|tr6i }t |D ]\}}||d||f < q!| | qt|t jrA|d}|||< q|S )Nz%s[]z%s[%s]r4   )r)   	iteritems
isinstancelistdictupdater*   encode)params	annotatedkeyr-   dict_optionsdkdvannotate_paramsr	   r
   ro      s   




z!to_query.<locals>.annotate_paramsT)r   r   	urlencode)query_paramsri   r	   rn   r
   to_query   s   rr   c                 C   s   dd|  }t | rB| jr| j s|d | _t| D ]$\}}t||d  |jr.|j s?|d t | k r<|d |_q||_qdS |rQ| jrL| j sS|| _dS dS dS )zAdd PrettyPrint formatting to an ElementTree element.

    Args:
        element: An ElementTree element which is modified in-place.
    Returns:
        None
    z
%sz  rI   N)lentextr\   	enumeratexml_pretty_formattail)elementlevelindentrQ   r   r	   r	   r
   rv      s   

rv   c                 C   sb   | du r| dd dS ttg D ]}t| |d r.|d | \}|_|r+| d|  dS qdS )zWrite a serialized value to an xml element.

    Args:
        value: The value to serialize.
        element: An xml element to write to.
    Returns:
        None
    Nniltruer/   r0   )setSERIALIZERSDEFAULT_SERIALIZERrc   rt   )r-   rx   
serializerelement_typer	   r	   r
   	serialize	  s   	r   objectc                 C   s   |r|| i} t | S )zConvert a dictionary, list or Collection to an JSON string.

    Args:
        obj: The object to serialize.

    Returns:
        A json string.
    )jsondumps)objrootr	   r	   r
   to_json  s   	
r   c                 C   s
   t | S )zParse the json into a dictionary of attributes.

    Args:
        jsonstr: A JSON formatted string.
    Returns:
        The deserialized object.
    )r   loads)jsonstrr	   r	   r
   json_to_dict,  s   
r   c                 C   s   |r| ddp	|}t|}t| tr,|dd | D ]}|t|t|| q|S t| t	rFt
| D ]\}}|t||| q6|S t| | |S )N_-r/   array)replaceETElementrc   rd   r}   append_to_xml_elementrU   re   r)   rb   r   )r   r   	dasherizeroot_elementr-   rj   r	   r	   r
   r   7  s   



r   FTc                 C   s2   t | ||}|rt| t|}|rt| S |S )a  Convert a dictionary or list to an XML string.

    Args:
        obj: The dictionary/list object to convert.
        root: The name of the root xml element.
        pretty: Whether to pretty-format the xml (default False).
        header: Whether to include an xml header (default True).
        dasherize: Whether to convert underscores to dashes in
                   attribute names (default True).
    Returns:
        An xml string.
    )r   rv   r   tostring
XML_HEADER)r   r   prettyheaderr   r   xml_datar	   r	   r
   to_xmlG  s   
r   c              
   C   sF  t | tjtjfr)|  ri S zt| }W n ty( } ztd| d}~ww | }|	dd
 }|dkr_|jdd}t|}t|D ]}|t|dd	 qG|r]t|||iS |S |	d
dkrhdS |dv rq|jsqdS |dkrzt|jS |dkrtrt|jS ztt|jd}tj|W S  ty } ztdd}~ww |dkrt|jd}	tj|	dd  S |dkrt|jS |dv rt |jS |dkr|jsdS |j! dv S |dkrt"st#dt"$|jS |dkrt%&|j'dS |dkr|	dd}
|	dd }t(|j||
S |d!v r!|jsdS |jS t|r|r8tt)|	dd|* }ntt+|jdd|* }t|D ]4}t|dd	}|jdd}||v rzt || trp|| | qK|| |g||< qK|||< qK|r|jdd|iS |S |* rt|jdd|* S |jS )"a  Parse the xml into a dictionary of attributes.

    Args:
        xmlobj: An ElementTree element or an xml string.
        saveroot: Keep the xml element names (ugly format)
    Returns:
        An ElementDict object or ElementList for multiple objects
    zUnable to parse xml data: %sNr/   r   r   r   r   F)saverootr{   r|   )r1   r   datedecimaldoublefloatr1   r   z%Y-%m-%dT%H:%M:%S+0000zUnable to parse timestamp. Install dateutil (http://labix.org/python-dateutil) or pyxml (http://pyxml.sf.net/topics/) for ISO8601 support.r   z%Y-%m-%d   r   )r   r   r(   )r|   1yamlz+PyYaml is not installed: http://pyyaml.org/base64binaryr7   filerF   rC   rE   rB   )symbolstring),rc   r)   r*   binary_typeisspacer   
fromstring	Exceptionr<   getr+   tagr   r   ElementListrd   r   xml_to_dictElementDictrt   intr   calendartimegmtimestrptimer   r   
ValueErrorr   r   Decimalr   r\   r   ImportError	safe_loadr8   	b64decoderg   rA   ra   itemsrU   )xmlobjr   rx   errr   element_list_typereturn_listr   	timestamp
time_tuplerF   filename
attributes	attribute	child_tagr	   r	   r
   r   ]  s   	








r   )r   )r   )r   FTT)T)7r@   
__author__r8   r   r   rM   r   r   r)   	six.movesr   pyactiveresourcer   r   r   
simplejsonr   dateutil.parserr   r   	xml.utilsr   	xml.etreer   r   r   r   rL   rS   rK   rJ   boolinteger_typesr~   PY2r   strbytesr   r   r   r<   rA   rR   rU   r`   ra   rr   rv   r   r   r   r   r   r   r	   r	   r	   r
   <module>   s   
	




