# tests/integration/test_no_applications_variable_usage.py import os import re import unittest class TestNoApplicationsVariableUsage(unittest.TestCase): """ This test ensures that the pattern `applications[some_variable]` is not used anywhere under the roles/ directory. Instead, the usage of get_app_conf should be preferred. """ APPLICATIONS_VARIABLE_PATTERN = re.compile(r"applications\[\s*[a-zA-Z_][a-zA-Z0-9_]*\s*\]") def test_no_applications_variable_usage(self): roles_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'roles')) found = [] for root, dirs, files in os.walk(roles_dir): # Skip __pycache__ folders dirs[:] = [d for d in dirs if d != '__pycache__'] for file in files: if file.endswith('.pyc'): continue file_path = os.path.join(root, file) # Skip this test file itself (so it can contain the pattern in docstrings) if os.path.abspath(file_path) == os.path.abspath(__file__): continue try: with open(file_path, 'r', encoding='utf-8') as f: for lineno, line in enumerate(f, 1): match = self.APPLICATIONS_VARIABLE_PATTERN.search(line) if match: found.append(f"{file_path}:{lineno}: {line.strip()}") except Exception: # Binary or unreadable file, skip continue if found: self.fail( "Found illegal usages of 'applications[variable]' in the following locations:\n" + "\n".join(found) + "\n\nPlease use get_app_conf instead." ) if __name__ == '__main__': unittest.main()