File indexing completed on 2025-08-03 08:09:25
0001 import sys
0002 import yaml
0003 import re
0004 import argparse
0005 from collections import namedtuple
0006
0007
0008 Config = namedtuple(
0009 "Config", ["remove_lines", "replace_lines", "ignore_files"], defaults=[[], [], []]
0010 )
0011
0012
0013 class State:
0014 skip_file: bool = False
0015
0016
0017 def parse_config(config: Config):
0018 remove_lines = []
0019 for s in config["remove_lines"]:
0020 remove_lines.append(re.compile(s))
0021
0022 replace_lines = []
0023 for s in config["replace_lines"]:
0024 s, r = list(s.items())[0]
0025 replace_lines.append((re.compile(s), r))
0026
0027 ignore_files = []
0028 for s in config["ignore_files"]:
0029 ignore_files.append(re.compile(s))
0030
0031 return Config(
0032 remove_lines=remove_lines,
0033 replace_lines=replace_lines,
0034 ignore_files=ignore_files,
0035 )
0036
0037
0038 def filter(line: str, config: Config, state: State):
0039 if state.skip_file:
0040 if line.endswith("---\n"):
0041 state.skip_file = False
0042 return None
0043
0044 if line.endswith(" should add these lines:\n"):
0045 for s in config.ignore_files:
0046 if s.search(line):
0047 state.skip_file = True
0048 return None
0049
0050 for s in config.remove_lines:
0051 if s.search(line):
0052 return None
0053
0054 for s, r in config.replace_lines:
0055 if s.search(line):
0056 return s.sub(r, line)
0057
0058 return line
0059
0060
0061 parser = argparse.ArgumentParser()
0062 parser.add_argument("config")
0063 parser.add_argument("input")
0064 parser.add_argument("output")
0065 args = parser.parse_args()
0066
0067 with open(args.config, "r") as config_file:
0068 try:
0069 config = yaml.safe_load(config_file)
0070 config = parse_config(config)
0071 except yaml.YAMLError as exc:
0072 print(exc)
0073 sys.exit(1)
0074
0075 with open(args.input, "r") as input_file, open(args.output, "w") as output_file:
0076 state = State()
0077
0078 for line in input_file:
0079 filtered_line = filter(line, config, state)
0080 if filtered_line is not None:
0081 output_file.write(filtered_line)
0082
0083 sys.exit(0)