summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2013-12-08 09:30:29 +0000
committerelie <elie>2013-12-08 09:30:29 +0000
commit1740bb6976086f79e5731a16d8cd33983ac5fc9e (patch)
tree0940e73cae98fa0eecb7f83874d7fe86e1e202c9
parentdaa20434ae095855b28c63469cebff3f79bfe15a (diff)
downloadpyasn1-1740bb6976086f79e5731a16d8cd33983ac5fc9e.tar.gz
* constructed types can now be initialized with new .setComponents() method
which accepts both var-args and keyword-args * default repr() modified to reflect this change
-rw-r--r--CHANGES3
-rw-r--r--pyasn1/type/base.py18
-rw-r--r--pyasn1/type/namedtype.py2
-rw-r--r--test/type/test_univ.py8
4 files changed, 22 insertions, 9 deletions
diff --git a/CHANGES b/CHANGES
index d6d617a..021e923 100644
--- a/CHANGES
+++ b/CHANGES
@@ -20,6 +20,9 @@ Revision 0.1.8
flags.
- Constructed types now verify their consistency by invoking isSameTypeWith()
for their components rather than isSuperTypeOf() as it used to be.
+- Constructed types can now be initialized with new .setComponents() method
+ which accepts both var-args and keyword-args. Default repr() modified to
+ reflect this change.
- Fix to NamedType.__repr__() to work properly.
- Fixes to __repr__() implementation of many built-in ASN.1 types to take into
account all of their initializers such as tagSet, subtypeSpec etc.
diff --git a/pyasn1/type/base.py b/pyasn1/type/base.py
index 8efa178..78d316f 100644
--- a/pyasn1/type/base.py
+++ b/pyasn1/type/base.py
@@ -185,12 +185,8 @@ class AbstractConstructedAsn1Item(Asn1ItemBase):
if self._subtypeSpec is not self.subtypeSpec:
r.append('subtypeSpec=%r' % (self._subtypeSpec,))
r = '%s(%s)' % (self.__class__.__name__, ', '.join(r))
- for idx in range(len(self._componentValues)):
- if self._componentValues[idx] is None:
- continue
- r = r + '.setComponentByPosition(%s, %r)' % (
- idx, self._componentValues[idx]
- )
+ if self._componentValues:
+ r += '.setComponents(%s)' % ', '.join([repr(x) for x in self._componentValues])
return r
def __eq__(self, other):
@@ -253,8 +249,17 @@ class AbstractConstructedAsn1Item(Asn1ItemBase):
def setComponentByPosition(self, idx, value, verifyConstraints=True):
raise error.PyAsn1Error('Method not implemented')
+ def setComponents(self, *args, **kwargs):
+ for idx in range(len(args)):
+ self[idx] = args[idx]
+ for k in kwargs:
+ self[k] = kwargs[k]
+ return self
+
def getComponentType(self): return self._componentType
+ def setDefaultComponents(self): pass
+
def __getitem__(self, idx): return self.getComponentByPosition(idx)
def __setitem__(self, idx, value): self.setComponentByPosition(idx, value)
@@ -264,4 +269,3 @@ class AbstractConstructedAsn1Item(Asn1ItemBase):
self._componentValues = []
self._componentValuesSet = 0
- def setDefaultComponents(self): pass
diff --git a/pyasn1/type/namedtype.py b/pyasn1/type/namedtype.py
index c1f36f7..5ddcbd3 100644
--- a/pyasn1/type/namedtype.py
+++ b/pyasn1/type/namedtype.py
@@ -8,7 +8,7 @@ class NamedType:
isDefaulted = 0
def __init__(self, name, t):
self.__name = name; self.__type = t
- def __repr__(self): return '%s(%s, %r)' % (
+ def __repr__(self): return '%s(%r, %r)' % (
self.__class__.__name__, self.__name, self.__type
)
def getType(self): return self.__type
diff --git a/test/type/test_univ.py b/test/type/test_univ.py
index 606d47b..68e5601 100644
--- a/test/type/test_univ.py
+++ b/test/type/test_univ.py
@@ -350,7 +350,10 @@ class SequenceOf(unittest.TestCase):
s = self.s1.clone(cloneValueFlag=1)
assert len(s) == 1
assert s.getComponentByPosition(0) == self.s1.getComponentByPosition(0)
-
+ def testSetComponents(self):
+ assert self.s1.clone().setComponents('abc', 'def') == \
+ self.s1.setComponentByPosition(0, 'abc').setComponentByPosition(1, 'def')
+
class Sequence(unittest.TestCase):
def setUp(self):
self.s1 = univ.Sequence(componentType=namedtype.NamedTypes(
@@ -418,6 +421,9 @@ class Sequence(unittest.TestCase):
pass
else:
assert 0, 'inner supertype constraint allowed'
+ def testSetComponents(self):
+ assert self.s1.clone().setComponents(name='a', nick='b', age=1) == \
+ self.s1.setComponentByPosition(0, 'a').setComponentByPosition(1, 'b').setComponentByPosition(2, 1)
class SetOf(unittest.TestCase):
def setUp(self):