Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfa8f23c

Browse files
author
Dan Brown
committed
Python 3 support
Well, tests pass at least. Testing welcome!
1 parentbf6c2b9 commitfa8f23c

File tree

10 files changed

+172
-101
lines changed

10 files changed

+172
-101
lines changed

‎.travis.yml‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
language:python
22
python:
33
-"2.7"
4-
## Coming soon:
5-
# - "3.2"
6-
# - "3.3"
7-
# - "3.4"
4+
# - "3.2" # `future` library doesn't support 3.2, sorry. Patches welcome.
5+
-"3.3"
6+
-"3.4"
87
script:"python setup.py test"

‎README.rst‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ This is a library in Python enabling `JSON-RPC 2.0 <http://www.jsonrpc.org/spec.
1212

1313
This is packaged as a standard Python project, so just install using ``python setup.py install``, or with `pip<http://www.pip-installer.org/>`_.
1414

15+
Supports Python 2.7 and 3.3+.
16+
1517
Servers
1618
-------
1719

‎jsonrpc2_zeromq/__init__.py‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
# Please see the LICENSE file in the root of this project for license
44
# information.
55

6-
from .clientimport*
7-
from .serverimport*
6+
from __future__importunicode_literals
7+
from __future__importprint_function
8+
from __future__importdivision
9+
from __future__importabsolute_import
10+
fromfutureimportstandard_library
11+
standard_library.install_aliases()
12+
frombuiltinsimport*# NOQA
813

9-
fromcommonimport (RPCError,ParseError,InvalidRequest,MethodNotFound,
10-
InvalidParams,InternalError,ServerError,ApplicationError,
11-
JSON_RPC_VERSION,package_loggeraslogger)
14+
from .clientimport*# NOQA
15+
from .serverimport*# NOQA
1216

17+
from .commonimport (RPCError,ParseError,InvalidRequest,MethodNotFound,InvalidParams,InternalError,ServerError,ApplicationError,JSON_RPC_VERSION,package_loggeraslogger)# NOQA

‎jsonrpc2_zeromq/client.py‎

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,23 @@
33
# Please see the LICENSE file in the root of this project for license
44
# information.
55

6+
from __future__importunicode_literals
7+
from __future__importprint_function
8+
from __future__importdivision
9+
from __future__importabsolute_import
10+
fromfutureimportstandard_library
11+
standard_library.install_aliases()
12+
frombuiltinsimport*# NOQA
13+
614
importthreading
715

816
importzmq
917

1018
from .importcommon
1119

1220

13-
classTimeoutError(Exception):pass
21+
classTimeoutError(Exception):
22+
pass
1423

1524

1625
classRPCClient(common.Endpoint):
@@ -23,8 +32,8 @@ class RPCClient(common.Endpoint):
2332

2433
def__init__(self,endpoint,context=None,timeout=5000,
2534
socket_type=None,logger=None):
26-
super(RPCClient,self).__init__(endpoint,socket_type,timeout,context,
27-
logger)
35+
super(RPCClient,self).__init__(endpoint,socket_type,timeout,
36+
context,logger)
2837
self.notify=NotifierProxy(self)
2938
self.request_poller=zmq.Poller()
3039
self._reconnect_socket()
@@ -41,32 +50,37 @@ def _reconnect_socket(self):
4150

4251
defrequest(self,request):
4352
self.logger.debug(">_> Client calling\"{method}\" on {endpoint} "
44-
"with params:\n{params}".format(method=request.method,
45-
endpoint=self.endpoint,
46-
params=common.debug_log_object_dump(request.params)))
53+
"with params:\n{params}".format(
54+
method=request.method,endpoint=self.endpoint,
55+
params=common.debug_log_object_dump(
56+
request.params)))
4757

4858
self.request_poller.register(self.request_sock,zmq.POLLOUT)
4959
ifnotself.request_poller.poll(self.timeout):
5060
self.on_timeout(request)
5161
raiseTimeoutError("Timed out while waiting to call {method} on "
52-
"{endpoint}".format(method=request.method,
53-
endpoint=self.endpoint))
62+
"{endpoint}".format(method=request.method,
63+
endpoint=self.endpoint))
5464

5565
self.request_poller.unregister(self.request_sock)
5666
self.request_sock.send(common.json_rpc_dumps(request))
5767

58-
ifrequest.idisNone:return# We don't get a response for notifications
68+
ifrequest.idisNone:
69+
return# We don't get a response for notifications
5970

6071
self.logger.debug("-.- Client waiting for response from {method} "
61-
"on {endpoint}".format(method=request.method,
62-
endpoint=self.endpoint,
63-
params=common.debug_log_object_dump(request.params)))
72+
"on {endpoint}".format(
73+
method=request.method,
74+
endpoint=self.endpoint,
75+
params=common.debug_log_object_dump(
76+
request.params)))
6477
self.request_poller.register(self.request_sock,zmq.POLLIN)
6578
ifnotself.request_poller.poll(self.timeout):
6679
self.on_timeout(request)
67-
raiseTimeoutError("Timed out while getting response to {method} on "
68-
"{endpoint}".format(method=request.method,
69-
endpoint=self.endpoint))
80+
raiseTimeoutError(
81+
"Timed out while getting response to {method} on "
82+
"{endpoint}".format(method=request.method,
83+
endpoint=self.endpoint))
7084

7185
self.request_poller.unregister(self.request_sock)
7286
response=common.json_rpc_loads(self.request_sock.recv())
@@ -82,11 +96,12 @@ def request(self, request):
8296
" on {endpoint}:\n{result}".format(
8397
method=request.method,
8498
endpoint=self.endpoint,
85-
result=common.debug_log_object_dump(response.result)))
99+
result=common.debug_log_object_dump(
100+
response.result)))
86101
returnresponse.result
87102

88103
defon_timeout(self,req):
89-
self._reconnect_socket()# Drop outgoing message
104+
self._reconnect_socket()# Drop outgoing message
90105

91106
defget_request_method(self,method,notify=False):
92107
returnself.request_method_class(method,client=self,notify=notify)
@@ -118,7 +133,7 @@ class NotificationReceiverClient(RPCNotifierClient, threading.Thread):
118133

119134
on_notification=None
120135
should_stop=False
121-
poll_timeout=1000# milliseconds
136+
poll_timeout=1000# milliseconds
122137

123138
def__init__(self,*args,**kwargs):
124139
super(NotificationReceiverClient,self).__init__(*args,**kwargs)
@@ -129,7 +144,7 @@ def __init__(self, *args, **kwargs):
129144
# talking to this thread.
130145
self.request_sock=self.context.socket(zmq.PAIR)
131146
self.request_sock_endpoint= \
132-
"inproc://jsonrpc2-subscription-client-%x"%id(self)
147+
"inproc://jsonrpc2-subscription-client-%x"%id(self)
133148
self.request_sock.bind(self.request_sock_endpoint)
134149

135150
# This is run automatically, as RPC-style blocking requests will not
@@ -170,16 +185,16 @@ def run(self):
170185
))
171186

172187
try:
173-
common.handle_request(self,
174-
'handle_{method}_notification',
175-
msg)
188+
common.handle_request(
189+
self,'handle_{method}_notification',msg)
176190
exceptcommon.MethodNotFound:
177-
self.logger.warning("v_v Client has no handler for "
178-
"\"{method}\" notification from "
179-
"subscription on {endpoint}".format(
180-
method=msg.method,
181-
endpoint=self.endpoint
182-
))
191+
self.logger.warning(
192+
"v_v Client has no handler for "
193+
"\"{method}\" notification from "
194+
"subscription on {endpoint}".format(
195+
method=msg.method,
196+
endpoint=self.endpoint
197+
))
183198

184199
defon_timeout(self,*args,**kwargs):
185200
self.stop()
@@ -195,4 +210,3 @@ def wait_for_notifications(self):
195210
defstop(self):
196211
self.should_stop=True
197212
self.join()
198-

‎jsonrpc2_zeromq/common.py‎

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@
33
# Please see the LICENSE file in the root of this project for license
44
# information.
55

6-
importsys
6+
from __future__importunicode_literals
7+
from __future__importprint_function
8+
from __future__importdivision
9+
from __future__importabsolute_import
10+
fromfutureimportstandard_library
11+
fromfuture.utilsimportwith_metaclass,native_str_to_bytes, \
12+
bytes_to_native_str
13+
standard_library.install_aliases()
14+
frombuiltinsimport*# NOQA
15+
716
importuuid
817
importjson
918
importre
@@ -24,9 +33,11 @@
2433

2534
debug_log_object_indent=' '*DEBUG_LOG_OBJECT_INDENT_LEN
2635

36+
2737
defdebug_log_object_dump(obj):
2838
returnre.sub(r'(^|\n)',r'\1'+debug_log_object_indent,
29-
pprint.pformat(obj,width=(80-DEBUG_LOG_OBJECT_INDENT_LEN)))
39+
pprint.pformat(obj,
40+
width=(80-DEBUG_LOG_OBJECT_INDENT_LEN)))
3041

3142

3243
def_json_default(o):
@@ -38,27 +49,32 @@ def _json_default(o):
3849
else:
3950
raiseTypeError
4051

52+
4153
def_parse_rpc_message(msg):
42-
msg_fields=frozenset(msg.keys())
54+
msg_fields=frozenset(list(msg.keys()))
4355
ifmsg_fields.issuperset(frozenset(['jsonrpc','method'])):
4456
returnRequest(msg['method'],msg.get('params',None),
45-
id_=msg.get('id',None))
57+
id_=msg.get('id',None))
4658
elifmsg_fields.issuperset(frozenset(['jsonrpc','id']))and \
4759
('result'inmsg_fieldsor'error'inmsg_fields):
4860
returnResponse(msg.get('result',None),msg.get('error',None),
49-
msg['id'])
61+
msg['id'])
5062
else:
5163
returnmsg
5264

65+
5366
defjson_rpc_dumps(o):
54-
returnjson.dumps(o,default=_json_default)
67+
returnnative_str_to_bytes(json.dumps(o,default=_json_default,
68+
ensure_ascii=True))
69+
5570

5671
defjson_rpc_loads(s):
57-
returnjson.loads(s,object_hook=_parse_rpc_message)
72+
returnjson.loads(bytes_to_native_str(s),object_hook=_parse_rpc_message)
5873

5974

6075
_GenerateID=object()
6176

77+
6278
classRequest(object):
6379

6480
def__init__(self,method,params,id_=_GenerateID,notify=False):
@@ -81,9 +97,8 @@ def is_notification(self):
8197

8298
defto_dict(self):
8399
data=dict(jsonrpc=JSON_RPC_VERSION,
84-
method=self.method,
85-
params=self.params,
86-
)
100+
method=self.method,
101+
params=self.params)
87102
ifself.id:
88103
data['id']=self.id
89104
returndata
@@ -109,7 +124,7 @@ def __init__(self, method, client, notify=False):
109124
def__call__(self,*args,**kwargs):
110125
ifargsandkwargs:
111126
raiseValueError("Cannot be called with both positional and named "
112-
"arguments")
127+
"arguments")
113128
returnself.client.request(Request(self.method,argsorkwargs,
114129
notify=self.notify))
115130

@@ -152,12 +167,11 @@ def error_exception(self, extra_code_mapping=None):
152167

153168
defto_dict(self):
154169
data=dict(jsonrpc=JSON_RPC_VERSION,
155-
result=self.result,
156-
error=self.error,
157-
id=self.id,
158-
)
159-
return {k:vfork,vindata.iteritems()ifk=='result'or
160-
visnotNone}
170+
result=self.result,
171+
error=self.error,
172+
id=self.id)
173+
return {k:vfork,vinlist(data.items())ifk=='result'or
174+
visnotNone}
161175

162176

163177
classRPCErrorMeta(type):
@@ -171,9 +185,7 @@ def __new__(cls, name, bases, d):
171185
returnout
172186

173187

174-
classRPCError(Exception):
175-
__metaclass__=RPCErrorMeta
176-
188+
classRPCError(with_metaclass(RPCErrorMeta,Exception)):
177189
error_code=None
178190
class_for_error_code= {}
179191

@@ -198,27 +210,38 @@ def __str__(self):
198210
returnout
199211

200212
defto_response(self,id_=None):
201-
returnResponse(None,dict(code=self.error_code,message=self.error_msg,
202-
data=self.error_data),id_)
213+
returnResponse(None,
214+
dict(code=self.error_code,message=self.error_msg,
215+
data=self.error_data),
216+
id_)
203217

204218

205219
classParseError(RPCError):
206220
error_code=-32700
207221

222+
208223
classInvalidRequest(RPCError):
209224
error_code=-32600
210225

226+
211227
classMethodNotFound(RPCError):
212228
error_code=-32601
213229

230+
214231
classInvalidParams(RPCError):
215232
error_code=-32602
216233

234+
217235
classInternalError(RPCError):
218236
error_code=-32603
219237

220-
classServerError(RPCError):pass
221-
classApplicationError(RPCError):pass
238+
239+
classServerError(RPCError):
240+
pass
241+
242+
243+
classApplicationError(RPCError):
244+
pass
222245

223246

224247
defrpc_exception_class_for_code(code,extra_code_mapping=None):
@@ -262,4 +285,3 @@ def __init__(self, endpoint, socket_type, timeout, context=None,
262285

263286
defclose(self):
264287
self.socket.close()
265-

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp