summaryrefslogtreecommitdiff
path: root/Lib/idlelib/grep.py
diff options
context:
space:
mode:
authorCheryl Sabella <cheryl.sabella@gmail.com>2019-03-23 07:33:42 -0400
committerGitHub <noreply@github.com>2019-03-23 07:33:42 -0400
commitd60f658fc0278f3fcdadec8ddcab35b8ae03e1d1 (patch)
treeed62b0ba7464fae17af4886b4fb6f9e7fa7b32df /Lib/idlelib/grep.py
parent6d5ee973f0600a3a9444f569dcf0dd346bfa2a11 (diff)
downloadcpython-git-d60f658fc0278f3fcdadec8ddcab35b8ae03e1d1.tar.gz
bpo-23205: IDLE: Add tests and refactor grep's findfiles (GH-12203)
* Add tests for grep findfiles. * Move findfiles to module function. * Change findfiles to use os.walk. Based on a patch by Al Sweigart.
Diffstat (limited to 'Lib/idlelib/grep.py')
-rw-r--r--Lib/idlelib/grep.py60
1 files changed, 26 insertions, 34 deletions
diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py
index 6068d7e4df..12513594b7 100644
--- a/Lib/idlelib/grep.py
+++ b/Lib/idlelib/grep.py
@@ -40,6 +40,27 @@ def grep(text, io=None, flist=None):
dialog.open(text, searchphrase, io)
+def walk_error(msg):
+ "Handle os.walk error."
+ print(msg)
+
+
+def findfiles(folder, pattern, recursive):
+ """Generate file names in dir that match pattern.
+
+ Args:
+ folder: Root directory to search.
+ pattern: File pattern to match.
+ recursive: True to include subdirectories.
+ """
+ for dirpath, _, filenames in os.walk(folder, onerror=walk_error):
+ yield from (os.path.join(dirpath, name)
+ for name in filenames
+ if fnmatch.fnmatch(name, pattern))
+ if not recursive:
+ break
+
+
class GrepDialog(SearchDialogBase):
"Dialog for searching multiple files."
@@ -140,15 +161,16 @@ class GrepDialog(SearchDialogBase):
prog: The compiled, cooked search pattern.
path: String containing the search path.
"""
- dir, base = os.path.split(path)
- list = self.findfiles(dir, base, self.recvar.get())
- list.sort()
+ folder, filepat = os.path.split(path)
+ if not folder:
+ folder = os.curdir
+ filelist = sorted(findfiles(folder, filepat, self.recvar.get()))
self.close()
pat = self.engine.getpat()
print(f"Searching {pat!r} in {path} ...")
hits = 0
try:
- for fn in list:
+ for fn in filelist:
try:
with open(fn, errors='replace') as f:
for lineno, line in enumerate(f, 1):
@@ -166,36 +188,6 @@ class GrepDialog(SearchDialogBase):
# so in OW.write, OW.text.insert fails.
pass
- def findfiles(self, dir, base, rec):
- """Return list of files in the dir that match the base pattern.
-
- Use the current directory if dir has no value.
- If rec is True, recursively iterate through subdirectories.
-
- Args:
- dir: Directory path to search.
- base: File search pattern.
- rec: Boolean for recursive search through subdirectories.
- """
- try:
- names = os.listdir(dir or os.curdir)
- except OSError as msg:
- print(msg)
- return []
- list = []
- subdirs = []
- for name in names:
- fn = os.path.join(dir, name)
- if os.path.isdir(fn):
- subdirs.append(fn)
- else:
- if fnmatch.fnmatch(name, base):
- list.append(fn)
- if rec:
- for subdir in subdirs:
- list.extend(self.findfiles(subdir, base, rec))
- return list
-
def _grep_dialog(parent): # htest #
from tkinter import Toplevel, Text, SEL, END