Skip to content

Commit

Permalink
Make rusty-rlp optional
Browse files Browse the repository at this point in the history
  • Loading branch information
cburgdorf committed Oct 7, 2020
1 parent 5a49f8e commit 593d4ca
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 19 deletions.
43 changes: 43 additions & 0 deletions .circleci/config.yml
Expand Up @@ -58,6 +58,36 @@ jobs:
- image: circleci/python:3.7
environment:
TOXENV: py37-core
py38-core:
<<: *common
docker:
- image: circleci/python:3.8
environment:
TOXENV: py38-core
py35-rust-backend:
<<: *common
docker:
- image: circleci/python:3.5
environment:
TOXENV: py35-rust-backend
py36-rust-backend:
<<: *common
docker:
- image: circleci/python:3.6
environment:
TOXENV: py36-rust-backend
py37-rust-backend:
<<: *common
docker:
- image: circleci/python:3.7
environment:
TOXENV: py37-rust-backend
py38-rust-backend:
<<: *common
docker:
- image: circleci/python:3.8
environment:
TOXENV: py38-rust-backend
py35-doctest:
<<: *common
docker:
Expand All @@ -76,6 +106,12 @@ jobs:
- image: circleci/python:3.7
environment:
TOXENV: py37-doctest
py38-doctest:
<<: *common
docker:
- image: circleci/python:3.8
environment:
TOXENV: py38-doctest

lint:
<<: *common
Expand All @@ -91,9 +127,16 @@ workflows:
- py35-core
- py36-core
- py37-core
- py38-core

- py35-rust-backend
- py36-rust-backend
- py37-rust-backend
- py38-rust-backend

- py35-doctest
- py36-doctest
- py37-doctest
- py38-doctest

- lint
Empty file added 2**32
Empty file.
73 changes: 58 additions & 15 deletions rlp/codec.py
Expand Up @@ -5,7 +5,7 @@
int_to_big_endian,
is_bytes,
)
import rusty_rlp


from rlp.exceptions import EncodingError, DecodingError
from rlp.sedes.binary import Binary as BinaryClass
Expand All @@ -15,20 +15,63 @@
from rlp.utils import ALL_BYTES


def decode_raw(item, strict, preserve_per_item_rlp):
try:
return rusty_rlp.decode_raw(item, strict, preserve_per_item_rlp)
except (TypeError, rusty_rlp.DecodingError) as e:
raise DecodingError(e, item)


def encode_raw(obj):
try:
if isinstance(obj, bytearray):
obj = bytes(obj)
return rusty_rlp.encode_raw(obj)
except(rusty_rlp.EncodingError) as e:
raise EncodingError(e, obj)
try:
import rusty_rlp
except ImportError as e:
import logging
from rlp.atomic import (
Atomic,
)
logger = logging.getLogger()
logger.warning(
"Consider installing rusty-rlp to improve pyrlp performance with a rust based backend"
)

def encode_raw(item):
"""RLP encode (a nested sequence of) :class:`Atomic`s."""
if isinstance(item, Atomic):
if len(item) == 1 and item[0] < 128:
return item
payload = item
prefix_offset = 128 # string
elif not isinstance(item, str) and isinstance(item, collections.abc.Sequence):
payload = b''.join(encode_raw(x) for x in item)
prefix_offset = 192 # list
else:
msg = 'Cannot encode object of type {0}'.format(type(item).__name__)
raise EncodingError(msg, item)

try:
prefix = length_prefix(len(payload), prefix_offset)
except ValueError:
raise EncodingError('Item too big to encode', item)

return prefix + payload

def decode_raw(item, strict, _):
try:
result, per_item_rlp, end = consume_item(item, 0)
except IndexError:
raise DecodingError('RLP string too short', item)
if end != len(item) and strict:
msg = 'RLP string ends with {} superfluous bytes'.format(len(item) - end)
raise DecodingError(msg, item)

return result, per_item_rlp
else:
def decode_raw(item, strict, preserve_per_item_rlp):
try:
return rusty_rlp.decode_raw(item, strict, preserve_per_item_rlp)
except (TypeError, rusty_rlp.DecodingError) as e:
raise DecodingError(e, item)

def encode_raw(obj):
try:
if isinstance(obj, bytearray):
obj = bytes(obj)
return rusty_rlp.encode_raw(obj)
except(rusty_rlp.EncodingError) as e:
raise EncodingError(e, obj)


def encode(obj, sedes=None, infer_serializer=True, cache=True):
Expand Down
5 changes: 3 additions & 2 deletions setup.py
Expand Up @@ -5,7 +5,6 @@
find_packages,
)


extras_require = {
'test': [
"pytest==5.4.3",
Expand All @@ -28,6 +27,9 @@
"ipython",
"twine",
],
'rust-backend': [
"rusty-rlp>=0.1.15, <0.2"
]
}


Expand All @@ -53,7 +55,6 @@
setup_requires=['setuptools-markdown'],
install_requires=[
"eth-utils>=1.0.2,<2",
"rusty-rlp>=0.1.15, <0.2",
],
extras_require=extras_require,
license="MIT",
Expand Down
9 changes: 7 additions & 2 deletions tox.ini
@@ -1,7 +1,8 @@
[tox]
envlist =
py{35,36,37}-core
py{35,36,37}-doctest
py{35,36,37,38}-core
py{35,36,37,38}-rust-backend
py{35,36,37,38}-doctest
lint

[flake8]
Expand All @@ -14,12 +15,16 @@ usedevelop=True
commands=
core: py.test {posargs:tests/}
doctest: py.test --doctest-glob='docs/*.rst' --doctest-modules docs rlp
rust-backend: py.test {posargs:tests/}

basepython =
py35: python3.5
py36: python3.6
py37: python3.7
py38: python3.8
extras=
test
rust-backend: rust-backend
whitelist_externals=make

[testenv:lint]
Expand Down

0 comments on commit 593d4ca

Please sign in to comment.