Konoha

Finished
11def grep(pattern: str, flags: str, files: list[str]) -> str:
2 pass
2 """
3 Search files for lines matching a search string and return all matching lines.
4
5 Args:
6 pattern (str): The string to search for
7 flags (str): Space-separated string of flags (-n, -l, -i, -v, -x)
8 files (list[str]): List of file paths to search in
9
10 Returns:
11 str: Matching lines formatted according to flags
12
13 The function supports the following flags:
14 -n: Prepend line numbers
15 -l: Output only filenames with matches
16 -i: Case-insensitive matching
17 -v: Invert matching (return non-matching lines)
18 -x: Match entire line only
19 """
20 # Parse flags
21 flag_list = flags.split() if flags else []
22 line_numbers = '-n' in flag_list
23 filenames_only = '-l' in flag_list
24 case_insensitive = '-i' in flag_list
25 invert_match = '-v' in flag_list
26 exact_match = '-x' in flag_list
27
28 # Prepare pattern for comparison
29 search_pattern = pattern.lower() if case_insensitive else pattern
30
31 results = []
32 matching_files = set()
33
34 # Process each file
35 for filename in files:
36 try:
37 with open(filename, 'r', encoding='utf-8') as f:
38 lines = f.readlines()
39 except FileNotFoundError:
40 # Edge Case: File not found - skip the file
41 continue
42 except Exception:
43 # Edge Case: Other file reading errors - skip the file
44 continue
45
46 # Process each line in the file
47 for line_num, line in enumerate(lines, 1):
48 # Prepare line for comparison
49 compare_line = line.lower() if case_insensitive else line
50
51 # Determine if line matches
52 if exact_match:
53 # Edge Case: Exact match flag - check if entire line matches pattern
54 matches = search_pattern == compare_line.rstrip('\n')
55 else:
56 # Edge Case: Partial match - check if pattern is in line
57 matches = search_pattern in compare_line
58
59 # Apply invert flag
60 if invert_match:
61 # Edge Case: Invert match flag - flip the match result
62 matches = not matches
63
64 # If line matches, collect results
65 if matches:
66 if filenames_only:
67 # Edge Case: Filenames only flag - just record the filename
68 matching_files.add(filename)
69 break # No need to check more lines in this file
70 else:
71 # Build output line
72 output_line = ""
73
74 # Add filename prefix if multiple files
75 if len(files) > 1:
76 output_line += f"{filename}:"
77
78 # Add line number if requested
79 if line_numbers:
80 output_line += f"{line_num}:"
81
82 # Add the actual line content
83 output_line += line
84
85 results.append(output_line)
86
87 # Handle filenames only output
88 if filenames_only:
89 # Edge Case: No matching files - return empty string
90 return "\n".join(sorted(matching_files)) + ("\n" if matching_files else "")
91
92 # Edge Case: No matches found - return empty string
93 # Edge Case: Single match - no trailing newline
94 # Edge Case: Multiple matches - join with newlines
95 return "".join(results)
96
97# Handled Edge Cases: File not found, other file reading errors, exact match flag, partial match, invert match flag, filenames only flag, no matching files, no matches found, single match, multiple matches
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.