-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add basic Validation for URITemplates
Closes #33
- Loading branch information
1 parent
942d0b8
commit 52fa015
Showing
4 changed files
with
135 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
"""Tests for the uritemplate.Validator class.""" | ||
import uritemplate | ||
from uritemplate import exceptions | ||
|
||
import pytest | ||
|
||
|
||
@pytest.mark.parametrize('template', [ | ||
'https://github.com{/user}', | ||
'https://github.com/sigmavirus24{/repository}', | ||
'{foo}', | ||
'?{bar}', | ||
'https://example.com', | ||
]) | ||
def test_valid_uris(template): | ||
"""Verify we don't raise an exception.""" | ||
urit = uritemplate.URITemplate(template) | ||
uritemplate.Validator().validate(urit) | ||
|
||
|
||
@pytest.mark.parametrize('template', [ | ||
'https://github.com{/user', | ||
'https://github.com/sigmavirus24/repository}', | ||
'{foo}}', | ||
'?{{bar}', | ||
]) | ||
def test_invalid_uris(template): | ||
"""Verify we catch invalid URITemplates.""" | ||
urit = uritemplate.URITemplate(template) | ||
with pytest.raises(exceptions.InvalidTemplate): | ||
uritemplate.Validator().validate(urit) | ||
|
||
|
||
@pytest.mark.parametrize('template', [ | ||
'https://github.com{/user', | ||
'https://github.com/sigmavirus24/repository}', | ||
'{foo}}', | ||
'?{{bar}', | ||
]) | ||
def test_allow_invalid_uris(template): | ||
"""Verify we allow invalid URITemplates.""" | ||
urit = uritemplate.URITemplate(template) | ||
uritemplate.Validator().allow_unbalanced_braces().validate(urit) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
"""Module containing all exceptions for the uritemplate module.""" | ||
|
||
|
||
class TemplateException(Exception): | ||
"""Base Exception class for all uritemplate exceptions.""" | ||
|
||
pass | ||
|
||
|
||
class InvalidTemplate(TemplateException): | ||
"""Base class for template validation.""" | ||
|
||
message = "The URI template ({}) is invalid." | ||
|
||
def __init__(self, uri, *args): | ||
"""Initialize our exception.""" | ||
super(InvalidTemplate, self).__init__(self.message.format(uri, *args)) | ||
self.uri = uri | ||
|
||
|
||
class UnbalancedBraces(InvalidTemplate): | ||
"""The template has unbalanced braces.""" | ||
|
||
message = "The URI template ({}) has more {} braces than {} braces." | ||
|
||
def __init__(self, uri, left_braces_count, right_braces_count): | ||
"""Initialize our exception.""" | ||
more, less = 'left', 'right' | ||
if left_braces_count < right_braces_count: | ||
more, less = less, more | ||
super(UnbalancedBraces, self).__init__(uri, more, less) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
"""Module containing all the validation logic for uritemplate.""" | ||
from uritemplate import exceptions as exc | ||
|
||
|
||
class Validator(object): | ||
"""Provide configurable validation of URITemplate objects. | ||
.. versionadded:: 3.1.0 | ||
.. code-block:: | ||
from uritemplate import URITemplate, Validator | ||
""" | ||
|
||
def __init__(self): | ||
"""Initialize our validator.""" | ||
self.enforcing_unbalanced_braces = True | ||
|
||
def allow_unbalanced_braces(self): | ||
"""Allow a template to have unbalanced braces. | ||
.. versionadded:: 3.1.0 | ||
Returns the validator instance. | ||
""" | ||
self.enforcing_unbalanced_braces = False | ||
return self | ||
|
||
def force_balanced_braces(self): | ||
"""Force a template to have balanced braces. | ||
.. versionadded:: 3.1.0 | ||
Returns the validator instance. | ||
""" | ||
self.enforcing_unbalanced_braces = True | ||
return self | ||
|
||
def validate(self, template): | ||
"""Validate that a template meets the parameters. | ||
.. versionadded:: 3.1.0 | ||
:raises: uritemplate.exceptions.InvalidTemplate | ||
:raises: uritemplate.exceptions.UnbalancedBraces | ||
""" | ||
if self.enforcing_unbalanced_braces: | ||
_enforce_balanced_braces(template) | ||
|
||
|
||
def _enforce_balanced_braces(template): | ||
uri = template.uri | ||
left_braces = uri.count('{') | ||
right_braces = uri.count('}') | ||
if left_braces != right_braces: | ||
raise exc.UnbalancedBraces(uri, left_braces, right_braces) |