[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