Merge pull request #5 from datpy/move-to-generators

Move naming to generator
This commit is contained in:
decentral1se 2019-10-08 22:45:45 +02:00 committed by GitHub
commit 15cac7d390
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 67 additions and 62 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

@ -1,28 +1,28 @@
Introduction Introduction
------------ ------------
The DatPy community is committed to providing an inclusive, The DatPy community is committed to providing an inclusive, safe, and
safe, and collaborative environment for all participants, regardless of their collaborative environment for all participants, regardless of their gender,
gender, gender expression, race, ethnicity, religion, sexual orientation, gender expression, race, ethnicity, religion, sexual orientation, sexual
sexual characteristics, physical appearance, disability, or age. We encourage characteristics, physical appearance, disability, or age. We encourage every
every participant to be themselves, and must respect the rights of others. The participant to be themselves, and must respect the rights of others. The code
code of conduct is a set of guidelines that establishes shared values and of conduct is a set of guidelines that establishes shared values and ensures
ensures that behaviors that may harm participants are avoided. that behaviors that may harm participants are avoided.
The values of the DatPy community are focused on developing The values of the DatPy community are focused on developing both our individual
both our individual and collective potential, supporting and empowering the and collective potential, supporting and empowering the most marginalized,
most marginalized, mutual respect, and an anti-violence approach that favors mutual respect, and an anti-violence approach that favors support and
support and collaboration among participants and the resolution of conflicts. A collaboration among participants and the resolution of conflicts. A code of
code of conduct helps us co-exist in a more positive way and provides conduct helps us co-exist in a more positive way and provides individuals who
individuals who are victims of negative behaviors with confidence that they are victims of negative behaviors with confidence that they will be supported
will be supported by the organization and the DatPy by the organization and the DatPy community, who respects and stands behind the
community, who respects and stands behind the code of conduct. code of conduct.
The DatPy community works towards providing a welcoming The DatPy community works towards providing a welcoming environment where
environment where participants are treated with dignity and respect and are participants are treated with dignity and respect and are free to be
free to be themselves. We encourage all participants to approach the themselves. We encourage all participants to approach the Librehosters network
Librehosters network with an open and positive attitude, engaging with an open and positive attitude, engaging constructively with others at all
constructively with others at all times. times.
Respect for Diversity & Inclusion Respect for Diversity & Inclusion
--------------------------------- ---------------------------------
@ -92,9 +92,9 @@ Enforcement
Overseeing the code of conduct Overseeing the code of conduct
============================== ==============================
The DatPy community, composed of volunteers, oversees the The DatPy community, composed of volunteers, oversees the code of conduct,
code of conduct, including addressing all incident reports. Breaking the code including addressing all incident reports. Breaking the code of conduct may
of conduct may result in immediate expulsion from the Librehosters network. result in immediate expulsion from the Librehosters network.
How to Report an Incident How to Report an Incident
========================= =========================

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

View File

@ -34,13 +34,11 @@ commands = isort {posargs:-rc -c} -sp setup.cfg merkle_tree_stream/ test/
[testenv:format] [testenv:format]
description = format the source description = format the source
skipdist = True skipdist = True
basepython = python3.6
deps = black deps = black
commands = black {posargs:--check} merkle_tree_stream/ test/ commands = black {posargs:--check} merkle_tree_stream/ test/
[testenv:type] [testenv:type]
description = type check the source description = type check the source
basepython = python3.7
skipdist = True skipdist = True
deps = mypy deps = mypy
commands = mypy merkle_tree_stream/ test/ commands = mypy merkle_tree_stream/ test/