From 43b30c9e8de3ddce1232ffa82022c0fe287a8d55 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:16:57 +0100 Subject: [PATCH 01/16] Add license badge to readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 689f8d8..c05be8f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ -# python-stub +# A template repo for IIASA Python projects + +Copyright (c) 2021 IIASA + +![GitHub](https://img.shields.io/github/license/iiasa/python-stub) + Template repository for creating python packages and Sphinx-based documentation pages in line with the IIASA design guidelines From bcfb582eada571bda572025e5521819b40d0329f Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:17:59 +0100 Subject: [PATCH 02/16] Add pycharm configs to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b6e4761..8b48a40 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,7 @@ dmypy.json # Pyre type checker .pyre/ + +# JetBrains IDEs +*.iml +.idea/ From 99c581ce2fa05378b8473334eee20f88bb1cf5ea Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:43:24 +0100 Subject: [PATCH 03/16] Add MacOS file system stuff to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8b48a40..02c858e 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,6 @@ dmypy.json # JetBrains IDEs *.iml .idea/ + +# Apple file system +.DS_Store From 083d34ddfde34aebd1baea7016a2bc3059c34be5 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:51:54 +0100 Subject: [PATCH 04/16] Update path to doc folder in gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 02c858e..78de9bb 100644 --- a/.gitignore +++ b/.gitignore @@ -69,7 +69,7 @@ instance/ .scrapy # Sphinx documentation -docs/_build/ +doc/_build/ # PyBuilder target/ From 7f1e20f6af5f62fbb1cb8feba7ffd5bbc94d3de1 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:52:13 +0100 Subject: [PATCH 05/16] Add minimal sphinx config --- doc/Makefile | 20 +++++++++++++++++ doc/make.bat | 35 +++++++++++++++++++++++++++++ doc/source/conf.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ doc/source/index.rst | 5 +++++ 4 files changed, 112 insertions(+) create mode 100644 doc/Makefile create mode 100644 doc/make.bat create mode 100644 doc/source/conf.py create mode 100644 doc/source/index.rst diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..6247f7e --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 0000000..7045166 --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,52 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'iiasa-python-project' +copyright = '2021 IIASA' +author = 'Daniel Huppmann' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] \ No newline at end of file diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 0000000..a85c5b8 --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,5 @@ +An IIASA Python project +======================= + +This is a template project for an IIASA Python project +with Sphinx documentation pages based on the IIASA design guidelines. \ No newline at end of file From c04be6e888f3d0868d71d9c60b73a9fd8ff9bae6 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 22:57:39 +0100 Subject: [PATCH 06/16] Add iiasa logo --- doc/source/_static/iiasa_logo_white.png | Bin 0 -> 22635 bytes doc/source/conf.py | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 doc/source/_static/iiasa_logo_white.png diff --git a/doc/source/_static/iiasa_logo_white.png b/doc/source/_static/iiasa_logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..583cbab47a2764078ab271d1c488659140acead5 GIT binary patch literal 22635 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 D;wM84 literal 0 HcmV?d00001 diff --git a/doc/source/conf.py b/doc/source/conf.py index 7045166..9da5ff1 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -17,6 +17,8 @@ # -- Project information ----------------------------------------------------- +# Please change this information! + project = 'iiasa-python-project' copyright = '2021 IIASA' author = 'Daniel Huppmann' @@ -44,7 +46,11 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = '_static/iiasa_logo_white.png' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 56ac0b630fb2e0c283c10af5ea221c0f96148e88 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 23:21:11 +0100 Subject: [PATCH 07/16] Add the iiasa design colours via a css file --- doc/source/_static/iiasa.css | 77 ++++++++++++++++++++++++++++++++++++ doc/source/conf.py | 6 ++- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 doc/source/_static/iiasa.css diff --git a/doc/source/_static/iiasa.css b/doc/source/_static/iiasa.css new file mode 100644 index 0000000..097100d --- /dev/null +++ b/doc/source/_static/iiasa.css @@ -0,0 +1,77 @@ +/* + +IIASA blue + three-stage gradient to white +- #00589d / #3f81b5 / #7fabce / #bfd5e6 + +IIASA secondary colours + two-stage gradient to white +- #62c5c0 / #96d8d5 / #caebea +- #247f6e +- #fdbb40 +- #ee6a6b +- #6a4c93 + +*/ + +/* Overall backgrounds */ +.wy-nav-side, .wy-side-nav-search, .wy-nav-top { + background: #00589d; +} + +/* White line between search & menu panels */ +.wy-side-nav-search { + border-bottom: 1px solid #ffffff; +} + +/* Text colours of menu items: general */ +.wy-menu-vertical a { + color: #ffffff; +} + +/* …: current items levels 1–3 */ +.wy-menu-vertical li.on a, +.wy-menu-vertical li.current > a, +.wy-menu-vertical li.toctree-l3.current > a { + color: #00589d; +} + +/* …: current item level 4 */ +.wy-menu-vertical li.toctree-l3 > a { + color: #000000; +} + +/* Borders around current items */ +.wy-menu-vertical li.current a { + border-right: 1px solid #00589d; +} + +.wy-menu-vertical li.toctree-l1.current > a { + border-bottom: 1px solid #00589d; + border-right: none; +} + +/* Gradient colouring of sub-menus */ +.wy-menu-vertical li.current, +.wy-menu-vertical li.toctree-l2.current > a { + background: #bfd5e6; /* blue */ +} + + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + background: #7fabce; /* blue */ +} + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + background: #3f81b5; /* blue */ + color: #ffffff; +} + +/* Hovered links; all the same colour */ +.wy-menu-vertical li > a:hover, +.wy-menu-vertical li.current > a:hover, +.wy-menu-vertical li.current li.toctree-l2 > a:hover, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover { + /* white on purple */ + background: #6a4c93; + color: #ffffff; +} diff --git a/doc/source/conf.py b/doc/source/conf.py index 9da5ff1..a0ac8a6 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -55,4 +55,8 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file +html_static_path = ['_static'] + +# Add the IIASA stylesheet +def setup(app): + app.add_css_file('iiasa.css') From a3430195f05909db2bba051e29ee993dae11b40b Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 23:39:24 +0100 Subject: [PATCH 08/16] Add a minimal setup config --- python_stub/__init__.py | 0 setup.cfg | 17 +++++++++++++++++ setup.py | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 python_stub/__init__.py create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/python_stub/__init__.py b/python_stub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..ca521c9 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,17 @@ +[metadata] +name = python_stub +author = Daniel Huppmann +author_email = huppmann@iiasa.ac.at +description = Template for creating python packages and Sphinx-based docs pages +url = https://www.iiasa.ac.at + +[options] +packages = python_stub +install_requires = + +[options.extras_require] +tests = + pytest +doc = + sphinx + sphinx_rtd_theme \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d5d43d7 --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup(use_scm_version=True) From e3be921cd0085243c7e4470bfd1406129ed40213 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 23:52:56 +0100 Subject: [PATCH 09/16] Add config, install and build-the-docs instructions to the readme --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index c05be8f..6b14b1c 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,34 @@ Copyright (c) 2021 IIASA ![GitHub](https://img.shields.io/github/license/iiasa/python-stub) Template repository for creating python packages and Sphinx-based documentation pages in line with the IIASA design guidelines + +## Configuration + +To start a new Python package from this repo, +click on the green **Use this template** button on top-right of this page. +Detailed instructions to create a new repository from a template can be found +[here](https://help.github.com/en/articles/creating-a-repository-from-a-template). + +Then, make the following changes: + +0. Change the text of the `LICENSE` file and the badge in this readme (optional). +1. Rename the folder `python_stub` to the intended package name. +2. Update the package name, author info and url in `setup.cfg`. +3. Update the package name, author info and copyright in `doc/source/conf.py` + +Make sure to commit all changes to your new repository - then program away! + +## Installation + +Install the package including the requirements for building the docs. + + pip install -e .[doc] + +## Building the docs + +Navigate to the doc folder and run Sphinx. + + cd doc + make html + +The rendered html pages will be located in `doc/build/html/index.html`. From 92b1df796d7498f8fe4968dd484a0bea3c2287a4 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Mon, 15 Feb 2021 23:56:37 +0100 Subject: [PATCH 10/16] Add instruction to delete the config section in the readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b14b1c..a456efa 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Copyright (c) 2021 IIASA ![GitHub](https://img.shields.io/github/license/iiasa/python-stub) +## Overview + Template repository for creating python packages and Sphinx-based documentation pages in line with the IIASA design guidelines ## Configuration @@ -18,7 +20,8 @@ Then, make the following changes: 0. Change the text of the `LICENSE` file and the badge in this readme (optional). 1. Rename the folder `python_stub` to the intended package name. 2. Update the package name, author info and url in `setup.cfg`. -3. Update the package name, author info and copyright in `doc/source/conf.py` +3. Update the package name, author info and copyright in `doc/source/conf.py`. +4. Delete the configuration section from this readme and update the title and overview section. Make sure to commit all changes to your new repository - then program away! From 901927831204c24484b625b8b207701b058b1f24 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Tue, 16 Feb 2021 09:10:55 +0100 Subject: [PATCH 11/16] Add a GitHub Actions workflow for building the docs --- .github/workflows/build-docs.yml | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/build-docs.yml diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 0000000..589b3e9 --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,44 @@ +# This workflow installs the package and builds the docs +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: build the docs + +on: + push: + branches: [ 'main' ] + pull_request: + branches: [ '**' ] + +jobs: + pytest: + strategy: + matrix: + os: + - ubuntu-latest + python-version: + - '3.8' + + fail-fast: false + + + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} py${{ matrix.python-version }} + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies and package for building the docs + run: | + python -m pip install --upgrade pip + pip install -e .[docs] + + - name: Build the docs + run: | + cd doc + make html + cd .. From 0ce9468a2898bfd6817e0d3191176d34de2f97ea Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Tue, 16 Feb 2021 09:16:51 +0100 Subject: [PATCH 12/16] Fix a typo in the extra install specs --- .github/workflows/build-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 589b3e9..684aaf5 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -35,7 +35,7 @@ jobs: - name: Install dependencies and package for building the docs run: | python -m pip install --upgrade pip - pip install -e .[docs] + pip install -e .[doc] - name: Build the docs run: | From ec431aed1815c91dc6402caae1f20ce20c552aa2 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 17 Feb 2021 14:15:16 +0100 Subject: [PATCH 13/16] Implement suggested changes by @khaeru --- .github/workflows/build-docs.yml | 9 +++------ doc/Makefile | 1 + doc/make.bat | 2 ++ setup.cfg | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 684aaf5..5d15d96 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -10,7 +10,7 @@ on: branches: [ '**' ] jobs: - pytest: + sphinx: strategy: matrix: os: @@ -35,10 +35,7 @@ jobs: - name: Install dependencies and package for building the docs run: | python -m pip install --upgrade pip - pip install -e .[doc] + pip install --editable .[doc] - name: Build the docs - run: | - cd doc - make html - cd .. + run: make --directory=doc html diff --git a/doc/Makefile b/doc/Makefile index d0c3cbf..a17256f 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,4 +1,5 @@ # Minimal makefile for Sphinx documentation +# This file was generated with sphinx-quickstart version 3.5.0 # # You can set these variables from the command line, and also diff --git a/doc/make.bat b/doc/make.bat index 6247f7e..9fb2e4a 100644 --- a/doc/make.bat +++ b/doc/make.bat @@ -1,3 +1,5 @@ +REM This file was generated with sphinx-quickstart version 3.5.0 + @ECHO OFF pushd %~dp0 diff --git a/setup.cfg b/setup.cfg index ca521c9..7ab724e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,6 +4,7 @@ author = Daniel Huppmann author_email = huppmann@iiasa.ac.at description = Template for creating python packages and Sphinx-based docs pages url = https://www.iiasa.ac.at +# license = (TODO: update this to match the license you choose for the package) [options] packages = python_stub From cc2496d86934630badc046ce52dad222287478e0 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 17 Feb 2021 14:17:29 +0100 Subject: [PATCH 14/16] Add long description to setup.cfg --- setup.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.cfg b/setup.cfg index 7ab724e..d186c8a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,6 +3,8 @@ name = python_stub author = Daniel Huppmann author_email = huppmann@iiasa.ac.at description = Template for creating python packages and Sphinx-based docs pages +long_description_content_type = text/markdown +long_description = file:README.md url = https://www.iiasa.ac.at # license = (TODO: update this to match the license you choose for the package) From cea847f1cd468af6f9d3af46e01aab29100248b1 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 17 Feb 2021 14:32:55 +0100 Subject: [PATCH 15/16] Make black --- doc/source/conf.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index a0ac8a6..d12a2f3 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -17,11 +17,9 @@ # -- Project information ----------------------------------------------------- -# Please change this information! - -project = 'iiasa-python-project' -copyright = '2021 IIASA' -author = 'Daniel Huppmann' +project = "python-stub" +copyright = "2021 IIASA" +author = "Daniel Huppmann" # -- General configuration --------------------------------------------------- @@ -29,11 +27,10 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [ -] +extensions = [] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -46,17 +43,18 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = '_static/iiasa_logo_white.png' +html_logo = "_static/iiasa_logo_white.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] + # Add the IIASA stylesheet def setup(app): - app.add_css_file('iiasa.css') + app.add_css_file("iiasa.css") From 72acc5c37c99fd3a7efb2f7c52a001b603892a20 Mon Sep 17 00:00:00 2001 From: Daniel Huppmann Date: Wed, 17 Feb 2021 14:37:07 +0100 Subject: [PATCH 16/16] Add `setup_requires` --- setup.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.cfg b/setup.cfg index d186c8a..b3d4c62 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,6 +11,9 @@ url = https://www.iiasa.ac.at [options] packages = python_stub install_requires = +setup_requires = + setuptools >= 41 + setuptools_scm [options.extras_require] tests =