|
134 | 134 | TIMEDELTA_REGEX = re.compile(r'((?P<days>\d+) days?, )?(?P<hours>\d+):'
|
135 | 135 | r'(?P<minutes>\d+):(?P<seconds>\d+(\.\d+)?)')
|
136 | 136 |
|
| 137 | +MIME_TYPE_REGEX = re.compile(r"^multipart|[-\w.]+/[-\w.\+]+$") |
| 138 | + |
137 | 139 | # pylint: disable=W0613
|
138 | 140 |
|
139 | 141 | ## CORE
|
@@ -2805,3 +2807,48 @@ def mac_address(value,
|
2805 | 2807 | 'address' % value)
|
2806 | 2808 |
|
2807 | 2809 | return value
|
| 2810 | + |
| 2811 | + |
| 2812 | +@disable_on_env |
| 2813 | +def mimetype(value, |
| 2814 | + allow_empty = False, |
| 2815 | + **kwargs): |
| 2816 | + """Validate that ``value`` is a valid MIME-type. |
| 2817 | +
|
| 2818 | + :param value: The value to validate. |
| 2819 | + :type value: :class:`str <python:str>` |
| 2820 | +
|
| 2821 | + :param allow_empty: If ``True``, returns :obj:`None <python:None>` if |
| 2822 | + ``value`` is empty. If ``False``, raises a |
| 2823 | + :class:`EmptyValueError <validator_collection.errors.EmptyValueError>` |
| 2824 | + if ``value`` is empty. Defaults to ``False``. |
| 2825 | + :type allow_empty: :class:`bool <python:bool>` |
| 2826 | +
|
| 2827 | + :returns: ``value`` / :obj:`None <python:None>` |
| 2828 | + :rtype: :class:`str <python:str>` / :obj:`None <python:None>` |
| 2829 | +
|
| 2830 | + :raises EmptyValueError: if ``value`` is empty and ``allow_empty`` is ``False`` |
| 2831 | + :raises CannotCoerceError: if ``value`` is not a valid string |
| 2832 | + :raises InvalidMimetypeError: if ``value`` is neither a valid MIME type nor empty |
| 2833 | + with ``allow_empty`` set to ``True`` |
| 2834 | +
|
| 2835 | + """ |
| 2836 | + if not value and not allow_empty: |
| 2837 | + raise errors.EmptyValueError('value (%s) was empty' % value) |
| 2838 | + elif not value: |
| 2839 | + return None |
| 2840 | + |
| 2841 | + if not isinstance(value, basestring): |
| 2842 | + raise errors.CannotCoerceError('value must be a valid string, ' |
| 2843 | + 'was %s' % type(value)) |
| 2844 | + |
| 2845 | + value = value.lower().strip() |
| 2846 | + |
| 2847 | + is_valid = MIME_TYPE_REGEX.fullmatch(value) |
| 2848 | + |
| 2849 | + if not is_valid: |
| 2850 | + raise errors.InvalidMimeTypeError( |
| 2851 | + 'value (%s) is not a valid MIME Type' % value |
| 2852 | + ) |
| 2853 | + |
| 2854 | + return value |
0 commit comments