Skip to content

Commit

Permalink
More flexible handling of ignored directories in elpy-find-file and e…
Browse files Browse the repository at this point in the history
…lpy-check (#1213)
  • Loading branch information
sam-s authored and galaunay committed Dec 7, 2017
1 parent b7343d8 commit 2630103
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 20 deletions.
64 changes: 44 additions & 20 deletions elpy.el
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
(require 'python)
(require 'subr-x)
(require 'xref nil t)
(require 'cl-lib) ; for `cl-every', `cl-copy-list', `cl-delete-if-not'

(require 'elpy-refactor)
(require 'elpy-django)
Expand Down Expand Up @@ -102,14 +103,29 @@ can be inidividually enabled or disabled."
:group 'elpy)

(defcustom elpy-project-ignored-directories
(append '(".tox" "build" "dist" ".cask" ".ipynb_checkpoints")
vc-directory-exclusion-list)
"Directories ignored by functions working on the whole project."
'(".tox" "build" "dist" ".cask" ".ipynb_checkpoints")
"Directories ignored by functions working on the whole project.
This is in addition to `vc-directory-exclusion-list'
and `grep-find-ignored-directories', as appropriate."
:type '(repeat string)
:safe (lambda (val)
(cl-every #'stringp val))
:group 'elpy)

(defun elpy-project-ignored-directories ()
"Compute the list of ignored directories for project.
Combines
`elpy-project-ignored-directories'
`vc-directory-exclusion-list'
`grep-find-ignored-directories'"
(delete-dups
(append elpy-project-ignored-directories
vc-directory-exclusion-list
(if (fboundp 'rgrep-find-ignored-directories)
(rgrep-find-ignored-directories (elpy-project-root))
(cl-delete-if-not #'stringp (cl-copy-list
grep-find-ignored-directories))))))

(defcustom elpy-project-root nil
"The root of the project the current buffer is in.
Expand Down Expand Up @@ -1386,8 +1402,7 @@ With a prefix argument, always prompt for a string to search for."
(concat "\\<" symbol "\\>")
(read-from-minibuffer "Search in project for regexp: " symbol)))))
(grep-compute-defaults)
(let ((grep-find-ignored-directories (append elpy-project-ignored-directories
grep-find-ignored-directories)))
(let ((grep-find-ignored-directories (elpy-project-ignored-directories)))
(rgrep regexp
elpy-rgrep-file-pattern
(or (elpy-project-root)
Expand All @@ -1403,24 +1418,33 @@ With a prefix argument, always prompt for a string to search for."
;;;;;;;;;;;;;;;;;;;;;;
;;; Find Project Files

(defcustom elpy-ffip-prune-patterns
(let ((extras ()))
(dolist (dir elpy-project-ignored-directories)
(let ((pat (concat "*/" dir "/*")))
(unless (member pat ffip-prune-patterns)
(push pat extras))))
(dolist (ext completion-ignored-extensions)
(unless (string-match "/$" ext)
(let ((pat (concat "*" ext)))
(unless (member pat ffip-prune-patterns)
(push pat extras)))))
(append extras ffip-prune-patterns))
"Elpy-specific extension of `ffip-prune-patterns'."
(defcustom elpy-ffip-prune-patterns '()
"Elpy-specific extension of `ffip-prune-patterns'.
This is in addition to `elpy-project-ignored-directories'
and `completion-ignored-extensions'.
The final value of `ffip-prune-patterns' used is computed
by the eponymous function `elpy-ffip-prune-patterns'."
:type '(repeat string)
:safe (lambda (val)
(cl-every #'stringp val))
:group 'elpy)

(defun elpy-ffip-prune-patterns ()
"Compute `ffip-prune-patterns' from other variables.
This combines
`elpy-ffip-prune-patterns'
`elpy-project-ignored-directories'
`completion-ignored-extensions'
`ffip-prune-patterns'."
(delete-dups
(nconc
(mapcar (lambda (dir) (concat "*/" dir "/*"))
elpy-project-ignored-directories)
(mapcar (lambda (ext) (concat "*" ext))
completion-ignored-extensions)
(cl-copy-list elpy-ffip-prune-patterns)
(cl-copy-list ffip-prune-patterns))))

(defun elpy-find-file (&optional dwim)
"Efficiently find a file in the current project.
Expand Down Expand Up @@ -1455,7 +1479,7 @@ file is <name>.py, and is either in the same directors or a
(find-file test-file)
(elpy-find-file nil))))
(t
(let ((ffip-prune-patterns elpy-ffip-prune-patterns)
(let ((ffip-prune-patterns (elpy-ffip-prune-patterns))
(ffip-project-root (or (elpy-project-root)
default-directory))
;; Set up ido to use vertical file lists.
Expand Down Expand Up @@ -1571,7 +1595,7 @@ with a prefix argument)."
" --ignore="
" --exclude=")
(mapconcat #'identity
elpy-project-ignored-directories
(elpy-project-ignored-directories)
","))
"")))
(compilation-start (concat python-check-command
Expand Down
6 changes: 6 additions & 0 deletions test/elpy-check-test.el
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
(elpy-testcase ((:project project-root "test.py"))
(find-file (f-join project-root "test.py"))
(mletf* ((command nil)
(vc-directory-exclusion-list ())
(grep-find-ignored-directories ())
(elpy-project-root project-root)
(elpy-project-ignored-directories '("foo" "bar"))
(compilation-start (command-arg mode name-function)
Expand All @@ -37,6 +39,8 @@
(elpy-testcase ((:project project-root "test.py"))
(find-file (f-join project-root "test.py"))
(mletf* ((command nil)
(vc-directory-exclusion-list ())
(grep-find-ignored-directories ())
(python-check-command "pylint")
(elpy-project-root project-root)
(elpy-project-ignored-directories '("foo" "bar"))
Expand All @@ -51,6 +55,8 @@
(elpy-testcase ((:project project-root "test.py"))
(find-file (f-join project-root "test.py"))
(mletf* ((command nil)
(vc-directory-exclusion-list ())
(grep-find-ignored-directories ())
(elpy-project-root () nil)
(elpy-project-ignored-directories '("foo" "bar"))
(compilation-start (command-arg mode name-function)
Expand Down

0 comments on commit 2630103

Please sign in to comment.