Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/trunk' into lots-more-docs
Browse files Browse the repository at this point in the history
  • Loading branch information
glyph committed Aug 15, 2023
2 parents c52d84c + 1e09933 commit aaa80e8
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 15 deletions.
2 changes: 1 addition & 1 deletion requirements/mypy.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cryptography==41.0.1
mypy==1.0.1
mypy==1.4.1
mypy-zope==1.0.0
types-click==7.1.8
4 changes: 2 additions & 2 deletions requirements/sphinx.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Sphinx==5.0.2
sphinx-rtd-theme==1.2.1
Sphinx==7.1.2
sphinx-rtd-theme==1.3.0rc1
2 changes: 1 addition & 1 deletion requirements/tox-pin-base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ incremental==22.10.0
PyHamcrest==2.0.4
six==1.16.0
Tubes==0.2.1
Werkzeug==2.3.4; python_version > '3.7'
Werkzeug==2.3.7; python_version > '3.7'
Werkzeug==2.1.2; python_version <= '3.7'
zope.interface==6.0
11 changes: 8 additions & 3 deletions src/klein/_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,14 @@ def asTags(self) -> Iterable[Tag]:
value = self.value
if value is None:
value = "" # type: ignore[unreachable]
fieldName = self.formFieldName

if fieldName is None:
raise ValueError("Cannot generate tags for unnamed form field.")

input_tag = tags.input(
type=self.formInputType,
name=self.formFieldName, # type: ignore[arg-type]
name=fieldName,
value=value,
)
error_tags = []
Expand Down Expand Up @@ -310,7 +315,7 @@ class RenderableForm:
_method: str
_enctype: str
_encoding: str
prevalidationValues: Dict[Field, Optional[str]] = attr.ib(factory=dict)
prevalidationValues: Dict[Field, str] = attr.ib(factory=dict)
validationErrors: Dict[Field, ValidationError] = attr.ib(factory=dict)

ENCTYPE_FORM_DATA = "multipart/form-data"
Expand Down Expand Up @@ -530,7 +535,7 @@ class FieldValues:

form: "Form"
arguments: Dict[str, Any]
prevalidationValues: Dict[Field, Optional[str]]
prevalidationValues: Dict[Field, str]
validationErrors: Dict[Field, ValidationError]
_injectionComponents: Componentized

Expand Down
41 changes: 38 additions & 3 deletions src/klein/test/test_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from twisted.internet.defer import inlineCallbacks
from twisted.python.compat import nativeString
from twisted.trial.unittest import SynchronousTestCase
from twisted.web.error import FlattenerError
from twisted.web.iweb import IRequest
from twisted.web.template import Element, TagLoader, renderer, tags

Expand Down Expand Up @@ -70,7 +71,23 @@ def procureASession(self, request: IRequest) -> Any:
dangling=DanglingField(lambda x: x, "text"),
)
def danglingParameter(self, dangling: str) -> None:
"..."
"""
Provided to test error reporting on handling of dangling fields.
@see: L{DanglingField}
"""

@requirer.require(
router.route("/dangling-param", methods=["GET"]),
form=Form.rendererFor(danglingParameter, action="/dangling-param"),
)
def renderDanglingParameter(self, form: Form) -> Form:
"""
Provided to test error reporting on rendering of dangling fields.
@see: L{DanglingField}
"""
return form

@requirer.require(
router.route("/handle", methods=["POST"]),
Expand Down Expand Up @@ -346,7 +363,10 @@ def test_missingRequiredParameter(self) -> None:
def test_noName(self) -> None:
"""
A handler for a Form with a Field that doesn't have a name will return
an error explaining the problem.
an error explaining the problem when either processed in a handler or
rendered in a form.
@see: L{DanglingField}.
"""
mem = MemorySessionStore()
session = self.successResultOf(
Expand All @@ -365,7 +385,22 @@ def test_noName(self) -> None:
errors = self.flushLoggedErrors(ValueError)
self.assertEqual(len(errors), 1)
self.assertIn(
str(errors[0].value), "Cannot extract unnamed form field."
"Cannot extract unnamed form field.",
str(errors[0].value),
)

self.successResultOf(
stub.get(
"https://localhost/dangling-param",
headers={b"X-Test-Session": session.identifier},
),
)
self.assertEqual(response.code, 500)
errors = self.flushLoggedErrors(FlattenerError)
self.assertEqual(len(errors), 1)
self.assertIn(
"Cannot generate tags for unnamed form field.",
str(errors[0].value.args[0]),
)

def test_handlingGET(self) -> None:
Expand Down
4 changes: 2 additions & 2 deletions src/klein/test/test_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -1315,7 +1315,7 @@ def test_failServerName(self) -> None:
Raises URLDecodeError if SERVER_NAME can't be decoded.
"""
request = MockRequest(b"/foo")
request.getRequestHostname = ( # type: ignore[assignment]
request.getRequestHostname = ( # type:ignore[method-assign]
lambda: b"f\xc3\xc3\xb6"
)
e = self.assertRaises(URLDecodeError, extractURLparts, request)
Expand Down Expand Up @@ -1345,7 +1345,7 @@ def test_failAll(self) -> None:
"""
request = MockRequest(b"/f\xc3\xc3\xb6")
request.prepath = [b"f\xc3\xc3\xb6"]
request.getRequestHostname = ( # type: ignore[assignment]
request.getRequestHostname = ( # type:ignore[method-assign]
lambda: b"f\xc3\xc3\xb6"
)
e = self.assertRaises(URLDecodeError, extractURLparts, request)
Expand Down
4 changes: 1 addition & 3 deletions src/klein/test/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,4 @@ def __ne__(self, other: object) -> bool:


def recover(d: "Deferred[_T]", exc_type: Type[Exception]) -> "Deferred[_T]":
return d.addErrback(
lambda f: f.trap(exc_type) # type: ignore[no-any-return]
)
return d.addErrback(lambda f: f.trap(exc_type))

0 comments on commit aaa80e8

Please sign in to comment.