]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
Ability to specify multiple OID mappings for pprinting 5.0
authorSergey Matveev <stargrave@stargrave.org>
Sun, 21 Apr 2019 14:21:36 +0000 (17:21 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 21 Apr 2019 14:23:06 +0000 (17:23 +0300)
VERSION
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

diff --git a/VERSION b/VERSION
index 86a9588adcd59c02ae1aa9f450f2afb4fbb0006d..819e07a22435f1e8efcbdd1d1c062deef0e501b1 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.9
+5.0
index 57c3b205d94a9674e82255c91e03633686de3665..d9d9ca09111137dd363ae70b51cd5ef49e50dd78 100644 (file)
@@ -1,6 +1,13 @@
 News
 ====
 
+.. _release5.0:
+
+5.0
+---
+* Ability to specify multip[le OID mappings for pprinted output
+  (``oids`` keyword argument is renamed to ``oid_maps``)
+
 .. _release4.9:
 
 4.9
index 254065491fb3772a4937daa850329a0c673cc83e..814d85fba9113ef595bdbd326a93c3c60382b5ca 100755 (executable)
@@ -1435,7 +1435,7 @@ def colonize_hex(hexed):
 
 def pp_console_row(
         pp,
-        oids=None,
+        oid_maps=(),
         with_offsets=False,
         with_blob=True,
         with_colours=False,
@@ -1470,14 +1470,18 @@ def pp_console_row(
         if isinstance(ent, DecodePathDefBy):
             cols.append(_colourize("DEFINED BY", "red", with_colours, ("reverse",)))
             value = str(ent.defined_by)
+            oid_name = None
             if (
-                    oids is not None and
+                    len(oid_maps) > 0 and
                     ent.defined_by.asn1_type_name ==
-                    ObjectIdentifier.asn1_type_name and
-                    value in oids
+                    ObjectIdentifier.asn1_type_name
             ):
-                cols.append(_colourize("%s:" % oids[value], "green", with_colours))
-            else:
+                for oid_map in oid_maps:
+                    oid_name = oid_map.get(value)
+                    if oid_name is not None:
+                        cols.append(_colourize("%s:" % oid_name, "green", with_colours))
+                        break
+            if oid_name is None:
                 cols.append(_colourize("%s:" % value, "white", with_colours, ("reverse",)))
         else:
             cols.append(_colourize("%s:" % ent, "yellow", with_colours, ("reverse",)))
@@ -1498,11 +1502,14 @@ def pp_console_row(
         value = pp.value
         cols.append(_colourize(value, "white", with_colours, ("reverse",)))
         if (
-                oids is not None and
-                pp.asn1_type_name == ObjectIdentifier.asn1_type_name and
-                value in oids
+                len(oid_maps) > 0 and
+                pp.asn1_type_name == ObjectIdentifier.asn1_type_name
         ):
-            cols.append(_colourize("(%s)" % oids[value], "green", with_colours))
+            for oid_map in oid_maps:
+                oid_name = oid_map.get(value)
+                if oid_name is not None:
+                    cols.append(_colourize("(%s)" % oid_name, "green", with_colours))
+                    break
         if pp.asn1_type_name == Integer.asn1_type_name:
             hex_repr = hex(int(pp.obj._value))[2:].upper()
             if len(hex_repr) % 2 != 0:
@@ -1546,7 +1553,7 @@ def pp_console_blob(pp, decode_path_len_decrease=0):
 
 def pprint(
         obj,
-        oids=None,
+        oid_maps=(),
         big_blobs=False,
         with_colours=False,
         with_decode_path=False,
@@ -1555,8 +1562,9 @@ def pprint(
     """Pretty print object
 
     :param Obj obj: object you want to pretty print
-    :param oids: ``OID <-> humand readable string`` dictionary. When OID
-                 from it is met, then its humand readable form is printed
+    :param oid_maps: list of ``OID <-> humand readable string`` dictionary.
+                     When OID from it is met, then its humand readable form
+                     is printed
     :param big_blobs: if large binary objects are met (like OctetString
                       values), do we need to print them too, on separate
                       lines
@@ -1578,7 +1586,7 @@ def pprint(
                 if big_blobs:
                     yield pp_console_row(
                         pp,
-                        oids=oids,
+                        oid_maps=oid_maps,
                         with_offsets=True,
                         with_blob=False,
                         with_colours=with_colours,
@@ -1593,7 +1601,7 @@ def pprint(
                 else:
                     yield pp_console_row(
                         pp,
-                        oids=oids,
+                        oid_maps=oid_maps,
                         with_offsets=True,
                         with_blob=True,
                         with_colours=with_colours,
@@ -5604,7 +5612,7 @@ def generic_decoder():  # pragma: no cover
 
     def pprint_any(
             obj,
-            oids=None,
+            oid_maps=(),
             with_colours=False,
             with_decode_path=False,
             decode_path_only=(),
@@ -5624,7 +5632,7 @@ def generic_decoder():  # pragma: no cover
                     pp = _pp(**pp_kwargs)
                     yield pp_console_row(
                         pp,
-                        oids=oids,
+                        oid_maps=oid_maps,
                         with_offsets=True,
                         with_blob=False,
                         with_colours=with_colours,
@@ -5654,7 +5662,7 @@ def main():  # pragma: no cover
     )
     parser.add_argument(
         "--oids",
-        help="Python path to dictionary with OIDs",
+        help="Python paths to dictionary with OIDs, comma separated",
     )
     parser.add_argument(
         "--schema",
@@ -5692,7 +5700,7 @@ def main():  # pragma: no cover
     args.DERFile.seek(args.skip)
     der = memoryview(args.DERFile.read())
     args.DERFile.close()
-    oids = obj_by_path(args.oids) if args.oids else {}
+    oid_maps = [obj_by_path(_path) for _path in (args.oids or "").split(",")]
     if args.schema:
         schema = obj_by_path(args.schema)
         from functools import partial
@@ -5708,7 +5716,7 @@ def main():  # pragma: no cover
     obj, tail = schema().decode(der, ctx=ctx)
     print(pprinter(
         obj,
-        oids=oids,
+        oid_maps=oid_maps,
         with_colours=True if environ.get("NO_COLOR") is None else False,
         with_decode_path=args.print_decode_path,
         decode_path_only=(
index aad0ba335dea8d00d7d94e89c81fe5b09461bdbe..3b86d2ceab6371674b4aa7874639e626a24bf4dc 100644 (file)
@@ -6129,7 +6129,10 @@ class TestPP(TestCase):
         chosen_id = oids[chosen]
         pp = _pp(asn1_type_name=ObjectIdentifier.asn1_type_name, value=chosen)
         self.assertNotIn(chosen_id, pp_console_row(pp))
-        self.assertIn(chosen_id, pp_console_row(pp, oids=oids))
+        self.assertIn(
+            chosen_id,
+            pp_console_row(pp, oid_maps=[{'whatever': 'whenever'}, oids]),
+        )
 
 
 class TestAutoAddSlots(TestCase):