11import re
22import logging
3- from typing import List , Iterator , Optional , Union , Any
3+ from typing import List , Iterator , Optional
44from sagemaker .core .helper .session_helper import Session
55from sagemaker .core .resources import HubContent
66
99
1010class _ExpressionNode :
1111 """Base class for expression AST nodes."""
12-
12+
1313 def evaluate (self , keywords : List [str ]) -> bool :
1414 """Evaluate this node against the given keywords."""
1515 raise NotImplementedError
1616
1717
1818class _AndNode (_ExpressionNode ):
1919 """AND logical operator node."""
20-
20+
2121 def __init__ (self , left : _ExpressionNode , right : _ExpressionNode ):
2222 self .left = left
2323 self .right = right
24-
24+
2525 def evaluate (self , keywords : List [str ]) -> bool :
2626 return self .left .evaluate (keywords ) and self .right .evaluate (keywords )
2727
2828
2929class _OrNode (_ExpressionNode ):
3030 """OR logical operator node."""
31-
31+
3232 def __init__ (self , left : _ExpressionNode , right : _ExpressionNode ):
3333 self .left = left
3434 self .right = right
35-
35+
3636 def evaluate (self , keywords : List [str ]) -> bool :
3737 return self .left .evaluate (keywords ) or self .right .evaluate (keywords )
3838
3939
4040class _NotNode (_ExpressionNode ):
4141 """NOT logical operator node."""
42-
42+
4343 def __init__ (self , operand : _ExpressionNode ):
4444 self .operand = operand
45-
45+
4646 def evaluate (self , keywords : List [str ]) -> bool :
4747 return not self .operand .evaluate (keywords )
4848
4949
5050class _PatternNode (_ExpressionNode ):
5151 """Pattern matching node for keywords with wildcard support."""
52-
52+
5353 def __init__ (self , pattern : str ):
5454 self .pattern = pattern .strip ('"' ).strip ("'" )
55-
55+
5656 def evaluate (self , keywords : List [str ]) -> bool :
5757 """Check if any keyword matches this pattern."""
5858 for keyword in keywords :
5959 if self ._matches_pattern (keyword , self .pattern ):
6060 return True
6161 return False
62-
62+
6363 def _matches_pattern (self , keyword : str , pattern : str ) -> bool :
6464 """Check if a keyword matches a pattern with wildcard support."""
6565 if pattern .startswith ("*" ) and pattern .endswith ("*" ):
@@ -140,23 +140,23 @@ def _tokenize(self, expr: str) -> List[str]:
140140 def _parse_or_expression (self , tokens : List [str ], pos : int ) -> tuple [_ExpressionNode , int ]:
141141 """Parse OR expression (lowest precedence)."""
142142 left , pos = self ._parse_and_expression (tokens , pos )
143-
143+
144144 while pos < len (tokens ) and tokens [pos ].upper () == "OR" :
145145 pos += 1 # Skip OR token
146146 right , pos = self ._parse_and_expression (tokens , pos )
147147 left = _OrNode (left , right )
148-
148+
149149 return left , pos
150150
151151 def _parse_and_expression (self , tokens : List [str ], pos : int ) -> tuple [_ExpressionNode , int ]:
152152 """Parse AND expression (medium precedence)."""
153153 left , pos = self ._parse_not_expression (tokens , pos )
154-
154+
155155 while pos < len (tokens ) and tokens [pos ].upper () == "AND" :
156156 pos += 1 # Skip AND token
157157 right , pos = self ._parse_not_expression (tokens , pos )
158158 left = _AndNode (left , right )
159-
159+
160160 return left , pos
161161
162162 def _parse_not_expression (self , tokens : List [str ], pos : int ) -> tuple [_ExpressionNode , int ]:
@@ -172,9 +172,9 @@ def _parse_primary_expression(self, tokens: List[str], pos: int) -> tuple[_Expre
172172 """Parse primary expression (parentheses or pattern)."""
173173 if pos >= len (tokens ):
174174 raise ValueError ("Unexpected end of expression" )
175-
175+
176176 token = tokens [pos ]
177-
177+
178178 if token == "(" :
179179 pos += 1 # Skip opening parenthesis
180180 expr , pos = self ._parse_or_expression (tokens , pos )
0 commit comments