Rename option to and improve output

This commit is contained in:
Thierry Deo 2018-03-08 09:42:32 +01:00
parent 19075371fa
commit 55c74c10d9
2 changed files with 31 additions and 16 deletions

View file

@ -30,13 +30,21 @@ def _process_filename_by_line(pattern, filename):
def _process_filename_at_once(pattern, filename):
retv = 0
with open(filename, 'rb') as f:
match = pattern.search(f.read())
contents = f.read()
match = pattern.search(contents)
if match:
retv = 1
output.write(
'{}:{}-{}:'.format(filename, match.start(), match.end()),
line_no = len(
re.compile('\n'.encode()).findall(contents, 0, match.start()),
)
output.write_line(match.group())
output.write(
'{}:{}:'.format(filename, line_no + 1),
)
matched_lines = match.group().split('\n')
matched_lines[0] = contents.split('\n')[line_no]
output.write_line('\n'.join(matched_lines))
return retv
@ -55,20 +63,20 @@ def main(argv=None):
),
)
parser.add_argument('-i', '--ignore-case', action='store_true')
parser.add_argument('-z', '--null-data', action='store_true')
parser.add_argument('--multiline', action='store_true')
parser.add_argument('pattern', help='python regex pattern.')
parser.add_argument('filenames', nargs='*')
args = parser.parse_args(argv)
flags = re.IGNORECASE if args.ignore_case else 0
if args.null_data:
if args.multiline:
flags = flags | re.MULTILINE | re.DOTALL
pattern = re.compile(args.pattern.encode(), flags)
retv = 0
for filename in args.filenames:
if args.null_data:
if args.multiline:
retv |= _process_filename_at_once(pattern, filename)
else:
retv |= _process_filename_by_line(pattern, filename)

View file

@ -40,22 +40,29 @@ def test_ignore_case(some_files, cap_out):
assert out == 'f2:1:[INFO] hi\n'
def test_null_data(some_files, cap_out):
ret = pygrep.main(('--null-data', r'foo\nbar', 'f1', 'f2', 'f3'))
def test_multiline(some_files, cap_out):
ret = pygrep.main(('--multiline', r'foo\nbar', 'f1', 'f2', 'f3'))
out = cap_out.get()
assert ret == 1
assert out == 'f1:0-7:foo\nbar\n'
assert out == 'f1:1:foo\nbar\n'
def test_null_data_dotall_flag_is_enabled(some_files, cap_out):
ret = pygrep.main(('--null-data', r'o.*bar', 'f1', 'f2', 'f3'))
def test_multiline_line_number(some_files, cap_out):
ret = pygrep.main(('--multiline', r'ar', 'f1', 'f2', 'f3'))
out = cap_out.get()
assert ret == 1
assert out == 'f1:1-7:oo\nbar\n'
assert out == 'f1:2:bar\n'
def test_null_data_multiline_flag_is_enabled(some_files, cap_out):
ret = pygrep.main(('--null-data', r'foo$.*bar', 'f1', 'f2', 'f3'))
def test_multiline_dotall_flag_is_enabled(some_files, cap_out):
ret = pygrep.main(('--multiline', r'o.*bar', 'f1', 'f2', 'f3'))
out = cap_out.get()
assert ret == 1
assert out == 'f1:0-7:foo\nbar\n'
assert out == 'f1:1:foo\nbar\n'
def test_multiline_multiline_flag_is_enabled(some_files, cap_out):
ret = pygrep.main(('--multiline', r'foo$.*bar', 'f1', 'f2', 'f3'))
out = cap_out.get()
assert ret == 1
assert out == 'f1:1:foo\nbar\n'