summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Matveev <stargrave@stargrave.org>2019-04-21 17:21:36 +0300
committerSergey Matveev <stargrave@stargrave.org>2019-04-21 17:23:06 +0300
commit6b0b62f656d1ccecc754c6bffb1fe450291c7419 (patch)
tree8c060661af3cfe4ad69110b11ca5396d3dff3afd
parent8f091a9be95e1581aaee100448660c3a59c6b6d2 (diff)
downloadpyderasn-6b0b62f656d1ccecc754c6bffb1fe450291c7419.tar.xz
Ability to specify multiple OID mappings for pprinting5.0
-rw-r--r--VERSION2
-rw-r--r--doc/news.rst7
-rwxr-xr-xpyderasn.py48
-rw-r--r--tests/test_pyderasn.py5
4 files changed, 40 insertions, 22 deletions
diff --git a/VERSION b/VERSION
index 86a9588..819e07a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.9
+5.0
diff --git a/doc/news.rst b/doc/news.rst
index 57c3b20..d9d9ca0 100644
--- a/doc/news.rst
+++ b/doc/news.rst
@@ -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
diff --git a/pyderasn.py b/pyderasn.py
index 2540654..814d85f 100755
--- a/pyderasn.py
+++ b/pyderasn.py
@@ -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=(
diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py
index aad0ba3..3b86d2c 100644
--- a/tests/test_pyderasn.py
+++ b/tests/test_pyderasn.py
@@ -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):