Skip to content
Snippets Groups Projects
Commit d31b2a5d authored by inso's avatar inso
Browse files

Upgrading ucoinpy to asyncio + aiohttp

parent 7a4639c0
No related branches found
No related tags found
No related merge requests found
config 0 → 100644
{"prefer_hash_algorithm":8,"encryption_cipher":9,"compression":1,"show_version":true,"show_comment":true,"integrity_protect":true,"composition_behavior":0,"keyserver":"keyserver.linux.it"}
\ No newline at end of file
...@@ -20,11 +20,12 @@ ...@@ -20,11 +20,12 @@
__all__ = ['api'] __all__ = ['api']
__author__ = 'Caner Candan' __author__ = 'Caner Candan'
__version__ = '0.10.0' __version__ = '0.11.0'
__nonsense__ = 'uCoin' __nonsense__ = 'uCoin'
import requests, logging, json PROTOCOL_VERSION = "1"
# import pylibscrypt
import aiohttp, requests, asyncio, logging, json
logger = logging.getLogger("ucoin") logger = logging.getLogger("ucoin")
...@@ -93,14 +94,13 @@ class API(object): ...@@ -93,14 +94,13 @@ class API(object):
def __get__(self, **kwargs): def __get__(self, **kwargs):
"""interface purpose for GET request""" """interface purpose for GET request"""
pass pass
def __post__(self, **kwargs): def __post__(self, **kwargs):
"""interface purpose for POST request""" """interface purpose for POST request"""
pass pass
@asyncio.coroutine
def requests_get(self, path, **kwargs): def requests_get(self, path, **kwargs):
""" """
Requests GET wrapper in order to use API parameters. Requests GET wrapper in order to use API parameters.
...@@ -108,12 +108,12 @@ class API(object): ...@@ -108,12 +108,12 @@ class API(object):
Arguments: Arguments:
- `path`: the request path - `path`: the request path
""" """
logging.debug("Request : {0}".format(self.reverse_url(path)))
response = yield from asyncio.wait_for(aiohttp.get(self.reverse_url(path), params=kwargs,
headers=self.headers), 15)
response = requests.get(self.reverse_url(path), params=kwargs, if response.status != 200:
headers=self.headers, timeout=15) raise ValueError('status code != 200 => %d (%s)' % (response.status, (yield from response.text())))
if response.status_code != 200:
raise ValueError('status code != 200 => %d (%s)' % (response.status_code, response.text))
return response return response
...@@ -128,17 +128,13 @@ class API(object): ...@@ -128,17 +128,13 @@ class API(object):
kwargs['self'] = kwargs.pop('self_') kwargs['self'] = kwargs.pop('self_')
logging.debug("POST : {0}".format(kwargs)) logging.debug("POST : {0}".format(kwargs))
response = requests.post(self.reverse_url(path), data=kwargs, headers=self.headers, response = yield from asyncio.wait_for(
aiohttp.post(self.reverse_url(path), data=kwargs, headers=self.headers),
timeout=15) timeout=15)
if response.status_code != 200: if response.status != 200:
raise ValueError('status code != 200 => %d (%s)' % (response.status_code, response.text)) raise ValueError('status code != 200 => %d (%s)' % (response.status, (yield from (response.text()))))
return response return response
def merkle_easy_parser(self, path, begin=None, end=None): from . import network, blockchain, tx, wot, node, ud
root = self.requests_get(path, leaves='true').json()
for leaf in root['leaves'][begin:end]:
yield self.requests_get(path, leaf=leaf).json()['leaf']
from . import network, blockchain, tx, wot, node
...@@ -30,7 +30,8 @@ class Parameters(Blockchain): ...@@ -30,7 +30,8 @@ class Parameters(Blockchain):
"""GET the blockchain parameters used by this node.""" """GET the blockchain parameters used by this node."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/parameters', **kwargs).json() r = yield from self.requests_get('/parameters', **kwargs)
return (yield from r.json())
class Membership(Blockchain): class Membership(Blockchain):
...@@ -42,11 +43,13 @@ class Membership(Blockchain): ...@@ -42,11 +43,13 @@ class Membership(Blockchain):
def __post__(self, **kwargs): def __post__(self, **kwargs):
assert 'membership' in kwargs assert 'membership' in kwargs
return self.requests_post('/membership', **kwargs).json() r = yield from self.requests_post('/membership', **kwargs)
return (yield from r.text())
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.search is not None assert self.search is not None
return self.requests_get('/memberships/%s' % self.search, **kwargs).json() r = yield from self.requests_get('/memberships/%s' % self.search, **kwargs)
return (yield from r.json())
class Block(Blockchain): class Block(Blockchain):
...@@ -66,20 +69,23 @@ class Block(Blockchain): ...@@ -66,20 +69,23 @@ class Block(Blockchain):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.number is not None assert self.number is not None
return self.requests_get('/block/%d' % self.number, **kwargs).json() r = yield from self.requests_get('/block/%d' % self.number, **kwargs)
return (yield from r.json())
def __post__(self, **kwargs): def __post__(self, **kwargs):
assert 'block' in kwargs assert 'block' in kwargs
assert 'signature' in kwargs assert 'signature' in kwargs
return self.requests_post('/block', **kwargs).json() r = yield from self.requests_post('/block', **kwargs)
return (yield from r.text())
class Current(Blockchain): class Current(Blockchain):
"""GET, same as block/[number], but return last accepted block.""" """GET, same as block/[number], but return last accepted block."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/current', **kwargs).json() r = yield from self.requests_get('/current', **kwargs)
return (yield from r.json())
class Hardship(Blockchain): class Hardship(Blockchain):
...@@ -99,60 +105,69 @@ class Hardship(Blockchain): ...@@ -99,60 +105,69 @@ class Hardship(Blockchain):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.fingerprint is not None assert self.fingerprint is not None
return self.requests_get('/hardship/%s' % self.fingerprint.upper(), **kwargs).json() r = yield from self.requests_get('/hardship/%s' % self.fingerprint.upper(), **kwargs)
return (yield from r.json())
class Newcomers(Blockchain): class Newcomers(Blockchain):
"""GET, return block numbers containing newcomers.""" """GET, return block numbers containing newcomers."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/newcomers', **kwargs).json() r = yield from self.requests_get('/with/newcomers', **kwargs)
return (yield from r.json())
class Certifications(Blockchain): class Certifications(Blockchain):
"""GET, return block numbers containing certifications.""" """GET, return block numbers containing certifications."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/certs', **kwargs).json() r = yield from self.requests_get('/with/certs', **kwargs)
return (yield from r.json())
class Joiners(Blockchain): class Joiners(Blockchain):
"""GET, return block numbers containing joiners.""" """GET, return block numbers containing joiners."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/joiners', **kwargs).json() r = yield from self.requests_get('/with/joiners', **kwargs)
return (yield from r.json())
class Actives(Blockchain): class Actives(Blockchain):
"""GET, return block numbers containing actives.""" """GET, return block numbers containing actives."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/actives', **kwargs).json() r = yield from self.requests_get('/with/actives', **kwargs)
return (yield from r.json())
class Leavers(Blockchain): class Leavers(Blockchain):
"""GET, return block numbers containing leavers.""" """GET, return block numbers containing leavers."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/leavers', **kwargs).json() r = yield from self.requests_get('/with/leavers', **kwargs)
return (yield from r.json())
class Excluded(Blockchain): class Excluded(Blockchain):
"""GET, return block numbers containing excluded.""" """GET, return block numbers containing excluded."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/excluded', **kwargs).json() r = yield from self.requests_get('/with/excluded', **kwargs)
return (yield from r.json())
class UD(Blockchain): class UD(Blockchain):
"""GET, return block numbers containing universal dividend.""" """GET, return block numbers containing universal dividend."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/ud', **kwargs).json() r = yield from self.requests_get('/with/ud', **kwargs)
return (yield from r.json())
class TX(Blockchain): class TX(Blockchain):
"""GET, return block numbers containing transactions.""" """GET, return block numbers containing transactions."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/with/tx', **kwargs).json() r = yield from self.requests_get('/with/tx', **kwargs)
return (yield from r.json())
...@@ -30,6 +30,7 @@ class Peering(Network): ...@@ -30,6 +30,7 @@ class Peering(Network):
"""GET peering information about a peer.""" """GET peering information about a peer."""
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/peering', **kwargs).json() r = yield from self.requests_get('/peering', **kwargs)
return (yield from r.json())
from . import peering from . import peering
...@@ -32,13 +32,15 @@ class Peers(Base): ...@@ -32,13 +32,15 @@ class Peers(Base):
def __get__(self, **kwargs): def __get__(self, **kwargs):
"""creates a generator with one peering entry per iteration.""" """creates a generator with one peering entry per iteration."""
return self.merkle_easy_parser('/peers') r = yield from self.requests_get('/peers', **kwargs)
return (yield from r.json())
def __post__(self, **kwargs): def __post__(self, **kwargs):
assert 'entry' in kwargs assert 'entry' in kwargs
assert 'signature' in kwargs assert 'signature' in kwargs
return self.requests_post('/peers', **kwargs).json() r = yield from self.requests_post('/peers', **kwargs)
return (yield from r.json())
class Status(Base): class Status(Base):
...@@ -48,4 +50,5 @@ class Status(Base): ...@@ -48,4 +50,5 @@ class Status(Base):
assert 'status' in kwargs assert 'status' in kwargs
assert 'signature' in kwargs assert 'signature' in kwargs
return self.requests_post('/status', **kwargs).json() r = yield from self.requests_post('/status', **kwargs)
return (yield from r.json())
...@@ -20,6 +20,7 @@ from .. import API, logging ...@@ -20,6 +20,7 @@ from .. import API, logging
logger = logging.getLogger("ucoin/node") logger = logging.getLogger("ucoin/node")
class Node(API): class Node(API):
def __init__(self, connection_handler, module='node'): def __init__(self, connection_handler, module='node'):
super(Node, self).__init__(connection_handler, module) super(Node, self).__init__(connection_handler, module)
...@@ -31,7 +32,7 @@ class Summary(Node): ...@@ -31,7 +32,7 @@ class Summary(Node):
def __init__(self, connection_handler, module='node'): def __init__(self, connection_handler, module='node'):
super(Summary, self).__init__(connection_handler, module) super(Summary, self).__init__(connection_handler, module)
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/summary', **kwargs).json() r = yield from self.requests_get('/summary', **kwargs)
return (yield from r.json())
...@@ -26,13 +26,26 @@ class Tx(API): ...@@ -26,13 +26,26 @@ class Tx(API):
super(Tx, self).__init__(connection_handler, module) super(Tx, self).__init__(connection_handler, module)
class History(Tx):
"""Get transaction sources."""
def __init__(self, conn_handler, pubkey, module='tx'):
super(Tx, self).__init__(conn_handler, module)
self.pubkey = pubkey
def __get__(self, **kwargs):
assert self.pubkey is not None
r = yield from self.requests_get('/history/%s' % self.pubkey, **kwargs)
return (yield from r.json())
class Process(Tx): class Process(Tx):
"""POST a transaction.""" """POST a transaction."""
def __post__(self, **kwargs): def __post__(self, **kwargs):
assert 'transaction' in kwargs assert 'transaction' in kwargs
return self.requests_post('/process', **kwargs).json() r = yield from self.requests_post('/process', **kwargs)
return (yield from r.text())
class Sources(Tx): class Sources(Tx):
...@@ -43,4 +56,7 @@ class Sources(Tx): ...@@ -43,4 +56,7 @@ class Sources(Tx):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.pubkey is not None assert self.pubkey is not None
return self.requests_get('/sources/%s' % self.pubkey, **kwargs).json() r = yield from self.requests_get('/sources/%s' % self.pubkey, **kwargs)
return (yield from r.json())
from . import history
\ No newline at end of file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Caner Candan <caner@candan.fr>, http://caner.candan.fr
#
from .. import History, logging
logger = logging.getLogger("ucoin/tx")
class Blocks(History):
def __init__(self, conn_handler, pubkey, from_, to_, module='tx'):
super(Blocks, self).__init__(conn_handler, pubkey, module)
self.from_ = from_
self.to_ = to_
def __get__(self, **kwargs):
r = yield from self.requests_get('/history/%s/blocks/%s/%s' % (self.pubkey, self.from_, self.to_), **kwargs)
return (yield from r.json())
\ No newline at end of file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Caner Candan <caner@candan.fr>, http://caner.candan.fr
#
from .. import API, logging
logger = logging.getLogger("ucoin/ud")
class Ud(API):
def __init__(self, conn_handler, module='ud'):
super(Ud, self).__init__(conn_handler, module)
class History(Ud):
"""Get UD history."""
def __init__(self, conn_handler, pubkey, module='ud'):
super(Ud, self).__init__(conn_handler, module)
self.pubkey = pubkey
def __get__(self, **kwargs):
assert self.pubkey is not None
r = yield from self.requests_get('/history/%s' % self.pubkey, **kwargs)
return (yield from r.json())
...@@ -34,7 +34,8 @@ class Add(WOT): ...@@ -34,7 +34,8 @@ class Add(WOT):
assert 'self_' in kwargs assert 'self_' in kwargs
assert 'other' in kwargs assert 'other' in kwargs
return self.requests_post('/add', **kwargs).json() r = yield from self.requests_post('/add', **kwargs)
return (yield from r.text())
class Revoke(WOT): class Revoke(WOT):
...@@ -44,7 +45,8 @@ class Revoke(WOT): ...@@ -44,7 +45,8 @@ class Revoke(WOT):
assert 'pubkey' in kwargs assert 'pubkey' in kwargs
assert 'self_' in kwargs assert 'self_' in kwargs
return self.requests_post('/revoke', **kwargs).json() r = yield from self.requests_post('/revoke', **kwargs)
return (yield from r.text())
class Lookup(WOT): class Lookup(WOT):
...@@ -58,7 +60,8 @@ class Lookup(WOT): ...@@ -58,7 +60,8 @@ class Lookup(WOT):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.search is not None assert self.search is not None
return self.requests_get('/lookup/%s' % self.search, **kwargs).json() r = yield from self.requests_get('/lookup/%s' % self.search, **kwargs)
return (yield from r.json())
class CertifiersOf(WOT): class CertifiersOf(WOT):
...@@ -72,7 +75,8 @@ class CertifiersOf(WOT): ...@@ -72,7 +75,8 @@ class CertifiersOf(WOT):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.search is not None assert self.search is not None
return self.requests_get('/certifiers-of/%s' % self.search, **kwargs).json() r = yield from self.requests_get('/certifiers-of/%s' % self.search, **kwargs)
return (yield from r.json())
class CertifiedBy(WOT): class CertifiedBy(WOT):
...@@ -86,7 +90,8 @@ class CertifiedBy(WOT): ...@@ -86,7 +90,8 @@ class CertifiedBy(WOT):
def __get__(self, **kwargs): def __get__(self, **kwargs):
assert self.search is not None assert self.search is not None
return self.requests_get('/certified-by/%s' % self.search, **kwargs).json() r = yield from self.requests_get('/certified-by/%s' % self.search, **kwargs)
return (yield from r.json())
class Members(WOT): class Members(WOT):
...@@ -96,4 +101,5 @@ class Members(WOT): ...@@ -96,4 +101,5 @@ class Members(WOT):
super(WOT, self).__init__(connection_handler, module) super(WOT, self).__init__(connection_handler, module)
def __get__(self, **kwargs): def __get__(self, **kwargs):
return self.requests_get('/members', **kwargs).json() r = yield from self.requests_get('/members', **kwargs)
return (yield from r.json())
...@@ -77,6 +77,8 @@ BOTTOM_SIGNATURE ...@@ -77,6 +77,8 @@ BOTTOM_SIGNATURE
re_certifications = re.compile("Certifications:\n") re_certifications = re.compile("Certifications:\n")
re_transactions = re.compile("Transactions:\n") re_transactions = re.compile("Transactions:\n")
Empty_Hash = "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
def __init__(self, version, currency, noonce, number, powmin, time, def __init__(self, version, currency, noonce, number, powmin, time,
mediantime, ud, issuer, prev_hash, prev_issuer, mediantime, ud, issuer, prev_hash, prev_issuer,
parameters, members_count, identities, joiners, parameters, members_count, identities, joiners,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment