xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/xml/dom/minicompat.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker"""Python version compatibility support for minidom.
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard WorkerThis module contains internal implementation details and
4*cda5da8dSAndroid Build Coastguard Workershould not be imported; use xml.dom.minidom instead.
5*cda5da8dSAndroid Build Coastguard Worker"""
6*cda5da8dSAndroid Build Coastguard Worker
7*cda5da8dSAndroid Build Coastguard Worker# This module should only be imported using "import *".
8*cda5da8dSAndroid Build Coastguard Worker#
9*cda5da8dSAndroid Build Coastguard Worker# The following names are defined:
10*cda5da8dSAndroid Build Coastguard Worker#
11*cda5da8dSAndroid Build Coastguard Worker#   NodeList      -- lightest possible NodeList implementation
12*cda5da8dSAndroid Build Coastguard Worker#
13*cda5da8dSAndroid Build Coastguard Worker#   EmptyNodeList -- lightest possible NodeList that is guaranteed to
14*cda5da8dSAndroid Build Coastguard Worker#                    remain empty (immutable)
15*cda5da8dSAndroid Build Coastguard Worker#
16*cda5da8dSAndroid Build Coastguard Worker#   StringTypes   -- tuple of defined string types
17*cda5da8dSAndroid Build Coastguard Worker#
18*cda5da8dSAndroid Build Coastguard Worker#   defproperty   -- function used in conjunction with GetattrMagic;
19*cda5da8dSAndroid Build Coastguard Worker#                    using these together is needed to make them work
20*cda5da8dSAndroid Build Coastguard Worker#                    as efficiently as possible in both Python 2.2+
21*cda5da8dSAndroid Build Coastguard Worker#                    and older versions.  For example:
22*cda5da8dSAndroid Build Coastguard Worker#
23*cda5da8dSAndroid Build Coastguard Worker#                        class MyClass(GetattrMagic):
24*cda5da8dSAndroid Build Coastguard Worker#                            def _get_myattr(self):
25*cda5da8dSAndroid Build Coastguard Worker#                                return something
26*cda5da8dSAndroid Build Coastguard Worker#
27*cda5da8dSAndroid Build Coastguard Worker#                        defproperty(MyClass, "myattr",
28*cda5da8dSAndroid Build Coastguard Worker#                                    "return some value")
29*cda5da8dSAndroid Build Coastguard Worker#
30*cda5da8dSAndroid Build Coastguard Worker#                    For Python 2.2 and newer, this will construct a
31*cda5da8dSAndroid Build Coastguard Worker#                    property object on the class, which avoids
32*cda5da8dSAndroid Build Coastguard Worker#                    needing to override __getattr__().  It will only
33*cda5da8dSAndroid Build Coastguard Worker#                    work for read-only attributes.
34*cda5da8dSAndroid Build Coastguard Worker#
35*cda5da8dSAndroid Build Coastguard Worker#                    For older versions of Python, inheriting from
36*cda5da8dSAndroid Build Coastguard Worker#                    GetattrMagic will use the traditional
37*cda5da8dSAndroid Build Coastguard Worker#                    __getattr__() hackery to achieve the same effect,
38*cda5da8dSAndroid Build Coastguard Worker#                    but less efficiently.
39*cda5da8dSAndroid Build Coastguard Worker#
40*cda5da8dSAndroid Build Coastguard Worker#                    defproperty() should be used for each version of
41*cda5da8dSAndroid Build Coastguard Worker#                    the relevant _get_<property>() function.
42*cda5da8dSAndroid Build Coastguard Worker
43*cda5da8dSAndroid Build Coastguard Worker__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"]
44*cda5da8dSAndroid Build Coastguard Worker
45*cda5da8dSAndroid Build Coastguard Workerimport xml.dom
46*cda5da8dSAndroid Build Coastguard Worker
47*cda5da8dSAndroid Build Coastguard WorkerStringTypes = (str,)
48*cda5da8dSAndroid Build Coastguard Worker
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Workerclass NodeList(list):
51*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
52*cda5da8dSAndroid Build Coastguard Worker
53*cda5da8dSAndroid Build Coastguard Worker    def item(self, index):
54*cda5da8dSAndroid Build Coastguard Worker        if 0 <= index < len(self):
55*cda5da8dSAndroid Build Coastguard Worker            return self[index]
56*cda5da8dSAndroid Build Coastguard Worker
57*cda5da8dSAndroid Build Coastguard Worker    def _get_length(self):
58*cda5da8dSAndroid Build Coastguard Worker        return len(self)
59*cda5da8dSAndroid Build Coastguard Worker
60*cda5da8dSAndroid Build Coastguard Worker    def _set_length(self, value):
61*cda5da8dSAndroid Build Coastguard Worker        raise xml.dom.NoModificationAllowedErr(
62*cda5da8dSAndroid Build Coastguard Worker            "attempt to modify read-only attribute 'length'")
63*cda5da8dSAndroid Build Coastguard Worker
64*cda5da8dSAndroid Build Coastguard Worker    length = property(_get_length, _set_length,
65*cda5da8dSAndroid Build Coastguard Worker                      doc="The number of nodes in the NodeList.")
66*cda5da8dSAndroid Build Coastguard Worker
67*cda5da8dSAndroid Build Coastguard Worker    # For backward compatibility
68*cda5da8dSAndroid Build Coastguard Worker    def __setstate__(self, state):
69*cda5da8dSAndroid Build Coastguard Worker        if state is None:
70*cda5da8dSAndroid Build Coastguard Worker            state = []
71*cda5da8dSAndroid Build Coastguard Worker        self[:] = state
72*cda5da8dSAndroid Build Coastguard Worker
73*cda5da8dSAndroid Build Coastguard Worker
74*cda5da8dSAndroid Build Coastguard Workerclass EmptyNodeList(tuple):
75*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ()
76*cda5da8dSAndroid Build Coastguard Worker
77*cda5da8dSAndroid Build Coastguard Worker    def __add__(self, other):
78*cda5da8dSAndroid Build Coastguard Worker        NL = NodeList()
79*cda5da8dSAndroid Build Coastguard Worker        NL.extend(other)
80*cda5da8dSAndroid Build Coastguard Worker        return NL
81*cda5da8dSAndroid Build Coastguard Worker
82*cda5da8dSAndroid Build Coastguard Worker    def __radd__(self, other):
83*cda5da8dSAndroid Build Coastguard Worker        NL = NodeList()
84*cda5da8dSAndroid Build Coastguard Worker        NL.extend(other)
85*cda5da8dSAndroid Build Coastguard Worker        return NL
86*cda5da8dSAndroid Build Coastguard Worker
87*cda5da8dSAndroid Build Coastguard Worker    def item(self, index):
88*cda5da8dSAndroid Build Coastguard Worker        return None
89*cda5da8dSAndroid Build Coastguard Worker
90*cda5da8dSAndroid Build Coastguard Worker    def _get_length(self):
91*cda5da8dSAndroid Build Coastguard Worker        return 0
92*cda5da8dSAndroid Build Coastguard Worker
93*cda5da8dSAndroid Build Coastguard Worker    def _set_length(self, value):
94*cda5da8dSAndroid Build Coastguard Worker        raise xml.dom.NoModificationAllowedErr(
95*cda5da8dSAndroid Build Coastguard Worker            "attempt to modify read-only attribute 'length'")
96*cda5da8dSAndroid Build Coastguard Worker
97*cda5da8dSAndroid Build Coastguard Worker    length = property(_get_length, _set_length,
98*cda5da8dSAndroid Build Coastguard Worker                      doc="The number of nodes in the NodeList.")
99*cda5da8dSAndroid Build Coastguard Worker
100*cda5da8dSAndroid Build Coastguard Worker
101*cda5da8dSAndroid Build Coastguard Workerdef defproperty(klass, name, doc):
102*cda5da8dSAndroid Build Coastguard Worker    get = getattr(klass, ("_get_" + name))
103*cda5da8dSAndroid Build Coastguard Worker    def set(self, value, name=name):
104*cda5da8dSAndroid Build Coastguard Worker        raise xml.dom.NoModificationAllowedErr(
105*cda5da8dSAndroid Build Coastguard Worker            "attempt to modify read-only attribute " + repr(name))
106*cda5da8dSAndroid Build Coastguard Worker    assert not hasattr(klass, "_set_" + name), \
107*cda5da8dSAndroid Build Coastguard Worker           "expected not to find _set_" + name
108*cda5da8dSAndroid Build Coastguard Worker    prop = property(get, set, doc=doc)
109*cda5da8dSAndroid Build Coastguard Worker    setattr(klass, name, prop)
110