Move naming to Generator (reflect reality)

Closes https://github.com/datpy/merkle-tree-stream/issues/4.
This commit is contained in:
Luke Murphy 2019-10-08 22:26:24 +02:00
parent 71526e64aa
commit a293d4bada
No known key found for this signature in database
GPG Key ID: 5E2EF5A63E3718CC
5 changed files with 44 additions and 37 deletions

View File

@ -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)
======================================= =======================================

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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