namespaces: add a namespace object
authorSean Farley <sean.michael.farley@gmail.com>
Fri, 19 Dec 2014 17:00:28 -0800
changeset 23715 eee55c09010a
parent 23714 e3a0e7e21f54
child 23716 f4828a8f6ae9
namespaces: add a namespace object Currently, we use a dictionary object to store the namespace properties. This is python so let's use an object. This will allow us to be more flexible in our method signatures in the future.
mercurial/namespaces.py
--- a/mercurial/namespaces.py	Fri Jan 02 13:30:38 2015 +0100
+++ b/mercurial/namespaces.py	Fri Dec 19 17:00:28 2014 -0800
@@ -109,3 +109,41 @@
         """method that returns a (sorted) list of names in a namespace that
         match a given node"""
         return sorted(self._names[namespace]['nodemap'](repo, node))
+
+class namespace(object):
+    """provides an interface to a namespace
+
+    Namespaces are basically generic many-to-many mapping between some
+    (namespaced) names and nodes. The goal here is to control the pollution of
+    jamming things into tags or bookmarks (in extension-land) and to simplify
+    internal bits of mercurial: log output, tab completion, etc.
+
+    More precisely, we define a mapping of names to nodes, and a mapping from
+    nodes to names. Each mapping returns a list.
+
+    Furthermore, each name mapping will be passed a name to lookup which might
+    not be in its domain. In this case, each method should return an empty list
+    and not raise an error.
+
+    This namespace object will define the properties we need:
+      'name': the namespace (plural form)
+      'templatename': name to use for templating (usually the singular form
+                      of the plural namespace name)
+      'namemap': function that takes a name and returns a list of nodes
+      'nodemap': function that takes a node and returns a list of names
+
+    """
+
+    def __init__(self, name, templatename, namemap, nodemap):
+        """create a namespace
+
+        name: the namespace to be registered (in plural form)
+        templatename: the name to use for templating
+        namemap: function that inputs a node, output name(s)
+        nodemap: function that inputs a name, output node(s)
+
+        """
+        self.name = name
+        self.templatename = templatename
+        self.namemap = namemap
+        self.nodemap = nodemap