File: property_types.py

package info (click to toggle)
python-irodsclient 3.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,352 kB
  • sloc: python: 16,650; xml: 525; sh: 104; awk: 5; sql: 3; makefile: 3
file content (123 lines) | stat: -rw-r--r-- 2,851 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from base64 import b64encode, b64decode

from irods.message.ordered import OrderedProperty
from html import escape


class MessageProperty(OrderedProperty):

    def __get__(self, obj, cls):
        return obj._values[self.name]

    def __set__(self, obj, value):
        obj._values[self.name] = value

    def dub(self, name):
        self.name = name
        return self

    def pack(self, value):
        values = []
        values.append("<%s>" % self.name)
        my_value = self.format(value)
        if isinstance(my_value, bytes):
            my_value = my_value.decode("utf-8")
        values.append(my_value)
        values.append("</%s>" % self.name)
        return "".join(values)

    def unpack(self, els):
        if len(els):
            el = els[0]
            return self.parse(el.text)
        return None


class IntegerProperty(MessageProperty):

    def format(self, value):
        return str(value)

    def parse(self, value):
        return int(value)


class LongProperty(MessageProperty):

    def format(self, value):
        return str(value)

    def parse(self, value):
        return int(value)


class BinaryProperty(MessageProperty):

    def __init__(self, length=None):
        self.length = length
        super(BinaryProperty, self).__init__()

    def format(self, value):
        if isinstance(value, bytes):
            return b64encode(value)
        else:
            return b64encode(value.encode())

    def parse(self, value):
        val = b64decode(value)
        return val


class StringProperty(MessageProperty):

    def __init__(self, length=None):
        self.length = length
        super(StringProperty, self).__init__()

    @staticmethod
    def escape_xml_string(string):
        return escape(string, quote=False)

    def format(self, value):
        if isinstance(value, str):
            return self.escape_xml_string(value)

        if isinstance(value, bytes):
            return self.escape_xml_string(value.decode())

        return self.escape_xml_string(str(value))

    def parse(self, value):
        return value


class ArrayProperty(MessageProperty):

    def __init__(self, prop):
        self.prop = prop
        super(ArrayProperty, self).__init__()

    def pack(self, values):
        self.prop.dub(self.name)
        return "".join([self.prop.pack(v) for v in values])

    def unpack(self, els):
        return [self.prop.unpack([el]) for el in els]


class SubmessageProperty(MessageProperty):

    def __init__(self, message_cls=None):
        self.message_cls = message_cls
        super(SubmessageProperty, self).__init__()

    def pack(self, value):
        return value.pack()

    def unpack(self, els):
        if len(els):
            el = els[0]
            msg = self.message_cls()
            msg.unpack(el)
            return msg
        return None