diff options
author | Eric Bavier <bavier@member.fsf.org> | 2014-10-22 13:47:01 -0500 |
---|---|---|
committer | Eric Bavier <bavier@member.fsf.org> | 2014-10-26 13:03:53 -0500 |
commit | 574e847b8ea692aeea051d487cc95cec1257aba7 (patch) | |
tree | ce7c980fba2aa15930e92f6813f7f9c370c7c99a | |
parent | c04b82ffce74612403b0c736713542ddbb4eed23 (diff) | |
download | guix-574e847b8ea692aeea051d487cc95cec1257aba7.tar guix-574e847b8ea692aeea051d487cc95cec1257aba7.tar.gz |
guix: lint: Check for proper end-of-sentence space.
* guix/scripts/lint.scm (start-with-capital-letter?): Handle empty
strings.
(check-description-style): New check for end-of-sentence space.
* tests/lint.scm: Test it.
-rw-r--r-- | guix/scripts/lint.scm | 42 | ||||
-rw-r--r-- | tests/lint.scm | 29 |
2 files changed, 63 insertions, 8 deletions
diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm index edd5bb9c9a..7b530fa5ac 100644 --- a/guix/scripts/lint.scm +++ b/guix/scripts/lint.scm @@ -25,6 +25,8 @@ #:use-module (guix utils) #:use-module (gnu packages) #:use-module (ice-9 match) + #:use-module (ice-9 regex) + #:use-module (ice-9 format) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) @@ -75,17 +77,41 @@ (exit 0)) (define (start-with-capital-letter? s) - (char-set-contains? char-set:upper-case (string-ref s 0))) + (and (not (string-null? s)) + (char-set-contains? char-set:upper-case (string-ref s 0)))) (define (check-description-style package) ;; Emit a warning if stylistic issues are found in the description of PACKAGE. - (let ((description (package-description package))) - (when (and (string? description) - (not (string-null? description)) - (not (start-with-capital-letter? description))) - (emit-warning package - "description should start with an upper-case letter" - 'description)))) + (define (check-starts-with-upper-case description) + (unless (start-with-capital-letter? description) + (emit-warning package + "description should start with an upper-case letter" + 'description))) + + (define (check-end-of-sentence-space description) + "Check that an end-of-sentence period is followed by two spaces." + (let ((infractions + (reverse (fold-matches + "\\. [A-Z]" description '() + (lambda (m r) + ;; Filter out matches of common abbreviations. + (if (find (lambda (s) + (string-suffix-ci? s (match:prefix m))) + '("i.e" "e.g" "a.k.a" "resp")) + r (cons (match:start m) r))))))) + (unless (null? infractions) + (emit-warning package + (format #f "sentences in description should be followed ~ +by two spaces; possible infraction~p at ~{~a~^, ~}" + (length infractions) + infractions) + 'description)))) + + (let ((description (package-description package))) + (when (string? description) + (begin + (check-starts-with-upper-case description) + (check-end-of-sentence-space description))))) (define (check-inputs-should-be-native package) ;; Emit a warning if some inputs of PACKAGE are likely to belong to its diff --git a/tests/lint.scm b/tests/lint.scm index 62a9df90d8..b013231b29 100644 --- a/tests/lint.scm +++ b/tests/lint.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013 Cyril Roelandt <tipecaml@gmail.com> +;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -53,6 +54,34 @@ (check-description-style pkg)))) "description should start with an upper-case letter"))) +(test-assert "description: two spaces after end of sentence" + (->bool + (string-contains (call-with-warnings + (lambda () + (let ((pkg (dummy-package "x" + (description "Bad. Quite bad.")))) + (check-description-style pkg)))) + "sentences in description should be followed by two spaces"))) + +(test-assert "description: end-of-sentence detection with abbreviations" + (not + (string-contains (call-with-warnings + (lambda () + (let ((pkg (dummy-package "x" + (description + "E.g. Foo, i.e. Bar resp. Baz (a.k.a. DVD).")))) + (check-description-style pkg)))) + "sentences in description should be followed by two spaces"))) + +(test-assert "synopsis: not empty" + (->bool + (string-contains (call-with-warnings + (lambda () + (let ((pkg (dummy-package "x" + (synopsis "")))) + (check-synopsis-style pkg)))) + "synopsis should not be empty"))) + (test-assert "synopsis: does not start with an upper-case letter" (->bool (string-contains (call-with-warnings |