From 1e404eccd2587c040c03ab7ed2b9ca0e910f94f5 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sun, 8 May 2016 12:56:25 -0400 Subject: Rework indentation The previous implementation did not support some legal syntax: * spaces between rule lines * indented rule blocks (e.g., a rule defined under an if-statement) * top-level commands like "include" when the value started on the second line (re: #16) --- snakemake-test.el | 329 ++++++++++++++++++++---------------------------------- 1 file changed, 120 insertions(+), 209 deletions(-) (limited to 'snakemake-test.el') diff --git a/snakemake-test.el b/snakemake-test.el index f092756..034350c 100644 --- a/snakemake-test.el +++ b/snakemake-test.el @@ -96,7 +96,6 @@ rule: ;;;; Indentation (ert-deftest snakemake-test-indent-line/at-rule-block () - ;; Always shift first line of block to column 0. (should (string= "rule abc:" @@ -118,8 +117,6 @@ rule: " rule abc :" (snakemake-indent-line) (buffer-string)))) - - ;; Don't move point if beyond column 0. (should (string= "rule abc: " @@ -129,14 +126,28 @@ rule: (buffer-string)))) (should (string= - "rule " + " +if True: + rule abc:" (snakemake-with-temp-text - " rule abc: " + " +if True: +rule abc:" (snakemake-indent-line) - (buffer-substring (point-min) (point)))))) + (buffer-string)))) + (should + (string= + " +if True: +rule abc:" + (snakemake-with-temp-text + " +if True: + rule abc:" + (snakemake-indent-line 'prev) + (buffer-string))))) (ert-deftest snakemake-test-indent-line/outside-rule () - ;; Use standard Python mode indentation outside of rule blocks. (should (string= " @@ -149,10 +160,49 @@ def ok(): (snakemake-indent-line) (buffer-string))))) +(ert-deftest snakemake-test-indent-line/toplevel-command () + (should + (string= + "include: \"somefile\"" + (snakemake-with-temp-text + "include: \"somefile\"" + (snakemake-indent-line) + (buffer-string)))) + (should + (string= + "include: \"somefile\"" + (snakemake-with-temp-text + " include: \"somefile\"" + (snakemake-indent-line) + (buffer-string)))) + (should + (string= + " +if True: + include: \"somefile\" +" + (snakemake-with-temp-text + " +if True: +include: \"somefile\" +" + (snakemake-indent-line) + (buffer-string)))) + (should + (string= + " +include: + \"somefile\" +" + (snakemake-with-temp-text + " +include: +\"somefile\" +" + (snakemake-indent-line) + (buffer-string))))) + (ert-deftest snakemake-test-indent-line/field-key () - ;; Always indent first line to `snakemake-indent-field-offset'. - ;; Move point to `snakemake-indent-field-offset' if it is before any - ;; text on the line. (should (string= " @@ -168,22 +218,58 @@ rule abc: (string= " rule abc: + " (snakemake-with-temp-text " rule abc: + " (snakemake-indent-line) - (snakemake-indent-line) (buffer-string)))) (should (string= " rule abc: + " + (snakemake-with-temp-text + " +rule abc: +" + (snakemake-indent-line 'prev) + (buffer-string)))) + (should + (string= + " +rule abc: +" + (snakemake-with-temp-text + " +rule abc: + " + (snakemake-indent-line 'prev) + (buffer-string)))) + (should + (string= + " +rule abc: + text" + (snakemake-with-temp-text + " +rule abc: +text" + (snakemake-indent-line) + (buffer-substring (point-min) (point))))) + (should + (string= + " +rule abc: + text" (snakemake-with-temp-text " rule abc: + text" (snakemake-indent-line) (buffer-substring (point-min) (point))))) @@ -198,10 +284,6 @@ rule abc: text" (snakemake-indent-line) (buffer-substring (point-min) (point))))) - - ;; Always indent field key to `snakemake-indent-field-offset'. - ;; Move point to `snakemake-indent-field-offset' if it is before any - ;; text on the line. (should (string= " @@ -239,8 +321,7 @@ rule abc: rule abc: input: 'infile' output:" - (snakemake-indent-line) - (snakemake-indent-line) + (snakemake-indent-line 'prev) (buffer-string)))) (should (string= @@ -270,10 +351,6 @@ rule abc: (buffer-substring (point-min) (point)))))) (ert-deftest snakemake-test-indent-line/field-value () - ;; Always indent line below naked field key to - ;; `snakemake-indent-field-offset' + - ;; `snakemake-indent-value-offset'. Move point to to this position - ;; as well if it is before any text on the line. (should (string= " @@ -298,8 +375,7 @@ rule abc: rule abc: output: " - (snakemake-indent-line) - (snakemake-indent-line) + (snakemake-indent-line 'prev) (buffer-string)))) (should (string= @@ -314,24 +390,6 @@ rule abc: " (snakemake-indent-line) (buffer-string)))) - - ;; Add step with Python indentation for non-blank lines under naked - ;; field keys. Field keys with values starting on the same line do - ;; not use Python indentation because this is invalid syntax in - ;; Snakemake. - (should - (string= - " -rule abc: - output: 'file{}{}'.format('one', - 'two'" - (snakemake-with-temp-text - " -rule abc: - output: 'file{}{}'.format('one', -'two'" - (snakemake-indent-line) - (buffer-string)))) (should (string= " @@ -350,39 +408,6 @@ rule abc: (should (string= " -rule abc: - output: - 'file{}{}'.format('one', - " - (snakemake-with-temp-text - " -rule abc: - output: - 'file{}{}'.format('one', -" - (snakemake-indent-line) - (buffer-string)))) - - ;; On non-naked field key cycle indentation between - ;; `snakemake-indent-field-offset' and column of previous field - ;; value. If point is before any text on the line, move it to the - ;; start of the text instead. - (should - (string= - " -rule abc: - output: 'file' - " - (snakemake-with-temp-text - " -rule abc: - output: 'file' -" - (snakemake-indent-line) - (buffer-string)))) - (should - (string= - " rule abc: output: 'file' " @@ -391,7 +416,6 @@ rule abc: rule abc: output: 'file' " - (snakemake-indent-line) (snakemake-indent-line) (buffer-string)))) (should @@ -404,23 +428,8 @@ rule abc: " rule abc: output: 'file' -" - (snakemake-indent-line) - (snakemake-indent-line) - (snakemake-indent-line) - (buffer-string)))) - (should - (string= - " -rule abc: - output: 'file' - 'text'" - (snakemake-with-temp-text - " -rule abc: - output: 'file' -'text'" - (snakemake-indent-line) + " + (snakemake-indent-line 'prev) (buffer-string)))) (should (string= @@ -433,7 +442,6 @@ rule abc: rule abc: output: 'file' 'text'" - (snakemake-indent-line) (snakemake-indent-line) (buffer-string)))) (should @@ -441,7 +449,7 @@ rule abc: " rule abc: output: 'file' - 'text' " + 'text' " (snakemake-with-temp-text " rule abc: @@ -454,7 +462,7 @@ rule abc: " rule abc: output: 'file' - " + " (snakemake-with-temp-text " rule abc: @@ -472,12 +480,9 @@ rule abc: " rule abc: output: 'file' - 'text'" - (snakemake-indent-line) - (snakemake-indent-line) + 'text'" + (snakemake-indent-line 'prev) (buffer-string)))) - - ;; Indent body of run field according to Python mode. (should (string= " @@ -505,6 +510,21 @@ rule abc: " rule abc: input: 'infile' +output:" + (indent-region (point) (point-max)) + (buffer-string)))) + (should + (string= + " +if True: + rule abc: + input: 'infile' + output:" + (snakemake-with-temp-text + " +if True: +rule abc: +input: 'infile' output:" (indent-region (point) (point-max)) (buffer-string)))) @@ -613,115 +633,6 @@ subworkflow otherworkflow: snakefile: '../path/to/otherworkflow/Snakefile'" (should (snakemake-in-rule-or-subworkflow-block-p)))) -(ert-deftest snakemake-test-first-field-line-p () - (snakemake-with-temp-text - " -rule abc: -" - (should (snakemake-first-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: 'file'" - (should (snakemake-first-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: -" - (should-not (snakemake-first-field-line-p)))) - -(ert-deftest snakemake-test-below-naked-field-p () - (snakemake-with-temp-text - " -rule abc: - output: -" - (should (snakemake-below-naked-field-p))) - (snakemake-with-temp-text - " -rule abc: - output: 'file' -" - (should-not (snakemake-below-naked-field-p))) - (snakemake-with-temp-text - " -rule abc: - output: " - (should-not (snakemake-below-naked-field-p)))) - -(ert-deftest snakemake-test-naked-field-line-p () - (snakemake-with-temp-text - " -rule abc: - output: -" - (should (snakemake-naked-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: - 'file', - " - (should (snakemake-naked-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: " - (should (snakemake-naked-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: 'file' -" - (should-not (snakemake-naked-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - input: - 'infile' - output: 'file' -" - (should-not (snakemake-naked-field-line-p)))) - -(ert-deftest snakemake-test-run-field-line-p () - (snakemake-with-temp-text - " -rule abc: - run: -" - (should (snakemake-run-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - run: - with file: -" - (should (snakemake-run-field-line-p))) - (snakemake-with-temp-text - " -rule abc: - output: 'file' -" - (should-not (snakemake-run-field-line-p)))) - -(ert-deftest snakemake-test-previous-field-value-column () - (should (= 12 - (snakemake-with-temp-text - " -rule abc: - output: 'file' -" - (snakemake-previous-field-value-column)))) - (should (= 12 - (snakemake-with-temp-text - " -rule abc: - output: 'file', - 'another' -" - (snakemake-previous-field-value-column))))) - ;;; snakemake.el -- cgit v1.2.3