-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
13 changed files
with
169 additions
and
12 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
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
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
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
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
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,41 @@ | ||
from collections import Counter | ||
from typing import Dict, List | ||
|
||
from dotenv_linter.violations.base import BaseViolation | ||
|
||
|
||
def test_all_unique_violation_codes( | ||
all_violations: List[BaseViolation], | ||
) -> None: | ||
"""Ensures that all violations have unique violation codes.""" | ||
codes = [int(violation.code) for violation in all_violations] | ||
|
||
assert len(set(codes)) == len(all_violations) | ||
|
||
|
||
def test_all_violations_are_final(all_violations: List[BaseViolation]) -> None: | ||
"""Ensures that all violations are final.""" | ||
for violation_type in all_violations: | ||
assert getattr(violation_type, '__final__', False), violation_type | ||
|
||
|
||
def test_all_unique_violation_messages( | ||
all_violations: List[BaseViolation], | ||
) -> None: | ||
"""Ensures that all violations have unique violation messages.""" | ||
messages = Counter([ | ||
violation.error_template for violation in all_violations | ||
]) | ||
for message, count in messages.items(): | ||
assert count == 1, message | ||
|
||
|
||
def test_no_holes(all_violation_codes: Dict) -> None: | ||
"""Ensures that there are no off-by-one errors.""" | ||
for module_codes in all_violation_codes.values(): | ||
previous_code = None | ||
for code in sorted(module_codes.keys()): | ||
if previous_code is not None: | ||
diff = code - previous_code | ||
assert diff == 1 or diff > 2, module_codes[code].__qualname__ | ||
previous_code = code |
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,41 @@ | ||
import inspect | ||
import re | ||
from types import ModuleType | ||
from typing import Dict, List, Tuple | ||
|
||
from dotenv_linter.violations.base import BaseViolation | ||
|
||
|
||
def _get_sorted_classes( | ||
classes: List[BaseViolation], | ||
) -> Tuple[List[BaseViolation], List[BaseViolation]]: | ||
sorted_by_code = sorted(classes, key=lambda cl: cl.code) | ||
sorted_by_source = sorted( | ||
classes, | ||
key=lambda cl: inspect.findsource(cl)[1], | ||
) | ||
|
||
return sorted_by_code, sorted_by_source | ||
|
||
|
||
def test_violation_source_order( | ||
all_module_violations: Dict[ModuleType, List[BaseViolation]], | ||
) -> None: | ||
"""Used to force violations order inside the source code.""" | ||
for _, classes in all_module_violations.items(): | ||
sorted_by_code, sorted_by_source = _get_sorted_classes(classes) | ||
|
||
assert sorted_by_code == sorted_by_source | ||
|
||
|
||
def test_violation_autoclass_order( | ||
all_module_violations: Dict[ModuleType, List[BaseViolation]], | ||
) -> None: | ||
"""Used to force violations order inside the `autoclass` directives.""" | ||
for module, classes in all_module_violations.items(): | ||
sorted_by_code, _ = _get_sorted_classes(classes) | ||
pattern = re.compile(r'\.\.\sautoclass::\s(\w+)') | ||
sorted_by_autoclass = pattern.findall(module.__doc__) | ||
sorted_by_code = [cl.__qualname__ for cl in sorted_by_code] | ||
|
||
assert sorted_by_code == sorted_by_autoclass |
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,47 @@ | ||
from types import ModuleType | ||
from typing import Dict, List | ||
|
||
from dotenv_linter.violations.base import BaseViolation | ||
|
||
|
||
def test_all_violations_are_documented( | ||
all_module_violations: Dict[ModuleType, List[BaseViolation]], | ||
) -> None: | ||
"""Ensures that all violations are documented.""" | ||
for module, classes in all_module_violations.items(): | ||
for violation_class in classes: | ||
# Once per `autoclass` | ||
assert module.__doc__.count(violation_class.__qualname__) == 1 | ||
|
||
|
||
def test_all_violations_have_versionadded( | ||
all_violations: List[BaseViolation], | ||
) -> None: | ||
"""Ensures that all violations have `versionadded` tag.""" | ||
for violation in all_violations: | ||
assert '.. versionadded:: ' in violation.__doc__ | ||
|
||
|
||
def test_violation_name(all_violations: List[BaseViolation]) -> None: | ||
"""Ensures that all violations have `Violation` suffix.""" | ||
for violation in all_violations: | ||
class_name = violation.__qualname__ | ||
assert class_name.endswith('Violation'), class_name | ||
|
||
|
||
def test_violation_template_ending(all_violations: List[BaseViolation]) -> None: | ||
"""Ensures that all violation templates do not end with a dot.""" | ||
for violation in all_violations: | ||
assert not violation.error_template.endswith('.'), violation | ||
|
||
|
||
def test_previous_codes_versionchanged( | ||
all_violations: List[BaseViolation], | ||
) -> None: | ||
"""Tests that we put both in case violation changes.""" | ||
for violation in all_violations: | ||
previous_codes = getattr(violation, 'previous_codes', None) | ||
if previous_codes is not None: | ||
assert violation.__doc__.count( | ||
'.. versionchanged::', | ||
) >= len(violation.previous_codes) |