Skip to content

Commit f779617

Browse files
moved ExtensionRegistry to extensions module
1 parent bdb379d commit f779617

10 files changed

Lines changed: 68 additions & 80 deletions

File tree

sifter/commands/require.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
)
66

77
from sifter.grammar.command import Command
8-
import sifter.grammar
9-
import sifter.handler
8+
from sifter.extensions import ExtensionRegistry
109
from sifter.validators.stringlist import StringList
1110
from sifter.grammar.state import EvaluationState
1211
from sifter.grammar.actions import Actions
@@ -21,7 +20,7 @@ class CommandRequire(Command):
2120
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
2221
ext_name_list = self.positional_args[0]
2322
for ext_name in ext_name_list: # type: ignore
24-
if not sifter.handler.ExtensionRegistry.get('extension', ext_name):
23+
if not ExtensionRegistry.get('extension', ext_name):
2524
raise RuntimeError(
2625
"Required extension '%s' not supported"
2726
% ext_name

sifter/comparator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Union
88
)
99

10-
import sifter.handler
10+
from sifter.extensions import ExtensionRegistry
1111

1212
if TYPE_CHECKING:
1313
from sifter.grammar.tag import Tag
@@ -31,7 +31,7 @@ def get_match_fn(
3131
match_type = 'IS'
3232

3333
# TODO: support wildcard matching in comparator names (RFC 4790)
34-
cmp_handler = sifter.handler.ExtensionRegistry.get('comparator', comparator)
34+
cmp_handler = ExtensionRegistry.get('comparator', comparator)
3535
if not cmp_handler:
3636
raise RuntimeError("Comparator not supported: %s" % comparator)
3737

sifter/extension.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

sifter/extensions/__init__.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from typing import (
2+
TYPE_CHECKING,
3+
Dict,
4+
Text,
5+
Optional,
6+
Union,
7+
Type
8+
)
9+
import pkg_resources
10+
11+
if TYPE_CHECKING:
12+
from sifter.grammar.rule import Rule
13+
from sifter.grammar.comparator import Comparator
14+
15+
16+
class ExtensionRegistry():
17+
18+
_HANDLERS_MAP: Dict[Text, Dict[Text, Union[bool, Type['Comparator'], Type['Rule']]]] = {}
19+
DEFAULT_EXTENSION = [
20+
'regex',
21+
'comparator-i;ascii-casemap',
22+
'comparator-i;octet',
23+
'fileinto',
24+
]
25+
26+
def __init__(self) -> None:
27+
for extension_name in self.DEFAULT_EXTENSION:
28+
self.register_extension(extension_name)
29+
30+
for entry_point in pkg_resources.iter_entry_points('sifter_extensions'):
31+
self.register_handler(entry_point.load())
32+
33+
@classmethod
34+
def register_extension(cls, extension_name):
35+
cls.register('extension', extension_name, True)
36+
37+
@classmethod
38+
def register_handler(cls, ext_cls):
39+
cls.register(ext_cls.handler_type(), ext_cls.handler_id(), ext_cls)
40+
41+
@classmethod
42+
def register(
43+
cls,
44+
handler_type: Optional[Text],
45+
handler_id: Optional[Text],
46+
value: Union[bool, Type['Comparator'], Type['Rule']]
47+
) -> None:
48+
cls._HANDLERS_MAP.setdefault(handler_type, {})[handler_id] = value
49+
50+
@classmethod
51+
def unregister(cls, handler_type: Text, handler_id: Text) -> Optional[Union[bool, Type['Comparator'], Type['Rule']]]:
52+
return cls._HANDLERS_MAP.get(handler_type, {}).pop(handler_id, None)
53+
54+
@classmethod
55+
def get(cls, handler_type: Text, handler_id: Text) -> Optional[Union[bool, Type['Comparator'], Type['Rule']]]:
56+
return cls._HANDLERS_MAP.get(handler_type, {}).get(handler_id, None)

sifter/grammar/grammar.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@
1313

1414
import ply.yacc # type: ignore
1515

16-
import sifter.grammar
1716
from sifter.grammar.tag import Tag
1817
from sifter.grammar.command_list import CommandList
1918
from sifter.grammar.string import String
20-
import sifter.handler
2119
from sifter.grammar.lexer import SieveLexer
22-
from sifter.handler import ExtensionRegistry
20+
from sifter.extensions import ExtensionRegistry
2321

2422
if TYPE_CHECKING:
2523
from py.yacc import LRParser, YaccProduction # type: ignore
@@ -79,7 +77,7 @@ def p_command(self, p: 'YaccProduction') -> None:
7977
block = None
8078
if p[3] != ';':
8179
block = p[3]
82-
handler = sifter.handler.ExtensionRegistry.get('command', p[1])
80+
handler = ExtensionRegistry.get('command', p[1])
8381
if handler is None:
8482
print("No handler registered for command '%s' on line %d" % (p[1], p.lineno(1)))
8583
raise SyntaxError
@@ -136,7 +134,7 @@ def p_test(self, p: 'YaccProduction') -> None:
136134
"""test : IDENTIFIER arguments"""
137135
# print("TEST:", p[1], p[2])
138136
tests = p[2].get('tests')
139-
handler = sifter.handler.ExtensionRegistry.get('test', p[1])
137+
handler = ExtensionRegistry.get('test', p[1])
140138
if handler is None:
141139
print("No handler registered for test '%s' on line %d" % (p[1], p.lineno(1)))
142140
raise SyntaxError

sifter/grammar/rule.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from sifter.grammar.tag import Tag
1313
from sifter.grammar.validator import Validator
1414
import sifter.grammar
15-
import sifter.handler
1615
import sifter.utils
1716

1817
if TYPE_CHECKING:

sifter/handler.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

sifter/validators/tag.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
from sifter.grammar.rule import RuleSyntaxError
1313
from sifter.grammar import tag
1414
from sifter.validators.stringlist import StringList
15-
import sifter.handler
16-
import sifter.validators
15+
from sifter.extensions import ExtensionRegistry
1716

1817
if TYPE_CHECKING:
1918
from sifter.grammar.tag import Tag as TagGrammar
@@ -98,7 +97,7 @@ def validate(
9897
"'%s' comparator is unknown/unsupported"
9998
% arg_list[starting_index + 1]
10099
)
101-
if not sifter.handler.ExtensionRegistry.get(
100+
if not ExtensionRegistry.get(
102101
'comparator',
103102
val[0],
104103
):

tests/test_comparators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pytest
44

5-
import sifter.handler
5+
from sifter.extensions import ExtensionRegistry
66
import sifter.comparator
77
from sifter.grammar.comparator import Comparator
88

@@ -11,6 +11,6 @@ def test_mock_comparator() -> None:
1111
class MockComparator(Comparator):
1212
COMPARATOR_ID = 'i;vnd-mock'
1313

14-
sifter.handler.ExtensionRegistry.register_handler(MockComparator)
14+
ExtensionRegistry.register_handler(MockComparator)
1515
with pytest.raises(RuntimeError):
1616
sifter.comparator.get_match_fn('i;vnd-mock', 'IS')

tests/test_grammar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pytest
44

5-
from sifter.handler import ExtensionRegistry
5+
from sifter.extensions import ExtensionRegistry
66
from sifter.grammar.state import EvaluationState
77

88

0 commit comments

Comments
 (0)