def test_file_candidates(url, spec, expected_candidates): # we circumvent the path existence checks here to simplify testing filt, subj, repl = parse_spec(spec) spec = MapLocalSpec(filt, subj, Path(repl)) candidates = file_candidates(url, spec) assert [x.as_posix() for x in candidates] == expected_candidates
def parse_map_remote_spec(option: str) -> MapRemoteSpec: spec = MapRemoteSpec(*parse_spec(option)) try: re.compile(spec.subject) except re.error as e: raise ValueError(f"Invalid regular expression {spec.subject!r} ({e})") return spec
def parse_map_local_spec(option: str) -> MapLocalSpec: filter, regex, replacement = parse_spec(option) try: re.compile(regex) except re.error as e: raise ValueError(f"Invalid regular expression {regex!r} ({e})") try: path = Path(replacement).expanduser().resolve(strict=True) except FileNotFoundError as e: raise ValueError(f"Invalid file path: {replacement} ({e})") return MapLocalSpec(filter, regex, path)
def parse_modify_spec(option: str, subject_is_regex: bool) -> ModifySpec: flow_filter, subject_str, replacement = parse_spec(option) subject = strutils.escaped_str_to_bytes(subject_str) if subject_is_regex: try: re.compile(subject) except re.error as e: raise ValueError(f"Invalid regular expression {subject!r} ({e})") spec = ModifySpec(flow_filter, subject, replacement) try: spec.read_replacement() except OSError as e: raise ValueError(f"Invalid file path: {replacement[1:]} ({e})") return spec
def test_parse_spec(): flow_filter, subject, replacement = parse_spec("/foo/bar/voing") assert flow_filter.pattern == "foo" assert subject == "bar" assert replacement == "voing" flow_filter, subject, replacement = parse_spec("/bar/voing") assert flow_filter(1) is True assert subject == "bar" assert replacement == "voing" with pytest.raises(ValueError, match="Invalid number of parameters"): parse_spec("/") with pytest.raises(ValueError, match="Invalid filter expression"): parse_spec("/~b/one/two")