diff --git a/.gitignore b/.gitignore index c416b0f..afcc3fc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ pip-log.txt .cache .coverage .tox +.venv nosetests.xml htmlcov diff --git a/Makefile b/Makefile index 48f003b..e6a0c81 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,9 @@ check: lint clean-build clean-pyc clean-test test release: clean python setup.py sdist upload + python setup.py bdist_wheel upload dist: clean python setup.py sdist + python setup.py bdist_wheel ls -l dist diff --git a/setup.py b/setup.py index ca42ade..86c6266 100644 --- a/setup.py +++ b/setup.py @@ -23,8 +23,8 @@ def read(fname): ] test_requirements = ( - read('requirements.txt').splitlines() - + read('requirements-dev.txt').splitlines()[1:] + read('requirements.txt').splitlines() + + read('requirements-dev.txt').splitlines()[1:] ) setup( diff --git a/tests/backends/test_sqlalchemy.py b/tests/backends/test_sqlalchemy.py index ab18ad3..a2ccd3a 100644 --- a/tests/backends/test_sqlalchemy.py +++ b/tests/backends/test_sqlalchemy.py @@ -67,7 +67,8 @@ def test_filter(self, alchemy_db): filtered = backend.filter() - assert six.text_type(filtered) == ( + sql = six.text_type(filtered) + assert sql == ( 'SELECT one_to_one_place.id AS one_to_one_place_id, ' 'one_to_one_place.name AS one_to_one_place_name, ' 'one_to_one_place.address AS one_to_one_place_address \n' @@ -76,7 +77,7 @@ def test_filter(self, alchemy_db): 'ON one_to_one_restaurant.place_id = one_to_one_place.id ' 'JOIN one_to_one_waiter ' 'ON one_to_one_waiter.restaurant_id = one_to_one_restaurant.place_id ' - '\nWHERE one_to_one_waiter.name = :name_1' + '\nWHERE one_to_one_waiter.name ={}'.format(sql.rsplit('=', 1)[-1]) ) def _test_build_clause(self, alchemy_db, name, lookup, value, expected, is_negated=False): diff --git a/url_filter/filtersets/base.py b/url_filter/filtersets/base.py index 4c062a7..b0b55a5 100644 --- a/url_filter/filtersets/base.py +++ b/url_filter/filtersets/base.py @@ -61,6 +61,7 @@ class FilterKeyValidator(RegexValidator): 'It must be `name[__]*[__][!]`.' ) + filter_key_validator = FilterKeyValidator() diff --git a/url_filter/filtersets/sqlalchemy.py b/url_filter/filtersets/sqlalchemy.py index 5d31484..f0e47fa 100644 --- a/url_filter/filtersets/sqlalchemy.py +++ b/url_filter/filtersets/sqlalchemy.py @@ -35,15 +35,17 @@ __all__ = ['SQLAlchemyModelFilterSet'] -_STRING = lambda field, column: forms.CharField(max_length=column.type.length) +def _string(field, column): + return forms.CharField(max_length=column.type.length) + SQLALCHEMY_FIELD_MAPPING = SubClassDict({ BIGINT: forms.IntegerField, BigInteger: forms.IntegerField, Integer: forms.IntegerField, Boolean: partial(forms.BooleanField, required=False), - CHAR: _STRING, - CLOB: _STRING, + CHAR: _string, + CLOB: _string, DATE: forms.DateTimeField, Date: forms.DateField, DateTime: forms.DateTimeField, @@ -52,9 +54,9 @@ INTEGER: forms.IntegerField, Numeric: forms.IntegerField, SMALLINT: forms.IntegerField, - String: _STRING, + String: _string, TIMESTAMP: forms.DateTimeField, - VARCHAR: _STRING, + VARCHAR: _string, }) diff --git a/url_filter/validators.py b/url_filter/validators.py index 9f50f52..89630cd 100644 --- a/url_filter/validators.py +++ b/url_filter/validators.py @@ -14,8 +14,6 @@ class MinLengthValidator(_MinLengthValidator): """ Customer Django min length validator with better-suited error message """ - compare = lambda self, a, b: a < b - clean = lambda self, x: len(x) code = 'min_length' message = ungettext_lazy( 'Ensure this value has at least %(limit_value)d items (it has %(show_value)d).', @@ -23,17 +21,27 @@ class MinLengthValidator(_MinLengthValidator): 'limit_value' ) + def compare(self, a, b): + return a < b + + def clean(self, x): + return len(x) + @deconstructible class MaxLengthValidator(_MaxLengthValidator): """ Customer Django max length validator with better-suited error message """ - compare = lambda self, a, b: a > b - clean = lambda self, x: len(x) code = 'max_length' message = ungettext_lazy( 'Ensure this value has at most %(limit_value)d items (it has %(show_value)d).', 'Ensure this value has at most %(limit_value)d items (it has %(show_value)d).', 'limit_value' ) + + def compare(self, a, b): + return a > b + + def clean(self, x): + return len(x)