diff --git a/duniterpy/documents/block.py b/duniterpy/documents/block.py index 93347752429830b6892d89b43ef9eb882470e948..451bdb38bd60cbe8a0b63c0845476a08aa6023e1 100644 --- a/duniterpy/documents/block.py +++ b/duniterpy/documents/block.py @@ -195,7 +195,7 @@ The class Block handles Block documents. :param list[duniterpy.documents.Membership] actives: renewed memberships via "IN" documents :param list[duniterpy.documents.Membership] leavers: the leavers memberships via "OUT" documents :param list[duniterpy.documents.Revocation] revokations: revokations - :param list[duniterpy.documents.Membership] excluded: members excluded because of missing certifications + :param list[str] excluded: members excluded because of missing certifications :param list[duniterpy.documents.Membership] actives: renewed memberships via "IN" documents :param list[duniterpy.documents.Certification] certifications: certifications documents :param list[duniterpy.documents.Transaction] transactions: transactions documents @@ -205,7 +205,7 @@ The class Block handles Block documents. """ super().__init__(version, currency, [signature]) documents_versions = max(max([1] + [i.version for i in identities]), - max([1] + [m.version for m in actives + leavers + joiners + excluded + actives]), + max([1] + [m.version for m in actives + leavers + joiners]), max([1] + [r.version for r in revokations]), max([1] + [c.version for c in certifications]), max([1] + [t.version for t in transactions])) @@ -358,8 +358,8 @@ The class Block handles Block documents. if Block.re_excluded.match(lines[n]): n += 1 while Block.re_certifications.match(lines[n]) is None: - membership = Block.re_exclusion.match(lines[n]).group(1) - excluded.append(membership) + exclusion = Block.re_exclusion.match(lines[n]).group(1) + excluded.append(exclusion) n += 1 if Block.re_certifications.match(lines[n]): @@ -466,7 +466,7 @@ PreviousIssuer: {1}\n".format(self.prev_hash, self.prev_issuer) doc += "Revoked:\n" for revokation in self.revoked: - doc += "{0}\n".format(revokation) + doc += "{0}\n".format(revokation.inline()) doc += "Excluded:\n" for exclude in self.excluded: diff --git a/duniterpy/documents/certification.py b/duniterpy/documents/certification.py index d2a6fef406e2fb458ecc96cb8bf1e5c4791e1993..8407e8e72eac81a1264bb16794fd99bc7881842d 100644 --- a/duniterpy/documents/certification.py +++ b/duniterpy/documents/certification.py @@ -265,6 +265,9 @@ class Revocation(Document): return SelfCertification(version, currency, issuer, unique_id, timestamp, signature) + def inline(self): + return "{0}:{1}".format(self.pubkey, self.signatures[0]) + def raw(self, selfcert): """ diff --git a/tests/documents/test_block.py b/tests/documents/test_block.py index f2b3a90a05afc385b79733b396e5adc48568112e..a35fc839a951b92727c17faad6daa9c40742e78d 100644 --- a/tests/documents/test_block.py +++ b/tests/documents/test_block.py @@ -227,6 +227,62 @@ nY/MsFU2luiohLmSiOOimL1RIqbriOBgc22ua03Z2dhxtSJxKZeGNGDvl1jaXgmEBRnXU87yXbZ7ioOS """ +raw_block_with_excluded = """Version: 3 +Type: Block +Currency: test_net +Number: 33365 +PoWMin: 76 +Time: 1472075456 +MedianTime: 1472072569 +UnitBase: 3 +Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk +IssuersFrame: 50 +IssuersFrameVar: 0 +DifferentIssuersCount: 9 +PreviousHash: 0000338C775613399FA508A8F8B22EB60F525884730639E2A707299E373F43C0 +PreviousIssuer: DesHja7gonANRJB7YUkfCgQpnDjgGeDXAeArdhcbXPmJ +MembersCount: 128 +Identities: +Joiners: +Actives: +Leavers: +Revoked: +2VAxjr8QoJtSzhE7APno4AkR2RAQNySpNNvDzMgPotSF:DGXpXwnxIP+j6fyLeaa8Toys9TN/fzumIrAslzAf+Tv50PTIrzBkxjE5oHGtI4AvytApW14rFWgWljmbtrVDAw== +Excluded: +2VAxjr8QoJtSzhE7APno4AkR2RAQNySpNNvDzMgPotSF +Certifications: +Transactions: +TX:3:1:4:4:12:1:0 +33363-000021C4B5BE2DA996F953DC09482F4FA2FA68774B1A38FAB03B2AAB4A08EBE0 +TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS +5:0:T:D25272F1D778B52798B7A51CF0CE21F7C5812F841374508F4367872D4A47F0F7:0 +6:1:T:D25272F1D778B52798B7A51CF0CE21F7C5812F841374508F4367872D4A47F0F7:1 +7:2:T:D25272F1D778B52798B7A51CF0CE21F7C5812F841374508F4367872D4A47F0F7:2 +2300962:3:T:D25272F1D778B52798B7A51CF0CE21F7C5812F841374508F4367872D4A47F0F7:10 +0:SIG(0) +1:SIG(0) +2:SIG(0) +3:SIG(0) +5:0:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS) +6:1:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS) +7:2:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS) +10000:3:SIG(5ocqzyDMMWf1V8bsoNhWb1iNwax1e9M7VTUN6navs8of) +13000:3:SIG(XeBpJwRLkF5J4mnwyEDriEcNB13iFpe1MAKR4mH3fzN) +8000:3:SIG(9bZEATXBGPUSsk8oAYi4KAChg3rHKwNt67hVdErbNGCW) +2250:3:SIG(J78bPUvLjxmjaEkdjxWLeENQtcfXm7iobqB49uT1Bgp3) +4750:3:SIG(HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk) +3000:3:SIG(6KXBjAFceD1gp8RBVZfy5YQyKFXG8GaX8tKaLAyPWHrj) +500:3:SIG(ACkHkjDj1SPUu8LhtSAWJLRLoWEXWFuzFPL65zFbe7Yb) +500:3:SIG(5bxtdmC7RGGJEmcdnJ3ut5zg7KdUH2pYZepSHbwNYs7z) +2258962:3:SIG(TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS) +REMU:30244:30411 +Yo5waBymzDRd0AAMPH8dBj/GnSjtCJUn4EKWaze/4CaU39lf7JAysYmc6yoQGSnGUKZwKT0P0/FvJr9kzX6RBA== +InnerHash: EB2926354963AA21E99E4D304B7765811BA385C9A1976B9A5FACBBCB12F4C969 +Nonce: 137387 +GmgYhWrwCtsK7t2B/omPpxZ8EfJgv9UYzJIFo++Za+A0Mo70xRfZG7kywxbQTTxDk/V7r90P946N89vdVjv1Bg== +""" + + class Test_Block(unittest.TestCase): def test_fromraw(self): block = Block.from_signed_raw(raw_block) @@ -377,7 +433,7 @@ class Test_Block(unittest.TestCase): block = Block.from_signed_raw(raw_block_with_leavers) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) - self.assertEqual(from_rendered_raw.version, 2) + self.assertEqual(from_rendered_raw.version, 3) self.assertEqual(from_rendered_raw.currency, "meta_brouzouf") self.assertEqual(from_rendered_raw.noonce, 9906) self.assertEqual(from_rendered_raw.number, 34895) @@ -406,6 +462,13 @@ class Test_Block(unittest.TestCase): self.assertFalse(lower > higher) self.assertFalse(lower == higher) + def test_parse_with_excluded(self): + block = Block.from_signed_raw(raw_block_with_excluded) + rendered_raw = block.signed_raw() + from_rendered_raw = block.from_signed_raw(rendered_raw) + self.assertEqual(from_rendered_raw.signed_raw(), raw_block_with_excluded) + + if __name__ == '__main__': unittest.main()