diff --git a/test/tc_newkeys.py b/test/tc_newkeys.py
index df32c14a..cd9430db 100644
--- a/test/tc_newkeys.py
+++ b/test/tc_newkeys.py
@@ -255,6 +255,31 @@ class Tree(object):
newtree._tree = self._tree
return newtree
+ def merge(self, other, copy=True):
+ """Merge another Tree into a copy of self"""
+ def deep_merge(branch, otherbranch):
+ assert isinstance(otherbranch, dict)
+ if not isinstance(branch, dict):
+ branch = dict()
+ elif copy:
+ branch = branch.copy()
+ for key, val in otherbranch.items():
+ if isinstance(val, dict):
+ if key not in branch:
+ branch[key] = None
+ branch[key] = deep_merge(branch[key], val)
+ else:
+ branch[key] = val
+ return branch
+
+ if isinstance(self._tree, dict) and isinstance(other._tree, dict):
+ content = deep_merge(self._tree, other._tree)
+ elif copy and hasattr(other._tree, 'copy'):
+ content = other._tree.copy()
+ else:
+ content = other._tree
+ return type(self)(content)
+
def set(self, keys, value, force=True):
"""Sets the element at the end of the path to <value>."""
if not isinstance(keys, (list, tuple)):
@@ -309,6 +334,8 @@ class Tree(object):
else:
return tree
+ __getitem__ = traverse
+
class KeyMap(Tree):
"""Contains a tree with all the keybindings"""
def add(self, *args, **keywords):
@@ -436,40 +463,74 @@ class Test(PressTestCase):
self.assertEqual("Lol", t2.traverse('axy'))
def test_merge_trees(self):
- t = Tree()
- t.set('aaaX', 1)
- t.set('aaaY', 2)
- t.set('aaaZ', 3)
- t.set('bbbA', 11)
- t.set('bbbB', 12)
- t.set('bbbC', 13)
- t.set('bbbD', 14)
- t.set('bP', 21)
- t.set('bQ', 22)
-
- u = Tree()
- u.set('aaaX', 0)
- u.set('bbbC', 'Yes')
- u.set('bbbD', 14)
- u.set('bbbE', 15)
- u.set('bbbF', 16)
- u.set('bQ', 22)
- u.set('bR', 23)
-
+ def makeTreeA():
+ t = Tree()
+ t.set('aaaX', 1)
+ t.set('aaaY', 2)
+ t.set('aaaZ', 3)
+ t.set('bbbA', 11)
+ t.set('bbbB', 12)
+ t.set('bbbC', 13)
+ t.set('bbbD', 14)
+ t.set('bP', 21)
+ t.set('bQ', 22)
+ return t
+
+ def makeTreeB():
+ u = Tree()
+ u.set('aaaX', 0)
+ u.set('bbbC', 'Yes')
+ u.set('bbbD', 14)
+ u.set('bbbE', 15)
+ u.set('bbbF', 16)
+ u.set('bQ', 22)
+ u.set('bR', 23)
+ u.set('ffff', 1337)
+ return u
+
+ # test 1
+ t = Tree('a')
+ u = Tree('b')
+ merged = t.merge(u)
+ self.assertEqual('b', merged._tree)
+
+ # test 2
+ t = Tree('a')
+ u = makeTreeA()
+ merged = t.merge(u)
+ self.assertEqual(u._tree, merged._tree)
+
+ # test 3
+ t = makeTreeA()
+ u = makeTreeB()
v = t.merge(u)
- self.ass.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package ranger.gui.widgets</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.<a href="ranger.gui.html"><font color="#ffffff">gui</font></a>.widgets</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/work/ranger/ranger/gui/widgets/__init__.py">/home/hut/work/ranger/ranger/gui/widgets/__init__.py</a></font></td></tr></table>
<p><tt># Copyright (c) 2009, 2010 hut <hut@lavabit.com><br>
#<br>
# Permission to use, copy, modify, and/or distribute this software for any<br>
# purpose with or without fee is hereby granted, provided that the above<br>
# copyright notice and this permission notice appear in all copies.<br>
#<br>
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES<br>
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF<br>
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR<br>
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES<br>
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN<br>
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF<br>
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="ranger.gui.widgets.browsercolumn.html">browsercolumn</a><br>
<a href="ranger.gui.widgets.browserview.html">browserview</a><br>
</td><td width="25%" valign=top><a href="ranger.gui.widgets.console.html">console</a><br>
<a href="ranger.gui.widgets.console_mode.html">console_mode</a><br>
</td><td width="25%" valign=top><a href="ranger.gui.widgets.pager.html">pager</a><br>
<a href="ranger.gui.widgets.statusbar.html">statusbar</a><br>
</td><td width="25%" valign=top><a href="ranger.gui.widgets.taskview.html">taskview</a><br>
<a href="ranger.gui.widgets.titlebar.html">titlebar</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="ranger.gui.displayable.html#Displayable">ranger.gui.displayable.Displayable</a>(<a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a>, <a href="ranger.shared.html#FileManagerAware">ranger.shared.FileManagerAware</a>, <a href="ranger.gui.curses_shortcuts.html#CursesShortcuts">ranger.gui.curses_shortcuts.CursesShortcuts</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.gui.widgets.html#Widget">Widget</a>
</font></dt></dl>
</dd>
</dl>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom> <br>
<font color="#000000" face="helvetica, arial"><a name="Widget">class <strong>Widget</strong></a>(<a href="ranger.gui.displayable.html#Displayable">ranger.gui.displayable.Displayable</a>)</font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
<td colspan=2><tt>The <a href="#Widget">Widget</a> class defines no methods and only exists for<br>
classification of widgets.<br> </tt></td></tr>
<tr><td> </td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="ranger.gui.widgets.html#Widget">Widget</a></dd>
<dd><a href="ranger.gui.displayable.html#Displayable">ranger.gui.displayable.Displayable</a></dd>
<dd><a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a></dd>
<dd><a href="ranger.shared.html#FileManagerAware">ranger.shared.FileManagerAware</a></dd>
<dd><a href="ranger.shared.html#Awareness">ranger.shared.Awareness</a></dd>
<dd><a href="ranger.gui.curses_shortcuts.html#CursesShortcuts">ranger.gui.curses_shortcuts.CursesShortcuts</a></dd>
<dd><a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a></dd>
<dd><a href="builtins.html#object">builtins.object</a></dd>
</dl>
<hr>
Methods inherited from <a href="ranger.gui.displayable.html#Displayable">ranger.gui.displayable.Displayable</a>:<br>
<dl><dt><a name="Widget-__contains__"><strong>__contains__</strong></a>(self, item)</dt><dd><tt>Is item inside the boundaries?<br>
item can be an iterable like [y, x] or an object with x and y methods.</tt></dd></dl>
<dl><dt><a name="Widget-__init__"><strong>__init__</strong></a>(self, win, env<font color="#909090">=None</font>, fm<font color="#909090">=None</font>, settings<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="Widget-__nonzero__"><strong>__nonzero__</strong></a>(self)</dt><dd><tt>Always True</tt></dd></dl>
<dl><dt><a name="Widget-__str__"><strong>__str__</strong></a>(self)</dt></dl>
<dl><dt><a name="Widget-click"><strong>click</strong></a>(self, event)</dt><dd><tt>Called when a mouse key is pressed and self.<strong>focused</strong> is True.<br>
Override this!</tt></dd></dl>
<dl><dt><a name="Widget-contains_point"><strong>contains_point</strong></a>(self, y, x)</dt><dd><tt>Test whether the point (with absolute coordinates) lies<br>
within the boundaries of this object.</tt></dd></dl>
<dl><dt><a name="Widget-destroy"><strong>destroy</strong></a>(self)</dt><dd><tt>Called when the object is destroyed.<br>
Override this!</tt></dd></dl>
<dl><dt><a name="Widget-draw"><strong>draw</strong></a>(self)</dt><dd><tt>Draw the object. Called on every main iteration if visible.<br>
Containers should call <a href="#Widget-draw">draw</a>() on their contained objects here.<br>
Override this!</tt></dd></dl>
<dl><dt><a name="Widget-finalize"><strong>finalize</strong></a>(self)</dt><dd><tt>Called after every displayable is done drawing.<br>
Override this!</tt></dd></dl>
<dl><dt><a name="Widget-poke"><strong>poke</strong></a>(self)</dt><dd><tt>Called before drawing, even if invisible</tt></dd></dl>
<dl><dt><a name="Widget-press"><strong>press</strong></a>(self, key)</dt><dd><tt>Called when a key is pressed and self.<strong>focused</strong> is True.<br>
Override this!</tt></dd></dl>
<dl><dt><a name="Widget-resize"><strong>resize</strong></a>(self, y, x, hei<font color="#909090">=None</font>, wid<font color="#909090">=None</font>)</dt><dd><tt>Resize the widget</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a>:<br>
<dl><dt><strong>env</strong> = None</dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.html#FileManagerAware">ranger.shared.FileManagerAware</a>:<br>
<dl><dt><strong>fm</strong> = None</dl>
<hr>
Data descriptors inherited from <a href="ranger.shared.html#Awareness">ranger.shared.Awareness</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list of weak references to the object (if defined)</tt></dd>
</dl>
<hr>
Methods inherited from <a href="ranger.gui.curses_shortcuts.html#CursesShortcuts">ranger.gui.curses_shortcuts.CursesShortcuts</a>:<br>
<dl><dt><a name="Widget-addnstr"><strong>addnstr</strong></a>(self, *args)</dt></dl>
<dl><dt><a name="Widget-addstr"><strong>addstr</strong></a>(self, *args)</dt></dl>
<dl><dt><a name="Widget-color"><strong>color</strong></a>(self, keylist<font color="#909090">=None</font>, *keys)</dt><dd><tt>Change the colors from now on.</tt></dd></dl>
<dl><dt><a name="Widget-color_at"><strong>color_at</strong></a>(self, y, x, wid, keylist<font color="#909090">=None</font>, *keys)</dt><dd><tt>Change the colors at the specified position</tt></dd></dl>
<dl><dt><a name="Widget-color_reset"><strong>color_reset</strong></a>(self)</dt><dd><tt>Change the colors to the default colors</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>:<br>
<dl><dt><strong>settings</strong> = <ranger.ext.openstruct.OpenStruct object at 0x7f28d0aa5bd0></dl>
</td></tr></table></td></tr></table>
</body></html>
|