Skip to content

Commit

Permalink
Code cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
kedder committed Mar 15, 2013
1 parent 0f72a0d commit 8db51f6
Showing 1 changed file with 51 additions and 73 deletions.
124 changes: 51 additions & 73 deletions src/zope/testbrowser/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ def title(self):
titles = self._response.html.find_all('title')
if not titles:
return None
return to_str(titles[0].text, self._response)
return self.toStr(titles[0].text)

def reload(self):
"""See zope.testbrowser.interfaces.IBrowser"""
Expand Down Expand Up @@ -226,21 +226,13 @@ def addHeader(self, key, value):

def open(self, url, data=None):
"""See zope.testbrowser.interfaces.IBrowser"""

url = str(url)
with self._preparedRequest(url) as reqargs:
self._history.add(self._response)
try:
if data is not None:
resp = self.testapp.post(url, data, **reqargs)
else:
resp = self.testapp.get(url, **reqargs)
resp = resp.maybe_follow()
except webtest.app.AppError:
six.reraise(*translateAppError(*sys.exc_info()))
if data is not None:
make_request = lambda args: self.testapp.post(url, data, **args)
else:
make_request = lambda args: self.testapp.get(url, **args)

self._setResponse(resp)
self._checkStatus()
self._processRequest(url, make_request)

def post(self, url, data, content_type=None):
if content_type is not None:
Expand All @@ -250,23 +242,22 @@ def post(self, url, data, content_type=None):
def _clickSubmit(self, form, control=None, coord=None):
# find index of given control in the form
url = self._absoluteUrl(form.action)
with self._preparedRequest(url) as reqargs:
self._history.add(self._response)
try:
if control:
index = form.fields[control.name].index(control)
resp = self._submit(form, control.name, index, coord=coord,
**reqargs)
else:
resp = self._submit(form, coord=coord, **reqargs)

resp = resp.maybe_follow()
if control:
index = form.fields[control.name].index(control)
make_request = lambda args: self._submit(form, control.name,
index, coord=coord, **args)
else:
make_request = lambda args: self._submit(form, coord=coord, **args)

self._setResponse(resp)
self._checkStatus()
self._processRequest(url, make_request)

except webtest.app.AppError:
six.reraise(*translateAppError(*sys.exc_info()))
def _processRequest(self, url, make_request):
with self._preparedRequest(url) as reqargs:
self._history.add(self._response)
resp = make_request(reqargs)
resp = resp.maybe_follow()
self._setResponse(resp)
self._checkStatus()

def _checkStatus(self):
# if the headers don't have a status, I suppose there can't be an error
Expand Down Expand Up @@ -466,6 +457,15 @@ def _preparedRequest(self, url):
def _absoluteUrl(self, url):
return str(urlparse.urljoin(self._getBaseUrl(), url))

def toStr(self, s):
"""Convert possibly unicode object to native string using response
charset"""
if s is None:
return None
if PYTHON2 and not isinstance(s, bytes):
return s.encode(self._response.charset)
return s

def controlFactory(name, wtcontrols, elemindex, browser, include_subcontrols=False):
assert len(wtcontrols) > 0

Expand Down Expand Up @@ -533,16 +533,16 @@ def url(self):
@property
def text(self):
txt = normalizeWhitespace(self._link.text)
return to_str(txt, self.browser._response)
return self.browser.toStr(txt)

@property
def tag(self):
return str(self._link.name)

@property
def attrs(self):
r = self.browser._response
return {to_str(k, r): to_str(v, r)
toStr = self.browser.toStr
return {toStr(k): toStr(v)
for k, v in self._link.attrs.items()}

def __repr__(self):
Expand Down Expand Up @@ -582,13 +582,13 @@ def type(self):
else:
# By default, inputs are of 'text' type
return 'text'
return to_str(typeattr, self.browser._response)
return self.browser.toStr(typeattr)

@property
def name(self):
if self._control.name is None:
return None
return to_str(self._control.name, self.browser._response)
return self.browser.toStr(self._control.name)

@property
def multiple(self):
Expand Down Expand Up @@ -653,7 +653,7 @@ def __repr__(self):
self.__class__.__name__, self.name, self.type)

def getLabels(self):
return [to_str(l, self.browser._response)
return [self.browser.toStr(l)
for l in getControlLabels(self._elem, self._form.html)]

@property
Expand Down Expand Up @@ -722,8 +722,7 @@ def value(self):
if val is None:
return []

r = self.browser._response
return [to_str(v, r) for v in val]
return [self.browser.toStr(v) for v in val]

@value.setter
def value(self, value):
Expand Down Expand Up @@ -968,7 +967,7 @@ def selected(self, value):

@property
def optionValue(self):
return to_str(self._elem.attrs.get('value'), self.browser._response)
return self.browser.toStr(self._elem.attrs.get('value'))

def click(self):
# TODO
Expand All @@ -983,7 +982,7 @@ def __repr__(self):
def getLabels(self):
lbl = self._elem.attrs.get('label', self._elem.text)
labels = [self._elem.attrs.get('label'), self._elem.text]
return [to_str(normalizeWhitespace(lbl), self.browser._response)
return [self.browser.toStr(normalizeWhitespace(lbl))
for lbl in labels if lbl]

def mechRepr(self):
Expand All @@ -998,25 +997,25 @@ def mechRepr(self):
class RadioItemControl(ItemControl):
@property
def optionValue(self):
return to_str(self._elem.attrs.get('value'), self.browser._response)
return self.browser.toStr(self._elem.attrs.get('value'))

def getLabels(self):
return [to_str(l, self.browser._response)
return [self.browser.toStr(l)
for l in getControlLabels(self._elem, self._form.html)]

def __repr__(self):
return "<ItemControl name='%s' type='radio' optionValue=%r selected=%r>" % (
self._parent.name, self.optionValue, self.selected)

def mechRepr(self):
r = self.browser._response
id = to_str(self._elem.attrs.get('id'), r)
value = to_str(self._elem.attrs.get('value'), r)
name = to_str(self._elem.attrs.get('name'), r)
toStr = self.browser.toStr
id = toStr(self._elem.attrs.get('id'))
value = toStr(self._elem.attrs.get('value'))
name = toStr(self._elem.attrs.get('name'))

props = []
if self._elem.parent.name == 'label':
props.append(('__label', {'__text': to_str(self._elem.parent.text, r)}))
props.append(('__label', {'__text': toStr(self._elem.parent.text)}))
if self.selected:
props.append(('checked', 'checked'))
props.append(('type', 'radio'))
Expand Down Expand Up @@ -1048,25 +1047,24 @@ def selected(self, value):

@property
def optionValue(self):
return to_str(self._control._value or 'on', self.browser._response)
return self.browser.toStr(self._control._value or 'on')

def getLabels(self):
return [to_str(l, self.browser._response)
return [self.browser.toStr(l)
for l in getControlLabels(self._elem, self._form.html)]

def __repr__(self):
return "<ItemControl name='%s' type='checkbox' optionValue=%r selected=%r>" % (
self._control.name, self.optionValue, self.selected)

def mechRepr(self):
r = self.browser._response
id = to_str(self._elem.attrs.get('id'), r)
value = to_str(self._elem.attrs.get('value'), r)
name = to_str(self._elem.attrs.get('name'), r)
id = self.browser.toStr(self._elem.attrs.get('id'))
value = self.browser.toStr(self._elem.attrs.get('value'))
name = self.browser.toStr(self._elem.attrs.get('name'))

props = []
if self._elem.parent.name == 'label':
props.append(('__label', {'__text': to_str(self._elem.parent.text, r)}))
props.append(('__label', {'__text': self.browser.toStr(self._elem.parent.text)}))
if self.selected:
props.append(('checked', 'checked'))
props.append(('name', name))
Expand Down Expand Up @@ -1311,26 +1309,6 @@ def clear(self):
class AmbiguityError(ValueError):
pass


APPERROR_STATUS_RE = re.compile(r'Bad response: (\d{3}) (.*) \(not .* for (.*)\)')

def translateAppError(exc_type, exc_value, exc_traceback=None):
msg = exc_value.message
matches = APPERROR_STATUS_RE.match(msg)
if matches:
code, status, url = matches.groups()
exc_value = urllib_request.HTTPError(url, code, status, [], None)
exc_type = urllib_request.HTTPError

return exc_type, exc_value, exc_traceback

def to_str(s, response):
if s is None:
return None
if PYTHON2 and not isinstance(s, bytes):
return s.encode(response.charset)
return s

class BrowserStateError(Exception):
pass

Expand Down

0 comments on commit 8db51f6

Please sign in to comment.