Index: tools/telemetry/third_party/gsutilz/third_party/pyasn1/doc/constraints.html |
diff --git a/tools/telemetry/third_party/gsutilz/third_party/pyasn1/doc/constraints.html b/tools/telemetry/third_party/gsutilz/third_party/pyasn1/doc/constraints.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..53da1addffe06fb19b78d40b8e3aa2929373d8bc |
--- /dev/null |
+++ b/tools/telemetry/third_party/gsutilz/third_party/pyasn1/doc/constraints.html |
@@ -0,0 +1,436 @@ |
+<html> |
+<title> |
+PyASN1 subtype constraints |
+</title> |
+<head> |
+</head> |
+<body> |
+<center> |
+<table width=60%> |
+<tr> |
+<td> |
+ |
+<h4> |
+1.4 PyASN1 subtype constraints |
+</h4> |
+ |
+<p> |
+Most ASN.1 types can correspond to an infinite set of values. To adapt to |
+particular application's data model and needs, ASN.1 provides a mechanism |
+for limiting the infinite set to values, that make sense in particular case. |
+</p> |
+ |
+<p> |
+Imposing value constraints on an ASN.1 type can also be seen as creating |
+a subtype from its base type. |
+</p> |
+ |
+<p> |
+In pyasn1, constraints take shape of immutable objects capable |
+of evaluating given value against constraint-specific requirements. |
+Constraint object is a property of pyasn1 type. Like TagSet property, |
+associated with every pyasn1 type, constraints can never be modified |
+in place. The only way to modify pyasn1 type constraint is to associate |
+new constraint object to a new pyasn1 type object. |
+</p> |
+ |
+<p> |
+A handful of different flavors of <i>constraints</i> are defined in ASN.1. |
+We will discuss them one by one in the following chapters and also explain |
+how to combine and apply them to types. |
+</p> |
+ |
+<a name="1.4.1"></a> |
+<h4> |
+1.4.1 Single value constraint |
+</h4> |
+ |
+<p> |
+This kind of constraint allows for limiting type to a finite, specified set |
+of values. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+DialButton ::= OCTET STRING ( |
+ "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" |
+) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Its pyasn1 implementation would look like: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import constraint |
+>>> c = constraint.SingleValueConstraint( |
+ '0','1','2','3','4','5','6','7','8','9' |
+) |
+>>> c |
+SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
+>>> c('0') |
+>>> c('A') |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) failed at: A |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+As can be seen in the snippet above, if a value violates the constraint, an |
+exception will be thrown. A constrainted pyasn1 type object holds a |
+reference to a constraint object (or their combination, as will be explained |
+later) and calls it for value verification. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import univ, constraint |
+>>> class DialButton(univ.OctetString): |
+... subtypeSpec = constraint.SingleValueConstraint( |
+... '0','1','2','3','4','5','6','7','8','9' |
+... ) |
+>>> DialButton('0') |
+DialButton(b'0') |
+>>> DialButton('A') |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) failed at: A |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Constrained pyasn1 value object can never hold a violating value. |
+</p> |
+ |
+<a name="1.4.2"></a> |
+<h4> |
+1.4.2 Value range constraint |
+</h4> |
+ |
+<p> |
+A pair of values, compliant to a type to be constrained, denote low and upper |
+bounds of allowed range of values of a type. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+Teenagers ::= INTEGER (13..19) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+And in pyasn1 terms: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import univ, constraint |
+>>> class Teenagers(univ.Integer): |
+... subtypeSpec = constraint.ValueRangeConstraint(13, 19) |
+>>> Teenagers(14) |
+Teenagers(14) |
+>>> Teenagers(20) |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ValueRangeConstraint(13, 19) failed at: 20 |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Value range constraint usually applies numeric types. |
+</p> |
+ |
+<a name="1.4.3"></a> |
+<h4> |
+1.4.3 Size constraint |
+</h4> |
+ |
+<p> |
+It is sometimes convenient to set or limit the allowed size of a data item |
+to be sent from one application to another to manage bandwidth and memory |
+consumption issues. Size constraint specifies the lower and upper bounds |
+of the size of a valid value. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+TwoBits ::= BIT STRING (SIZE (2)) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Express the same grammar in pyasn1: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import univ, constraint |
+>>> class TwoBits(univ.BitString): |
+... subtypeSpec = constraint.ValueSizeConstraint(2, 2) |
+>>> TwoBits((1,1)) |
+TwoBits("'11'B") |
+>>> TwoBits((1,1,0)) |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ValueSizeConstraint(2, 2) failed at: (1, 1, 0) |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Size constraint can be applied to potentially massive values - bit or octet |
+strings, SEQUENCE OF/SET OF values. |
+</p> |
+ |
+<a name="1.4.4"></a> |
+<h4> |
+1.4.4 Alphabet constraint |
+</h4> |
+ |
+<p> |
+The permitted alphabet constraint is similar to Single value constraint |
+but constraint applies to individual characters of a value. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+MorseCode ::= PrintableString (FROM ("."|"-"|" ")) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+And in pyasn1: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import char, constraint |
+>>> class MorseCode(char.PrintableString): |
+... subtypeSpec = constraint.PermittedAlphabetConstraint(".", "-", " ") |
+>>> MorseCode("...---...") |
+MorseCode('...---...') |
+>>> MorseCode("?") |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ PermittedAlphabetConstraint(".", "-", " ") failed at: "?" |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Current implementation does not handle ranges of characters in constraint |
+(FROM "A".."Z" syntax), one has to list the whole set in a range. |
+</p> |
+ |
+<a name="1.4.5"></a> |
+<h4> |
+1.4.5 Constraint combinations |
+</h4> |
+ |
+<p> |
+Up to this moment, we used a single constraint per ASN.1 type. The standard, |
+however, allows for combining multiple individual constraints into |
+intersections, unions and exclusions. |
+</p> |
+ |
+<p> |
+In pyasn1 data model, all of these methods of constraint combinations are |
+implemented as constraint-like objects holding individual constraint (or |
+combination) objects. Like terminal constraint objects, combination objects |
+are capable to perform value verification at its set of enclosed constraints |
+according to the logic of particular combination. |
+</p> |
+ |
+<p> |
+Constraints intersection verification succeeds only if a value is |
+compliant to each constraint in a set. To begin with, the following |
+specification will constitute a valid telephone number: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+PhoneNumber ::= NumericString (FROM ("0".."9")) (SIZE 11) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Constraint intersection object serves the logic above: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import char, constraint |
+>>> class PhoneNumber(char.NumericString): |
+... subtypeSpec = constraint.ConstraintsIntersection( |
+... constraint.PermittedAlphabetConstraint('0','1','2','3','4','5','6','7','8','9'), |
+... constraint.ValueSizeConstraint(11, 11) |
+... ) |
+>>> PhoneNumber('79039343212') |
+PhoneNumber('79039343212') |
+>>> PhoneNumber('?9039343212') |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ConstraintsIntersection( |
+ PermittedAlphabetConstraint('0','1','2','3','4','5','6','7','8','9'), |
+ ValueSizeConstraint(11, 11)) failed at: |
+ PermittedAlphabetConstraint('0','1','2','3','4','5','6','7','8','9') failed at: "?039343212" |
+>>> PhoneNumber('9343212') |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ConstraintsIntersection( |
+ PermittedAlphabetConstraint('0','1','2','3','4','5','6','7','8','9'), |
+ ValueSizeConstraint(11, 11)) failed at: |
+ ValueSizeConstraint(10, 10) failed at: "9343212" |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Union of constraints works by making sure that a value is compliant |
+to any of the constraint in a set. For instance: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+CapitalOrSmall ::= IA5String (FROM ('A','B','C') | FROM ('a','b','c')) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+It's important to note, that a value must fully comply to any single |
+constraint in a set. In the specification above, a value of all small or |
+all capital letters is compliant, but a mix of small&capitals is not. |
+Here's its pyasn1 analogue: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import char, constraint |
+>>> class CapitalOrSmall(char.IA5String): |
+... subtypeSpec = constraint.ConstraintsUnion( |
+... constraint.PermittedAlphabetConstraint('A','B','C'), |
+... constraint.PermittedAlphabetConstraint('a','b','c') |
+... ) |
+>>> CapitalOrSmall('ABBA') |
+CapitalOrSmall('ABBA') |
+>>> CapitalOrSmall('abba') |
+CapitalOrSmall('abba') |
+>>> CapitalOrSmall('Abba') |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ConstraintsUnion(PermittedAlphabetConstraint('A', 'B', 'C'), |
+ PermittedAlphabetConstraint('a', 'b', 'c')) failed at: failed for "Abba" |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+Finally, the exclusion constraint simply negates the logic of value |
+verification at a constraint. In the following example, any integer value |
+is allowed in a type but not zero. |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+NoZero ::= INTEGER (ALL EXCEPT 0) |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+In pyasn1 the above definition would read: |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import univ, constraint |
+>>> class NoZero(univ.Integer): |
+... subtypeSpec = constraint.ConstraintsExclusion( |
+... constraint.SingleValueConstraint(0) |
+... ) |
+>>> NoZero(1) |
+NoZero(1) |
+>>> NoZero(0) |
+Traceback (most recent call last): |
+... |
+pyasn1.type.error.ValueConstraintError: |
+ ConstraintsExclusion(SingleValueConstraint(0)) failed at: 0 |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+The depth of such a constraints tree, built with constraint combination objects |
+at its nodes, has not explicit limit. Value verification is performed in a |
+recursive manner till a definite solution is found. |
+</p> |
+ |
+<a name="1.5"></a> |
+<h4> |
+1.5 Types relationships |
+</h4> |
+ |
+<p> |
+In the course of data processing in an application, it is sometimes |
+convenient to figure out the type relationships between pyasn1 type or |
+value objects. Formally, two things influence pyasn1 types relationship: |
+<i>tag set</i> and <i>subtype constraints</i>. One pyasn1 type is considered |
+to be a derivative of another if their TagSet and Constraint objects are |
+a derivation of one another. |
+</p> |
+ |
+<p> |
+The following example illustrates the concept (we use the same tagset but |
+different constraints for simplicity): |
+</p> |
+ |
+<table bgcolor="lightgray" border=0 width=100%><TR><TD> |
+<pre> |
+>>> from pyasn1.type import univ, constraint |
+>>> i1 = univ.Integer(subtypeSpec=constraint.ValueRangeConstraint(3,8)) |
+>>> i2 = univ.Integer(subtypeSpec=constraint.ConstraintsIntersection( |
+... constraint.ValueRangeConstraint(3,8), |
+... constraint.ValueRangeConstraint(4,7) |
+... ) ) |
+>>> i1.isSameTypeWith(i2) |
+False |
+>>> i1.isSuperTypeOf(i2) |
+True |
+>>> i1.isSuperTypeOf(i1) |
+True |
+>>> i2.isSuperTypeOf(i1) |
+False |
+>>> |
+</pre> |
+</td></tr></table> |
+ |
+<p> |
+As can be seen in the above code snippet, there are two methods of any pyasn1 |
+type/value object that test types for their relationship: |
+<b>isSameTypeWith</b>() and <b>isSuperTypeOf</b>(). The former is |
+self-descriptive while the latter yields true if the argument appears |
+to be a pyasn1 object which has tagset and constraints derived from those |
+of the object being called. |
+</p> |
+ |
+<hr> |
+ |
+</td> |
+</tr> |
+</table> |
+</center> |
+</body> |
+</html> |