Ejemplo n.º 1
0
    def serialize(self, obj: Any) -> Any:
        if isinstance(obj, dict):
            r = {}
            for k, v in obj.items():
                with subserializer('$key'):
                    k = self.serialize(k)
                assert isinstance(k, str), k

                with subserializer('$value'):
                    v = self.serialize(v)

                r[k] = v
            return r
        elif isinstance(obj, list):
            r = []

            for i, v in enumerate(obj):
                with subserializer(i):
                    r.append(self.serialize(v))
            return r
        elif isinstance(obj, str):
            return obj
        elif isinstance(obj, float):
            return obj
        elif isinstance(obj, int):
            return obj
        elif obj is None:
            return obj
        else:
            raise SerializationError(val=obj, reason='not_json_value')
Ejemplo n.º 2
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('$value'):
            obj = self.dependencies['value'].serialize(obj)

        with subserializer('$child'):
            r = self.dependencies['child'].serialize(obj)

        return r
Ejemplo n.º 3
0
    def serialize(self, obj: Any) -> Any:
        r = {}

        for k, v in obj.items():
            with subserializer('$key'):
                k = self.dependencies['key'].serialize(k)

            with subserializer('$value'):
                v = self.dependencies['value'].serialize(v)

            r[k] = v
        return r
Ejemplo n.º 4
0
    def serialize(self, obj: Any) -> FieldValue:
        v = self.dependencies['item']

        with subserializer(self.name):
            obj = v.serialize(obj)

        return FieldValue(self.name, obj)
Ejemplo n.º 5
0
    def serialize(self, obj: Any) -> Any:
        r = b''
        for x in range(len(self.dependencies)):
            with subserializer(str(x)):
                r += self.dependencies[str(x)].serialize(obj)

        return r
Ejemplo n.º 6
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('$discriminant'):
            discriminant = self.dependencies['discriminant'].serialize(obj)

        if discriminant not in self.items:
            raise SerializationError(val=obj, path=['$value'], origin=self,
                                     reason=f'`{discriminant}` is not in the map')

        with subserializer('$value'):
            value = self.dependencies['value'].serialize(obj)

        depk = self.items[discriminant]
        dep = self.dependencies[depk]

        with subserializer('$sub'):
            return dep.serialize(value)
Ejemplo n.º 7
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('$body'):
            val = self.dependencies['body'].serialize(obj)

        try:
            return json.loads(bytes(val))
        except Exception as e:
            raise SerializationError(val=obj, reason='json', exc=e, origin=self)
Ejemplo n.º 8
0
    def serialize(self, obj: Tuple[int, bytes]) -> BinaryNext:
        with subserializer('$size'):
            size = self.dependencies['size'].serialize(obj)

        with subserializer('$body'):
            body = self.dependencies['body'].serialize(obj)

        if not isinstance(size, int):
            raise SerializationError(val=obj, reason='not_int', origin=self)

        if not isinstance(body, bytes) and not isinstance(body, memoryview):
            raise SerializationError(val=obj, reason='not_bytes', origin=self)

        if len(body) < size:
            raise SerializationError(val=obj, reason=BUFFER_NEEDED, origin=self)

        return BinaryNext(body[:size], body[size:])
Ejemplo n.º 9
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('$value'):
            obj2 = self.dependencies['value'].serialize(obj)

        if obj2 not in self.lookup:
            raise SerializationError(val=obj, exc=KeyError(obj2), reason='key_missing')

        return self.lookup[obj2]
Ejemplo n.º 10
0
    def serialize(self, obj: Any) -> Any:
        if not hasattr(obj, '__getitem__'):
            raise SerializationError(val=obj, reason='invalid_obj', origin=self)

        try:
            r = obj[self.name]
        except KeyError as e:
            raise SerializationError(val=obj, reason='key_missing', exc=e, origin=self)

        with subserializer('$item'):
            return self.dependencies['type'].serialize(r)
Ejemplo n.º 11
0
    def serialize(self, obj: Any) -> Any:
        try:
            r = getattr(obj, self.name)
        except AttributeError as e:
            raise SerializationError(val=obj, reason=f'attr_missing', origin=self, exc=e)

        if len(self.dependencies):
            with subserializer('$attr'):
                return self.dependencies['type'].serialize(r)
        else:
            return r
Ejemplo n.º 12
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('$value'):
            obj2 = self.dependencies['value'].serialize(obj)

        try:
            return self.enum(obj2)
        except Exception as e:
            raise SerializationError(path=['$enum'],
                                     val=obj,
                                     exc=e,
                                     reason=f'invalid_enum_key',
                                     origin=self)
Ejemplo n.º 13
0
    def serialize(self, obj: Any) -> Any:
        r = {}
        for idx, v in self.dependencies.items():
            with subserializer(idx):
                item = v.serialize(obj)

                if not isinstance(item, FieldValue):
                    raise SerializationError(val=item,
                                             reason='unsupported_field_defn',
                                             origin=self)

            if item.has_value:
                r[item.name] = item.value

        if self.cls:
            return self.cls(**r)
        else:
            return r
Ejemplo n.º 14
0
    def serialize(self, obj: Any) -> Any:
        with subserializer('value'):
            obj = self.dependencies['value'].serialize(obj)

        if not isinstance(obj, self.enum):
            raise SerializationError(val=obj,
                                     reason='enum_not_enum',
                                     origin=self)

        try:
            obj = obj.value
        except AttributeError as e:
            raise SerializationError(val=obj,
                                     exc=e,
                                     reason='invalid_enum',
                                     origin=self)

        return obj
Ejemplo n.º 15
0
    def serialize(self, obj: Any) -> Any:
        if self.cls and not isinstance(obj, self.cls):
            raise SerializationError(val=obj,
                                     reason='not_instance',
                                     origin=self)

        r = OrderedDict()

        for idx, v in self.dependencies.items():
            with subserializer(idx):
                item = v.serialize(obj)

                if not isinstance(item, FieldValue):
                    raise SerializationError(val=item,
                                             reason='unsupported_field_defn',
                                             origin=self)

            if item.has_value:
                r[item.name] = item.value
        return r
Ejemplo n.º 16
0
 def serialize(self, obj: Any) -> Any:
     with subserializer('$item'):
         obj = self.dependencies['item'].serialize(obj)
     return len(obj)
Ejemplo n.º 17
0
 def serialize(self, obj: Any) -> Any:
     r = []
     for i, x in enumerate(obj):
         with subserializer(i):
             r.append(self.dependencies['value'].serialize(x))
     return r