The runners all share the bulk of their logic - extract the changed files, filter them by a matcher of some sort, filter them by the file_filter regex, determine whether to skip execution based on the presence of relevant files, etc.
We can extract a class to pull out most of that logic, but it needs to be intuitive to use - we need it to be easy to build a new tool even if one is unfamiliar with the system.
The runners all share the bulk of their logic - extract the changed files, filter them by a matcher of some sort, filter them by the file_filter regex, determine whether to skip execution based on the presence of relevant files, etc.
We can extract a class to pull out most of that logic, but it needs to be intuitive to use - we need it to be easy to build a new tool even if one is unfamiliar with the system.