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

View File

@ -52,22 +52,20 @@ A note on naming
================
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
cause confusion since it is not clear what exactly is referred to when using
the term "stream" in the context of Python. To be clear, this module provides a
`Python iterator`_ which appears to match the implementation and meaning of the
reference implementation.
implementation, we use the same module name as `merkle-tree-stream`_. However,
there is currently no stream implemented, only a generator is available. This
is because the reference implementation of Hypercore 7 makes use of the
generator only. A `stream`_ implementation may follow.
.. _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:
.. code-block:: python
from hashlib import sha256
from merkle_tree_stream import MerkleTreeIterator
from merkle_tree_stream import MerkleTreeGenerator
def leaf(node, roots=None):
return sha256(node.data).digest()
@ -78,10 +76,10 @@ reference implementation.
sha256.update(second.data)
return sha256.digest()
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
merkle_iter.write('hello')
merkle_iter.write('hashed')
merkle_iter.write('world')
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
merkle.write('hello')
merkle.write('hashed')
merkle.write('world')
.. _documentation:

View File

@ -1,7 +1,7 @@
"""merkle-tree-stream module."""
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:
import pkg_resources

View File

@ -1,4 +1,4 @@
"""A merkle tree iterator."""
"""A merkle tree generator."""
from typing import Any, Callable, Iterator, List
@ -10,14 +10,14 @@ from merkle_tree_stream.node import MerkleTreeNode
EMPTY_DATA = b''
EMPTY_HASH = None
__all__ = ['MerkleTreeIterator']
__all__ = ['MerkleTreeGenerator']
flat_tree = FlatTreeAccessor()
@attr.s(auto_attribs=True)
class MerkleTreeIterator:
"""A merkle tree iterator.
class MerkleTreeGenerator:
"""A merkle tree generator.
:param leaf: The leaf hash generation function
:param parent: The parent hash generation function

View File

@ -4,53 +4,53 @@ import hashlib
import pytest
from merkle_tree_stream import MerkleTreeIterator, MerkleTreeNode
from merkle_tree_stream import MerkleTreeGenerator, MerkleTreeNode
def test_hashes(leaf, parent):
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
merkle_iter.write(b'a')
merkle_iter.write(b'b')
merkle.write(b'a')
merkle.write(b'b')
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'
)
assert next(merkle_iter) == MerkleTreeNode(
assert next(merkle) == MerkleTreeNode(
index=2, parent=1, hash=hashlib.sha256(b'b').digest(), size=1, data=b'b'
)
hashed = hashlib.sha256(b'a')
hashed.update(b'b')
assert next(merkle_iter) == MerkleTreeNode(
assert next(merkle) == MerkleTreeNode(
index=1, parent=3, hash=hashed.digest(), size=2, data=b''
)
with pytest.raises(StopIteration):
next(merkle_iter)
next(merkle)
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_iter.write(b'b')
merkle_iter.write(b'c')
merkle_iter.write(b'd')
merkle.write(b'a')
merkle.write(b'b')
merkle.write(b'c')
merkle.write(b'd')
assert len(merkle_iter.roots) == 1
assert len(merkle.roots) == 1
def multiple_roots(leaf, parent):
merkle_iter = MerkleTreeIterator(leaf=leaf, parent=parent)
merkle = MerkleTreeGenerator(leaf=leaf, parent=parent)
merkle_iter.write(b'a')
merkle_iter.write(b'b')
merkle_iter.write(b'c')
merkle.write(b'a')
merkle.write(b'b')
merkle.write(b'c')
assert len(merkle_iter.roots) > 1
assert len(merkle.roots) > 1