Skip to content

Commit

Permalink
WTForms 3.0.0 support (#71)
Browse files Browse the repository at this point in the history
* Predictible isort & flake8 versions

Using the latest versions which support Python 2.7

* WTForms 3.0.0 support
  • Loading branch information
jpic committed Jan 17, 2021
1 parent db7b948 commit 202801b
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 23 deletions.
17 changes: 15 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,26 @@ python:
- 3.5
- 3.6
- 3.7
- pypy2.7-6.0
- pypy3.5-6.0
- pypy
- pypy3
env:
matrix:
- WTFORMS=WTForms==1.0.5
- WTFORMS=WTForms==2.0
- WTFORMS=WTForms==2.1
- WTFORMS=WTForms==2.2
- WTFORMS=WTForms==2.3
- WTFORMS=WTForms==3.0.0a1
jobs:
exclude:
- python: 2.7
env: WTFORMS=WTForms==3.0.0a1
- python: 3.4
env: WTFORMS=WTForms==3.0.0a1
- python: 3.5
env: WTFORMS=WTForms==3.0.0a1
- python: pypy
env: WTFORMS=WTForms==3.0.0a1

install:
- "pip install $WTFORMS"
Expand Down
10 changes: 6 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ def get_version():
'pytest>=2.2.3',
'flexmock>=0.9.7',
'WTForms-Test>=0.1.1',
'flake8>=2.4.0',
'isort>=4.2.2',
'flake8==3.8.4',
'isort==4.3.21',
],
'color': ['colour>=0.0.4'],
'ipaddress': ['ipaddr'] if not PY3 else [],
Expand Down Expand Up @@ -61,8 +61,10 @@ def get_version():
install_requires=[
'WTForms>=1.0.4',
'six>=1.4.1',
'validators>=0.5.0',
'intervals>=0.6.0'
'email_validator>=1.0.0',
'validators>=0.5.0' if PY3 else 'validators<=0.15',
'intervals>=0.6.0',
'MarkupSafe>=1.0.0'
],
extras_require=extras_require,
classifiers=[
Expand Down
6 changes: 5 additions & 1 deletion tests/test_chain_validator.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from wtforms import Form
from wtforms.fields import TextField
from wtforms.validators import DataRequired, Email
from wtforms_test import FormTestCase

from tests import MultiDict
from wtforms_components import Chain

try:
from wtforms.fields import TextField
except ImportError: # wtforms3
from wtforms.fields import StringField as TextField


class TestChainValidator(FormTestCase):
def test_validates_whole_chain(self):
Expand Down
6 changes: 5 additions & 1 deletion tests/test_if_validator.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from wtforms import Form
from wtforms.fields import TextField
from wtforms.validators import DataRequired
from wtforms_test import FormTestCase

from tests import MultiDict
from wtforms_components import If

try:
from wtforms.fields import TextField
except ImportError: # wtforms3
from wtforms.fields import StringField as TextField


class TestIfValidator(FormTestCase):
def test_only_validates_if_condition_returns_true(self):
Expand Down
6 changes: 5 additions & 1 deletion tests/test_read_only_function.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
from wtforms import Form
from wtforms.fields import TextField
from wtforms_test import FormTestCase

from tests import MultiDict
from wtforms_components import read_only

try:
from wtforms.fields import TextField
except ImportError: # wtforms3
from wtforms.fields import StringField as TextField


class TestReadOnlyFunction(FormTestCase):
def test_prevents_value_changing(self):
Expand Down
4 changes: 4 additions & 0 deletions wtforms_components/_compat.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import functools

import markupsafe

try:
from html import escape as html_escape
except ImportError:
from cgi import escape as _cgi_escape
html_escape = functools.partial(_cgi_escape, quote=True)

HTMLString = markupsafe.Markup
37 changes: 28 additions & 9 deletions wtforms_components/fields/html5.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
from wtforms.fields import html5
try:
from wtforms.fields.html5 import (
DateField,
DateTimeField,
DecimalField,
DecimalRangeField,
IntegerField,
IntegerRangeField,
SearchField
)
except ImportError: # wtforms>=3
from wtforms.fields import (
DateField,
DateTimeField,
DecimalField,
DecimalRangeField,
IntegerField,
IntegerRangeField,
SearchField
)
from wtforms.fields import StringField as _StringField

from ..widgets import (
Expand All @@ -17,15 +36,15 @@ class EmailField(_StringField):
widget = EmailInput()


class IntegerField(html5.IntegerField):
class IntegerField(IntegerField):
widget = NumberInput(step='1')


class DecimalField(html5.DecimalField):
class DecimalField(DecimalField):
widget = NumberInput(step='any')


class DateTimeLocalField(html5.DateTimeField):
class DateTimeLocalField(DateTimeField):
def __init__(
self,
label=None,
Expand All @@ -42,23 +61,23 @@ def __init__(
widget = DateTimeLocalInput()


class DateTimeField(html5.DateTimeField):
class DateTimeField(DateTimeField):
widget = DateTimeInput()


class DateField(html5.DateField):
class DateField(DateField):
widget = DateInput()


class IntegerSliderField(html5.IntegerRangeField):
class IntegerSliderField(IntegerRangeField):
widget = RangeInput(step='1')


class DecimalSliderField(html5.DecimalRangeField):
class DecimalSliderField(DecimalRangeField):
widget = RangeInput(step='any')


class SearchField(html5.SearchField):
class SearchField(SearchField):
widget = SearchInput()


Expand Down
10 changes: 10 additions & 0 deletions wtforms_components/fields/select.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from copy import copy

from wtforms import SelectField as _SelectField
from wtforms.validators import ValidationError

Expand Down Expand Up @@ -27,6 +29,14 @@ class SelectField(_SelectField):
"""
widget = SelectWidget()

def __init__(self, *args, **kwargs):
choices = kwargs.pop('choices', None)
if callable(choices):
super(SelectField, self).__init__(*args, **kwargs)
self.choices = copy(choices)
else:
super(SelectField, self).__init__(*args, choices=choices, **kwargs)

def iter_choices(self):
"""
We should update how choices are iter to make sure that value from
Expand Down
4 changes: 3 additions & 1 deletion wtforms_components/fields/select_multiple.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from wtforms.validators import ValidationError

from ..widgets import SelectWidget
from .select import SelectField

Expand Down Expand Up @@ -32,7 +34,7 @@ def pre_validate(self, form):
values = self.choice_values
for value in self.data:
if value not in values:
raise ValueError(
raise ValidationError(
self.gettext(
"'%(value)s' is not a valid"
" choice for this field"
Expand Down
9 changes: 7 additions & 2 deletions wtforms_components/fields/split_date_time.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, label=None, validators=None, separator='-', **kwargs):
**kwargs
)

def process(self, formdata, data=_unset_value):
def process(self, formdata, data=_unset_value, extra_filters=None):
if data is _unset_value:
try:
data = self.default()
Expand All @@ -40,7 +40,12 @@ def process(self, formdata, data=_unset_value):
obj.time = data.time()
else:
obj = None
FormField.process(self, formdata, data=obj)

kwargs = dict()
if extra_filters is not None:
# do not enforce extra_filters=None injection to wtforms<3
kwargs['extra_filters'] = extra_filters
FormField.process(self, formdata, data=obj, **kwargs)

def populate_obj(self, obj, name):
if hasattr(obj, name):
Expand Down
4 changes: 2 additions & 2 deletions wtforms_components/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import six
from wtforms.validators import DataRequired, NumberRange
from wtforms.widgets import html_params, HTMLString, Input
from wtforms.widgets import html_params, Input
from wtforms.widgets import Select as _Select

from ._compat import html_escape
from ._compat import html_escape, HTMLString
from .validators import DateRange, TimeRange


Expand Down

0 comments on commit 202801b

Please sign in to comment.