joseph

Finished
11def grep(pattern: str, flags: str, files: list[str]) -> str:
2 pass
2 # Parse flags
3 line_numbers = '-n' in flags
4 files_only = '-l' in flags
5 case_insensitive = '-i' in flags
6 invert_match = '-v' in flags
7 exact_match = '-x' in flags
8
9 # Prepare pattern for comparison
10 search_pattern = pattern.lower() if case_insensitive else pattern
11
12 # Results storage
13 results = []
14 matched_files = set()
15
16 # Process each file
17 for filename in files:
18 try:
19 with open(filename, 'r', encoding='utf-8') as file:
20 # Edge Case: Handle files that cannot be read
21 lines = file.readlines()
22 except FileNotFoundError:
23 # Edge Case: Handle missing files
24 continue
25 except Exception:
26 # Edge Case: Handle other file reading errors
27 continue
28
29 # Process each line in the file
30 for line_num, line in enumerate(lines, 1):
31 # Prepare line for comparison
32 compare_line = line.lower() if case_insensitive else line
33
34 # Determine if line matches
35 if exact_match:
36 # Edge Case: Exact match flag requires the entire line to match
37 is_match = (search_pattern == compare_line.rstrip('\n')) or (search_pattern == compare_line.rstrip('\n\r'))
38 else:
39 # Edge Case: Normal substring search
40 is_match = search_pattern in compare_line
41
42 # Apply invert flag
43 if invert_match:
44 # Edge Case: Invert match inverts the result of the matching
45 is_match = not is_match
46
47 # If we have a match
48 if is_match:
49 # Edge Case: When only file names are requested
50 if files_only:
51 matched_files.add(filename)
52 break # No need to check more lines in this file
53 else:
54 # Build output line
55 output_line = ""
56 # Edge Case: Multiple files require filename prefix
57 if len(files) > 1:
58 output_line += f"{filename}:"
59 # Edge Case: Line numbers flag adds line number
60 if line_numbers:
61 output_line += f"{line_num}:"
62 output_line += line
63 results.append(output_line)
64
65 # Edge Case: When only file names are requested, return them
66 if files_only:
67 # Edge Case: Maintain file order as specified in input
68 ordered_files = [f for f in files if f in matched_files]
69 return "\n".join(ordered_files) + ("\n" if ordered_files else "")
70
71 # Edge Case: Normal output with matched lines
72 return "".join(results)
73
74# Handled Edge Cases: Empty files, missing files, file reading errors, case insensitive matching, exact line matching, inverted matching, line numbering, file name only output, multiple files with prefixes, maintaining input file order
Test NameStatus
test_multiple_files_no_matches_various_flags
Pass
test_multiple_files_one_match_match_entire_lines_flag
Pass
test_multiple_files_one_match_multiple_flags
Pass
test_multiple_files_one_match_no_flags
Pass
test_multiple_files_one_match_print_file_names_flag
Pass
test_multiple_files_several_matches_case_insensitive_flag
Pass
test_multiple_files_several_matches_file_flag_takes_precedence_over_line_number_flag
Pass
test_multiple_files_several_matches_inverted_and_match_entire_lines_flags
Pass
test_multiple_files_several_matches_inverted_flag
Pass
test_multiple_files_several_matches_no_flags
Pass
test_multiple_files_several_matches_print_line_numbers_flag
Pass
test_one_file_no_matches_various_flags
Pass
test_one_file_one_match_case_insensitive_flag
Pass
test_one_file_one_match_file_flag_takes_precedence_over_line_flag
Pass
test_one_file_one_match_match_entire_lines_flag
Pass
test_one_file_one_match_multiple_flags
Pass
test_one_file_one_match_no_flags
Pass
test_one_file_one_match_print_file_names_flag
Pass
test_one_file_one_match_print_line_numbers_flag
Pass
test_one_file_several_matches_case_insensitive_flag
Pass
test_one_file_several_matches_inverted_and_match_entire_lines_flags
Pass
test_one_file_several_matches_inverted_flag
Pass
test_one_file_several_matches_match_entire_lines_flag
Pass
test_one_file_several_matches_no_flags
Pass
test_one_file_several_matches_print_line_numbers_flag
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.