[PATCH 1 of 4] namespaces: add a namespace object

Sean Farley sean.michael.farley at gmail.com
Wed Dec 31 19:17:35 CST 2014


# HG changeset patch
# User Sean Farley <sean.michael.farley at gmail.com>
# Date 1419037228 28800
#      Fri Dec 19 17:00:28 2014 -0800
# Node ID 66f9e085fa63d4cd9486a5e700e5f31d3d312f80
# Parent  9a02f75179390b109da0b9e2af6a7506c087f762
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.

diff --git a/mercurial/namespaces.py b/mercurial/namespaces.py
--- a/mercurial/namespaces.py
+++ b/mercurial/namespaces.py
@@ -107,5 +107,43 @@ class namespaces(object):
 
     def names(self, repo, namespace, node):
         """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


More information about the Mercurial-devel mailing list