@@ -88,13 +88,26 @@ def __init__(self, value: Any, lookup: Optional[Lookup] = None) -> None:
88
88
def __iter__ (self ):
89
89
yield self
90
90
91
+ def __bool__ (self ):
92
+ return True
93
+
91
94
def __and__ (self , other : "Pattern" ) -> "Pattern" :
95
+ if not bool (other ):
96
+ return self
97
+ elif not bool (self ):
98
+ return other
92
99
return _And ((self , other ))
93
100
94
101
def __or__ (self , other : "Pattern" ) -> "Pattern" :
102
+ if not bool (other ):
103
+ return self
104
+ elif not bool (self ):
105
+ return other
95
106
return _Or ((self , other ))
96
107
97
108
def __invert__ (self ):
109
+ if not bool (self ):
110
+ return self
98
111
return _Invert (self )
99
112
100
113
def __repr__ (self ): # pragma: nocover
@@ -159,6 +172,22 @@ def _in(self, value: Any) -> Match:
159
172
return Match (value in self .value )
160
173
161
174
175
+ class Noop (Pattern ):
176
+ def __init__ (self ) -> None :
177
+ super ().__init__ (None )
178
+
179
+ def __repr__ (self ):
180
+ return f"<{ self .__class__ .__name__ } >"
181
+
182
+ def __bool__ (self ) -> bool :
183
+ # Treat this pattern as non-existent, e.g. when filtering or conditioning
184
+ return False
185
+
186
+ def match (self , request : httpx .Request ) -> Match :
187
+ # If this pattern is part of a combined pattern, always be truthy, i.e. noop
188
+ return Match (True )
189
+
190
+
162
191
class PathPattern (Pattern ):
163
192
path : Optional [str ]
164
193
@@ -500,7 +529,7 @@ def clean(self, value: Dict) -> bytes:
500
529
return data
501
530
502
531
503
- def M (* patterns : Pattern , ** lookups : Any ) -> Optional [ Pattern ] :
532
+ def M (* patterns : Pattern , ** lookups : Any ) -> Pattern :
504
533
extras = None
505
534
506
535
for pattern__lookup , value in lookups .items ():
@@ -550,12 +579,10 @@ def get_scheme_port(scheme: Optional[str]) -> Optional[int]:
550
579
return {"http" : 80 , "https" : 443 }.get (scheme or "" )
551
580
552
581
553
- def combine (
554
- patterns : Sequence [Pattern ], op : Callable = operator .and_
555
- ) -> Optional [Pattern ]:
582
+ def combine (patterns : Sequence [Pattern ], op : Callable = operator .and_ ) -> Pattern :
556
583
patterns = tuple (filter (None , patterns ))
557
584
if not patterns :
558
- return None
585
+ return Noop ()
559
586
return reduce (op , patterns )
560
587
561
588
@@ -598,14 +625,14 @@ def parse_url_patterns(
598
625
return bases
599
626
600
627
601
- def merge_patterns (pattern : Optional [ Pattern ] , ** bases : Pattern ) -> Optional [ Pattern ] :
628
+ def merge_patterns (pattern : Pattern , ** bases : Pattern ) -> Pattern :
602
629
if not bases :
603
630
return pattern
604
631
605
- if pattern :
606
- # Flatten pattern
607
- patterns = list (iter (pattern ))
632
+ # Flatten pattern
633
+ patterns : List [Pattern ] = list (filter (None , iter (pattern )))
608
634
635
+ if patterns :
609
636
if "host" in (_pattern .key for _pattern in patterns ):
610
637
# Pattern is "absolute", skip merging
611
638
bases = {}
0 commit comments