def from_uri(serialized_condition): """ Create a Condition object from a URI. This method will parse a condition URI and construct a corresponding Condition object. Args: serialized_condition (str): URI representing the condition Returns: Condition: Resulting object """ # TODO consider removing. if isinstance(serialized_condition, Condition): return serialized_condition # TODO Use static typing instead (e.g.: with mypy). elif not isinstance(serialized_condition, str): raise TypeError('Serialized condition must be a string') pieces = serialized_condition.split(':') if pieces[0] != CONDITION_URI_SCHEME: raise PrefixError( 'Serialized condition must start with "{}:"'.format( CONDITION_URI_SCHEME ) ) regex_match = re.match(CONDITION_REGEX_STRICT, serialized_condition) if not regex_match: raise ParsingError('Invalid condition format') qs_dict = parse_qs(regex_match.group(2)) try: fingerprint_type = qs_dict['fpt'][0] except (KeyError, IndexError): raise ParsingError( 'Invalid condition format: "fpt" parameter or value missing.') condition_type = TypeRegistry.find_by_name(fingerprint_type) try: cost = qs_dict['cost'][0] except (KeyError, IndexError): raise ParsingError( 'Invalid condition format: "cost" parameter or value missing.') if not re.match(INTEGER_REGEX, cost): raise ParsingError('No or invalid cost provided') fingerprint = regex_match.group(1) condition = Condition() condition.type_id = condition_type['type_id'] condition._subtypes = set() if condition_type['class'].TYPE_CATEGORY == 'compound': condition._subtypes.update(qs_dict['subtypes'][0].split(',')) condition.hash = base64.urlsafe_b64decode( base64_add_padding(fingerprint)) condition.cost = int(cost) return condition
def to_asn1_dict(self): condition_type = TypeRegistry.find_by_type_id(self.type_id) condition_class = condition_type['class'] payload = {'fingerprint': self.hash, 'cost': self.cost} if condition_class.TYPE_CATEGORY == 'compound': subtype_ids = [ TypeRegistry.find_by_name(subtype)['type_id'] for subtype in self.subtypes ] bits = ['0' for bit in range(5)] for subtype_id in subtype_ids: bits[subtype_id] = '1' bitstring = ''.join(bits).rstrip('0') payload['subtypes'] = bitstring return {condition_class.TYPE_ASN1: payload}
def from_json(data): type_ = TypeRegistry.find_by_name(data['type']) fulfillment = type_['class']() fulfillment.parse_json(data) return fulfillment
def from_json(data): type_ = TypeRegistry.find_by_name(data['type']) fulfillment = type_['class']() fulfillment.parse_json(data) return fulfillment