Skip to content

Commit f6da05b

Browse files
Merge branch 'develop'
2 parents f9abbdb + a9dc190 commit f6da05b

41 files changed

Lines changed: 394 additions & 744 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ parser.out
66
parsetab.py
77
*.pyc
88
*.egg-info/
9-
.mypy_cache
9+
.mypy_cache
10+
*.ipynb

sifter/commands/discard.py

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,18 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
4-
Optional,
5-
List,
6-
Union,
7-
SupportsInt,
8-
Text
3+
Optional
94
)
105

116
from sifter.grammar.actions import Actions
127
from sifter.grammar.state import EvaluationState
138
from sifter.grammar.command import Command
14-
from sifter.grammar.command_list import CommandList
15-
16-
if TYPE_CHECKING:
17-
from sifter.grammar.tag import Tag as TagGrammar
18-
from sifter.grammar.string import String
19-
from sifter.grammar.test import Test
20-
21-
__all__ = ('CommandDiscard',)
229

2310

2411
# section 4.4
2512
class CommandDiscard(Command):
2613

2714
RULE_IDENTIFIER = 'DISCARD'
2815

29-
def __init__(
30-
self,
31-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
32-
tests: Optional[List['Test']] = None,
33-
block: Optional[CommandList] = None
34-
) -> None:
35-
super(CommandDiscard, self).__init__(arguments, tests, block)
36-
self.validate_arguments()
37-
self.validate_tests_size(0)
38-
self.validate_block_size(0)
39-
4016
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
4117
state.actions.cancel_implicit_keep()
4218
return None

sifter/commands/fileinto.py

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,25 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
4-
List,
5-
Optional,
6-
Union,
7-
SupportsInt,
8-
Text
3+
Optional
94
)
105

116
from sifter.grammar.command import Command
12-
from sifter.grammar.command_list import CommandList
137
from sifter.validators.stringlist import StringList
148
from sifter.grammar.state import EvaluationState
159
from sifter.grammar.actions import Actions
1610

17-
if TYPE_CHECKING:
18-
from sifter.grammar.tag import Tag as TagGrammar
19-
from sifter.grammar.string import String
20-
from sifter.grammar.test import Test
21-
22-
__all__ = ('CommandFileInto',)
23-
2411

2512
# section 4.1
2613
class CommandFileInto(Command):
2714

2815
RULE_IDENTIFIER = 'FILEINTO'
29-
30-
def __init__(
31-
self,
32-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
33-
tests: Optional[List['Test']] = None,
34-
block: Optional[CommandList] = None
35-
) -> None:
36-
super(CommandFileInto, self).__init__(arguments, tests, block)
37-
_, positional_args = self.validate_arguments(
38-
{},
39-
[StringList(length=1), ],
40-
)
41-
self.validate_tests_size(0)
42-
self.validate_block_size(0)
43-
self.file_dest = positional_args[0]
16+
POSITIONAL_ARGS = [StringList(length=1)]
4417

4518
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
19+
file_dest = self.positional_args[0]
20+
4621
state.check_required_extension('fileinto', 'FILEINTO')
47-
state.actions.append('fileinto', self.file_dest) # type: ignore
22+
state.actions.append('fileinto', file_dest) # type: ignore
4823
state.actions.cancel_implicit_keep()
4924
return None
5025

sifter/commands/if_cmd.py

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,18 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
4-
List,
5-
Optional,
6-
Union,
7-
SupportsInt,
8-
Text
3+
Optional
94
)
105

116
from sifter.grammar.command import Command
12-
from sifter.grammar.command_list import CommandList
137
from sifter.grammar.state import EvaluationState
148
from sifter.grammar.actions import Actions
159

16-
if TYPE_CHECKING:
17-
from sifter.grammar.tag import Tag as TagGrammar
18-
from sifter.grammar.string import String
19-
from sifter.grammar.test import Test
20-
21-
__all__ = ('CommandIf', 'CommandElsIf', 'CommandElse',)
22-
2310

2411
# section 3.1
2512
class CommandIfBase(Command):
2613

27-
def __init__(
28-
self,
29-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
30-
tests: Optional[List['Test']] = None,
31-
block: Optional[CommandList] = None
32-
) -> None:
33-
super(CommandIfBase, self).__init__(arguments, tests, block)
34-
self.validate_arguments()
35-
self.validate_tests_size(1)
14+
TESTS_MIN = 1
15+
HAS_BLOCKS = False
3616

3717
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
3818
if self.tests[0].evaluate(message, state):
@@ -58,7 +38,7 @@ class CommandElsIf(CommandIfBase):
5838
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
5939
if state.last_if:
6040
return None
61-
return super(CommandElsIf, self).evaluate(message, state)
41+
return super().evaluate(message, state)
6242

6343

6444
CommandElsIf.register()
@@ -67,16 +47,8 @@ def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions
6747
class CommandElse(Command):
6848

6949
RULE_IDENTIFIER = 'ELSE'
70-
71-
def __init__(
72-
self,
73-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
74-
tests: Optional[List['Test']] = None,
75-
block: Optional[CommandList] = None
76-
) -> None:
77-
super(CommandElse, self).__init__(arguments, tests, block)
78-
self.validate_arguments()
79-
self.validate_tests_size(0)
50+
TESTS_MIN = 0
51+
HAS_BLOCKS = False
8052

8153
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
8254
if state.last_if:

sifter/commands/keep.py

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,18 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
4-
List,
5-
Optional,
6-
Union,
7-
SupportsInt,
8-
Text
3+
Optional
94
)
105

116
from sifter.grammar.command import Command
12-
from sifter.grammar.command_list import CommandList
137
from sifter.grammar.state import EvaluationState
148
from sifter.grammar.actions import Actions
159

16-
if TYPE_CHECKING:
17-
from sifter.grammar.tag import Tag as TagGrammar
18-
from sifter.grammar.string import String
19-
from sifter.grammar.test import Test
20-
21-
22-
__all__ = ('CommandKeep',)
23-
2410

2511
# section 4.3
2612
class CommandKeep(Command):
2713

2814
RULE_IDENTIFIER = 'KEEP'
29-
30-
def __init__(
31-
self,
32-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
33-
tests: Optional[List['Test']] = None,
34-
block: Optional[CommandList] = None
35-
) -> None:
36-
super(CommandKeep, self).__init__(arguments, tests, block)
37-
self.validate_arguments()
38-
self.validate_tests_size(0)
39-
self.validate_block_size(0)
15+
HAS_BLOCKS = False
4016

4117
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
4218
state.actions.append('keep')

sifter/commands/redirect.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,22 @@
2121
from sifter.grammar.string import String
2222
from sifter.grammar.test import Test
2323

24-
__all__ = ('CommandRedirect',)
25-
2624

2725
# section 4.2
2826
class CommandRedirect(Command):
2927

3028
RULE_IDENTIFIER = 'REDIRECT'
29+
POSITIONAL_ARGS = [StringList(length=1)]
3130

3231
def __init__(
3332
self,
3433
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
3534
tests: Optional[List['Test']] = None,
3635
block: Optional[CommandList] = None
3736
) -> None:
38-
super(CommandRedirect, self).__init__(arguments, tests, block)
39-
_, positional_args = self.validate_arguments(
40-
{},
41-
[StringList(length=1), ],
42-
)
43-
self.validate_tests_size(0)
44-
self.validate_block_size(0)
45-
if not isinstance(positional_args, list):
46-
raise ValueError("CommandRedirect positional argument error")
47-
if not isinstance(positional_args[0], list):
48-
raise ValueError("CommandRedirect positional argument error")
49-
self.email_address = positional_args[0][0]
37+
super().__init__(arguments, tests, block)
38+
39+
self.email_address = self.positional_args[0][0] # type: ignore
5040
# TODO: section 2.4.2.3 constrains the email address to a limited
5141
# subset of valid address formats. need to check if python's
5242
# email.utils also uses this subset or if we need to do our own

sifter/commands/require.py

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,26 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
43
Text,
5-
List,
6-
Optional,
7-
Union,
8-
SupportsInt
4+
Optional
95
)
106

117
from sifter.grammar.command import Command
12-
from sifter.grammar.command_list import CommandList
138
import sifter.grammar
149
import sifter.handler
1510
from sifter.validators.stringlist import StringList
1611
from sifter.grammar.state import EvaluationState
1712
from sifter.grammar.actions import Actions
1813

19-
if TYPE_CHECKING:
20-
from sifter.grammar.tag import Tag as TagGrammar
21-
from sifter.grammar.string import String
22-
from sifter.grammar.test import Test
23-
24-
__all__ = ('CommandRequire',)
25-
2614

2715
# section 3.2
2816
class CommandRequire(Command):
2917

3018
RULE_IDENTIFIER: Text = 'REQUIRE'
31-
32-
def __init__(
33-
self,
34-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
35-
tests: Optional[List['Test']] = None,
36-
block: Optional[CommandList] = None
37-
) -> None:
38-
super(CommandRequire, self).__init__(arguments, tests, block)
39-
_, positional_args = self.validate_arguments(
40-
{},
41-
[StringList(), ],
42-
)
43-
self.validate_tests_size(0)
44-
self.validate_block_size(0)
45-
self.ext_names = positional_args[0]
19+
POSITIONAL_ARGS = [StringList()]
4620

4721
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
48-
if not isinstance(self.ext_names, list):
49-
raise ValueError("CommandRequire.ext_names must be a list!")
50-
for ext_name in self.ext_names:
22+
ext_name_list = self.positional_args[0]
23+
for ext_name in ext_name_list: # type: ignore
5124
if not sifter.handler.get('extension', ext_name):
5225
raise RuntimeError(
5326
"Required extension '%s' not supported"

sifter/commands/stop.py

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,18 @@
11
from email.message import Message
22
from typing import (
3-
TYPE_CHECKING,
4-
Optional,
5-
List,
6-
Union,
7-
SupportsInt,
8-
Text
3+
Optional
94
)
105

116
from sifter.grammar.command import Command
12-
from sifter.grammar.command_list import CommandList
137
from sifter.grammar.state import EvaluationState
148
from sifter.grammar.actions import Actions
159

16-
if TYPE_CHECKING:
17-
from sifter.grammar.tag import Tag as TagGrammar
18-
from sifter.grammar.string import String
19-
from sifter.grammar.test import Test
20-
21-
__all__ = ('CommandStop',)
22-
2310

2411
# section 3.3
2512
class CommandStop(Command):
2613

2714
RULE_IDENTIFIER = 'STOP'
2815

29-
def __init__(
30-
self,
31-
arguments: Optional[List[Union['TagGrammar', SupportsInt, List[Union[Text, 'String']]]]] = None,
32-
tests: Optional[List['Test']] = None,
33-
block: Optional[CommandList] = None
34-
) -> None:
35-
super(CommandStop, self).__init__(arguments, tests, block)
36-
self.validate_arguments()
37-
self.validate_tests_size(0)
38-
self.validate_block_size(0)
39-
4016
def evaluate(self, message: Message, state: EvaluationState) -> Optional[Actions]:
4117
state.actions.append('stop')
4218
return None

sifter/comparator.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
from sifter.grammar.tag import Tag
1616
from sifter.grammar.state import EvaluationState
1717

18-
__all__ = ('register', 'get_match_fn',)
19-
2018

2119
def register(comparator_name: Optional[Text], comparator_cls: Type['Comparator']) -> None:
2220
sifter.handler.register('comparator', comparator_name, comparator_cls)

sifter/comparators/ascii_casemap.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
maketrans = str.maketrans
55

6-
__all__ = ('ComparatorASCIICasemap',)
7-
86

97
class ComparatorASCIICasemap(ComparatorOctet):
108

0 commit comments

Comments
 (0)