1+ from email .message import Message
2+ from typing import (
3+ Any ,
4+ Dict ,
5+ Text ,
6+ Optional ,
7+ List ,
8+ Tuple
9+ )
10+
11+ from sifter .grammar .tag import Tag
12+ from sifter .grammar .state import EvaluationState
13+ from sifter .grammar .validator import Validator
114import sifter .grammar
215import sifter .handler
316import sifter .utils
@@ -11,6 +24,9 @@ class RuleSyntaxError(Exception):
1124
1225class Rule (object ):
1326
27+ RULE_TYPE : Optional [Text ] = None
28+ RULE_IDENTIFIER : Optional [Text ] = None
29+
1430 @classmethod
1531 def register (cls ) -> None :
1632 try :
@@ -20,7 +36,7 @@ def register(cls) -> None:
2036 # only on subclasses that implement specific rules
2137 raise NotImplementedError
2238
23- def __init__ (self , arguments = None , tests = None ):
39+ def __init__ (self , arguments : Optional [ List [ Any ]] = None , tests : Optional [ List [ Any ]] = None ) -> None :
2440 if arguments is None :
2541 self .arguments = []
2642 else :
@@ -30,7 +46,7 @@ def __init__(self, arguments=None, tests=None):
3046 else :
3147 self .tests = tests
3248
33- def __str__ (self ):
49+ def __str__ (self ) -> Text :
3450 s = ["%s" % self .RULE_IDENTIFIER , ]
3551 for arg in self .arguments :
3652 s .append (" %s" % arg )
@@ -39,7 +55,11 @@ def __str__(self):
3955 s .append ("(\n %s)\n " % sifter .utils .indent_string (str (test ), 2 ))
4056 return '' .join (s )
4157
42- def validate_arguments (self , tagged_args = None , positional_args = None ):
58+ def validate_arguments (
59+ self ,
60+ tagged_args : Optional [Dict [Any , Any ]] = None ,
61+ positional_args : Optional [List [Validator ]] = None
62+ ) -> Tuple [Dict [Any , Any ], List [Any ]]:
4363 if tagged_args is None :
4464 tagged_args = {}
4565 if positional_args is None :
@@ -48,7 +68,7 @@ def validate_arguments(self, tagged_args=None, positional_args=None):
4868 seen_args = {}
4969 i , n = 0 , len (self .arguments )
5070 while i < n :
51- if not isinstance (self .arguments [i ], sifter . grammar . Tag ):
71+ if not isinstance (self .arguments [i ], Tag ):
5272 break
5373 num_valid_args = 0
5474 for arg_name , arg_validator in tagged_args .items ():
@@ -82,7 +102,7 @@ def validate_arguments(self, tagged_args=None, positional_args=None):
82102
83103 return (seen_args , self .arguments [i :])
84104
85- def validate_tests_size (self , min_tests , max_tests = None ):
105+ def validate_tests_size (self , min_tests : int , max_tests : Optional [ int ] = None ) -> None :
86106 if max_tests is None :
87107 max_tests = min_tests
88108 if len (self .tests ) < min_tests or len (self .tests ) > max_tests :
@@ -93,5 +113,5 @@ def validate_tests_size(self, min_tests, max_tests=None):
93113 raise RuleSyntaxError ("%s takes %s tests" % (
94114 self .RULE_IDENTIFIER , msg ))
95115
96- def evaluate (self , message , state ) :
116+ def evaluate (self , message : Message , state : EvaluationState ) -> None :
97117 raise NotImplementedError
0 commit comments