Move naming to Generator (reflect reality)
Closes https://github.com/datpy/merkle-tree-stream/issues/4.
This commit is contained in:
parent
71526e64aa
commit
a293d4bada
@ -1,3 +1,12 @@
|
|||||||
|
Merkle_Tree_Stream 0.0.1a3 (2019-10-08)
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
Bug Fixes
|
||||||
|
---------
|
||||||
|
|
||||||
|
- MerkleTreeIterator -> MerkleTreeGenerator
|
||||||
|
|
||||||
|
|
||||||
Merkle_Tree_Stream 0.0.1a2 (2019-10-06)
|
Merkle_Tree_Stream 0.0.1a2 (2019-10-06)
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
|
22
README.rst
22
README.rst
@ -52,22 +52,20 @@ A note on naming
|
|||||||
================
|
================
|
||||||
|
|
||||||
For the purposes of uniformity and easy of discovery alongside the reference
|
For the purposes of uniformity and easy of discovery alongside the reference
|
||||||
implementation, we use the same module name as `merkle-tree-stream`_. This may
|
implementation, we use the same module name as `merkle-tree-stream`_. However,
|
||||||
cause confusion since it is not clear what exactly is referred to when using
|
there is currently no stream implemented, only a generator is available. This
|
||||||
the term "stream" in the context of Python. To be clear, this module provides a
|
is because the reference implementation of Hypercore 7 makes use of the
|
||||||
`Python iterator`_ which appears to match the implementation and meaning of the
|
generator only. A `stream`_ implementation may follow.
|
||||||
reference implementation.
|
|
||||||
|
|
||||||
.. _merkle-tree-stream: https://github.com/mafintosh/merkle-tree-stream
|
.. _merkle-tree-stream: https://github.com/mafintosh/merkle-tree-stream
|
||||||
.. _Python iterator: https://docs.python.org/3/c-api/iter.html
|
.. _stream: https://docs.python.org/3/library/asyncio-stream.html
|
||||||
|
|
||||||
.. _example:
|
.. _example:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
from merkle_tree_stream import MerkleTreeIterator
|
from merkle_tree_stream import MerkleTreeGenerator
|
||||||
|
|
||||||
|
|
||||||
def leaf(node, roots=None):
|
def leaf(node, roots=None):
|
||||||
return sha256(node.data).digest()
|
return sha256(node.data).digest()
|
||||||
@ -78,10 +76,10 @@ reference implementation.
|
|||||||
sha256.update(second.data)
|
sha256.update(second.data)
|
||||||
return sha256.digest()
|
return sha256.digest()
|
||||||
|
|
||||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||||
merkle_iter.write('hello')
|
merkle.write('hello')
|
||||||
merkle_iter.write('hashed')
|
merkle.write('hashed')
|
||||||
merkle_iter.write('world')
|
merkle.write('world')
|
||||||
|
|
||||||
.. _documentation:
|
.. _documentation:
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""merkle-tree-stream module."""
|
"""merkle-tree-stream module."""
|
||||||
|
|
||||||
from merkle_tree_stream.node import MerkleTreeNode # noqa
|
from merkle_tree_stream.node import MerkleTreeNode # noqa
|
||||||
from merkle_tree_stream.tree import MerkleTreeIterator # noqa
|
from merkle_tree_stream.tree import MerkleTreeGenerator # noqa
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
"""A merkle tree iterator."""
|
"""A merkle tree generator."""
|
||||||
|
|
||||||
from typing import Any, Callable, Iterator, List
|
from typing import Any, Callable, Iterator, List
|
||||||
|
|
||||||
@ -10,14 +10,14 @@ from merkle_tree_stream.node import MerkleTreeNode
|
|||||||
EMPTY_DATA = b''
|
EMPTY_DATA = b''
|
||||||
EMPTY_HASH = None
|
EMPTY_HASH = None
|
||||||
|
|
||||||
__all__ = ['MerkleTreeIterator']
|
__all__ = ['MerkleTreeGenerator']
|
||||||
|
|
||||||
flat_tree = FlatTreeAccessor()
|
flat_tree = FlatTreeAccessor()
|
||||||
|
|
||||||
|
|
||||||
@attr.s(auto_attribs=True)
|
@attr.s(auto_attribs=True)
|
||||||
class MerkleTreeIterator:
|
class MerkleTreeGenerator:
|
||||||
"""A merkle tree iterator.
|
"""A merkle tree generator.
|
||||||
|
|
||||||
:param leaf: The leaf hash generation function
|
:param leaf: The leaf hash generation function
|
||||||
:param parent: The parent hash generation function
|
:param parent: The parent hash generation function
|
||||||
|
@ -4,53 +4,53 @@ import hashlib
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from merkle_tree_stream import MerkleTreeIterator, MerkleTreeNode
|
from merkle_tree_stream import MerkleTreeGenerator, MerkleTreeNode
|
||||||
|
|
||||||
|
|
||||||
def test_hashes(leaf, parent):
|
def test_hashes(leaf, parent):
|
||||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||||
|
|
||||||
merkle_iter.write(b'a')
|
merkle.write(b'a')
|
||||||
merkle_iter.write(b'b')
|
merkle.write(b'b')
|
||||||
|
|
||||||
expected_count = 2 + 1 # nodes plus parent
|
expected_count = 2 + 1 # nodes plus parent
|
||||||
assert len(merkle_iter) == expected_count
|
assert len(merkle) == expected_count
|
||||||
|
|
||||||
assert next(merkle_iter) == MerkleTreeNode(
|
assert next(merkle) == MerkleTreeNode(
|
||||||
index=0, parent=1, hash=hashlib.sha256(b'a').digest(), size=1, data=b'a'
|
index=0, parent=1, hash=hashlib.sha256(b'a').digest(), size=1, data=b'a'
|
||||||
)
|
)
|
||||||
|
|
||||||
assert next(merkle_iter) == MerkleTreeNode(
|
assert next(merkle) == MerkleTreeNode(
|
||||||
index=2, parent=1, hash=hashlib.sha256(b'b').digest(), size=1, data=b'b'
|
index=2, parent=1, hash=hashlib.sha256(b'b').digest(), size=1, data=b'b'
|
||||||
)
|
)
|
||||||
|
|
||||||
hashed = hashlib.sha256(b'a')
|
hashed = hashlib.sha256(b'a')
|
||||||
hashed.update(b'b')
|
hashed.update(b'b')
|
||||||
|
|
||||||
assert next(merkle_iter) == MerkleTreeNode(
|
assert next(merkle) == MerkleTreeNode(
|
||||||
index=1, parent=3, hash=hashed.digest(), size=2, data=b''
|
index=1, parent=3, hash=hashed.digest(), size=2, data=b''
|
||||||
)
|
)
|
||||||
|
|
||||||
with pytest.raises(StopIteration):
|
with pytest.raises(StopIteration):
|
||||||
next(merkle_iter)
|
next(merkle)
|
||||||
|
|
||||||
|
|
||||||
def test_single_root(leaf, parent):
|
def test_single_root(leaf, parent):
|
||||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||||
|
|
||||||
merkle_iter.write(b'a')
|
merkle.write(b'a')
|
||||||
merkle_iter.write(b'b')
|
merkle.write(b'b')
|
||||||
merkle_iter.write(b'c')
|
merkle.write(b'c')
|
||||||
merkle_iter.write(b'd')
|
merkle.write(b'd')
|
||||||
|
|
||||||
assert len(merkle_iter.roots) == 1
|
assert len(merkle.roots) == 1
|
||||||
|
|
||||||
|
|
||||||
def multiple_roots(leaf, parent):
|
def multiple_roots(leaf, parent):
|
||||||
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
|
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
|
||||||
|
|
||||||
merkle_iter.write(b'a')
|
merkle.write(b'a')
|
||||||
merkle_iter.write(b'b')
|
merkle.write(b'b')
|
||||||
merkle_iter.write(b'c')
|
merkle.write(b'c')
|
||||||
|
|
||||||
assert len(merkle_iter.roots) > 1
|
assert len(merkle.roots) > 1
|
||||||
|
Loading…
Reference in New Issue
Block a user