summaryrefslogtreecommitdiff
path: root/src/flake8/plugins/notifier.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/flake8/plugins/notifier.py')
-rw-r--r--src/flake8/plugins/notifier.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/flake8/plugins/notifier.py b/src/flake8/plugins/notifier.py
new file mode 100644
index 0000000..dc255c4
--- /dev/null
+++ b/src/flake8/plugins/notifier.py
@@ -0,0 +1,46 @@
+"""Implementation of the class that registers and notifies listeners."""
+from flake8.plugins import _trie
+
+
+class Notifier(object):
+ """Object that tracks and notifies listener objects."""
+
+ def __init__(self):
+ """Initialize an empty notifier object."""
+ self.listeners = _trie.Trie()
+
+ def listeners_for(self, error_code):
+ """Retrieve listeners for an error_code.
+
+ There may be listeners registered for E1, E100, E101, E110, E112, and
+ E126. To get all the listeners for one of E100, E101, E110, E112, or
+ E126 you would also need to incorporate the listeners for E1 (since
+ they're all in the same class).
+
+ Example usage:
+
+ .. code-block:: python
+
+ from flake8 import notifier
+
+ n = notifier.Notifier()
+ # register listeners
+ for listener in n.listeners_for('W102'):
+ listener.notify(...)
+ """
+ path = error_code
+ while path:
+ node = self.listeners.find(path)
+ listeners = getattr(node, 'data', [])
+ for listener in listeners:
+ yield listener
+ path = path[:-1]
+
+ def notify(self, error_code, *args, **kwargs):
+ """Notify all listeners for the specified error code."""
+ for listener in self.listeners_for(error_code):
+ listener.notify(error_code, *args, **kwargs)
+
+ def register_listener(self, error_code, listener):
+ """Register a listener for a specific error_code."""
+ self.listeners.add(error_code, listener)