Eric Bavier <ericbav...@gmail.com> writes: > From 88d05ece4bf30bbed6de51f076cde0301c493123 Mon Sep 17 00:00:00 2001 > From: Eric Bavier <bav...@member.fsf.org> > Date: Wed, 22 Oct 2014 13:47:01 -0500 > Subject: [PATCH 3/5] 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. > --- > guix/scripts/lint.scm | 42 ++++++++++++++++++++++++++++++++++-------- > tests/lint.scm | 9 +++++++++ > 2 files changed, 43 insertions(+), 8 deletions(-) > > diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm > index 84d9fe9..e8cc853 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 (filter-map > + (lambda (m) > + (and (not > + ;; Filter out matches of common abbrevs. > + (find (lambda (s) > + (string-suffix? s (match:prefix m))) > + '("i.e" "e.g" "a.k.a" "resp"))) > + (match:start m))) > + (list-matches "\\. [A-Z]" description)))) > + (when (not (null? infractions))
(unless (null? infractions)). Also, this should be indented one more column. > + (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))))) 'begin' is not needed here. 'when' and 'unless' include an implicit 'begin'. > > (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 62a9df9..2c2a179 100644 > --- a/tests/lint.scm > +++ b/tests/lint.scm > @@ -53,6 +53,15 @@ > (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"))) > + It would be good to add some tests for the "common abbrevs" logic above. Otherwise looks good to me, thanks! Mark