77if TYPE_CHECKING :
88 from . import _Catalogue
99
10+ MemberValueType = Union [str , int , float , dt .datetime , bool ]
1011
11- class Field :
12+ class _Member :
1213 def __init__ (self , name : str ):
1314 self .value = name
1415
16+ def __eq__ (self , other : MemberValueType ) -> 'Predicate' :
17+ return Comparison ('==' , self , other )
18+
19+ def __ne__ (self , other ) -> 'Predicate' :
20+ return Comparison ('!=' , self , other )
21+
22+ def __gt__ (self , other ) -> 'Predicate' :
23+ return Comparison ('>' , self , other )
24+
25+ def __lt__ (self , other ) -> 'Predicate' :
26+ return Comparison ('<' , self , other )
27+
28+ def __ge__ (self , other ) -> 'Predicate' :
29+ return Comparison ('>=' , self , other )
30+
31+ def __le__ (self , other ) -> 'Predicate' :
32+ return Comparison ('<=' , self , other )
33+
34+ def matches (self , value : str ) -> 'Predicate' :
35+ return Match (self , value )
36+
37+
38+ class Field (_Member ):
39+ def __init__ (self , name : str ):
40+ super ().__init__ (name )
41+
1542 def __repr__ (self ):
1643 return f"Field('{ self .value } ')"
1744
1845
19- class Attribute :
46+ class Attribute ( _Member ) :
2047 def __init__ (self , name : str ):
21- self . value = name
48+ super (). __init__ ( name )
2249
2350 def __repr__ (self ):
2451 return f"Attribute('{ self .value } ')"
2552
53+ def exists (self ) -> 'Predicate' :
54+ return Has (self )
2655
2756class Predicate :
2857 def __eq__ (self , o ):
2958 return repr (self ) == repr (o )
3059
60+ def __and__ (self , other ):
61+ if isinstance (other , Predicate ):
62+ return All (self , other )
63+ elif isinstance (other , (list , tuple )) and all (isinstance (item , Predicate ) for item in other ):
64+ return All (self , * other )
65+ else :
66+ raise TypeError (f"Cannot combine { type (self ).__name__ } with { type (other ).__name__ } " )
67+
68+ def __or__ (self , other ):
69+ if isinstance (other , Predicate ):
70+ return Any (self , other )
71+ elif isinstance (other , (list , tuple )) and all (isinstance (item , Predicate ) for item in other ):
72+ return Any (self , * other )
73+ else :
74+ raise TypeError (f"Cannot combine { type (self ).__name__ } with { type (other ).__name__ } " )
75+
76+ def __invert__ (self ):
77+ return Not (self )
78+
3179
3280class Comparison (Predicate ):
3381 def __init__ (self ,
3482 op : Union [Literal ['>' ], Literal ['>=' ],
35- Literal ['<' ], Literal ['<=' ],
36- Literal ['==' ], Literal ['!=' ]],
37- lhs : Union [ Field , Attribute ] ,
38- rhs : Union [ str , int , float , dt . datetime , bool ] ):
83+ Literal ['<' ], Literal ['<=' ],
84+ Literal ['==' ], Literal ['!=' ]],
85+ lhs : _Member ,
86+ rhs : MemberValueType ):
3987 self ._op = op
4088 self ._lhs = lhs
4189 self ._rhs = rhs
@@ -46,7 +94,7 @@ def __repr__(self):
4694
4795class Match (Predicate ):
4896 def __init__ (self ,
49- lhs : Union [ Field , Attribute ] ,
97+ lhs : _Member ,
5098 rhs : str ): # regex
5199 self ._lhs = lhs
52100 self ._rhs = rhs
@@ -88,7 +136,7 @@ def __repr__(self):
88136
89137
90138class In (Predicate ):
91- def __init__ (self , lhs : str , rhs : Union [ Field , Attribute ] ):
139+ def __init__ (self , lhs : str , rhs : _Member ):
92140 self ._lhs = lhs
93141 self ._rhs = rhs
94142
@@ -120,3 +168,36 @@ def __init__(self, message: str, predicate: Predicate):
120168class CatalogueFilterError (Exception ):
121169 def __init__ (self , message : str ):
122170 super ().__init__ (message )
171+
172+
173+
174+ class _Catalogue :
175+ def __init__ (self ):
176+ pass
177+
178+ def __contains__ (self , item : "_Event" ) -> Predicate :
179+ return InCatalogue (item )
180+
181+ def __getattr__ (self , item ) -> _Member :
182+ if item in ('name' , 'author' , 'uuid' , 'tags' , 'predicate' , 'attributes' ):
183+ return Field (item )
184+ return Attribute (item )
185+
186+
187+ class _Events :
188+ def __init__ (self ):
189+ pass
190+
191+ def __contains__ (self , item : str ) -> Predicate :
192+ return self [item ].exists ()
193+
194+ def __getattr__ (self , item ) -> _Member :
195+ if item in ('start' , 'stop' , 'author' , 'tags' , 'products' , 'rating' , 'uuid' ):
196+ return Field (item )
197+ return Attribute (item )
198+
199+
200+ # tokens to create predicates from Python code
201+ catalogue = _Catalogue ()
202+ events = _Events ()
203+ event = events
0 commit comments