Repository: napari/napari

Issue:
developer resources have disappeared from website
## 🐛 Bug

Developer resources have disappeared from website

![image](https://user-images.githubusercontent.com/6531703/79048229-784dcc80-7bd0-11ea-9eaa-0bfbd16cc329.png)



Discussion:
it seems to be due to the recent sphinx update.  sphinx 2.4.4 works, sphinx 3.0.0 throws _tons_ of errors (regardless of #1113)
relatedly... while it makes sense to be permissive about our requirements for napari proper (using `>=` whenever possible).  For websites with dependencies it's common practice to pin dependencies to exact versions... so I think we should do that here as well (since we're the only ones "consuming" our docs-building source code).
> For websites with dependencies it's common practice to pin dependencies to exact versions... so I think we should do that here as well (since we're the only ones "consuming" our docs-building source code).

That is fine with me, I see these as quite different use cases
I'm ok with it. Ideally we would keep up with sphinx development, but we are already have too much on our plates, so let's pick our battles. =)
I don't see it as incompatible with keeping up with sphinx... more like not being surprised by an update that leaves your public facing docs broken.  at FPbase, I have a couple dozen dependencies that are all pinned, and i go through every month or two, update them all, see if anything is broken, then release.  (That was only after having lots of breakages).  I do think we should keep up to date as well.

Resolving patch:
diff --git a/docs/release/generate_release_notes.py b/docs/release/generate_release_notes.py
--- a/docs/release/generate_release_notes.py
+++ b/docs/release/generate_release_notes.py
@@ -162,28 +162,28 @@ def add_to_users(users, new_user):
 
 
 # Now generate the release notes
-announcement_title = f'# Announcement: napari {args.version}'
-print(announcement_title)
+title = f'# napari {args.version}'
+print(title)
 
 print(
     f"""
-We're happy to announce the release of napari {args.version}! \
-napari is a fast, interactive, multi-dimensional image viewer for Python. \
-It's designed for browsing, annotating, and analyzing large multi-dimensional \
-images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based \
-rendering), and the scientific Python stack (numpy, scipy).\
+We're happy to announce the release of napari {args.version}!
+napari is a fast, interactive, multi-dimensional image viewer for Python.
+It's designed for browsing, annotating, and analyzing large multi-dimensional
+images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
+rendering), and the scientific Python stack (numpy, scipy).
 """
 )
 
 print(
     """
-For more information, examples, and documentation, please visit our website: \
+For more information, examples, and documentation, please visit our website:
 https://github.com/napari/napari
 """
 )
 
 for section, pull_request_dicts in highlights.items():
-    print(f'## {section}')
+    print(f'## {section}\n')
     if len(pull_request_dicts.items()) == 0:
         print()
     for number, pull_request_info in pull_request_dicts.items():
@@ -206,6 +206,7 @@ def add_to_users(users, new_user):
         'release (alphabetical)'
     )
     print(committer_str)
+    print()
 
     for c in sorted(contributor_set, key=lambda x: users[x].lower()):
         commit_link = f"{GH}/{GH_USER}/{GH_REPO}/commits?author={c}"
diff --git a/docs/source/conf.py b/docs/source/conf.py
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -27,30 +27,35 @@
 
 release = __version__
 version = __version__
+CONFDIR = os.path.dirname(__file__)
 
 
 def clean_release_notes():
-    dirname = os.path.join(os.path.dirname(__file__), 'release')
-    for rel in os.listdir(dirname):
+
+    release_rst = """Release Notes
+=============
+
+.. toctree::
+   :maxdepth: 1
+   :glob:
+
+"""
+    dirname = os.path.join(CONFDIR, 'release')
+    for rel in sorted(
+        os.listdir(dirname),
+        key=lambda s: list(map(int, re.findall(r'\d+', s))),
+        reverse=True,
+    ):
         for line in fileinput.input(os.path.join(dirname, rel), inplace=True):
-            if line.startswith("Announcement: napari"):
-                line = line.replace("Announcement: ", "")
-            # uncomment to remove the standard announcement paragraph.
-            # if not line.startswith(
-            #     (
-            #         "We're happy",
-            #         'napari is a fast',
-            #         "It's designed for",
-            #         "images. It's built",
-            #         "rendering), and ",
-            #     )
-            # ):
             line = re.sub(
                 r'#(\d+)',
-                r'`#\1 <https://github.com/napari/napari/issues/\1>`_',
+                r'[#\1](<https://github.com/napari/napari/issues/\1>)',
                 line,
             )
             print(line, end='')
+        release_rst += '   release/' + rel.replace('.md', '\n')
+    with open(os.path.join(CONFDIR, 'releases.rst'), 'w') as f:
+        f.write(release_rst)
 
 
 clean_release_notes()
@@ -66,6 +71,7 @@ def clean_release_notes():
     'sphinx.ext.todo',
     'sphinx.ext.viewcode',
     'sphinx.ext.intersphinx',
+    'recommonmark',
 ]
 
 # Add any paths that contain templates here, relative to this directory.


Test patch: