Best Python code snippet using playwright-python
test_pattern.py
Source:test_pattern.py
...12 input_string = "An Abyssinian fly playing a Celtic violin was annoyed by trashy flags on " \13 "which were the Hebrew letter qoph."14 def test_single(self):15 pattern = StringPattern("Celtic")16 matches = list(pattern.matches(self.input_string))17 assert len(matches) == 118 assert isinstance(matches[0], Match)19 assert matches[0].pattern == pattern20 assert matches[0].span == (28, 34)21 assert matches[0].value == "Celtic"22 def test_repr(self):23 pattern = StringPattern("Celtic")24 assert repr(pattern) == '<StringPattern:(\'Celtic\',)>'25 def test_ignore_case(self):26 pattern = StringPattern("celtic", ignore_case=False)27 matches = list(pattern.matches(self.input_string))28 assert len(matches) == 029 pattern = StringPattern("celtic", ignore_case=True)30 matches = list(pattern.matches(self.input_string))31 assert len(matches) == 132 assert matches[0].value == "Celtic"33 def test_private_names(self):34 pattern = StringPattern("celtic", name="test", private_names=["test"], ignore_case=True)35 matches = list(pattern.matches(self.input_string))36 assert len(matches) == 137 assert matches[0].private38 def test_ignore_names(self):39 pattern = StringPattern("celtic", name="test", ignore_names=["test"], ignore_case=True)40 matches = list(pattern.matches(self.input_string))41 assert len(matches) == 042 def test_no_match(self):43 pattern = StringPattern("Python")44 matches = list(pattern.matches(self.input_string))45 assert not matches46 def test_multiple_patterns(self):47 pattern = StringPattern("playing", "annoyed", "Hebrew")48 matches = list(pattern.matches(self.input_string))49 assert len(matches) == 350 assert isinstance(matches[0], Match)51 assert matches[0].pattern == pattern52 assert matches[0].span == (18, 25)53 assert matches[0].value == "playing"54 assert isinstance(matches[1], Match)55 assert matches[1].pattern == pattern56 assert matches[1].span == (46, 53)57 assert matches[1].value == "annoyed"58 assert isinstance(matches[2], Match)59 assert matches[2].pattern == pattern60 assert matches[2].span == (88, 94)61 assert matches[2].value == "Hebrew"62 def test_start_end_kwargs(self):63 pattern = StringPattern("Abyssinian", start=20, end=40)64 matches = list(pattern.matches(self.input_string))65 assert len(matches) == 066 def test_matches_kwargs(self):67 pattern = StringPattern("Abyssinian", name="test", value="AB")68 matches = list(pattern.matches(self.input_string))69 assert len(matches) == 170 assert matches[0].name == "test"71 assert matches[0].value == "AB"72 def test_post_processor(self):73 def post_processor(matches, pattern):74 assert len(matches) == 175 assert isinstance(pattern, StringPattern)76 return []77 pattern = StringPattern("Abyssinian", name="test", value="AB", post_processor=post_processor)78 matches = list(pattern.matches(self.input_string))79 assert len(matches) == 080class TestRePattern(object):81 """82 Tests for RePattern matching83 """84 input_string = "An Abyssinian fly playing a Celtic violin was annoyed by trashy flags on " \85 "which were the Hebrew letter qoph."86 def test_single_compiled(self):87 pattern = RePattern(re.compile("Celt.?c"))88 matches = list(pattern.matches(self.input_string))89 assert len(matches) == 190 assert isinstance(matches[0], Match)91 assert matches[0].pattern == pattern92 assert matches[0].span == (28, 34)93 assert matches[0].value == "Celtic"94 def test_single_string(self):95 pattern = RePattern("Celt.?c")96 matches = list(pattern.matches(self.input_string))97 assert len(matches) == 198 assert isinstance(matches[0], Match)99 assert matches[0].pattern == pattern100 assert matches[0].span == (28, 34)101 assert matches[0].value == "Celtic"102 def test_single_kwargs(self):103 pattern = RePattern({"pattern": "celt.?c", "flags": re.IGNORECASE})104 matches = list(pattern.matches(self.input_string))105 assert len(matches) == 1106 assert isinstance(matches[0], Match)107 assert matches[0].pattern == pattern108 assert matches[0].span == (28, 34)109 assert matches[0].value == "Celtic"110 def test_single_vargs(self):111 pattern = RePattern(("celt.?c", re.IGNORECASE))112 matches = list(pattern.matches(self.input_string))113 assert len(matches) == 1114 assert isinstance(matches[0], Match)115 assert matches[0].pattern == pattern116 assert matches[0].span == (28, 34)117 assert matches[0].value == "Celtic"118 def test_no_match(self):119 pattern = RePattern("abc.?def")120 matches = list(pattern.matches(self.input_string))121 assert len(matches) == 0122 def test_shortcuts(self):123 pattern = RePattern("Celtic-violin", abbreviations=[("-", r"[\W_]+")])124 matches = list(pattern.matches(self.input_string))125 assert len(matches) == 1126 pattern = RePattern({"pattern": "celtic-violin", "flags": re.IGNORECASE}, abbreviations=[("-", r"[\W_]+")])127 matches = list(pattern.matches(self.input_string))128 assert len(matches) == 1129 def test_multiple_patterns(self):130 pattern = RePattern("pla.?ing", "ann.?yed", "Heb.?ew")131 matches = list(pattern.matches(self.input_string))132 assert len(matches) == 3133 assert isinstance(matches[0], Match)134 assert matches[0].pattern == pattern135 assert matches[0].span == (18, 25)136 assert matches[0].value == "playing"137 assert isinstance(matches[1], Match)138 assert matches[1].pattern == pattern139 assert matches[1].span == (46, 53)140 assert matches[1].value == "annoyed"141 assert isinstance(matches[2], Match)142 assert matches[2].pattern == pattern143 assert matches[2].span == (88, 94)144 assert matches[2].value == "Hebrew"145 def test_unnamed_groups(self):146 pattern = RePattern(r"(Celt.?c)\s+(\w+)")147 matches = list(pattern.matches(self.input_string))148 assert len(matches) == 1149 parent = matches[0]150 assert isinstance(parent, Match)151 assert parent.pattern == pattern152 assert parent.span == (28, 41)153 assert parent.name is None154 assert parent.value == "Celtic violin"155 assert len(parent.children) == 2156 group1, group2 = parent.children157 assert isinstance(group1, Match)158 assert group1.pattern == pattern159 assert group1.span == (28, 34)160 assert group1.name is None161 assert group1.value == "Celtic"162 assert group1.parent == parent163 assert isinstance(group2, Match)164 assert group2.pattern == pattern165 assert group2.span == (35, 41)166 assert group2.name is None167 assert group2.value == "violin"168 assert group2.parent == parent169 def test_named_groups(self):170 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)")171 matches = list(pattern.matches(self.input_string))172 assert len(matches) == 1173 parent = matches[0]174 assert isinstance(parent, Match)175 assert parent.pattern == pattern176 assert parent.span == (28, 41)177 assert parent.name is None178 assert parent.value == "Celtic violin"179 assert len(parent.children) == 2180 group1, group2 = parent.children181 assert isinstance(group1, Match)182 assert group1.pattern == pattern183 assert group1.span == (28, 34)184 assert group1.name == "param1"185 assert group1.value == "Celtic"186 assert group1.parent == parent187 assert isinstance(group2, Match)188 assert group2.pattern == pattern189 assert group2.span == (35, 41)190 assert group2.name == "param2"191 assert group2.value == "violin"192 assert group2.parent == parent193 def test_children(self):194 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", children=True)195 matches = list(pattern.matches(self.input_string))196 assert len(matches) == 2197 group1, group2 = matches198 assert isinstance(group1, Match)199 assert group1.pattern == pattern200 assert group1.span == (28, 34)201 assert group1.name == "param1"202 assert group1.value == "Celtic"203 assert isinstance(group2, Match)204 assert group2.pattern == pattern205 assert group2.span == (35, 41)206 assert group2.name == "param2"207 assert group2.value == "violin"208 def test_children_parent_private(self):209 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", children=True, private_parent=True)210 matches = list(pattern.matches(self.input_string))211 assert len(matches) == 3212 parent, group1, group2 = matches213 assert isinstance(group1, Match)214 assert parent.private215 assert parent.pattern == pattern216 assert parent.span == (28, 41)217 assert parent.name is None218 assert parent.value == "Celtic violin"219 assert isinstance(group1, Match)220 assert not group1.private221 assert group1.pattern == pattern222 assert group1.span == (28, 34)223 assert group1.name == "param1"224 assert group1.value == "Celtic"225 assert isinstance(group2, Match)226 assert not group2.private227 assert group2.pattern == pattern228 assert group2.span == (35, 41)229 assert group2.name == "param2"230 assert group2.value == "violin"231 def test_parent_children_private(self):232 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", private_children=True)233 matches = list(pattern.matches(self.input_string))234 assert len(matches) == 3235 parent, group1, group2 = matches236 assert isinstance(group1, Match)237 assert not parent.private238 assert parent.pattern == pattern239 assert parent.span == (28, 41)240 assert parent.name is None241 assert parent.value == "Celtic violin"242 assert isinstance(group1, Match)243 assert group1.private244 assert group1.pattern == pattern245 assert group1.span == (28, 34)246 assert group1.name == "param1"247 assert group1.value == "Celtic"248 assert isinstance(group2, Match)249 assert group2.private250 assert group2.pattern == pattern251 assert group2.span == (35, 41)252 assert group2.name == "param2"253 assert group2.value == "violin"254 def test_every(self):255 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", every=True)256 matches = list(pattern.matches(self.input_string))257 assert len(matches) == 3258 parent, group1, group2 = matches259 assert isinstance(group1, Match)260 assert not parent.private261 assert parent.pattern == pattern262 assert parent.span == (28, 41)263 assert parent.name is None264 assert parent.value == "Celtic violin"265 assert isinstance(group1, Match)266 assert not group1.private267 assert group1.pattern == pattern268 assert group1.span == (28, 34)269 assert group1.name == "param1"270 assert group1.value == "Celtic"271 assert isinstance(group2, Match)272 assert not group2.private273 assert group2.pattern == pattern274 assert group2.span == (35, 41)275 assert group2.name == "param2"276 assert group2.value == "violin"277 def test_private_names(self):278 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", private_names=["param2"], children=True)279 matches = list(pattern.matches(self.input_string))280 assert len(matches) == 2281 assert matches[0].name == "param1"282 assert not matches[0].private283 assert matches[1].name == "param2"284 assert matches[1].private285 def test_ignore_names(self):286 pattern = RePattern(r"(?P<param1>Celt.?c)\s+(?P<param2>\w+)", ignore_names=["param2"], children=True)287 matches = list(pattern.matches(self.input_string))288 assert len(matches) == 1289 assert matches[0].name == "param1"290 def test_matches_kwargs(self):291 pattern = RePattern("He.rew", name="test", value="HE")292 matches = list(pattern.matches(self.input_string))293 assert len(matches) == 1294 assert matches[0].name == "test"295 assert matches[0].value == "HE"296 pattern = RePattern("H(e.)(rew)", name="test", value="HE")297 matches = list(pattern.matches(self.input_string))298 assert len(matches) == 1299 assert matches[0].name == "test"300 assert matches[0].value == "HE"301 children = matches[0].children302 assert len(children) == 2303 assert children[0].name == "test"304 assert children[0].value == "HE"305 assert children[1].name == "test"306 assert children[1].value == "HE"307 pattern = RePattern("H(?P<first>e.)(?P<second>rew)", name="test", value="HE")308 matches = list(pattern.matches(self.input_string))309 assert len(matches) == 1310 assert matches[0].name == "test"311 assert matches[0].value == "HE"312 children = matches[0].children313 assert len(children) == 2314 assert children[0].name == "first"315 assert children[0].value == "HE"316 assert children[1].name == "second"317 assert children[1].value == "HE"318class TestFunctionalPattern(object):319 """320 Tests for FunctionalPattern matching321 """322 input_string = "An Abyssinian fly playing a Celtic violin was annoyed by trashy flags on " \323 "which were the Hebrew letter qoph."324 def test_single_vargs(self):325 def func(input_string):326 i = input_string.find("fly")327 if i > -1:328 return i, i + len("fly"), "fly", "functional"329 pattern = FunctionalPattern(func)330 matches = list(pattern.matches(self.input_string))331 assert len(matches) == 1332 assert isinstance(matches[0], Match)333 assert matches[0].pattern == pattern334 assert matches[0].span == (14, 17)335 assert matches[0].name == "functional"336 assert matches[0].value == "fly"337 def test_single_kwargs(self):338 def func(input_string):339 i = input_string.find("fly")340 if i > -1:341 return {"start": i, "end": i + len("fly"), "name": "functional"}342 pattern = FunctionalPattern(func)343 matches = list(pattern.matches(self.input_string))344 assert len(matches) == 1345 assert isinstance(matches[0], Match)346 assert matches[0].pattern == pattern347 assert matches[0].span == (14, 17)348 assert matches[0].name == "functional"349 assert matches[0].value == "fly"350 def test_multiple_objects(self):351 def func(input_string):352 i = input_string.find("fly")353 matches = []354 if i > -1:355 matches.append((i, i + len("fly"), {'name': "functional"}))356 i = input_string.find("annoyed")357 if i > -1:358 matches.append((i, i + len("annoyed")))359 i = input_string.find("Hebrew")360 if i > -1:361 matches.append({"start": i, "end": i + len("Hebrew")})362 return matches363 pattern = FunctionalPattern(func)364 matches = list(pattern.matches(self.input_string))365 assert len(matches) == 3366 assert isinstance(matches[0], Match)367 assert matches[0].pattern == pattern368 assert matches[0].span == (14, 17)369 assert matches[0].name == "functional"370 assert matches[0].value == "fly"371 assert isinstance(matches[1], Match)372 assert matches[1].pattern == pattern373 assert matches[1].span == (46, 53)374 assert matches[1].value == "annoyed"375 assert isinstance(matches[2], Match)376 assert matches[2].pattern == pattern377 assert matches[2].span == (88, 94)378 assert matches[2].value == "Hebrew"379 def test_multiple_generator(self):380 def func(input_string):381 i = input_string.find("fly")382 if i > -1:383 yield (i, i + len("fly"), {'name': "functional"})384 i = input_string.find("annoyed")385 if i > -1:386 yield (i, i + len("annoyed"))387 i = input_string.find("Hebrew")388 if i > -1:389 yield (i, {"end": i + len("Hebrew")})390 pattern = FunctionalPattern(func)391 matches = list(pattern.matches(self.input_string))392 assert len(matches) == 3393 assert isinstance(matches[0], Match)394 assert matches[0].pattern == pattern395 assert matches[0].span == (14, 17)396 assert matches[0].name == "functional"397 assert matches[0].value == "fly"398 assert isinstance(matches[1], Match)399 assert matches[1].pattern == pattern400 assert matches[1].span == (46, 53)401 assert matches[1].value == "annoyed"402 assert isinstance(matches[2], Match)403 assert matches[2].pattern == pattern404 assert matches[2].span == (88, 94)405 assert matches[2].value == "Hebrew"406 def test_no_match(self):407 pattern = FunctionalPattern(lambda x: None)408 matches = list(pattern.matches(self.input_string))409 assert len(matches) == 0410 def test_multiple_patterns(self):411 def playing(input_string):412 i = input_string.find("playing")413 if i > -1:414 return i, i + len("playing")415 def annoyed(input_string):416 i = input_string.find("annoyed")417 if i > -1:418 return i, i + len("annoyed")419 def hebrew(input_string):420 i = input_string.find("Hebrew")421 if i > -1:422 return i, i + len("Hebrew")423 pattern = FunctionalPattern(playing, annoyed, hebrew)424 matches = list(pattern.matches(self.input_string))425 assert len(matches) == 3426 assert isinstance(matches[0], Match)427 assert matches[0].pattern == pattern428 assert matches[0].span == (18, 25)429 assert matches[0].value == "playing"430 assert isinstance(matches[1], Match)431 assert matches[1].pattern == pattern432 assert matches[1].span == (46, 53)433 assert matches[1].value == "annoyed"434 assert isinstance(matches[2], Match)435 assert matches[2].pattern == pattern436 assert matches[2].span == (88, 94)437 assert matches[2].value == "Hebrew"438 def test_matches_kwargs(self):439 def playing(input_string):440 i = input_string.find("playing")441 if i > -1:442 return i, i + len("playing")443 pattern = FunctionalPattern(playing, name="test", value="PLAY")444 matches = list(pattern.matches(self.input_string))445 assert len(matches) == 1446 assert matches[0].name == "test"447 assert matches[0].value == "PLAY"448class TestValue(object):449 """450 Tests for value option451 """452 input_string = "This string contains 1849 a number"453 def test_str_value(self):454 pattern = StringPattern("1849", name="dummy", value="test")455 matches = list(pattern.matches(self.input_string))456 assert len(matches) == 1457 assert isinstance(matches[0], Match)458 assert matches[0].pattern == pattern459 assert matches[0].span == (21, 25)460 assert matches[0].value == "test"461 def test_dict_child_value(self):462 pattern = RePattern(r"(?P<strParam>cont.?ins)\s+(?P<intParam>\d+)",463 formatter={'intParam': lambda x: int(x) * 2,464 'strParam': lambda x: "really " + x},465 format_all=True,466 value={'intParam': 'INT_PARAM_VALUE'})467 matches = list(pattern.matches(self.input_string))468 assert len(matches) == 1469 parent = matches[0]470 assert len(parent.children) == 2471 group1, group2 = parent.children472 assert isinstance(group1, Match)473 assert group1.pattern == pattern474 assert group1.span == (12, 20)475 assert group1.value == "really contains"476 assert isinstance(group2, Match)477 assert group2.pattern == pattern478 assert group2.span == (21, 25)479 assert group2.value == 'INT_PARAM_VALUE'480 def test_dict_default_value(self):481 pattern = RePattern(r"(?P<strParam>cont.?ins)\s+(?P<intParam>\d+)",482 formatter={'intParam': lambda x: int(x) * 2,483 'strParam': lambda x: "really " + x},484 format_all=True,485 value={'__children__': 'CHILD', 'strParam': 'STR_VALUE', '__parent__': 'PARENT'})486 matches = list(pattern.matches(self.input_string))487 assert len(matches) == 1488 parent = matches[0]489 assert parent.value == "PARENT"490 assert len(parent.children) == 2491 group1, group2 = parent.children492 assert isinstance(group1, Match)493 assert group1.pattern == pattern494 assert group1.span == (12, 20)495 assert group1.value == "STR_VALUE"496 assert isinstance(group2, Match)497 assert group2.pattern == pattern498 assert group2.span == (21, 25)499 assert group2.value == "CHILD"500class TestFormatter(object):501 """502 Tests for formatter option503 """504 input_string = "This string contains 1849 a number"505 def test_single_string(self):506 pattern = StringPattern("1849", name="dummy", formatter=lambda x: int(x) / 2)507 matches = list(pattern.matches(self.input_string))508 assert len(matches) == 1509 assert isinstance(matches[0], Match)510 assert matches[0].pattern == pattern511 assert matches[0].span == (21, 25)512 assert matches[0].value == 1849 / 2513 def test_single_re_no_group(self):514 pattern = RePattern(r"\d+", formatter=lambda x: int(x) * 2)515 matches = list(pattern.matches(self.input_string))516 assert len(matches) == 1517 assert isinstance(matches[0], Match)518 assert matches[0].pattern == pattern519 assert matches[0].span == (21, 25)520 assert matches[0].value == 1849 * 2521 def test_single_re_named_groups(self):522 pattern = RePattern(r"(?P<strParam>cont.?ins)\s+(?P<intParam>\d+)",523 formatter={'intParam': lambda x: int(x) * 2,524 'strParam': lambda x: "really " + x}, format_all=True)525 matches = list(pattern.matches(self.input_string))526 assert len(matches) == 1527 parent = matches[0]528 assert len(parent.children) == 2529 group1, group2 = parent.children530 assert isinstance(group1, Match)531 assert group1.pattern == pattern532 assert group1.span == (12, 20)533 assert group1.value == "really contains"534 assert isinstance(group2, Match)535 assert group2.pattern == pattern536 assert group2.span == (21, 25)537 assert group2.value == 1849 * 2538 def test_repeated_captures_option(self):539 pattern = RePattern(r"\[(\d+)\](?:-(\d+))*")540 matches = list(pattern.matches("[02]-03-04-05-06"))541 assert len(matches) == 1542 match = matches[0]543 if REGEX_AVAILABLE:544 assert len(match.children) == 5545 assert [child.value for child in match.children] == ["02", "03", "04", "05", "06"]546 else:547 assert len(match.children) == 2548 assert [child.value for child in match.children] == ["02", "06"]549 with pytest.raises(NotImplementedError):550 RePattern(r"\[(\d+)\](?:-(\d+))*", repeated_captures=True)551 pattern = RePattern(r"\[(\d+)\](?:-(\d+))*", repeated_captures=False)552 matches = list(pattern.matches("[02]-03-04-05-06"))553 assert len(matches) == 1554 match = matches[0]555 assert len(match.children) == 2556 assert [child.value for child in match.children] == ["02", "06"]557 def test_single_functional(self):558 def digit(input_string):559 i = input_string.find("1849")560 if i > -1:561 return i, i + len("1849")562 pattern = FunctionalPattern(digit, formatter=lambda x: int(x) * 3)563 matches = list(pattern.matches(self.input_string))564 assert len(matches) == 1565 assert isinstance(matches[0], Match)566 assert matches[0].pattern == pattern567 assert matches[0].span == (21, 25)568 assert matches[0].value == 1849 * 3569class TestValidator(object):570 """571 Tests for validator option572 """573 input_string = "This string contains 1849 a number"574 @staticmethod575 def true_validator(match):576 return int(match.value) < 1850577 @staticmethod578 def false_validator(match):579 return int(match.value) >= 1850580 def test_single_string(self):581 pattern = StringPattern("1849", name="dummy", validator=self.false_validator)582 matches = list(pattern.matches(self.input_string))583 assert len(matches) == 0584 pattern = StringPattern("1849", validator=self.true_validator)585 matches = list(pattern.matches(self.input_string))586 assert len(matches) == 1587 def test_single_re_no_group(self):588 pattern = RePattern(r"\d+", validator=self.false_validator)589 matches = list(pattern.matches(self.input_string))590 assert len(matches) == 0591 pattern = RePattern(r"\d+", validator=self.true_validator)592 matches = list(pattern.matches(self.input_string))593 assert len(matches) == 1594 def test_single_re_named_groups(self):595 pattern = RePattern(r"(?P<strParam>cont.?ins)\s+(?P<intParam>\d+)",596 validator={'intParam': self.false_validator}, validate_all=True)597 matches = list(pattern.matches(self.input_string))598 assert len(matches) == 0599 pattern = RePattern(r"(?P<strParam>cont.?ins)\s+(?P<intParam>\d+)",600 validator={'intParam': self.true_validator}, validate_all=True)601 matches = list(pattern.matches(self.input_string))602 assert len(matches) == 1603 def test_validate_all(self):604 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int, validator=lambda match: match.value < 100,605 children=True)606 matches = list(pattern.matches(self.input_string))607 assert len(matches) == 0608 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int, validator=lambda match: match.value > 100,609 children=True)610 matches = list(pattern.matches(self.input_string))611 assert len(matches) == 1612 def invalid_func(match):613 if match.name == 'intParam':614 return True615 return match.value.startswith('abc')616 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int, validator=invalid_func, validate_all=True,617 children=True)618 matches = list(pattern.matches(self.input_string))619 assert len(matches) == 0620 def func(match):621 if match.name == 'intParam':622 return True623 return match.value.startswith('contains')624 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int, validator=func, validate_all=True,625 children=True)626 matches = list(pattern.matches(self.input_string))627 assert len(matches) == 1628 def test_format_all(self):629 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int,630 children=True)631 matches = list(pattern.matches(self.input_string))632 assert len(matches) == 1633 for match in matches:634 assert match.value is not None635 with pytest.raises(ValueError):636 pattern = RePattern(r"contains (?P<intParam>\d+)", formatter=int, format_all=True)637 matches = list(pattern.matches(self.input_string))638 for match in matches:639 assert match.value is not None640 def test_single_functional(self):641 def digit(input_string):642 i = input_string.find("1849")643 if i > -1:644 return i, i + len("1849")645 pattern = FunctionalPattern(digit, validator=self.false_validator)646 matches = list(pattern.matches(self.input_string))647 assert len(matches) == 0648 pattern = FunctionalPattern(digit, validator=self.true_validator)649 matches = list(pattern.matches(self.input_string))...
test_match.py
Source:test_match.py
...225class TestMaches(object):226 def test_names(self):227 input_string = "One Two Three"228 matches = Matches()229 matches.extend(StringPattern("One", name="1-str", tags=["One", "str"]).matches(input_string))230 matches.extend(RePattern("One", name="1-re", tags=["One", "re"]).matches(input_string))231 matches.extend(StringPattern("Two", name="2-str", tags=["Two", "str"]).matches(input_string))232 matches.extend(RePattern("Two", name="2-re", tags=["Two", "re"]).matches(input_string))233 matches.extend(StringPattern("Three", name="3-str", tags=["Three", "str"]).matches(input_string))234 matches.extend(RePattern("Three", name="3-re", tags=["Three", "re"]).matches(input_string))235 assert set(matches.names) == set(["1-str", "1-re", "2-str", "2-re", "3-str", "3-re"])236 def test_filters(self):237 input_string = "One Two Three"238 matches = Matches()239 matches.extend(StringPattern("One", name="1-str", tags=["One", "str"]).matches(input_string))240 matches.extend(RePattern("One", name="1-re", tags=["One", "re"]).matches(input_string))241 matches.extend(StringPattern("Two", name="2-str", tags=["Two", "str"]).matches(input_string))242 matches.extend(RePattern("Two", name="2-re", tags=["Two", "re"]).matches(input_string))243 matches.extend(StringPattern("Three", name="3-str", tags=["Three", "str"]).matches(input_string))244 matches.extend(RePattern("Three", name="3-re", tags=["Three", "re"]).matches(input_string))245 selection = matches.starting(0)246 assert len(selection) == 2247 selection = matches.starting(0, lambda m: "str" in m.tags)248 assert len(selection) == 1249 assert selection[0].pattern.name == "1-str"250 selection = matches.ending(7, predicate=lambda m: "str" in m.tags)251 assert len(selection) == 1252 assert selection[0].pattern.name == "2-str"253 selection = matches.previous(matches.named("2-str")[0])254 assert len(selection) == 2255 assert selection[0].pattern.name == "1-str"256 assert selection[1].pattern.name == "1-re"257 selection = matches.previous(matches.named("2-str", 0), lambda m: "str" in m.tags)258 assert len(selection) == 1259 assert selection[0].pattern.name == "1-str"260 selection = matches.next(matches.named("2-str", 0))261 assert len(selection) == 2262 assert selection[0].pattern.name == "3-str"263 assert selection[1].pattern.name == "3-re"264 selection = matches.next(matches.named("2-str", 0), index=0, predicate=lambda m: "re" in m.tags)265 assert selection is not None266 assert selection.pattern.name == "3-re"267 selection = matches.next(matches.named("2-str", index=0), lambda m: "re" in m.tags)268 assert len(selection) == 1269 assert selection[0].pattern.name == "3-re"270 selection = matches.named("2-str", lambda m: "re" in m.tags)271 assert len(selection) == 0272 selection = matches.named("2-re", lambda m: "re" in m.tags, 0)273 assert selection is not None274 assert selection.name == "2-re" # pylint:disable=no-member275 selection = matches.named("2-re", lambda m: "re" in m.tags)276 assert len(selection) == 1277 assert selection[0].name == "2-re"278 selection = matches.named("2-re", lambda m: "re" in m.tags, index=1000)279 assert selection is None280 def test_raw(self):281 input_string = "0123456789"282 match = Match(0, 10, input_string=input_string, formatter=lambda s: s*2)283 assert match.value == match.raw * 2284 assert match.raw == input_string285 match.raw_end = 9286 match.raw_start = 1287 assert match.value == match.raw * 2288 assert match.raw == input_string[1:9]289 match.raw_end = None290 match.raw_start = None291 assert match.value == match.raw * 2292 assert match.raw == input_string293 def test_formatter_chain(self):294 input_string = "100"295 match = Match(0, 3, input_string=input_string, formatter=formatters(int, lambda s: s*2, lambda s: s+10))296 assert match.raw == input_string297 assert match.value == 100 * 2 + 10298 def test_to_dict(self):299 input_string = "One Two Two Three"300 matches = Matches()301 matches.extend(StringPattern("One", name="1", tags=["One", "str"]).matches(input_string))302 matches.extend(RePattern("One", name="1", tags=["One", "re"]).matches(input_string))303 matches.extend(StringPattern("Two", name="2", tags=["Two", "str"]).matches(input_string))304 matches.extend(RePattern("Two", name="2", tags=["Two", "re"]).matches(input_string))305 matches.extend(RePattern("Two", name="2", tags=["Two", "reBis"]).matches(input_string))306 matches.extend(StringPattern("Three", name="3", tags=["Three", "str"]).matches(input_string))307 matches.extend(RePattern("Three", name="3bis", tags=["Three", "re"]).matches(input_string))308 matches.extend(RePattern(r"(\w+)", name="words").matches(input_string))309 kvalues = matches.to_dict(first_value=True)310 assert kvalues == {"1": "One",311 "2": "Two",312 "3": "Three",313 "3bis": "Three",314 "words": "One"}315 assert kvalues.values_list["words"] == ["One", "Two", "Three"]316 kvalues = matches.to_dict(enforce_list=True)317 assert kvalues["words"] == ["One", "Two", "Three"]318 kvalues = matches.to_dict(details=True)319 assert kvalues["1"].value == "One"320 assert len(kvalues["2"]) == 2321 assert kvalues["2"][0].value == "Two"322 assert kvalues["2"][1].value == "Two"323 assert kvalues["3"].value == "Three"324 assert kvalues["3bis"].value == "Three"325 assert len(kvalues["words"]) == 4326 assert kvalues["words"][0].value == "One"327 assert kvalues["words"][1].value == "Two"328 assert kvalues["words"][2].value == "Two"329 assert kvalues["words"][3].value == "Three"330 kvalues = matches.to_dict(details=True)331 assert kvalues["1"].value == "One"332 assert len(kvalues.values_list["2"]) == 2333 assert kvalues.values_list["2"][0].value == "Two"334 assert kvalues.values_list["2"][1].value == "Two"335 assert kvalues["3"].value == "Three"336 assert kvalues["3bis"].value == "Three"337 assert len(kvalues.values_list["words"]) == 4338 assert kvalues.values_list["words"][0].value == "One"339 assert kvalues.values_list["words"][1].value == "Two"340 assert kvalues.values_list["words"][2].value == "Two"341 assert kvalues.values_list["words"][3].value == "Three"342 def test_chains(self):343 input_string = "wordX 10 20 30 40 wordA, wordB, wordC 70 80 wordX"344 matches = Matches(input_string=input_string)345 matches.extend(RePattern(r"\d+", name="digit").matches(input_string))346 matches.extend(RePattern("[a-zA-Z]+", name="word").matches(input_string))347 assert len(matches) == 11348 a_start = input_string.find('wordA')349 b_start = input_string.find('wordB')350 b_end = b_start + len('wordB')351 c_start = input_string.find('wordC')352 c_end = c_start + len('wordC')353 chain_before = matches.chain_before(b_start, " ,", predicate=lambda match: match.name == "word")354 assert len(chain_before) == 1355 assert chain_before[0].value == 'wordA'356 chain_before = matches.chain_before(Match(b_start, b_start), " ,", predicate=lambda match: match.name == "word")357 assert len(chain_before) == 1358 assert chain_before[0].value == 'wordA'359 chain_before = matches.chain_before(b_start, " ,", predicate=lambda match: match.name == "digit")360 assert len(chain_before) == 0361 chain_before = matches.chain_before(a_start, " ,", predicate=lambda match: match.name == "digit")362 assert len(chain_before) == 4363 assert [match.value for match in chain_before] == ["40", "30", "20", "10"]364 chain_after = matches.chain_after(b_end, " ,", predicate=lambda match: match.name == "word")365 assert len(chain_after) == 1366 assert chain_after[0].value == 'wordC'367 chain_after = matches.chain_after(Match(b_end, b_end), " ,", predicate=lambda match: match.name == "word")368 assert len(chain_after) == 1369 assert chain_after[0].value == 'wordC'370 chain_after = matches.chain_after(b_end, " ,", predicate=lambda match: match.name == "digit")371 assert len(chain_after) == 0372 chain_after = matches.chain_after(c_end, " ,", predicate=lambda match: match.name == "digit")373 assert len(chain_after) == 2374 assert [match.value for match in chain_after] == ["70", "80"]375 chain_after = matches.chain_after(c_end, " ,", end=10000, predicate=lambda match: match.name == "digit")376 assert len(chain_after) == 2377 assert [match.value for match in chain_after] == ["70", "80"]378 def test_holes(self):379 input_string = '1'*10+'2'*10+'3'*10+'4'*10+'5'*10+'6'*10+'7'*10380 hole1 = Match(0, 10, input_string=input_string)381 hole2 = Match(20, 30, input_string=input_string)382 hole3 = Match(30, 40, input_string=input_string)383 hole4 = Match(60, 70, input_string=input_string)384 matches = Matches([hole1, hole2], input_string=input_string)385 matches.append(hole3)386 matches.append(hole4)387 holes = list(matches.holes())388 assert len(holes) == 2389 assert holes[0].span == (10, 20)390 assert holes[0].value == '2'*10391 assert holes[1].span == (40, 60)392 assert holes[1].value == '5' * 10 + '6' * 10393 holes = list(matches.holes(5, 15))394 assert len(holes) == 1395 assert holes[0].span == (10, 15)396 assert holes[0].value == '2'*5397 holes = list(matches.holes(5, 15, formatter=lambda value: "formatted"))398 assert len(holes) == 1399 assert holes[0].span == (10, 15)400 assert holes[0].value == "formatted"401 holes = list(matches.holes(5, 15, predicate=lambda hole: False))402 assert len(holes) == 0403 def test_holes_empty(self):404 input_string = "Test hole on empty matches"405 matches = Matches(input_string=input_string)406 holes = matches.holes()407 assert len(holes) == 1408 assert holes[0].value == input_string409 def test_holes_seps(self):410 input_string = "Test hole - with many separators + included"411 match = StringPattern("many").matches(input_string)412 matches = Matches(match, input_string)413 holes = matches.holes()414 assert len(holes) == 2415 holes = matches.holes(seps="-+")416 assert len(holes) == 4...
test_rebulk.py
Source:test_rebulk.py
...13 if i > -1:14 return i, i + len("over")15 rebulk.functional(func)16 input_string = "The quick brown fox jumps over the lazy dog"17 matches = rebulk.matches(input_string)18 assert len(matches) == 319 assert matches[0].value == "quick"20 assert matches[1].value == "fox"21 assert matches[2].value == "over"22def test_rebulk_composition():23 rebulk = Rebulk()24 rebulk.string("quick")25 rebulk.rebulk(Rebulk().regex("f.x"))26 rebulk.rebulk(Rebulk(disabled=lambda context: True).functional(lambda string: None))27 input_string = "The quick brown fox jumps over the lazy dog"28 matches = rebulk.matches(input_string)29 assert len(matches) == 230 assert matches[0].value == "quick"31 assert matches[1].value == "fox"32def test_rebulk_context():33 rebulk = Rebulk()34 context = {'nostring': True, 'word': 'lazy'}35 rebulk.string("quick", disabled=lambda context: context.get('nostring', False))36 rebulk.regex("f.x", disabled=lambda context: context.get('noregex', False))37 def func(input_string, context):38 word = context.get('word', 'over')39 i = input_string.find(word)40 if i > -1:41 return i, i + len(word)42 rebulk.functional(func)43 input_string = "The quick brown fox jumps over the lazy dog"44 matches = rebulk.matches(input_string, context)45 assert len(matches) == 246 assert matches[0].value == "fox"47 assert matches[1].value == "lazy"48def test_rebulk_prefer_longer():49 input_string = "The quick brown fox jumps over the lazy dog"50 matches = Rebulk().string("quick").string("own").regex("br.{2}n").matches(input_string)51 assert len(matches) == 252 assert matches[0].value == "quick"53 assert matches[1].value == "brown"54def test_rebulk_defaults():55 input_string = "The quick brown fox jumps over the lazy dog"56 def func(input_string):57 i = input_string.find("fox")58 if i > -1:59 return i, i + len("fox")60 matches = Rebulk()\61 .string_defaults(name="string", tags=["a", "b"])\62 .regex_defaults(name="regex") \63 .functional_defaults(name="functional") \64 .string("quick", tags=["c"])\65 .functional(func)\66 .regex("br.{2}n") \67 .matches(input_string)68 assert matches[0].name == "string"69 assert matches[0].tags == ["a", "b", "c"]70 assert matches[1].name == "functional"71 assert matches[2].name == "regex"72 matches = Rebulk() \73 .defaults(name="default", tags=["0"])\74 .string_defaults(name="string", tags=["a", "b"]) \75 .functional_defaults(name="functional", tags=["1"]) \76 .string("quick", tags=["c"]) \77 .functional(func) \78 .regex("br.{2}n") \79 .matches(input_string)80 assert matches[0].name == "string"81 assert matches[0].tags == ["0", "a", "b", "c"]82 assert matches[1].name == "functional"83 assert matches[1].tags == ["0", "1"]84 assert matches[2].name == "default"85 assert matches[2].tags == ["0"]86def test_rebulk_rebulk():87 input_string = "The quick brown fox jumps over the lazy dog"88 base = Rebulk().string("quick")89 child = Rebulk().string("own").regex("br.{2}n")90 matches = base.rebulk(child).matches(input_string)91 assert len(matches) == 292 assert matches[0].value == "quick"93 assert matches[1].value == "brown"94def test_rebulk_no_default():95 input_string = "The quick brown fox jumps over the lazy dog"96 matches = Rebulk(default_rules=False).string("quick").string("own").regex("br.{2}n").matches(input_string)97 assert len(matches) == 398 assert matches[0].value == "quick"99 assert matches[1].value == "own"100 assert matches[2].value == "brown"101def test_rebulk_empty_match():102 input_string = "The quick brown fox jumps over the lazy dog"103 matches = Rebulk(default_rules=False).string("quick").string("own").regex("br(.*?)own", children=True)\104 .matches(input_string)105 assert len(matches) == 2106 assert matches[0].value == "quick"107 assert matches[1].value == "own"108def test_rebulk_tags_names():109 rebulk = Rebulk()110 rebulk.string("quick", name="str", tags=["first", "other"])111 rebulk.regex("f.x", tags="other")112 def func(input_string):113 i = input_string.find("over")114 if i > -1:115 return i, i + len("over"), {'tags': ['custom']}116 rebulk.functional(func, name="fn")117 def func2(input_string):118 i = input_string.find("lazy")119 if i > -1:120 return {'start': i, 'end': i + len("lazy"), 'tags': ['custom']}121 rebulk.functional(func2, name="fn")122 input_string = "The quick brown fox jumps over the lazy dog"123 matches = rebulk.matches(input_string)124 assert len(matches) == 4125 assert len(matches.named("str")) == 1126 assert len(matches.named("fn")) == 2127 assert len(matches.named("false")) == 0128 assert len(matches.tagged("false")) == 0129 assert len(matches.tagged("first")) == 1130 assert len(matches.tagged("other")) == 2131 assert len(matches.tagged("custom")) == 2132def test_rebulk_rules_1():133 rebulk = Rebulk()134 rebulk.regex(r'\d{4}', name="year")135 rebulk.rules(rm.RemoveAllButLastYear)136 matches = rebulk.matches("1984 keep only last 1968 entry 1982 case")137 assert len(matches) == 1138 assert matches[0].value == "1982"139def test_rebulk_rules_2():140 rebulk = Rebulk()141 rebulk.regex(r'\d{4}', name="year")142 rebulk.string(r'year', name="yearPrefix", private=True)143 rebulk.string(r'keep', name="yearSuffix", private=True)144 rebulk.rules(rm.PrefixedSuffixedYear)145 matches = rebulk.matches("Keep suffix 1984 keep prefixed year 1968 and remove the rest 1982")146 assert len(matches) == 2147 assert matches[0].value == "1984"148 assert matches[1].value == "1968"149def test_rebulk_rules_3():150 rebulk = Rebulk()151 rebulk.regex(r'\d{4}', name="year")152 rebulk.string(r'year', name="yearPrefix", private=True)153 rebulk.string(r'keep', name="yearSuffix", private=True)154 rebulk.rules(rm.PrefixedSuffixedYearNoLambda)155 matches = rebulk.matches("Keep suffix 1984 keep prefixed year 1968 and remove the rest 1982")156 assert len(matches) == 2157 assert matches[0].value == "1984"158 assert matches[1].value == "1968"159def test_rebulk_rules_4():160 class FirstOnlyRule(Rule):161 def when(self, matches, context):162 grabbed = matches.named("grabbed", 0)163 if grabbed and matches.previous(grabbed):164 return grabbed165 def then(self, matches, when_response, context):166 matches.remove(when_response)167 rebulk = Rebulk()168 rebulk.regex("This match (.*?)grabbed", name="grabbed")169 rebulk.regex("if it's (.*?)first match", private=True)170 rebulk.rules(FirstOnlyRule)171 matches = rebulk.matches("This match is grabbed only if it's the first match")172 assert len(matches) == 1173 assert matches[0].value == "This match is grabbed"174 matches = rebulk.matches("if it's NOT the first match, This match is NOT grabbed")175 assert len(matches) == 0176class TestMarkers(object):177 def test_one_marker(self):178 class MarkerRule(Rule):179 def when(self, matches, context):180 word_match = matches.named("word", 0)181 marker = matches.markers.at_match(word_match, lambda marker: marker.name == "mark1", 0)182 if not marker:183 return word_match184 def then(self, matches, when_response, context):185 matches.remove(when_response)186 rebulk = Rebulk().regex(r'\(.*?\)', marker=True, name="mark1") \187 .regex(r'\[.*?\]', marker=True, name="mark2") \188 .string("word", name="word") \189 .rules(MarkerRule)190 matches = rebulk.matches("grab (word) only if it's in parenthesis")191 assert len(matches) == 1192 assert matches[0].value == "word"193 matches = rebulk.matches("don't grab [word] if it's in braket")194 assert len(matches) == 0195 matches = rebulk.matches("don't grab word at all")196 assert len(matches) == 0197 def test_multiple_marker(self):198 class MarkerRule(Rule):199 def when(self, matches, context):200 word_match = matches.named("word", 0)201 marker = matches.markers.at_match(word_match,202 lambda marker: marker.name == "mark1" or marker.name == "mark2")203 if len(marker) < 2:204 return word_match205 def then(self, matches, when_response, context):206 matches.remove(when_response)207 rebulk = Rebulk().regex(r'\(.*?\)', marker=True, name="mark1") \208 .regex(r'\[.*?\]', marker=True, name="mark2") \209 .regex("w.*?d", name="word") \210 .rules(MarkerRule)211 matches = rebulk.matches("[grab (word) only] if it's in parenthesis and brakets")212 assert len(matches) == 1213 assert matches[0].value == "word"214 matches = rebulk.matches("[don't grab](word)[if brakets are outside]")215 assert len(matches) == 0216 matches = rebulk.matches("(grab w[or)d even] if it's partially in parenthesis and brakets")217 assert len(matches) == 1218 assert matches[0].value == "w[or)d"219 def test_at_index_marker(self):220 class MarkerRule(Rule):221 def when(self, matches, context):222 word_match = matches.named("word", 0)223 marker = matches.markers.at_index(word_match.start,224 lambda marker: marker.name == "mark1", 0)225 if not marker:226 return word_match227 def then(self, matches, when_response, context):228 matches.remove(when_response)229 rebulk = Rebulk().regex(r'\(.*?\)', marker=True, name="mark1") \230 .regex("w.*?d", name="word") \231 .rules(MarkerRule)232 matches = rebulk.matches("gr(ab wo)rd only if starting of match is inside parenthesis")233 assert len(matches) == 1234 assert matches[0].value == "wo)rd"235 matches = rebulk.matches("don't grab wo(rd if starting of match is not inside parenthesis")236 assert len(matches) == 0237 def test_remove_marker(self):238 class MarkerRule(Rule):239 def when(self, matches, context):240 marker = matches.markers.named("mark1", 0)241 if marker:242 return marker243 def then(self, matches, when_response, context):244 matches.markers.remove(when_response)245 rebulk = Rebulk().regex(r'\(.*?\)', marker=True, name="mark1") \246 .regex("w.*?d", name="word") \247 .rules(MarkerRule)248 matches = rebulk.matches("grab word event (if it's not) inside parenthesis")249 assert len(matches) == 1250 assert matches[0].value == "word"251 assert not matches.markers252class TestUnicode(object):253 def test_rebulk_simple(self):254 input_string = u"ææ·çæ£è²çç¸è·³éæ¶ç"255 rebulk = Rebulk()256 rebulk.string(u"æ")257 rebulk.regex(u"æ·")258 def func(input_string):259 i = input_string.find(u"ç")260 if i > -1:261 return i, i + len(u"ç")262 rebulk.functional(func)263 matches = rebulk.matches(input_string)264 assert len(matches) == 3265 assert matches[0].value == u"æ"266 assert matches[1].value == u"æ·"267 assert matches[2].value == u"ç"268class TestImmutable(object):269 def test_starting(self):270 input_string = "The quick brown fox jumps over the lazy dog"271 matches = Rebulk().string("quick").string("over").string("fox").matches(input_string)272 for i in range(0, len(input_string)):273 starting = matches.starting(i)274 for match in list(starting):275 starting.remove(match)276 assert len(matches) == 3277 def test_ending(self):278 input_string = "The quick brown fox jumps over the lazy dog"279 matches = Rebulk().string("quick").string("over").string("fox").matches(input_string)280 for i in range(0, len(input_string)):281 starting = matches.ending(i)282 for match in list(starting):283 starting.remove(match)284 assert len(matches) == 3285 def test_named(self):286 input_string = "The quick brown fox jumps over the lazy dog"287 matches = Rebulk().defaults(name='test').string("quick").string("over").string("fox").matches(input_string)288 named = matches.named('test')289 for match in list(named):290 named.remove(match)291 assert len(named) == 0...
test_chain.py
Source:test_chain.py
...48 rebulk.chain()\49 .regex("(?P<test>test)") \50 .regex(" ").repeater("*") \51 .regex("(?P<testIgnore>testIgnore)")52 matches = rebulk.matches("test testIgnore")53 assert len(matches) == 154 assert matches[0].name == "test"55def test_matches():56 rebulk = Rebulk()57 def digit(input_string):58 i = input_string.find("1849")59 if i > -1:60 return i, i + len("1849")61 input_string = "1849testtestxxfixfux_foxabc1849testtestxoptionalfoxabc"62 chain = rebulk.chain() \63 .functional(digit) \64 .string("test").hidden().repeater(2) \65 .string("x").hidden().repeater('{1,3}') \66 .string("optional").hidden().repeater('?') \67 .regex("f.?x", name='result').repeater('+') \68 .close()69 matches = chain.matches(input_string)70 assert len(matches) == 271 children = matches[0].children72 assert children[0].value == '1849'73 assert children[1].value == 'fix'74 assert children[2].value == 'fux'75 children = matches[1].children76 assert children[0].value == '1849'77 assert children[1].value == 'fox'78 input_string = "_1850testtestxoptionalfoxabc"79 matches = chain.matches(input_string)80 assert len(matches) == 081 input_string = "_1849testtesttesttestxoptionalfoxabc"82 matches = chain.matches(input_string)83 assert len(matches) == 084 input_string = "_1849testtestxxxxoptionalfoxabc"85 matches = chain.matches(input_string)86 assert len(matches) == 087 input_string = "_1849testtestoptionalfoxabc"88 matches = chain.matches(input_string)89 assert len(matches) == 090 input_string = "_1849testtestxoptionalabc"91 matches = chain.matches(input_string)92 assert len(matches) == 093 input_string = "_1849testtestxoptionalfaxabc"94 matches = chain.matches(input_string)95 assert len(matches) == 196 children = matches[0].children97 assert children[0].value == '1849'98 assert children[1].value == 'fax'99def test_matches_2():100 rebulk = Rebulk() \101 .regex_defaults(flags=re.IGNORECASE) \102 .chain(children=True, formatter={'episode': int}) \103 .defaults(formatter={'version': int}) \104 .regex(r'e(?P<episode>\d{1,4})') \105 .regex(r'v(?P<version>\d+)').repeater('?') \106 .regex(r'[ex-](?P<episode>\d{1,4})').repeater('*') \107 .close()108 matches = rebulk.matches("This is E14v2-15E16x17")109 assert len(matches) == 5110 assert matches[0].name == 'episode'111 assert matches[0].value == 14112 assert matches[1].name == 'version'113 assert matches[1].value == 2114 assert matches[2].name == 'episode'115 assert matches[2].value == 15116 assert matches[3].name == 'episode'117 assert matches[3].value == 16118 assert matches[4].name == 'episode'119 assert matches[4].value == 17120def test_matches_3():121 alt_dash = (r'@', r'[\W_]') # abbreviation122 rebulk = Rebulk()123 rebulk.chain(formatter={'season': int, 'episode': int},124 tags=['SxxExx'],125 abbreviations=[alt_dash],126 private_names=['episodeSeparator', 'seasonSeparator'],127 children=True,128 private_parent=True,129 conflict_solver=lambda match, other: match130 if match.name in ['season', 'episode'] and other.name in131 ['screen_size', 'video_codec', 'audio_codec',132 'audio_channels', 'container', 'date']133 else '__default__') \134 .regex(r'(?P<season>\d+)@?x@?(?P<episode>\d+)') \135 .regex(r'(?P<episodeSeparator>x|-|\+|&)(?P<episode>\d+)').repeater('*') \136 .chain() \137 .regex(r'S(?P<season>\d+)@?(?:xE|Ex|E|x)@?(?P<episode>\d+)') \138 .regex(r'(?:(?P<episodeSeparator>xE|Ex|E|x|-|\+|&)(?P<episode>\d+))').repeater('*') \139 .chain() \140 .regex(r'S(?P<season>\d+)') \141 .regex(r'(?P<seasonSeparator>S|-|\+|&)(?P<season>\d+)').repeater('*')142 matches = rebulk.matches("test-01x02-03")143 assert len(matches) == 3144 assert matches[0].name == 'season'145 assert matches[0].value == 1146 assert matches[1].name == 'episode'147 assert matches[1].value == 2148 assert matches[2].name == 'episode'149 assert matches[2].value == 3150 matches = rebulk.matches("test-S01E02-03")151 assert len(matches) == 3152 assert matches[0].name == 'season'153 assert matches[0].value == 1154 assert matches[1].name == 'episode'155 assert matches[1].value == 2156 assert matches[2].name == 'episode'157 assert matches[2].value == 3158 matches = rebulk.matches("test-S01-02-03-04")159 assert len(matches) == 4160 assert matches[0].name == 'season'161 assert matches[0].value == 1162 assert matches[1].name == 'season'163 assert matches[1].value == 2164 assert matches[2].name == 'season'165 assert matches[2].value == 3166 assert matches[3].name == 'season'167 assert matches[3].value == 4168def test_matches_4():169 seps_surround = partial(chars_surround, " ")170 rebulk = Rebulk()171 rebulk.regex_defaults(flags=re.IGNORECASE)172 rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator'], validate_all=True,173 validator={'__parent__': seps_surround}, children=True, private_parent=True)174 rebulk.chain(formatter={'episode': int, 'version': int}) \175 .defaults(validator=None) \176 .regex(r'e(?P<episode>\d{1,4})') \177 .regex(r'v(?P<version>\d+)').repeater('?') \178 .regex(r'(?P<episodeSeparator>e|x|-)(?P<episode>\d{1,4})').repeater('*')179 matches = rebulk.matches("Some Series E01E02E03")180 assert len(matches) == 3181 assert matches[0].value == 1182 assert matches[1].value == 2183 assert matches[2].value == 3184def test_matches_5():185 seps_surround = partial(chars_surround, " ")186 rebulk = Rebulk()187 rebulk.regex_defaults(flags=re.IGNORECASE)188 rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator'], validate_all=True,189 validator={'__parent__': seps_surround}, children=True, private_parent=True)190 rebulk.chain(formatter={'episode': int, 'version': int}) \191 .defaults(validator=None) \192 .regex(r'e(?P<episode>\d{1,4})') \193 .regex(r'v(?P<version>\d+)').repeater('?') \194 .regex(r'(?P<episodeSeparator>e|x|-)(?P<episode>\d{1,4})').repeater('{2,3}')195 matches = rebulk.matches("Some Series E01E02E03")196 assert len(matches) == 3197 matches = rebulk.matches("Some Series E01E02")198 assert len(matches) == 0199 matches = rebulk.matches("Some Series E01E02E03E04E05E06") # Parent can't be validated, so no results at all200 assert len(matches) == 0201def test_matches_6():202 rebulk = Rebulk()203 rebulk.regex_defaults(flags=re.IGNORECASE)204 rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator'], validate_all=True,205 validator=None, children=True, private_parent=True)206 rebulk.chain(formatter={'episode': int, 'version': int}) \207 .defaults(validator=None) \208 .regex(r'e(?P<episode>\d{1,4})') \209 .regex(r'v(?P<version>\d+)').repeater('?') \210 .regex(r'(?P<episodeSeparator>e|x|-)(?P<episode>\d{1,4})').repeater('{2,3}')211 matches = rebulk.matches("Some Series E01E02E03")212 assert len(matches) == 3213 matches = rebulk.matches("Some Series E01E02")214 assert len(matches) == 0215 matches = rebulk.matches("Some Series E01E02E03E04E05E06") # No validator on parent, so it should give 4 episodes.216 assert len(matches) == 4217def test_matches_7():218 seps_surround = partial(chars_surround, ' .-/')219 rebulk = Rebulk()220 rebulk.regex_defaults(flags=re.IGNORECASE)221 rebulk.defaults(children=True, private_parent=True)222 rebulk.chain(). \223 regex(r'S(?P<season>\d+)', validate_all=True, validator={'__parent__': seps_surround}). \224 regex(r'[ -](?P<season>\d+)', validator=seps_surround).repeater('*')225 matches = rebulk.matches("Some S01")226 assert len(matches) == 1227 matches[0].value = 1228 matches = rebulk.matches("Some S01-02")229 assert len(matches) == 2230 matches[0].value = 1231 matches[1].value = 2232 matches = rebulk.matches("programs4/Some S01-02")233 assert len(matches) == 2234 matches[0].value = 1235 matches[1].value = 2236 matches = rebulk.matches("programs4/SomeS01middle.S02-03.andS04here")237 assert len(matches) == 2238 matches[0].value = 2239 matches[1].value = 3240 matches = rebulk.matches("Some 02.and.S04-05.here")241 assert len(matches) == 2242 matches[0].value = 4243 matches[1].value = 5244def test_chain_breaker():245 def chain_breaker(matches):246 seasons = matches.named('season')247 if len(seasons) > 1:248 if seasons[-1].value - seasons[-2].value > 10:249 return True250 return False251 seps_surround = partial(chars_surround, ' .-/')252 rebulk = Rebulk()253 rebulk.regex_defaults(flags=re.IGNORECASE)254 rebulk.defaults(children=True, private_parent=True, formatter={'season': int})255 rebulk.chain(chain_breaker=chain_breaker). \256 regex(r'S(?P<season>\d+)', validate_all=True, validator={'__parent__': seps_surround}). \257 regex(r'[ -](?P<season>\d+)', validator=seps_surround).repeater('*')258 matches = rebulk.matches("Some S01-02-03-50-51")259 assert len(matches) == 3260 matches[0].value = 1261 matches[1].value = 2262 matches[2].value = 3263def test_chain_breaker_defaults():264 def chain_breaker(matches):265 seasons = matches.named('season')266 if len(seasons) > 1:267 if seasons[-1].value - seasons[-2].value > 10:268 return True269 return False270 seps_surround = partial(chars_surround, ' .-/')271 rebulk = Rebulk()272 rebulk.regex_defaults(flags=re.IGNORECASE)273 rebulk.defaults(chain_breaker=chain_breaker, children=True, private_parent=True, formatter={'season': int})274 rebulk.chain(). \275 regex(r'S(?P<season>\d+)', validate_all=True, validator={'__parent__': seps_surround}). \276 regex(r'[ -](?P<season>\d+)', validator=seps_surround).repeater('*')277 matches = rebulk.matches("Some S01-02-03-50-51")278 assert len(matches) == 3279 matches[0].value = 1280 matches[1].value = 2281 matches[2].value = 3282def test_chain_breaker_defaults2():283 def chain_breaker(matches):284 seasons = matches.named('season')285 if len(seasons) > 1:286 if seasons[-1].value - seasons[-2].value > 10:287 return True288 return False289 seps_surround = partial(chars_surround, ' .-/')290 rebulk = Rebulk()291 rebulk.regex_defaults(flags=re.IGNORECASE)292 rebulk.chain_defaults(chain_breaker=chain_breaker)293 rebulk.defaults(children=True, private_parent=True, formatter={'season': int})294 rebulk.chain(). \295 regex(r'S(?P<season>\d+)', validate_all=True, validator={'__parent__': seps_surround}). \296 regex(r'[ -](?P<season>\d+)', validator=seps_surround).repeater('*')297 matches = rebulk.matches("Some S01-02-03-50-51")298 assert len(matches) == 3299 matches[0].value = 1300 matches[1].value = 2...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!