def gen_config_file() -> None: # Generates a `.fixit.config.yaml` file with defaults in the current working dir. config_file = LINT_CONFIG_FILE_NAME.resolve() default_config_dict = asdict(LintConfig()) with open(config_file, "w") as cf: yaml.dump(default_config_dict, cf)
def _gen_testcase_config(dir_rules: Dict[str, object]) -> LintConfig: return LintConfig(repo_root=TEST_REPO_ROOT, rule_config={"ImportConstraintsRule": dir_rules})
pass class FixtureFileNotFoundError(Exception): pass class LintRuleNotFoundError(Exception): pass LintRuleCollectionT = Set[Union[Type[CstLintRule], Type[PseudoLintRule]]] DEFAULT_FILENAME: str = "not/a/real/file/path.py" DEFAULT_CONFIG: LintConfig = LintConfig( repo_root=str( Path(__file__).parent.parent ), # Set base config repo_root to `fixit` directory for testing. ) @add_slots @dataclass(frozen=True) class ValidTestCase: code: str filename: str = DEFAULT_FILENAME config: LintConfig = DEFAULT_CONFIG @add_slots @dataclass(frozen=True) class Position:
def test( self, *, source: bytes, rules_in_lint_run: Collection[Type[CstLintRule]], rules_without_report: Collection[Type[CstLintRule]], suppressed_line: int, expected_unused_suppressions_report_messages: Collection[str], expected_replacements: Optional[List[str]] = None, ) -> None: reports = [ CstLintRuleReport( file_path=FILE_PATH, node=cst.EmptyLine(), code=rule.__name__, message="message", line=suppressed_line, column=0, module=cst.MetadataWrapper(cst.parse_module(source)), module_bytes=source, ) for rule in rules_in_lint_run if rule not in rules_without_report ] tokens = _get_tokens(source) ignore_info = IgnoreInfo.compute( comment_info=CommentInfo.compute(tokens=tokens), line_mapping_info=LineMappingInfo.compute(tokens=tokens), use_noqa=False, ) cst_wrapper = MetadataWrapper(cst.parse_module(source), unsafe_skip_copy=True) config = LintConfig( rule_config={ RemoveUnusedSuppressionsRule.__name__: { "ignore_info": ignore_info, "rules": rules_in_lint_run, } }) unused_suppressions_context = CstContext(cst_wrapper, source, FILE_PATH, config) for report in reports: ignore_info.should_ignore_report(report) _visit_cst_rules_with_context(cst_wrapper, [RemoveUnusedSuppressionsRule], unused_suppressions_context) messages = [] patches = [] for report in unused_suppressions_context.reports: messages.append(report.message) patches.append(report.patch) self.assertEqual(messages, expected_unused_suppressions_report_messages) if expected_replacements is None: self.assertEqual(len(patches), 0) else: self.assertEqual(len(patches), len(expected_replacements)) for idx, patch in enumerate(patches): replacement = patch.apply(source.decode()) self.assertEqual(replacement, expected_replacements[idx])