diff --git a/src/firebase_functions/private/path_pattern.py b/src/firebase_functions/private/path_pattern.py index 78b61f0..bcf8bf6 100644 --- a/src/firebase_functions/private/path_pattern.py +++ b/src/firebase_functions/private/path_pattern.py @@ -129,9 +129,10 @@ class PathPattern: segments: list[PathSegment] def __init__(self, raw_path: str): - self.raw = raw_path + normalized_path = raw_path.strip("/") + self.raw = normalized_path self.segments = [] - self.init_path_segments(raw_path) + self.init_path_segments(normalized_path) def init_path_segments(self, raw: str): parts = raw.split("/") diff --git a/tests/test_path_pattern.py b/tests/test_path_pattern.py index 5248b02..3513e34 100644 --- a/tests/test_path_pattern.py +++ b/tests/test_path_pattern.py @@ -41,6 +41,28 @@ def test_trim_param(self): self.assertEqual(trim_param("{something=*}"), "something") def test_extract_matches(self): + # parse single-capture segments with leading slash + pp = PathPattern("/messages/{a}/{b}/{c}") + self.assertEqual( + pp.extract_matches("messages/match_a/match_b/match_c"), + { + "a": "match_a", + "b": "match_b", + "c": "match_c", + }, + ) + + # parse single-capture segments without leading slash + pp = PathPattern("messages/{a}/{b}/{c}") + self.assertEqual( + pp.extract_matches("messages/match_a/match_b/match_c"), + { + "a": "match_a", + "b": "match_b", + "c": "match_c", + }, + ) + # parse without multi-capture segments pp = PathPattern("{a}/something/else/{b}/end/{c}") self.assertEqual(