diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py
index 29c3f94008ab8d257cebbc46e046241d7f7e26b2..56c5954319c8d1d5f3f0698aa5b19da1187c4c42 100644
--- a/lib/spack/spack/test/package_sanity.py
+++ b/lib/spack/spack/test/package_sanity.py
@@ -87,3 +87,11 @@ def test_no_fixme():
                         (filename, i, line.strip())
                     )
             assert [] == errors
+
+
+def test_docstring():
+    """Ensure that every package has a docstring."""
+
+    for name in spack.repo.all_package_names():
+        pkg = spack.repo.get(name)
+        assert pkg.__doc__
diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py
index dd86657bf623e4469c7e1deedc43fdf34032259f..f15c3b7f3096f757d36cf6fd339bdb73b416c1b8 100644
--- a/var/spack/repos/builtin/packages/apex/package.py
+++ b/var/spack/repos/builtin/packages/apex/package.py
@@ -7,6 +7,8 @@
 
 
 class Apex(CMakePackage):
+    """Autonomic Performance Environment for eXascale (APEX)."""
+
     homepage = "http://github.com/khuck/xpress-apex"
     url      = "http://github.com/khuck/xpress-apex/archive/v0.1.tar.gz"
 
diff --git a/var/spack/repos/builtin/packages/bamdst/package.py b/var/spack/repos/builtin/packages/bamdst/package.py
index 13031f61b1dda797778e427191cd5569c514d014..dc8440e8683964e845221f9a659a3f3068242243 100644
--- a/var/spack/repos/builtin/packages/bamdst/package.py
+++ b/var/spack/repos/builtin/packages/bamdst/package.py
@@ -7,7 +7,7 @@
 
 
 class Bamdst(MakefilePackage):
-    "Bamdst is a a lightweight bam file depth statistical tool."
+    """Bamdst is a a lightweight bam file depth statistical tool."""
 
     homepage = "https://github.com/shiquan/bamdst"
     git      = "https://github.com/shiquan/bamdst.git"
diff --git a/var/spack/repos/builtin/packages/ecflow/package.py b/var/spack/repos/builtin/packages/ecflow/package.py
index 375f5124827e47c66053bb9c3642932816b2df97..5613138d9ede78b0f77abb3a6eacb5f7afc4f459 100644
--- a/var/spack/repos/builtin/packages/ecflow/package.py
+++ b/var/spack/repos/builtin/packages/ecflow/package.py
@@ -7,13 +7,13 @@
 
 
 class Ecflow(CMakePackage):
-    '''ecFlow is a work flow package that enables users to run a large number
+    """ecFlow is a work flow package that enables users to run a large number
     of programs (with dependencies on each other and on time) in a controlled
     environment.
 
     It provides tolerance for hardware and software failures, combined with
     good restart capabilities.
-    '''
+    """
 
     homepage = 'https://confluence.ecmwf.int/display/ECFLOW/'
     url      = 'https://confluence.ecmwf.int/download/attachments/8650755/ecFlow-4.11.1-Source.tar.gz'
diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py
index ab374f0270e21663576c82e0441e538dadc9d74e..75c4e7bf9fa97ad299dc6b1e3bc867d25fdab718 100644
--- a/var/spack/repos/builtin/packages/elk/package.py
+++ b/var/spack/repos/builtin/packages/elk/package.py
@@ -7,8 +7,8 @@
 
 
 class Elk(MakefilePackage):
-    '''An all-electron full-potential linearised augmented-plane wave
-    (FP-LAPW) code with many advanced features.'''
+    """An all-electron full-potential linearised augmented-plane wave
+    (FP-LAPW) code with many advanced features."""
 
     homepage = 'http://elk.sourceforge.net/'
     url      = 'https://sourceforge.net/projects/elk/files/elk-3.3.17.tgz'
diff --git a/var/spack/repos/builtin/packages/libpcap/package.py b/var/spack/repos/builtin/packages/libpcap/package.py
index 6d100caeef4dbce38c9e105d626e9a9fc279a34c..a3d500eb1e7437ee1d936fed11284bb4fb28e424 100644
--- a/var/spack/repos/builtin/packages/libpcap/package.py
+++ b/var/spack/repos/builtin/packages/libpcap/package.py
@@ -7,7 +7,7 @@
 
 
 class Libpcap(AutotoolsPackage):
-    "libpcap is a portable library in C/C++ for packet capture"
+    """libpcap is a portable library in C/C++ for packet capture."""
     homepage = "http://www.tcpdump.org/"
     list_url = "http://www.tcpdump.org/release/"
     url      = "http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz"
diff --git a/var/spack/repos/builtin/packages/libspatialindex/package.py b/var/spack/repos/builtin/packages/libspatialindex/package.py
index cb7c3afbe6457fefdfc9bebf9f01a03cabd04fb6..c41e23930a45319f1c93853aa2d556bfb5264c06 100644
--- a/var/spack/repos/builtin/packages/libspatialindex/package.py
+++ b/var/spack/repos/builtin/packages/libspatialindex/package.py
@@ -7,7 +7,9 @@
 
 
 class Libspatialindex(CMakePackage):
-    homepage = "http://libspatialindex.github.io"
+    """C++ implementation of R*-tree, an MVR-tree and a TPR-tree with C API."""
+
+    homepage = "https://libspatialindex.org/"
     url      = "https://github.com/libspatialindex/libspatialindex/tarball/1.8.5"
 
     version('1.8.5', 'a95d8159714dbda9a274792cd273d298')
diff --git a/var/spack/repos/builtin/packages/libxsmm/package.py b/var/spack/repos/builtin/packages/libxsmm/package.py
index 4ff1bc809cb9773aed6a6eac2aad8ff5f85b54b9..aedd5edc85a2b1a6f7166d98d854bc40689e8c4b 100644
--- a/var/spack/repos/builtin/packages/libxsmm/package.py
+++ b/var/spack/repos/builtin/packages/libxsmm/package.py
@@ -9,9 +9,9 @@
 
 
 class Libxsmm(MakefilePackage):
-    '''Library targeting Intel Architecture
+    """Library targeting Intel Architecture
     for small, dense or sparse matrix multiplications,
-    and small convolutions.'''
+    and small convolutions."""
 
     homepage = 'https://github.com/hfp/libxsmm'
     url      = 'https://github.com/hfp/libxsmm/archive/1.10.tar.gz'
diff --git a/var/spack/repos/builtin/packages/libxstream/package.py b/var/spack/repos/builtin/packages/libxstream/package.py
index 7113d407d7cb530430fdb26edd69c72e4697f985..e754450ece4bdd9acf7686e6f34e4dff14c582cb 100644
--- a/var/spack/repos/builtin/packages/libxstream/package.py
+++ b/var/spack/repos/builtin/packages/libxstream/package.py
@@ -7,9 +7,9 @@
 
 
 class Libxstream(Package):
-    '''LIBXSTREAM is a library to work with streams, events, and code regions
+    """LIBXSTREAM is a library to work with streams, events, and code regions
     that are able to run asynchronous while preserving the usual stream
-    conditions.'''
+    conditions."""
 
     homepage = 'https://github.com/hfp/libxstream'
     url      = 'https://github.com/hfp/libxstream/archive/0.9.0.tar.gz'
diff --git a/var/spack/repos/builtin/packages/mysql/package.py b/var/spack/repos/builtin/packages/mysql/package.py
index 16be4d7314c7027f295c504f5cdb9149b8926561..1820f5ab04f05d4ad24eae1ee2b5d35948152f39 100644
--- a/var/spack/repos/builtin/packages/mysql/package.py
+++ b/var/spack/repos/builtin/packages/mysql/package.py
@@ -6,6 +6,8 @@
 
 
 class Mysql(CMakePackage):
+    """MySQL is an open source relational database management system."""
+
     homepage = "http://dev.mysql.com"
     url      = "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11.tar.gz"
 
diff --git a/var/spack/repos/builtin/packages/perl-compress-raw-zlib/package.py b/var/spack/repos/builtin/packages/perl-compress-raw-zlib/package.py
index 66c7df4fec8591686b291548729a739917c62684..197566773b1ac726575e913f997cd38114def659 100644
--- a/var/spack/repos/builtin/packages/perl-compress-raw-zlib/package.py
+++ b/var/spack/repos/builtin/packages/perl-compress-raw-zlib/package.py
@@ -7,7 +7,7 @@
 
 
 class PerlCompressRawZlib(PerlPackage):
-    "A low-Level Interface to zlib compression library"
+    """A low-Level Interface to zlib compression library."""
 
     homepage = "http://search.cpan.org/~pmqs/Compress-Raw-Zlib-2.081/lib/Compress/Raw/Zlib.pm"
     url      = "https://cpan.metacpan.org/authors/id/P/PM/PMQS/Compress-Raw-Zlib-2.081.tar.gz"
diff --git a/var/spack/repos/builtin/packages/py-astroid/package.py b/var/spack/repos/builtin/packages/py-astroid/package.py
index ba437ddd832629d57804c0dd0b3c31e8ee083dcc..7b40cb49a5fc83f10b2b351f03376791131ebf41 100644
--- a/var/spack/repos/builtin/packages/py-astroid/package.py
+++ b/var/spack/repos/builtin/packages/py-astroid/package.py
@@ -7,7 +7,10 @@
 
 
 class PyAstroid(PythonPackage):
-    homepage = "https://www.astroid.org/"
+    """A common base representation of python source code for pylint
+    and other projects."""
+
+    homepage = "https://github.com/PyCQA/astroid"
     url      = "https://github.com/PyCQA/astroid/archive/astroid-1.4.5.tar.gz"
 
     version('2.2.0', sha256='7e289d0aa4a537b4aa798bd609fdf745de0f3c37e6b67642ed328e1482421a6d')
diff --git a/var/spack/repos/builtin/packages/sofa-c/package.py b/var/spack/repos/builtin/packages/sofa-c/package.py
index a9bbbd15be9de3561d1d08a24698a202ed3dc2c5..cc67527b553b5016d13f77696d496b99ead8c81f 100644
--- a/var/spack/repos/builtin/packages/sofa-c/package.py
+++ b/var/spack/repos/builtin/packages/sofa-c/package.py
@@ -7,7 +7,7 @@
 
 
 class SofaC(MakefilePackage):
-    "Standards of Fundamental Astronomy (SOFA) library for ANSI C."
+    """Standards of Fundamental Astronomy (SOFA) library for ANSI C."""
 
     homepage = "http://www.iausofa.org/current_C.html"
     url      = "http://www.iausofa.org/2018_0130_C/sofa_c-20180130.tar.gz"