From: "André Erdmann" <dywi@mailerd.de>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/util/
Date: Fri, 23 Aug 2013 13:52:00 +0000 (UTC) [thread overview]
Message-ID: <1377256633.1bd7938e8f3d9ba59fae9bdae378ec2120c3ca8b.dywi@gentoo> (raw)
commit: 1bd7938e8f3d9ba59fae9bdae378ec2120c3ca8b
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Aug 23 11:17:13 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Aug 23 11:17:13 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=1bd7938e
roverlay/util/namespace:
This is (mostly) a copy of the package rules' namespace object, but aims to be
generic. Supports creation of objects with hashable args / kwarg items only,
currently.
---
roverlay/util/namespace.py | 144 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 144 insertions(+)
diff --git a/roverlay/util/namespace.py b/roverlay/util/namespace.py
new file mode 100644
index 0000000..86d102f
--- /dev/null
+++ b/roverlay/util/namespace.py
@@ -0,0 +1,144 @@
+# R overlay -- generic namespace
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version.
+
+#import weakref
+
+import roverlay.util.common
+import roverlay.util.objects
+
+DEBUG_GET_OBJECT = False
+
+
+if DEBUG_GET_OBJECT:
+ def debug_get_object ( msg, cls, args, kwargs ):
+ print (
+ "[ObjectNamespace] {:<17} :: {}, {}, {}".format (
+ msg, cls, args, kwargs
+ )
+ )
+ # --- end of debug_get_object (...) ---
+# -- end if
+
+
+class Namespaceable ( object ):
+ @classmethod
+ def from_namespace ( cls, namespace, *args, **kwargs ):
+ return namespace.get_object_v ( cls, args, kwargs )
+ # --- end of from_namespace (...) ---
+
+ def __init__ ( self, *args, **kwargs ):
+ super ( Namespaceable, self ).__init__()
+ # --- end of __init__ (...) ---
+
+# --- end of Namespaceable ---
+
+class AbstractNamespace ( object ):
+
+ def __init__ ( self, *args, **kwargs ):
+ super ( AbstractNamespace, self ).__init__()
+ # --- end of __init__ (...) ---
+
+ @roverlay.util.objects.abstractmethod
+ def zap ( self, zap_object_db=False ):
+ pass
+ # --- end of zap (...) ---
+
+ def get_dict_hash ( self, d ):
+ # note that this doesn't handle "recursive" dicts
+ return roverlay.util.common.get_dict_hash ( d )
+ # --- end of get_dict_hash (...) ---
+
+ @roverlay.util.objects.abstractmethod
+ def get_object_v ( self, cls, args, kwargs ):
+ """Returns the desired object.
+
+ The object will be created if it does not already exist in the
+ object db of this namespace.
+
+ !!! The object has to be "shareable", i.e. it must not be modified
+ after constructing it (unless such a side-effect is intentional).
+
+ arguments:
+ * cls --
+ * *args --
+ * **kwargs --
+ """
+ pass
+ # --- end of get_object_v (...) ---
+
+ def get_object ( self, cls, *args, **kwargs ):
+ """Like get_object_v(), but accepts a variable number of args."""
+ return self.get_object_v ( cls, args, kwargs )
+ # --- end of get_object (...) ---
+
+# --- end of AbstractNamespace ---
+
+
+class NullNamespace ( AbstractNamespace ):
+
+ def zap ( self, *args, **kwargs ):
+ pass
+ # --- end of zap (...) ---
+
+ def get_object_v ( self, cls, args, kwargs ):
+ return cls ( *args, **kwargs )
+ # --- end of get_object_v (...) ---
+
+# --- end of NullNamespace ---
+
+
+class SimpleNamespace ( AbstractNamespace ):
+ """A namespace that caches all created objects."""
+
+ def zap ( self, zap_object_db=False ):
+ if zap_object_db:
+ self._objects.clear()
+ # --- end of zap (...) ---
+
+ def __init__ ( self ):
+ super ( SimpleNamespace, self ).__init__()
+
+ # object db
+ # dict (
+ # class => dict (
+ # tuple(hash(args),hash(kwargs)) => instance
+ # )
+ # )
+ #
+ self._objects = dict()
+ # --- end of __init__ (...) ---
+
+ def get_object_v ( self, cls, args, kwargs ):
+ ident = (
+ hash ( args ) if args else 0,
+ self.get_dict_hash ( kwargs ) if kwargs else 0,
+ )
+
+ objects = self._objects.get ( cls, None )
+
+ if objects is None:
+ if DEBUG_GET_OBJECT:
+ debug_get_object ( "miss/new cls, obj", cls, args, kwargs )
+
+ c = cls ( *args, **kwargs )
+ self._objects [cls] = { ident : c }
+
+ else:
+ c = objects.get ( ident, None )
+
+ if c is None:
+ if DEBUG_GET_OBJECT:
+ debug_get_object ( "miss/new obj", cls, args, kwargs )
+
+ c = cls ( *args, **kwargs )
+ objects [ident] = c
+ elif DEBUG_GET_OBJECT:
+ debug_get_object ( "hit/exist", cls, args, kwargs )
+
+ return c
+ # --- end of get_object_v (...) ---
+
+# --- end of SimpleNamespace ---
next reply other threads:[~2013-08-23 13:52 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-23 13:52 André Erdmann [this message]
-- strict thread matches above, loose matches on Subject: below --
2016-07-07 4:19 [gentoo-commits] proj/R_overlay:master commit in: roverlay/util/ Benda XU
2015-01-26 17:41 André Erdmann
2014-08-23 19:03 André Erdmann
2014-06-05 22:09 André Erdmann
2014-06-05 22:09 André Erdmann
2014-04-01 16:38 André Erdmann
2014-02-16 16:30 André Erdmann
2014-01-25 18:14 André Erdmann
2013-12-11 18:40 André Erdmann
2013-09-20 15:57 André Erdmann
2013-09-12 16:36 André Erdmann
2013-09-12 16:36 André Erdmann
2013-09-10 14:40 André Erdmann
2013-09-05 10:24 André Erdmann
2013-09-05 9:25 André Erdmann
2013-09-05 9:25 André Erdmann
2013-09-03 15:50 André Erdmann
2013-09-03 15:50 André Erdmann
2013-09-03 12:21 André Erdmann
2013-09-03 8:35 André Erdmann
2013-09-02 16:21 André Erdmann
2013-08-30 14:49 André Erdmann
2013-08-30 14:49 André Erdmann
2013-08-29 13:53 André Erdmann
2013-08-29 12:36 André Erdmann
2013-08-29 12:36 André Erdmann
2013-08-23 13:52 André Erdmann
2013-08-23 13:52 André Erdmann
2013-08-23 13:51 André Erdmann
2013-08-22 9:01 André Erdmann
2013-08-16 6:44 André Erdmann
2013-08-13 8:56 André Erdmann
2013-08-01 12:44 André Erdmann
2013-07-30 18:40 André Erdmann
2013-07-29 14:56 André Erdmann
2013-07-23 14:57 André Erdmann
2013-07-23 14:57 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-07-23 14:57 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-07-18 19:25 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-07-23 7:51 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-07-12 13:57 André Erdmann
2013-06-20 23:40 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-06-22 15:24 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1377256633.1bd7938e8f3d9ba59fae9bdae378ec2120c3ca8b.dywi@gentoo \
--to=dywi@mailerd.de \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox