|
6 | 6 |
|
7 | 7 | import collections |
8 | 8 | import datetime |
9 | | -from functools import wraps |
10 | 9 | import math |
11 | 10 | import random |
12 | 11 | import re |
@@ -45,7 +44,6 @@ def accept_kwargs(func): |
45 | 44 | functions always receive kwargs from serialize, but by using this, |
46 | 45 | the original functions may simply take a single value. |
47 | 46 | """ |
48 | | - @wraps(func) |
49 | 47 | def wrapped(val, **kwargs): |
50 | 48 | """Perform a function on a value, ignoring kwargs if necessary""" |
51 | 49 | try: |
@@ -339,14 +337,19 @@ def error(self, instance, value, error_class=None, extra=''): |
339 | 337 | prefix = prefix + ' of a {cls} instance'.format( |
340 | 338 | cls=instance.__class__.__name__, |
341 | 339 | ) |
| 340 | + print_value = repr(value) |
| 341 | + if len(print_value) > 107: |
| 342 | + print_value = '{} ... {}'.format( |
| 343 | + print_value[:50], print_value[-50:] |
| 344 | + ) |
342 | 345 | message = ( |
343 | | - '{prefix} must be {info}. A value of {val!r} {vtype!r} was ' |
344 | | - 'specified. {extra}'.format( |
| 346 | + '{prefix} must be {info}. An invalid value of {val} {vtype} was ' |
| 347 | + 'specified.{extra}'.format( |
345 | 348 | prefix=prefix, |
346 | 349 | info=self.info or 'corrected', |
347 | | - val=value, |
| 350 | + val=print_value, |
348 | 351 | vtype=type(value), |
349 | | - extra=extra, |
| 352 | + extra=' {}'.format(extra) if extra else '', |
350 | 353 | ) |
351 | 354 | ) |
352 | 355 | if issubclass(error_class, ValidationError): |
@@ -732,7 +735,7 @@ def validate(self, instance, value): |
732 | 735 | try: |
733 | 736 | value = bool(value) |
734 | 737 | except ValueError: |
735 | | - self.error(instance, value) |
| 738 | + self.error(instance, value, extra='Cannot cast to boolean.') |
736 | 739 | if not isinstance(value, BOOLEAN_TYPES): |
737 | 740 | self.error(instance, value) |
738 | 741 | return value |
@@ -765,7 +768,7 @@ def _in_bounds(prop, instance, value): |
765 | 768 | (prop.min is not None and value < prop.min) or |
766 | 769 | (prop.max is not None and value > prop.max) |
767 | 770 | ): |
768 | | - prop.error(instance, value) |
| 771 | + prop.error(instance, value, extra='Not within allowed range.') |
769 | 772 |
|
770 | 773 |
|
771 | 774 | class Integer(Boolean): |
@@ -811,9 +814,13 @@ def validate(self, instance, value): |
811 | 814 | try: |
812 | 815 | intval = int(value) |
813 | 816 | if not self.cast and abs(value - intval) > TOL: |
814 | | - self.error(instance, value) |
| 817 | + self.error( |
| 818 | + instance=instance, |
| 819 | + value=value, |
| 820 | + extra='Not within tolerance range of {}.'.format(TOL), |
| 821 | + ) |
815 | 822 | except (TypeError, ValueError): |
816 | | - self.error(instance, value) |
| 823 | + self.error(instance, value, extra='Cannot cast to integer.') |
817 | 824 | _in_bounds(self, instance, intval) |
818 | 825 | return intval |
819 | 826 |
|
@@ -861,9 +868,13 @@ def validate(self, instance, value): |
861 | 868 | try: |
862 | 869 | floatval = float(value) |
863 | 870 | if not self.cast and abs(value - floatval) > TOL: |
864 | | - self.error(instance, value) |
| 871 | + self.error( |
| 872 | + instance=instance, |
| 873 | + value=value, |
| 874 | + extra='Not within tolerance range of {}.'.format(TOL), |
| 875 | + ) |
865 | 876 | except (TypeError, ValueError): |
866 | | - self.error(instance, value) |
| 877 | + self.error(instance, value, extra='Cannot cast to float.') |
867 | 878 | _in_bounds(self, instance, floatval) |
868 | 879 | return floatval |
869 | 880 |
|
@@ -907,7 +918,11 @@ def validate(self, instance, value): |
907 | 918 | abs(value.real - compval.real) > TOL or |
908 | 919 | abs(value.imag - compval.imag) > TOL |
909 | 920 | ): |
910 | | - self.error(instance, value) |
| 921 | + self.error( |
| 922 | + instance=instance, |
| 923 | + value=value, |
| 924 | + extra='Not within tolerance range of {}.'.format(TOL), |
| 925 | + ) |
911 | 926 | except (TypeError, ValueError, AttributeError): |
912 | 927 | self.error(instance, value) |
913 | 928 | return compval |
@@ -1012,7 +1027,7 @@ def validate(self, instance, value): |
1012 | 1027 | if not isinstance(value, string_types): |
1013 | 1028 | self.error(instance, value) |
1014 | 1029 | if self.regex is not None and self.regex.search(value) is None: #pylint: disable=no-member |
1015 | | - self.error(instance, value) |
| 1030 | + self.error(instance, value, extra='Regex does not match.') |
1016 | 1031 | value = value.strip(self.strip) |
1017 | 1032 | if self.change_case == 'upper': |
1018 | 1033 | value = value.upper() |
@@ -1153,7 +1168,7 @@ def validate(self, instance, value): #pyli |
1153 | 1168 | test_val = val if self.case_sensitive else [_.upper() for _ in val] |
1154 | 1169 | if test_value == test_key or test_value in test_val: |
1155 | 1170 | return key |
1156 | | - self.error(instance, value) |
| 1171 | + self.error(instance, value, extra='Not an available choice.') |
1157 | 1172 |
|
1158 | 1173 |
|
1159 | 1174 | class Color(Property): |
@@ -1226,11 +1241,19 @@ def validate(self, instance, value): |
1226 | 1241 | if isinstance(value, datetime.datetime): |
1227 | 1242 | return value |
1228 | 1243 | if not isinstance(value, string_types): |
1229 | | - self.error(instance, value) |
| 1244 | + self.error( |
| 1245 | + instance=instance, |
| 1246 | + value=value, |
| 1247 | + extra='Cannot convert non-strings to datetime.', |
| 1248 | + ) |
1230 | 1249 | try: |
1231 | 1250 | return self.from_json(value) |
1232 | 1251 | except ValueError: |
1233 | | - self.error(instance, value) |
| 1252 | + self.error( |
| 1253 | + instance=instance, |
| 1254 | + value=value, |
| 1255 | + extra='Invalid format for converting to datetime.', |
| 1256 | + ) |
1234 | 1257 |
|
1235 | 1258 | @staticmethod |
1236 | 1259 | def to_json(value, **kwargs): |
|
0 commit comments