]> git.ipfire.org Git - people/ms/westferry.git/commitdiff
decorators: Import some basic @lazy_property generator
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 9 May 2025 13:09:32 +0000 (13:09 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 9 May 2025 13:09:32 +0000 (13:09 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/westferry/decorators.py [new file with mode: 0644]

index a9999b11deae64b4ec972baa84656aa2f18fc1d8..70b589fa75f966af6980296c3c8ef2f6d802c0a1 100644 (file)
@@ -85,6 +85,7 @@ westferry_PYTHON = \
        src/westferry/__init__.py \
        src/westferry/constants.py \
        src/westferry/application.py \
+       src/westferry/decorators.py \
        src/westferry/i18n.py \
        src/westferry/logging.py \
        src/westferry/services.py
diff --git a/src/westferry/decorators.py b/src/westferry/decorators.py
new file mode 100644 (file)
index 0000000..3648e3d
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python3
+###############################################################################
+#                                                                             #
+# Westferry - The IPFire web user interface                                   #
+# Copyright (C) 2015 IPFire development team                                  #
+#                                                                             #
+# This program is free software: you can redistribute it and/or modify        #
+# it under the terms of the GNU General Public License as published by        #
+# the Free Software Foundation, either version 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+class Missing(object):
+       pass
+
+_missing = Missing()
+
+class lazy_property(property):
+       """
+               The property is only computed once and then being
+               cached until the end of the lifetime of the object.
+       """
+       def __init__(self, fget, fset=None, fdel=None, doc=None, name=None):
+               property.__init__(self, fget=fget, fset=fset, fdel=fdel, doc=doc)
+
+               self.__name__   = name or fget.__name__
+               self.__module__ = fget.__module__
+
+       def __get__(self, obj, type=None):
+               if object is None:
+                       return self
+
+               value = obj.__dict__.get(self.__name__, _missing)
+               if value is _missing:
+                       obj.__dict__[self.__name__] = value = self.fget(obj)
+
+               return value
+
+       def __set__(self, obj, value):
+               if self.fset:
+                       self.fset(obj, value)
+
+               obj.__dict__[self.__name__] = value