Skip to content

Commit 937dce3

Browse files
committed
Implemented multiaddr
1 parent 528daa3 commit 937dce3

File tree

24 files changed

+9972
-721
lines changed

24 files changed

+9972
-721
lines changed

.github/workflows/python-pytest.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ jobs:
3838
- name: Lint with pylint
3939
run: |
4040
pylint --errors-only --rcfile=.pylintrc multiformats
41-
pylint --exit-zero --rcfile=.pylintrc multiformats
41+
pylint --exit-zero --rcfile=.pylintrc --disable=fixme multiformats

docs/multiformats/cid.html

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
133133

134134
from multiformats.multicodec import Multicodec
135135
from multiformats.multibase import Multibase
136+
from multiformats.multihash import Multihash, _validate_raw_digest_size
136137
from multiformats.varint import BytesLike, byteslike
137138

138139
_CIDSubclass = TypeVar(&#34;_CIDSubclass&#34;, bound=&#34;CID&#34;)
@@ -144,8 +145,7 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
144145
if len(cid) == 46 and cid.startswith(&#34;Qm&#34;):
145146
# CIDv0 to be decoded as base58btc
146147
return base58btc.decode(cid), multibase.get(&#34;base58btc&#34;)
147-
b = multibase.decode(cid)
148-
mb = multibase.from_str(cid)
148+
mb, b = multibase.decode_raw(cid)
149149
if b[0] == 0x12:
150150
# CIDv0 may not be multibase encoded (0x12 is the first byte of sha2-256 multihashes)
151151
# CIDv18 (first byte 18=0x12) will be skipped to prevent ambiguity
@@ -168,29 +168,27 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
168168
multicodec.validate_multicodec(codec)
169169
return codec
170170

171-
def _CID_validate_multihash(hashfun: Union[str, int, Multicodec]) -&gt; Multicodec:
171+
def _CID_validate_multihash(hashfun: Union[str, int, Multihash]) -&gt; Multihash:
172172
if isinstance(hashfun, str):
173173
hashfun = multihash.get(hashfun)
174174
elif isinstance(hashfun, int):
175175
hashfun = multihash.get(code=hashfun)
176176
else:
177-
multihash.validate_multihash(hashfun)
177+
pass
178178
return hashfun
179179

180-
def _CID_validate_raw_digest(raw_digest: Union[str, BytesLike], hashfun: Multicodec) -&gt; bytes:
180+
def _CID_validate_raw_digest(raw_digest: Union[str, BytesLike], hashfun: Multihash) -&gt; bytes:
181181
if isinstance(raw_digest, str):
182182
raw_digest = bytes.fromhex(raw_digest)
183183
else:
184184
validate(raw_digest, BytesLike)
185185
if not isinstance(raw_digest, bytes):
186186
raw_digest = bytes(raw_digest)
187-
_, _, max_digest_size = multihash.implementation(hashfun)
188-
if max_digest_size is not None and len(raw_digest) &gt; max_digest_size:
189-
raise ValueError(f&#34;Digest size {len(raw_digest)} exceeds max digest size {max_digest_size} &#34;
190-
f&#34;for multihash multicodec {hashfun.name}&#34;)
187+
_, max_digest_size = hashfun.implementation
188+
_validate_raw_digest_size(hashfun.name, raw_digest, max_digest_size)
191189
return raw_digest
192190

193-
def _CID_validate_multihash_digest(digest: Union[str, BytesLike]) -&gt; Tuple[Multicodec, bytes]:
191+
def _CID_validate_multihash_digest(digest: Union[str, BytesLike]) -&gt; Tuple[Multihash, bytes]:
194192
if isinstance(digest, str):
195193
digest = bytes.fromhex(digest)
196194
raw_digest: BytesLike
@@ -199,7 +197,7 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
199197
raw_digest = _CID_validate_raw_digest(raw_digest, hashfun)
200198
return hashfun, raw_digest
201199

202-
def _CID_validate_version(version: int, base: Multibase, codec: Multicodec, hashfun: Multicodec) -&gt; int:
200+
def _CID_validate_version(version: int, base: Multibase, codec: Multicodec, hashfun: Multihash) -&gt; int:
203201
if version in (2, 3):
204202
raise ValueError(&#34;CID versions 2 and 3 are reserved for future use.&#34;)
205203
if version not in (0, 1):
@@ -277,7 +275,7 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
277275
_base: Multibase
278276
_version: CIDVersion
279277
_codec: Multicodec
280-
_hashfun: Multicodec
278+
_hashfun: Multihash
281279
_digest: bytes
282280

283281
__slots__ = (&#34;__weakref__&#34;, &#34;_base&#34;, &#34;_version&#34;, &#34;_codec&#34;, &#34;_hashfun&#34;, &#34;_digest&#34;)
@@ -286,17 +284,17 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
286284
base: Union[str, Multibase],
287285
version: int,
288286
codec: Union[str, int, Multicodec],
289-
digest: Union[str, BytesLike, Tuple[Union[str, int, Multicodec], Union[str, BytesLike]]],
287+
digest: Union[str, BytesLike, Tuple[Union[str, int, Multihash], Union[str, BytesLike]]],
290288
) -&gt; _CIDSubclass:
291289
# pylint: disable = too-many-arguments
292290
base = _CID_validate_multibase(base)
293291
codec = _CID_validate_multicodec(codec)
294292
raw_digest: Union[str, bytes]
295-
hashfun: Union[str, int, Multicodec]
293+
hashfun: Union[str, int, Multihash]
296294
if isinstance(digest, (str,)+byteslike):
297295
hashfun, raw_digest = _CID_validate_multihash_digest(digest)
298296
else:
299-
validate(digest, Tuple[Union[str, int, Multicodec], Union[str, BytesLike]])
297+
validate(digest, Tuple[Union[str, int, Multihash], Union[str, BytesLike]])
300298
hashfun, raw_digest = digest
301299
hashfun = _CID_validate_multihash(hashfun)
302300
raw_digest = _CID_validate_raw_digest(raw_digest, hashfun)
@@ -310,8 +308,8 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
310308
base: Multibase,
311309
version: int,
312310
codec: Multicodec,
313-
hashfun: Multicodec,
314-
digest: Union[bytes, Tuple[Multicodec, bytes]],
311+
hashfun: Multihash,
312+
digest: Union[bytes, Tuple[Multihash, bytes]],
315313
) -&gt; _CIDSubclass:
316314
# pylint: disable = too-many-arguments
317315
instance = super().__new__(CID_subclass)
@@ -328,7 +326,7 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
328326
if not isinstance(raw_digest, bytes):
329327
raw_digest = bytes(raw_digest)
330328
assert _hashfun == hashfun, &#34;You passed different multihashes to a _new_instance call with digest as a pair.&#34;
331-
instance._digest = multihash.encode(raw_digest, hashfun)
329+
instance._digest = hashfun.encode(raw_digest)
332330
return cast(_CIDSubclass, instance)
333331

334332
@property
@@ -386,9 +384,9 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
386384
return self._codec
387385

388386
@property
389-
def hashfun(self) -&gt; Multicodec:
387+
def hashfun(self) -&gt; Multihash:
390388
&#34;&#34;&#34;
391-
Multihash codec used to produce the multihash digest.
389+
Multihash used to produce the multihash digest.
392390

393391
Example usage:
394392

@@ -563,13 +561,19 @@ <h1 class="title">Module <code>multiformats.cid</code></h1>
563561
d = self.digest
564562
return f&#34;CID({repr(mb)}, {v}, {repr(mc)}, {repr(d.hex())})&#34;
565563

564+
@property
565+
def _as_tuple(self) -&gt; Tuple[Type[&#34;CID&#34;], Multibase, int, Multicodec, bytes]:
566+
return (CID, self.base, self.version, self.codec, self.digest)
567+
568+
def __hash__(self) -&gt; int:
569+
return hash(self._as_tuple)
570+
566571
def __eq__(self, other: Any) -&gt; bool:
567572
if self is other:
568573
return True
569574
if not isinstance(other, CID):
570-
return False
571-
return (self.base == other.base and self.version == other.version
572-
and self.codec == other.codec and self.digest == other.digest)
575+
return NotImplemented
576+
return self._as_tuple == other._as_tuple
573577

574578
@staticmethod
575579
def decode(cid: Union[str, BytesLike]) -&gt; &#34;CID&#34;:
@@ -765,7 +769,7 @@ <h2 class="section-title" id="header-classes">Classes</h2>
765769
<dl>
766770
<dt id="multiformats.cid.CID"><code class="flex name class">
767771
<span>class <span class="ident">CID</span></span>
768-
<span>(</span><span>base: Union[str, <a title="multiformats.multibase.Multibase" href="multibase/index.html#multiformats.multibase.Multibase">Multibase</a>], version: int, codec: Union[str, int, <a title="multiformats.multicodec.Multicodec" href="multicodec/index.html#multiformats.multicodec.Multicodec">Multicodec</a>], digest: Union[str, bytes, bytearray, memoryview, Tuple[Union[str, int, <a title="multiformats.multicodec.Multicodec" href="multicodec/index.html#multiformats.multicodec.Multicodec">Multicodec</a>], Union[str, bytes, bytearray, memoryview]]])</span>
772+
<span>(</span><span>base: Union[str, <a title="multiformats.multibase.Multibase" href="multibase/index.html#multiformats.multibase.Multibase">Multibase</a>], version: int, codec: Union[str, int, <a title="multiformats.multicodec.Multicodec" href="multicodec/index.html#multiformats.multicodec.Multicodec">Multicodec</a>], digest: Union[str, bytes, bytearray, memoryview, Tuple[Union[str, int, <a title="multiformats.multihash.Multihash" href="multihash/index.html#multiformats.multihash.Multihash">Multihash</a>], Union[str, bytes, bytearray, memoryview]]])</span>
769773
</code></dt>
770774
<dd>
771775
<div class="desc"><p>Container class for <a href="https://github.com/multiformats/cid">Content IDentifiers</a>.
@@ -874,7 +878,7 @@ <h2 class="section-title" id="header-classes">Classes</h2>
874878
_base: Multibase
875879
_version: CIDVersion
876880
_codec: Multicodec
877-
_hashfun: Multicodec
881+
_hashfun: Multihash
878882
_digest: bytes
879883

880884
__slots__ = (&#34;__weakref__&#34;, &#34;_base&#34;, &#34;_version&#34;, &#34;_codec&#34;, &#34;_hashfun&#34;, &#34;_digest&#34;)
@@ -883,17 +887,17 @@ <h2 class="section-title" id="header-classes">Classes</h2>
883887
base: Union[str, Multibase],
884888
version: int,
885889
codec: Union[str, int, Multicodec],
886-
digest: Union[str, BytesLike, Tuple[Union[str, int, Multicodec], Union[str, BytesLike]]],
890+
digest: Union[str, BytesLike, Tuple[Union[str, int, Multihash], Union[str, BytesLike]]],
887891
) -&gt; _CIDSubclass:
888892
# pylint: disable = too-many-arguments
889893
base = _CID_validate_multibase(base)
890894
codec = _CID_validate_multicodec(codec)
891895
raw_digest: Union[str, bytes]
892-
hashfun: Union[str, int, Multicodec]
896+
hashfun: Union[str, int, Multihash]
893897
if isinstance(digest, (str,)+byteslike):
894898
hashfun, raw_digest = _CID_validate_multihash_digest(digest)
895899
else:
896-
validate(digest, Tuple[Union[str, int, Multicodec], Union[str, BytesLike]])
900+
validate(digest, Tuple[Union[str, int, Multihash], Union[str, BytesLike]])
897901
hashfun, raw_digest = digest
898902
hashfun = _CID_validate_multihash(hashfun)
899903
raw_digest = _CID_validate_raw_digest(raw_digest, hashfun)
@@ -907,8 +911,8 @@ <h2 class="section-title" id="header-classes">Classes</h2>
907911
base: Multibase,
908912
version: int,
909913
codec: Multicodec,
910-
hashfun: Multicodec,
911-
digest: Union[bytes, Tuple[Multicodec, bytes]],
914+
hashfun: Multihash,
915+
digest: Union[bytes, Tuple[Multihash, bytes]],
912916
) -&gt; _CIDSubclass:
913917
# pylint: disable = too-many-arguments
914918
instance = super().__new__(CID_subclass)
@@ -925,7 +929,7 @@ <h2 class="section-title" id="header-classes">Classes</h2>
925929
if not isinstance(raw_digest, bytes):
926930
raw_digest = bytes(raw_digest)
927931
assert _hashfun == hashfun, &#34;You passed different multihashes to a _new_instance call with digest as a pair.&#34;
928-
instance._digest = multihash.encode(raw_digest, hashfun)
932+
instance._digest = hashfun.encode(raw_digest)
929933
return cast(_CIDSubclass, instance)
930934

931935
@property
@@ -983,9 +987,9 @@ <h2 class="section-title" id="header-classes">Classes</h2>
983987
return self._codec
984988

985989
@property
986-
def hashfun(self) -&gt; Multicodec:
990+
def hashfun(self) -&gt; Multihash:
987991
&#34;&#34;&#34;
988-
Multihash codec used to produce the multihash digest.
992+
Multihash used to produce the multihash digest.
989993

990994
Example usage:
991995

@@ -1160,13 +1164,19 @@ <h2 class="section-title" id="header-classes">Classes</h2>
11601164
d = self.digest
11611165
return f&#34;CID({repr(mb)}, {v}, {repr(mc)}, {repr(d.hex())})&#34;
11621166

1167+
@property
1168+
def _as_tuple(self) -&gt; Tuple[Type[&#34;CID&#34;], Multibase, int, Multicodec, bytes]:
1169+
return (CID, self.base, self.version, self.codec, self.digest)
1170+
1171+
def __hash__(self) -&gt; int:
1172+
return hash(self._as_tuple)
1173+
11631174
def __eq__(self, other: Any) -&gt; bool:
11641175
if self is other:
11651176
return True
11661177
if not isinstance(other, CID):
1167-
return False
1168-
return (self.base == other.base and self.version == other.version
1169-
and self.codec == other.codec and self.digest == other.digest)
1178+
return NotImplemented
1179+
return self._as_tuple == other._as_tuple
11701180

11711181
@staticmethod
11721182
def decode(cid: Union[str, BytesLike]) -&gt; &#34;CID&#34;:
@@ -1766,9 +1776,9 @@ <h3>Instance variables</h3>
17661776
return self._digest</code></pre>
17671777
</details>
17681778
</dd>
1769-
<dt id="multiformats.cid.CID.hashfun"><code class="name">var <span class="ident">hashfun</span><a title="multiformats.multicodec.Multicodec" href="multicodec/index.html#multiformats.multicodec.Multicodec">Multicodec</a></code></dt>
1779+
<dt id="multiformats.cid.CID.hashfun"><code class="name">var <span class="ident">hashfun</span><a title="multiformats.multihash.Multihash" href="multihash/index.html#multiformats.multihash.Multihash">Multihash</a></code></dt>
17701780
<dd>
1771-
<div class="desc"><p>Multihash codec used to produce the multihash digest.</p>
1781+
<div class="desc"><p>Multihash used to produce the multihash digest.</p>
17721782
<p>Example usage:</p>
17731783
<pre><code class="language-py">&gt;&gt;&gt; s = &quot;zb2rhe5P4gXftAwvA4eXQ5HJwsER2owDyS9sKaQRRVQPn93bA&quot;
17741784
&gt;&gt;&gt; cid = CID.decode(s)
@@ -1781,9 +1791,9 @@ <h3>Instance variables</h3>
17811791
<span>Expand source code</span>
17821792
</summary>
17831793
<pre><code class="python">@property
1784-
def hashfun(self) -&gt; Multicodec:
1794+
def hashfun(self) -&gt; Multihash:
17851795
&#34;&#34;&#34;
1786-
Multihash codec used to produce the multihash digest.
1796+
Multihash used to produce the multihash digest.
17871797

17881798
Example usage:
17891799

docs/multiformats/index.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,22 @@ <h1 class="title">Package <code>multiformats</code></h1>
3232
This package implements existing multiformat protocols, according to the [Multiformats](https://multiformats.io/) specifications.
3333
&#34;&#34;&#34;
3434

35-
__version__ = &#34;0.1.0&#34;
35+
__version__ = &#34;0.1.1&#34;
3636

3737
from . import varint
3838
from . import multicodec
3939
from . import multibase
4040
from . import multihash
4141
from .cid import CID
42+
from . import multiaddr
4243

4344
__all__ = [
4445
&#34;varint&#34;,
4546
&#34;multicodec&#34;,
4647
&#34;multibase&#34;,
4748
&#34;multihash&#34;,
48-
&#34;CID&#34;
49+
&#34;CID&#34;,
50+
&#34;multiaddr&#34;
4951
]
5052

5153
__pdoc__ = {name: False for name in [&#34;CID&#34;]}</code></pre>
@@ -58,6 +60,10 @@ <h2 class="section-title" id="header-submodules">Sub-modules</h2>
5860
<dd>
5961
<div class="desc"><p>Implementation of the <a href="https://github.com/multiformats/cid">CID spec</a></p></div>
6062
</dd>
63+
<dt><code class="name"><a title="multiformats.multiaddr" href="multiaddr/index.html">multiformats.multiaddr</a></code></dt>
64+
<dd>
65+
<div class="desc"><p>Implementation of the <a href="https://github.com/multiformats/multiaddr">multiaddr spec</a>.</p></div>
66+
</dd>
6167
<dt><code class="name"><a title="multiformats.multibase" href="multibase/index.html">multiformats.multibase</a></code></dt>
6268
<dd>
6369
<div class="desc"><p>Implementation of the <a href="https://github.com/multiformats/multibase">multibase spec</a></p></div>
@@ -92,6 +98,7 @@ <h1>Index</h1>
9298
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
9399
<ul>
94100
<li><code><a title="multiformats.cid" href="cid.html">multiformats.cid</a></code></li>
101+
<li><code><a title="multiformats.multiaddr" href="multiaddr/index.html">multiformats.multiaddr</a></code></li>
95102
<li><code><a title="multiformats.multibase" href="multibase/index.html">multiformats.multibase</a></code></li>
96103
<li><code><a title="multiformats.multicodec" href="multicodec/index.html">multiformats.multicodec</a></code></li>
97104
<li><code><a title="multiformats.multihash" href="multihash/index.html">multiformats.multihash</a></code></li>

0 commit comments

Comments
 (0)