B
    EDb                 @   s  d dl mZmZmZmZmZ d dlmZ d dlm	Z	m
Z
m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 ZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeG dd deZdS )    )BaseInterfaceServiceDescriptorBaseRequestHandlerBaseResponseHandlerBaseFaultHandler)expose)type_to_jsontypepytype_supportPORTABLE_STRINGN)ServiceFault)LadonExceptionc             C   s8   t dd |  D }x| D ]\}}|||< q W |S )Nc             s   s   | ]\}}||fV  qd S )N ).0kvr   r   :G:\easytimepro\master/mysite/ladon\interfaces\jsonrpc10.py	<genexpr>   s    z'_add_passback_params.<locals>.<genexpr>)dictitems)res_dictpassback_dictZmerged_dictr   r   r   r   r   _add_passback_params
   s    r   c                   s$   e Zd Z fddZdd Z  ZS )RequestPropFaultc                s,   || _ || _tt| dd| j  d d d S )Nservicez#Request doesn't have "%s" property.   )propr   superr   __init__)selfr   r   )	__class__r   r   r      s    zRequestPropFault.__init__c             C   s   | j S )N)faultstring)r   r   r   r   __str__   s    zRequestPropFault.__str__)__name__
__module____qualname__r   r!   __classcell__r   r   )r   r   r      s   r   c                   s$   e Zd Z fddZdd Z  ZS )RequestParamFaultc                s,   || _ || _tt| dd| j  d d d S )Nr   z$Request doesn't have "%s" parameter.r   )paramr   r   r&   r   )r   r'   r   )r   r   r   r      s    zRequestParamFault.__init__c             C   s   | j S )N)r    )r   r   r   r   r!      s    zRequestParamFault.__str__)r"   r#   r$   r   r!   r%   r   r   )r   r   r&      s   r&   c                   s$   e Zd Z fddZdd Z  ZS )MethodArgsCountFaultc                sB   || _ || _|| _|| _tt| dd| j | j| jf d d d S )Nr   z1Method "%s" takes exactly %s arguments, %s given.r   )
methodnametargsscount
gargscountr   r   r(   r   )r   r)   r*   r+   r   )r   r   r   r   #   s    zMethodArgsCountFault.__init__c             C   s   | j S )N)r    )r   r   r   r   r!   +   s    zMethodArgsCountFault.__str__)r"   r#   r$   r   r!   r%   r   r   )r   r   r(   "   s   r(   c                   s$   e Zd Z fddZdd Z  ZS )RequestParamsArrayFaultc                s    || _ tt| ddd d d S )Nr   z Params must be array of objects.r   )r   r   r,   r   )r   r   )r   r   r   r   /   s    z RequestParamsArrayFault.__init__c             C   s   | j S )N)r    )r   r   r   r   r!   3   s    zRequestParamsArrayFault.__str__)r"   r#   r$   r   r!   r%   r   r   )r   r   r,   .   s   r,   c               @   s    e Zd ZeZdZdZdd ZdS )JSONRPCServiceDescriptorz1.0zapplication/jsonc             C   s  |j }|j}dd }	||d| ji i d}
|
d }xl|D ]d}t|tkr6i }|||d < xB|d D ]6\}}}t|tkr|	|d g}n|	|}|||< q`W q6W |
d	 }x
|D ] }i }d
}||jd}||| < x| D ]}tt	g
t|d r|	|d d g}n|	|d }|||d d||d < d|krR|d ||d  d< ng ||d  d< |d
7 }qW tt	g
t|jr|	|jd g}n
|	|j}||jd|d< qW tjd dkrt|
S tj|
|dS )Nc             S   s   | t jkrt j|  S | jS d S )N)r-   javascript_type_mapr"   )typr   r   r   map_type?   s    

z3JSONRPCServiceDescriptor.generate.<locals>.map_typezjsonrpc/description)servicenameZurltypeversiontypesmethodsr4   nameZ
attributesr   r5      )params	doc_linesr2   optional)r2   Z	def_orderr:   docr9   )r2   r9   Zret_info   )encoding)	type_dict
type_orderr3   r2   r   listZ_method_docr6   argstuplecountZ_rtypeZ
_rtype_docsysversion_infojsondumps)r   r1   servicenumberZtypemanagerZ
methodlistZservice_urlr=   r>   r?   r0   Zdescr4   r/   Z	desc_typer   r   propsZdesc_type_valr5   mZdesc_mparamsorderZdesc_methodargZdesc_param_typeZ
desc_rtyper   r   r   generate;   sX    



z!JSONRPCServiceDescriptor.generateN)r"   r#   r$   r   r.   r3   _content_typerM   r   r   r   r   r-   6   s   r-   c               @   s   e Zd Zdd Zdd ZdS )JSONRPCRequestHandlerc             C   s  dd }dd }t jt|||||d}| |}d|krDtd|d|krVtd|d|krhtd||j|d  }|d }	|	d k	rt|	tk	rt||	d k	rt	|	nd	}
t	|
 }|
d	kr|d	krt|
 d	 d
 |n>|
|k rt|
 |
 d
 |n|
|kr t|d ||
|i |d< |	d k	rfx2tt	|	D ]"}|	| |d |
 | d
 < q@W |d |d< |d= |d= |S )Nc             S   s   t | S )N)r
   )xr   r   r   parse_number   s    z9JSONRPCRequestHandler.parse_request.<locals>.parse_numberc             S   s   | dkrt dS t | S )NZnullNone)r
   )rP   r   r   r   parse_constant   s    z;JSONRPCRequestHandler.parse_request.<locals>.parse_constant)Z	parse_intZparse_floatrS   methodr8   idr   r6   rA   r)   )rF   loadsr
   get_passback_paramsr   r5   r2   r@   r,   lenrA   r&   r(   range)r   Z	json_bodysinfor=   rQ   rS   req_dictr   Zminfor8   Z
params_lenZargs_lenir   r   r   parse_request~   s>    






"z#JSONRPCRequestHandler.parse_requestc             C   s   d|krd|d iS i S d S )NrU   r   )r   r[   r   r   r   rW      s    z)JSONRPCRequestHandler.get_passback_paramsN)r"   r#   r$   r]   rW   r   r   r   r   rO   }   s   %rO   c               @   s   e Zd ZdZdZdd ZdS )JSONRPCResponseHandlerzapplication/jsonFc             C   s.   d |d< |d= |d= |d= t j|dd|S )NerrorrH   r1   rT   F)ensure_ascii)rF   rG   encode)r   r   rZ   r=   r   r   r   build_response   s
    z%JSONRPCResponseHandler.build_responseN)r"   r#   r$   rN   _stringify_res_dictrb   r   r   r   r   r^      s   r^   c               @   s   e Zd ZdZdZdd ZdS )JSONRPCFaultHandlerzapplication/jsonFc             C   sp   |j r|j }nt }|ddd}d |j|j||j|jdd}t	|dr\t
||j}tj|dd|S )Nz

)codestringdetailfilenamelineno)resultr_   r   F)r`   )rh   	traceback
format_excreplacesplitZ	faultcoder    modrj   hasattrr   r   rF   rG   ra   )r   Zservice_excrZ   r)   r=   Z
reflectionrh   Z
fault_dictr   r   r   build_fault_response   s    
z(JSONRPCFaultHandler.build_fault_responseN)r"   r#   r$   rN   rc   rr   r   r   r   r   rd      s   rd   c               @   sD   e Zd Zdd Zedd Zedd Zedd Zed	d
 ZdS )JSONRPCInterfacec             K   s,   t tttd}|| tj| |f| d S )N)Zservice_descriptorZrequest_handlerZresponse_handlerZfault_handler)r-   rO   r^   rd   updater   r   )r   rZ   kwZdef_kwr   r   r   r      s    
zJSONRPCInterface.__init__c               C   s   dS )NZ	jsonrpc10r   r   r   r   r   _interface_name   s    z JSONRPCInterface._interface_namec             C   s   t | dkS )Nr   )r	   rC   )r/   r   r   r   _accept_basetype   s    z!JSONRPCInterface._accept_basetypec               C   s   dS )NTr   r   r   r   r   _accept_list   s    zJSONRPCInterface._accept_listc               C   s   dS )NFr   r   r   r   r   _accept_dict   s    zJSONRPCInterface._accept_dictN)	r"   r#   r$   r   staticmethodrv   rw   rx   ry   r   r   r   r   rs      s
   	rs   )Zmysite.ladon.interfaces.baser   r   r   r   r   Zmysite.ladon.interfacesr   Zmysite.ladon.compatr   r	   r
   rF   rD   rl   Zmysite.ladon.exceptions.servicer   Zmysite.ladon.exceptions.baser   r   r   r&   r(   r,   r-   rO   r^   rd   rs   r   r   r   r   <module>   s    		G,