[wwwsearch-commits] r18229 - wwwsearch/ClientForm/trunk

jjlee at codespeak.net jjlee at codespeak.net
Thu Oct 6 23:12:11 CEST 2005


Author: jjlee
Date: Thu Oct  6 23:12:10 2005
New Revision: 18229

Modified:
   wwwsearch/ClientForm/trunk/ClientForm.py
   wwwsearch/ClientForm/trunk/test.py
Log:
Fix ordering of label arg in find_control calls; Deprecate by_label arg in .set/get_value() and add .set/get_value_by_label methods to HTMLForm; Remove by_label arg from .get() and add label arg; Merge .items_from*() methods into new .get_items() function

Modified: wwwsearch/ClientForm/trunk/ClientForm.py
==============================================================================
--- wwwsearch/ClientForm/trunk/ClientForm.py	(original)
+++ wwwsearch/ClientForm/trunk/ClientForm.py	Thu Oct  6 23:12:10 2005
@@ -30,10 +30,6 @@
 # Move Item.__str__ back into ListControl?  Don't like str(item) ATM...
 # Label matching in backwards_compat mode: compression of text??
 # Check old test suite passes in backwards_compat mode.
-# Deprecate by_label in set/get_value()
-# Add .set/get_value_by_label() to HTMLForm
-# Remove by_label arg from .get() and add label arg
-# Merge .items_from*() methods into new .get_items() function
 
 # XXX
 # Add some more functional tests
@@ -1554,39 +1550,39 @@
         else:
             return False
 
-    def items_from_label(self, label, exclude_disabled=False):
-        """Return all items that have labels containing the given label text.
+    def get_items(self, name=None, label=None, exclude_disabled=False):
+        """Return matching items by name or label.
 
-        Optionally excludes disabled items.
+        For argument docs, see the docstring for .get()
 
         """
-        if not isstringlike(label):
+        if name is not None and not isstringlike(name):
+            raise TypeError("item name must be string-like")
+        if label is not None and not isstringlike(label):
             raise TypeError("item label must be string-like")
         items = []  # order is important
         compat = self._form.backwards_compat
         for o in self.items:
-            if not exclude_disabled or not o.disabled:
+            if exclude_disabled and o.disabled:
+                continue
+            if name is not None and o.name != name:
+                continue
+            if label is not None:
                 for l in o.get_labels():
                     if ((compat and l.text == label) or
                         (not compat and l.text.find(label) > -1)):
-                        items.append(o)
                         break
+                else:
+                    continue
+            items.append(o)
         return items
 
-    def items_from_name(self, name, exclude_disabled=False):
-        """Return all items that have names matching the given name.
-
-        Optionally excludes disabled items.
-
-        """
-        if not isstringlike(name):
-            raise TypeError("item name must be string-like")
-        return [o for o in self.items if
-                o.name == name and (not exclude_disabled or not o.disabled)]
-
-    def get(self, name, by_label=False, nr=None, exclude_disabled=False):
+    def get(self, name=None, label=None, nr=None, exclude_disabled=False):
         """Return item by name or label, disambiguating if necessary with nr.
 
+        All arguments must be passed by name, with the exception of 'name',
+        which may be used as a positional argument.
+
         nr is an optional 0-based index of the items matching the query.
 
         If nr is the default None value and more than item is found, raises
@@ -1600,14 +1596,18 @@
         Optionally excludes disabled items.
 
         """
+        if nr is None and self._form.backwards_compat:
+            nr = 0  # :-/
+        items = self.get_items(name, label, exclude_disabled)
+        return disambiguate(items, nr, name)
 
+    def _get(self, name, by_label=False, nr=None, exclude_disabled=False):
+        # strictly for use by deprecated methods
         if by_label:
-            method = self.items_from_label
+            name, label = None, name
         else:
-            method = self.items_from_name
-        if nr is None and self._form.backwards_compat:
-            nr = 0  # :-/
-        return disambiguate(method(name, exclude_disabled), nr, name)
+            name, label = name, None
+        return self.get(name, label, nr, exclude_disabled)
 
     def toggle(self, name, by_label=False, nr=None):
         """Deprecated: given a name or label and optional disambiguating index
@@ -1622,7 +1622,7 @@
         """
         deprecation(
             "item = control.get(...); item.selected = not item.selected")
-        o = self.get(name, by_label, nr)
+        o = self._get(name, by_label, nr)
         self._set_selected_state(o, not o.selected)
 
     def set(self, selected, name, by_label=False, nr=None):
@@ -1638,7 +1638,7 @@
         """
         deprecation(
             "control.get(...).selected = <boolean>")
-        self._set_selected_state(self.get(name, by_label, nr), selected)
+        self._set_selected_state(self._get(name, by_label, nr), selected)
 
     def _set_selected_state(self, item, action):
         # action:
@@ -1702,7 +1702,7 @@
         """Get disabled state of named list item in a ListControl."""
         deprecation(
             "control.get(...).disabled")
-        return self.get(name, by_label, nr).disabled
+        return self._get(name, by_label, nr).disabled
 
     def set_item_disabled(self, disabled, name, by_label=False, nr=None):
         """Set disabled state of named list item in a ListControl.
@@ -1712,7 +1712,7 @@
         """
         deprecation(
             "control.get(...).disabled = <boolean>")
-        self.get(name, by_label, nr).disabled = disabled
+        self._get(name, by_label, nr).disabled = disabled
 
     def set_all_items_disabled(self, disabled):
         """Set disabled state of all list items in a ListControl.
@@ -1738,7 +1738,7 @@
         """
         deprecation(
             "control.get(...).attrs")
-        return self.get(name, by_label, nr).attrs
+        return self._get(name, by_label, nr).attrs
 
     def add_to_form(self, form):
         self._form = form
@@ -1829,7 +1829,7 @@
             self._single_set_value(value)
 
     def _get_items(self, name, target=1):
-        all_items = self.items_from_name(name)
+        all_items = self.get_items(name)
         items = [o for o in all_items if not o.disabled]
         if len(items) < target:
             if len(all_items) < target:
@@ -1894,7 +1894,7 @@
                 "length 0 or 1")
         items = []
         for nn in value:
-            found = self.items_from_label(nn)
+            found = self.get_items(label=nn)
             if len(found) > 1:
                 if not self._form.backwards_compat:
                     # ambiguous labels are fine as long as item names (e.g.
@@ -2563,7 +2563,9 @@
         form[name]
 
         """
-        c = self.find_control(name, type, kind, id, label, nr=nr)
+        if by_label:
+            deprecation("form.get_value_by_label(...)")
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
         if by_label:
             try:
                 meth = c.get_value_by_label
@@ -2585,7 +2587,9 @@
         form[name] = value
 
         """
-        c = self.find_control(name, type, kind, id, label, nr=nr)
+        if by_label:
+            deprecation("form.get_value_by_label(...)")
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
         if by_label:
             try:
                 meth = c.set_value_by_label
@@ -2596,6 +2600,26 @@
                 meth(value)
         else:
             c.value = value
+    def get_value_by_label(
+        self, name=None, type=None, kind=None, id=None, label=None, nr=None):
+        """
+
+        All arguments should be passed by name.
+
+        """
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        return c.get_value_by_label()
+
+    def set_value_by_label(
+        self, value,
+        name=None, type=None, kind=None, id=None, label=None, nr=None):
+        """
+
+        All arguments should be passed by name.
+
+        """
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        c.set_value_by_label(value)
 
     def set_all_readonly(self, readonly):
         for control in self.controls:
@@ -2618,7 +2642,7 @@
         is subsequently set.  AttributeError is raised on readonly controls.
 
         """
-        c = self.find_control(name, type, kind, id, label, nr=nr)
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
         c.clear()
 
 

Modified: wwwsearch/ClientForm/trunk/test.py
==============================================================================
--- wwwsearch/ClientForm/trunk/test.py	(original)
+++ wwwsearch/ClientForm/trunk/test.py	Thu Oct  6 23:12:10 2005
@@ -15,6 +15,7 @@
      ItemCountError, AmbiguityError, ParseError
 
 # XXX
+# HTMLForm.set/get_value_by_label()
 # Base control tests on ParseFile, so can use same tests for DOMForm and
 #  ClientForm.  That wouldn't be unit testing exactly, but saner than the
 #  current situation with massive duplication of tests between the two
@@ -2349,18 +2350,17 @@
                          "Submit")
         self.assertEqual(
             form.find_control(label="Country").get(
-                "Britain", by_label=True).name, "EU: Great Britain")
+                label="Britain").name, "EU: Great Britain")
         self.assertEqual(
             form.find_control(label="Origin").get(
-                "GB", by_label=True).name, "EU: Great Britain")
+                label="GB").name, "EU: Great Britain")
         self.assertEqual(form.find_control(label="Password").value,
                          "123")
         self.assertEqual(form.find_control(label="Title").value,
                          "The Grapes of Wrath")
 
-        # test item ambiguity, get, items_from_label, items_from_name, and
-        # set_value_by_label
-        # a form can be in two states: either ignoring ambiguity or being
+        # Test item ambiguity, get, get_items, and set_value_by_label.
+        # A form can be in two states: either ignoring ambiguity or being
         # careful about it.  Currently, by default, a form's backwards_compat
         # attribute is True, so ambiguity is ignored.  For instance, notice
         # that the form.grocery checkboxes include some loaves of bread and
@@ -2368,8 +2368,8 @@
         form.backwards_compat = True
         c = form.find_control("form.grocery")
         # label substring matching is turned off for compat mode
-        self.assertRaises(ItemNotFoundError, c.get, "Loaf", True)
-        self.assertEqual(c.get("Loaf of Bread", True), c.items[0])
+        self.assertRaises(ItemNotFoundError, c.get, label="Loaf")
+        self.assertEqual(c.get(label="Loaf of Bread"), c.items[0])
         c.set_value_by_label(["Loaf of Bread"])
         self.assertEqual(c.get_value_by_label(), ["Loaf of Bread"])
         self.assertEqual(c.items[0].id, "1")
@@ -2377,7 +2377,7 @@
         # Errors may be raised.  This is generally a preferred approach, but is
         # not backwards compatible.
         form.backwards_compat = False
-        self.assertRaises(ClientForm.AmbiguityError, c.get, "Loaf", True)
+        self.assertRaises(ClientForm.AmbiguityError, c.get, label="Loaf")
         self.assertRaises(
             ClientForm.AmbiguityError, c.set_value_by_label, ["Loaf"])
         # If items have the same name (value), set_value_by_label will
@@ -2391,25 +2391,24 @@
             ["Loaf of Bread", "Loaf of Bread", "Loaf of Challah"])
         # "get" will still raise an exception, though.
         self.assertRaises(
-            ClientForm.AmbiguityError, c.get, "Loaf of Bread", True)
-        # If you want an item, you need to
-        # specify which one you want (or use items_from_label or
-        # items_from_name to explicitly get all of them).
-        self.assertEqual(c.get("Loaf of Bread", True, 0).selected, True)
-        self.assertEqual(c.get("Loaf of Bread", True, 1).selected, True)
-        self.assertEqual(c.get("Loaf of Bread", True, 2).selected, False)
-        self.assertEqual(c.get("Loaf of Challah", True).selected, True)
+            ClientForm.AmbiguityError, c.get, label="Loaf of Bread")
+        # If you want an item, you need to specify which one you want (or use
+        # get_items to explicitly get all of them).
+        self.assertEqual(c.get(label="Loaf of Bread", nr=0).selected, True)
+        self.assertEqual(c.get(label="Loaf of Bread", nr=1).selected, True)
+        self.assertEqual(c.get(label="Loaf of Bread", nr=2).selected, False)
+        self.assertEqual(c.get(label="Loaf of Challah").selected, True)
         self.assertEqual(
-            [i.selected for i in c.items_from_label("Loaf of Bread")],
+            [i.selected for i in c.get_items(label="Loaf of Bread")],
             [True, True, False])
         self.assertEqual(
-            [i.selected for i in c.items_from_label("Loaf of Challah")],
+            [i.selected for i in c.get_items(label="Loaf of Challah")],
             [True])
         self.assertEqual(
-            [i.name for i in c.items_from_label("Loaf")],
+            [i.name for i in c.get_items(label="Loaf")],
             ["bread", "bread", "bread", "challah"])
         self.assertEqual(
-            [i.get_labels()[0].text for i in c.items_from_name("bread")],
+            [i.get_labels()[0].text for i in c.get_items("bread")],
             ["Loaf of Bread", "Loaf of Bread", "Loaf of Bread"])
 
         # test deprecation
@@ -2574,6 +2573,7 @@
 
         form.set_value(["v3"], type="select", kind="multilist")
         self.assert_(form.get_value("d") == ["v3"])
+        hide_deprecations()
         form.set_value(["l2"], type="select", kind="multilist", by_label=True)
         self.assert_(form.get_value("d", by_label=True) == ["l2"])
 
@@ -2584,6 +2584,7 @@
             form.get_value("b", "radio", "singlelist", None, 0, False),
             ["1"])
         form.set_value(["Three"], "b", by_label=True)
+        reset_deprecations()
         self.assertEqual(
             form.get_value("b", "radio", "singlelist", None, 0, False),
             ["3"])
@@ -2699,18 +2700,18 @@
         # nr too high
         self.assertRaises(ItemNotFoundError, ctl.get, "p", nr=50)
         # first having label "a"
-        self.assertEqual(ctl.get("a", nr=0, by_label=True).id, "1")
+        self.assertEqual(ctl.get(label="a", nr=0).id, "1")
         # second having label "a"...
-        item = ctl.get("a", nr=1, by_label=True)
+        item = ctl.get(label="a", nr=1)
         # ...as opposed to second with label attribute "a"! -- each item
         # has multiple labels accessible by .get_labels(), but only one
         # label HTML-attribute
         self.assertEqual(item.id, "2")
         self.assertEqual(item.attrs.get("label"), "b")  # !
         # third having label "a" (but only the second whose label is "a")
-        self.assertEqual(ctl.get("a", nr=1, by_label=True).id, "2")
+        self.assertEqual(ctl.get(label="a", nr=1).id, "2")
         # nr too high again
-        self.assertRaises(ItemNotFoundError, ctl.get, "a", nr=3, by_label=True)
+        self.assertRaises(ItemNotFoundError, ctl.get, label="a", nr=3)
 
 
 def startswith(string, initial):


More information about the wwwsearch-commits mailing list