public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
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 ---


             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