Skip to content

Commit f990f34

Browse files
committed
Implementation of websockets
1 parent 1253b2b commit f990f34

File tree

10 files changed

+57
-35
lines changed

10 files changed

+57
-35
lines changed

ucoinpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
MANAGED_API=["BASIC_MERKLED_API"]
2222

2323
__author__ = 'Caner Candan & inso'
24-
__version__ = '0.13.1'
24+
__version__ = '0.14.0'
2525
__nonsense__ = 'uCoin'
2626

2727
from . import api, documents, key

ucoinpy/api/bma/__init__.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
PROTOCOL_VERSION = "1"
2323

24-
import aiohttp, asyncio, logging, jsonschema
24+
import aiohttp, json, logging, jsonschema
2525

2626
logger = logging.getLogger("ucoin")
2727

@@ -59,7 +59,7 @@ def __init__(self, connection_handler, module):
5959
self.connection_handler = connection_handler
6060
self.headers = {}
6161

62-
def reverse_url(self, path):
62+
def reverse_url(self, scheme, path):
6363
"""
6464
Reverses the url using self.url and path given in parameter.
6565
@@ -69,7 +69,10 @@ def reverse_url(self, path):
6969

7070
server, port = self.connection_handler.server, self.connection_handler.port
7171

72-
url = 'http://%s:%d/%s' % (server, port, self.module)
72+
url = '{scheme}://{server}:{port}/{module}'.format(scheme=scheme,
73+
server=server,
74+
port=port,
75+
module=self.module)
7376
return url + path
7477

7578
def get(self, **kwargs):
@@ -96,7 +99,21 @@ async def __post__(self, **kwargs):
9699
"""interface purpose for POST request"""
97100
pass
98101

99-
async def parse(self, response):
102+
def parse_text(self, text):
103+
"""
104+
Validate and parse the BMA answer from websocket
105+
106+
:param str text: the bma answer
107+
:return: the json data
108+
"""
109+
try:
110+
data = json.loads(text)
111+
jsonschema.validate(data, self.schema)
112+
return data
113+
except TypeError:
114+
raise jsonschema.ValidationError("Could not parse json")
115+
116+
async def parse_response(self, response):
100117
"""
101118
Validate and parse the BMA answer
102119
@@ -117,9 +134,9 @@ async def requests_get(self, path, **kwargs):
117134
Arguments:
118135
- `path`: the request path
119136
"""
120-
logging.debug("Request : {0}".format(self.reverse_url(path)))
137+
logging.debug("Request : {0}".format(self.reverse_url("http", path)))
121138
with aiohttp.Timeout(15):
122-
response = await aiohttp.get(self.reverse_url(path), params=kwargs,headers=self.headers)
139+
response = await aiohttp.get(self.reverse_url("http", path), params=kwargs,headers=self.headers)
123140
if response.status != 200:
124141
raise ValueError('status code != 200 => %d (%s)' % (response.status, (await response.text())))
125142

@@ -137,7 +154,7 @@ async def requests_post(self, path, **kwargs):
137154

138155
logging.debug("POST : {0}".format(kwargs))
139156
with aiohttp.Timeout(15):
140-
response = await aiohttp.post(self.reverse_url(path), data=kwargs, headers=self.headers)
157+
response = await aiohttp.post(self.reverse_url("http", path), data=kwargs, headers=self.headers)
141158
return response
142159

143160
def connect_ws(self, path):
@@ -147,7 +164,8 @@ def connect_ws(self, path):
147164
:param str path: the url path
148165
:return:
149166
"""
150-
return aiohttp.ws_connect(self.reverse_url(path))
167+
url = self.reverse_url("ws", path)
168+
return aiohttp.ws_connect(url)
151169

152170

153-
from . import network, blockchain, tx, wot, node, ud, websocket
171+
from . import network, blockchain, tx, wot, node, ud, ws

ucoinpy/api/bma/blockchain/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Parameters(Blockchain):
8484

8585
async def __get__(self, **kwargs):
8686
r = await self.requests_get('/parameters', **kwargs)
87-
return (await self.parse(r))
87+
return (await self.parse_response(r))
8888

8989

9090
class Membership(Blockchain):
@@ -143,7 +143,7 @@ async def __post__(self, **kwargs):
143143
async def __get__(self, **kwargs):
144144
assert self.search is not None
145145
r = await self.requests_get('/memberships/%s' % self.search, **kwargs)
146-
return (await self.parse(r))
146+
return (await self.parse_response(r))
147147

148148

149149
class Block(Blockchain):
@@ -281,7 +281,7 @@ def __init__(self, connection_handler, number=None):
281281
async def __get__(self, **kwargs):
282282
assert self.number is not None
283283
r = await self.requests_get('/block/%d' % self.number, **kwargs)
284-
return (await self.parse(r))
284+
return (await self.parse_response(r))
285285

286286
async def __post__(self, **kwargs):
287287
assert 'block' in kwargs
@@ -298,7 +298,7 @@ class Current(Blockchain):
298298

299299
async def __get__(self, **kwargs):
300300
r = await self.requests_get('/current', **kwargs)
301-
return (await self.parse(r))
301+
return (await self.parse_response(r))
302302

303303

304304
class Hardship(Blockchain):
@@ -331,7 +331,7 @@ def __init__(self, connection_handler, fingerprint):
331331
async def __get__(self, **kwargs):
332332
assert self.fingerprint is not None
333333
r = await self.requests_get('/hardship/%s' % self.fingerprint.upper(), **kwargs)
334-
return (await self.parse(r))
334+
return (await self.parse_response(r))
335335

336336

337337
class Newcomers(Blockchain):
@@ -358,7 +358,7 @@ class Newcomers(Blockchain):
358358

359359
async def __get__(self, **kwargs):
360360
r = await self.requests_get('/with/newcomers', **kwargs)
361-
return (await self.parse(r))
361+
return (await self.parse_response(r))
362362

363363

364364
class Certifications(Blockchain):
@@ -368,7 +368,7 @@ class Certifications(Blockchain):
368368

369369
async def __get__(self, **kwargs):
370370
r = await self.requests_get('/with/certs', **kwargs)
371-
return (await self.parse(r))
371+
return (await self.parse_response(r))
372372

373373

374374
class Joiners(Blockchain):
@@ -378,7 +378,7 @@ class Joiners(Blockchain):
378378

379379
async def __get__(self, **kwargs):
380380
r = await self.requests_get('/with/joiners', **kwargs)
381-
return (await self.parse(r))
381+
return (await self.parse_response(r))
382382

383383

384384
class Actives(Blockchain):
@@ -388,7 +388,7 @@ class Actives(Blockchain):
388388

389389
async def __get__(self, **kwargs):
390390
r = await self.requests_get('/with/actives', **kwargs)
391-
return (await self.parse(r))
391+
return (await self.parse_response(r))
392392

393393

394394
class Leavers(Blockchain):
@@ -398,7 +398,7 @@ class Leavers(Blockchain):
398398

399399
async def __get__(self, **kwargs):
400400
r = await self.requests_get('/with/leavers', **kwargs)
401-
return (await self.parse(r))
401+
return (await self.parse_response(r))
402402

403403

404404
class Excluded(Blockchain):
@@ -408,7 +408,7 @@ class Excluded(Blockchain):
408408

409409
async def __get__(self, **kwargs):
410410
r = await self.requests_get('/with/excluded', **kwargs)
411-
return (await self.parse(r))
411+
return (await self.parse_response(r))
412412

413413

414414
class UD(Blockchain):
@@ -418,7 +418,7 @@ class UD(Blockchain):
418418

419419
async def __get__(self, **kwargs):
420420
r = await self.requests_get('/with/ud', **kwargs)
421-
return (await self.parse(r))
421+
return (await self.parse_response(r))
422422

423423

424424
class TX(Blockchain):
@@ -428,4 +428,4 @@ class TX(Blockchain):
428428

429429
async def __get__(self, **kwargs):
430430
r = await self.requests_get('/with/tx', **kwargs)
431-
return (await self.parse(r))
431+
return (await self.parse_response(r))

ucoinpy/api/bma/network/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,6 @@ class Peering(Network):
5555

5656
async def __get__(self, **kwargs):
5757
r = await self.requests_get('/peering', **kwargs)
58-
return (await self.parse(r))
58+
return (await self.parse_response(r))
5959

6060
from . import peering

ucoinpy/api/bma/network/peering/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ async def __get__(self, **kwargs):
8585
"""creates a generator with one peering entry per iteration."""
8686

8787
r = await self.requests_get('/peers', **kwargs)
88-
return (await self.parse(r))
88+
return (await self.parse_response(r))
8989

9090
async def __post__(self, **kwargs):
9191
assert 'entry' in kwargs

ucoinpy/api/bma/node/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,5 @@ def __init__(self, connection_handler, module='node'):
5555

5656
async def __get__(self, **kwargs):
5757
r = await self.requests_get('/summary', **kwargs)
58-
return (await self.parse(r))
58+
return (await self.parse_response(r))
5959

ucoinpy/api/bma/tx/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def __init__(self, conn_handler, pubkey, module='tx'):
160160
async def __get__(self, **kwargs):
161161
assert self.pubkey is not None
162162
r = await self.requests_get('/history/%s' % self.pubkey, **kwargs)
163-
return (await self.parse(r))
163+
return (await self.parse_response(r))
164164

165165

166166
class Process(Tx):
@@ -219,7 +219,7 @@ def __init__(self, connection_handler, pubkey, module='tx'):
219219
async def __get__(self, **kwargs):
220220
assert self.pubkey is not None
221221
r = await self.requests_get('/sources/%s' % self.pubkey, **kwargs)
222-
return (await self.parse(r))
222+
return (await self.parse_response(r))
223223

224224

225225
from . import history

ucoinpy/api/bma/tx/history/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ def __init__(self, conn_handler, pubkey, from_, to_, module='tx'):
3232

3333
async def __get__(self, **kwargs):
3434
r = await self.requests_get('/history/%s/blocks/%s/%s' % (self.pubkey, self.from_, self.to_), **kwargs)
35-
return (await self.parse(r))
35+
return (await self.parse_response(r))

ucoinpy/api/bma/wot/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ async def __get__(self, **kwargs):
148148
assert self.search is not None
149149

150150
r = await self.requests_get('/lookup/%s' % self.search, **kwargs)
151-
return (await self.parse(r))
151+
return (await self.parse_response(r))
152152

153153

154154
class CertifiersOf(WOT):
@@ -231,7 +231,7 @@ async def __get__(self, **kwargs):
231231
assert self.search is not None
232232

233233
r = await self.requests_get('/certifiers-of/%s' % self.search, **kwargs)
234-
return (await self.parse(r))
234+
return (await self.parse_response(r))
235235

236236

237237
class CertifiedBy(WOT):
@@ -248,7 +248,7 @@ async def __get__(self, **kwargs):
248248
assert self.search is not None
249249

250250
r = await self.requests_get('/certified-by/%s' % self.search, **kwargs)
251-
return (await self.parse(r))
251+
return (await self.parse_response(r))
252252

253253

254254
class Members(WOT):
@@ -277,4 +277,4 @@ def __init__(self, connection_handler, module='wot'):
277277

278278
async def __get__(self, **kwargs):
279279
r = await self.requests_get('/members', **kwargs)
280-
return (await self.parse(r))
280+
return (await self.parse_response(r))

ucoinpy/api/bma/websocket/__init__.py renamed to ucoinpy/api/bma/ws/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@
1717
#
1818

1919
from .. import API, logging
20+
from ..blockchain import Block as _Block
21+
from ..network.peering import Peers as _Peers
2022

21-
logger = logging.getLogger("ucoin/wot")
23+
logger = logging.getLogger("ucoin/ws")
2224

2325

2426
class Websocket(API):
25-
def __init__(self, connection_handler, module='websocket'):
27+
def __init__(self, connection_handler, module='ws'):
2628
super(Websocket, self).__init__(connection_handler, module)
2729

2830

2931
class Block(Websocket):
3032
"""Connect to block websocket."""
33+
schema = _Block.schema
3134

3235
def connect(self):
3336

@@ -37,6 +40,7 @@ def connect(self):
3740

3841
class Peer(Websocket):
3942
"""Connect to block websocket."""
43+
schema = _Peers.schema
4044

4145
def connect(self):
4246

0 commit comments

Comments
 (0)