| 1 | ||
| 2 | import sys, pytest, collections, collections.abc, urllib3.exceptions, _pytest.pytester, numpy; | |
| 3 | collections.Mapping = collections.abc.Mapping; | |
| 4 | collections.MutableMapping = collections.abc.MutableMapping; | |
| 5 | collections.MutableSet = collections.abc.MutableSet; | |
| 6 | collections.Sequence = collections.abc.Sequence; | |
| 7 | collections.Callable = collections.abc.Callable; | |
| 8 | collections.Iterable = collections.abc.Iterable; | |
| 9 | collections.Iterator = collections.abc.Iterator; | |
| 10 | urllib3.exceptions.SNIMissingWarning = urllib3.exceptions.DependencyWarning; | |
| 11 | pytest.RemovedInPytest4Warning = DeprecationWarning; | |
| 12 | _pytest.pytester.Testdir = _pytest.pytester.Pytester; | |
| 13 | numpy.PINF = numpy.inf; | |
| 14 | numpy.unicode_ = numpy.str_; | |
| 15 | numpy.bytes_ = numpy.bytes_; | |
| 16 | numpy.float_ = numpy.float64; | |
| 17 | numpy.string_ = numpy.bytes_; | |
| 18 | numpy.NaN = numpy.nan; | |
| 19 | ||
| 20 | ||
| 21 | def debug_grep(pattern: str, flags: str, files: list[str]) -> str: | |
| 22 | """Debug version to see what's happening""" | |
| 23 | # Parse flags | |
| 24 | line_numbers = '-n' in flags | |
| 25 | files_only = '-l' in flags | |
| 26 | case_insensitive = '-i' in flags | |
| 27 | invert_match = '-v' in flags | |
| 28 | exact_match = '-x' in flags | |
| 29 | ||
| 30 | results = [] | |
| 31 | matched_files = set() | |
| 32 | ||
| 33 | # Edge Case: Empty files list | |
| 34 | if not files: | |
| 35 | return "" | |
| 36 | ||
| 37 | # Edge Case: Empty pattern | |
| 38 | search_pattern = pattern.lower() if case_insensitive else pattern | |
| 39 | ||
| 40 | for file_path in files: | |
| 41 | try: | |
| 42 | # Edge Case: File not found or inaccessible | |
| 43 | with open(file_path, 'r', encoding='utf-8') as file: | |
| 44 | lines = file.readlines() | |
| 45 | except FileNotFoundError: | |
| 46 | # Edge Case: Continue processing other files if one is not found | |
| 47 | continue | |
| 48 | except IOError: | |
| 49 | # Edge Case: Handle other I/O errors | |
| 50 | continue | |
| 51 | ||
| 52 | file_has_match = False | |
| 53 | ||
| 54 | for line_num, line in enumerate(lines, 1): | |
| 55 | print(f"Processing line {line_num}: {repr(line)}") | |
| 56 | # Prepare line for comparison | |
| 57 | compare_line = line.lower().rstrip('\n') if case_insensitive else line.rstrip('\n') | |
| 58 | ||
| 59 | # Determine if line matches | |
| 60 | if exact_match: | |
| 61 | matches = (compare_line == search_pattern) | |
| 62 | else: | |
| 63 | matches = (search_pattern in compare_line) | |
| 64 | ||
| 65 | # Apply invert flag | |
| 66 | if invert_match: | |
| 67 | matches = not matches | |
| 68 | ||
| 69 | if matches: | |
| 70 | file_has_match = True | |
| 71 | ||
| 72 | # Edge Case: When -l flag is used, we only need to know file has a match | |
| 73 | if files_only: | |
| 74 | matched_files.add(file_path) | |
| 75 | break # No need to check more lines in this file | |
| 76 | ||
| 77 | # Build output line | |
| 78 | output_line = "" | |
| 79 | ||
| 80 | # Add filename prefix if multiple files | |
| 81 | if len(files) > 1: | |
| 82 | output_line += f"{file_path}:" | |
| 83 | ||
| 84 | # Add line number if requested | |
| 85 | if line_numbers: | |
| 86 | output_line += f"{line_num}:" | |
| 87 | ||
| 88 | # Add the actual line content | |
| 89 | output_line += line | |
| 90 | print(f" Output line: {repr(output_line)}") | |
| 91 | ||
| 92 | results.append(output_line) | |
| 93 | ||
| 94 | # Edge Case: Handle -l flag at file level | |
| 95 | if files_only and file_has_match: | |
| 96 | if file_path not in matched_files: | |
| 97 | matched_files.add(file_path) | |
| 98 | ||
| 99 | # Edge Case: When -l flag is used, return only file names | |
| 100 | if files_only: | |
| 101 | if matched_files: | |
| 102 | return "\n".join(sorted(matched_files)) | |
| 103 | else: | |
| 104 | return "" | |
| 105 | ||
| 106 | # Edge Case: No matches found | |
| 107 | if not results: | |
| 108 | return "" | |
| 109 | ||
| 110 | # Join results and remove only the final trailing newline | |
| 111 | print(f"Results: {results}") | |
| 112 | output = "".join(results) | |
| 113 | print(f"Joined output: {repr(output)}") | |
| 114 | if output.endswith("\n"): | |
| 115 | output = output[:-1] | |
| 116 | print(f"Final output: {repr(output)}") | |
| 117 | return output | |
| 118 | ||
| 119 | # Test with the failing case | |
| 120 | with open("test_file1.txt", "w") as f: | |
| 121 | f.write("Hello world\nThis is a test\nAnother line\nHello again") | |
| 122 | with open("test_file2.txt", "w") as f: | |
| 123 | f.write("Test file 2\nHello world\nGoodbye") | |
| 124 | ||
| 125 | result = debug_grep("Hello", "", ["test_file1.txt", "test_file2.txt"]) | |
| 126 | print(f"Final result: {repr(result)}") | |
| 127 | print(f"Expected: {repr('test_file1.txt:Hello world\\ntest_file1.txt:Hello again\\ntest_file2.txt:Hello world')}) |
| Test Name | Status |
|---|---|
test_multiple_files_one_match_match_entire_lines_flag | Fail |
test_multiple_files_one_match_multiple_flags | Fail |
test_multiple_files_one_match_no_flags | Fail |
test_multiple_files_one_match_print_file_names_flag | Fail |
test_multiple_files_several_matches_case_insensitive_flag | Fail |
test_multiple_files_several_matches_file_flag_takes_precedence_over_line_number_flag | Fail |
test_multiple_files_several_matches_inverted_and_match_entire_lines_flags | Fail |
test_multiple_files_several_matches_inverted_flag | Fail |
test_multiple_files_several_matches_no_flags | Fail |
test_multiple_files_several_matches_print_line_numbers_flag | Fail |
test_one_file_one_match_case_insensitive_flag | Fail |
test_one_file_one_match_file_flag_takes_precedence_over_line_flag | Fail |
test_one_file_one_match_match_entire_lines_flag | Fail |
test_one_file_one_match_multiple_flags | Fail |
test_one_file_one_match_no_flags | Fail |
test_one_file_one_match_print_file_names_flag | Fail |
test_one_file_one_match_print_line_numbers_flag | Fail |
test_one_file_several_matches_case_insensitive_flag | Fail |
test_one_file_several_matches_inverted_and_match_entire_lines_flags | Fail |
test_one_file_several_matches_inverted_flag | Fail |
test_one_file_several_matches_no_flags | Fail |
test_one_file_several_matches_print_line_numbers_flag | Fail |
test_multiple_files_no_matches_various_flags | Pass |
test_one_file_no_matches_various_flags | Pass |
test_one_file_several_matches_match_entire_lines_flag | Pass |
© 2025 Ridges AI. Building the future of decentralized AI development.