Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-sphinxcontrib-autoprogram for
openSUSE:Factory checked in at 2021-10-12 21:49:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sphinxcontrib-autoprogram (Old)
and /work/SRC/openSUSE:Factory/.python-sphinxcontrib-autoprogram.new.2443
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sphinxcontrib-autoprogram"
Tue Oct 12 21:49:54 2021 rev:3 rq:924879 version:0.1.7
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-sphinxcontrib-autoprogram/python-sphinxcontrib-autoprogram.changes
2018-12-19 13:51:16.451130282 +0100
+++
/work/SRC/openSUSE:Factory/.python-sphinxcontrib-autoprogram.new.2443/python-sphinxcontrib-autoprogram.changes
2021-10-12 21:51:16.480036751 +0200
@@ -1,0 +2,22 @@
+Tue Oct 12 13:40:48 UTC 2021 - [email protected]
+
+- version update to 0.1.7
+ Version 0.1.7
+ -------------
+ - Publish to PyPI via Github Actions.
+ Version 0.1.6
+ -------------
+ - Dropped support for Python 2 and Pypy
+ - Declare this extension safe for parallel reading
+ - Migrate to Github Actions for CI [:issue:`28`, :pull:`32` by Langston
Barrett]
+ - Test against recent versions of Sphinx [:issue:`33`, :pull:`32` by
Langston Barrett]
+ - Format source code with Black [:issue:`30`, :pull:`32` by Langston Barrett]
+ - Add documentation to the ``sdist`` [:issue:`26`, :pull:`32` by Langston
Barrett]
+ - Fixed unwanted ``<blockquote>`` tags in multi-line command descriptions
that
+ are indented to match surrounding code. [:pull:`21` by dgw]
+- deleted patches
+ - 0001-License-file-ci-skip.patch (upstreamed)
+- added sources
+ + _multibuild
+
+-------------------------------------------------------------------
Old:
----
0001-License-file-ci-skip.patch
python-sphinxcontrib-autoprogram-0.1.5.tar.gz
New:
----
_multibuild
python-sphinxcontrib-autoprogram-0.1.7.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-sphinxcontrib-autoprogram.spec ++++++
--- /var/tmp/diff_new_pack.dTHdht/_old 2021-10-12 21:51:16.936037403 +0200
+++ /var/tmp/diff_new_pack.dTHdht/_new 2021-10-12 21:51:16.936037403 +0200
@@ -1,7 +1,7 @@
#
-# spec file for package python-sphinxcontrib
+# spec file
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,26 +16,39 @@
#
+%{?!python_module:%define python_module() python-%{**} python3-%{**}}
+%global flavor @BUILD_FLAVOR@%{nil}
+%if "%{flavor}" == "test"
+%define psuffix -test
+%bcond_without test
+%else
+%define psuffix %{nil}
+%bcond_with test
+%endif
%global short_name autoprogram
+#
https://github.com/sphinx-contrib/autoprogram/commit/457822502b71a449d97dfece63e77dbee910b581
+%define skip_python36 1
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-sphinxcontrib-%{short_name}
-Version: 0.1.5
+Version: 0.1.7
Release: 0
Summary: Sphinx extension to document CLI programs
License: BSD-2-Clause
Group: Development/Languages/Python
URL: https://github.com/sphinx-contrib/%{short_name}
Source0: %{URL}/archive/%{version}/%{name}-%{version}.tar.gz
-Patch0: 0001-License-file-ci-skip.patch
BuildRequires: %{python_module Sphinx >= 1.2}
BuildRequires: %{python_module setuptools}
-BuildRequires: %{python_module six}
-BuildRequires: %{python_module sphinxcontrib-websupport >= 1.0.1}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-Sphinx >= 1.2
Requires: python-six
BuildArch: noarch
+%if %{with test}
+BuildRequires: %{python_module six}
+BuildRequires: %{python_module sphinxcontrib-autoprogram}
+BuildRequires: %{python_module sphinxcontrib-websupport >= 1.0.1}
+%endif
%python_subpackages
%description
@@ -55,6 +68,7 @@
%autosetup -n %{short_name}-%{version} -p1
%build
+%if !%{with test}
%python_build
# need to set PYTHONPATH, otherwise the build won't find the extension in the
@@ -66,21 +80,31 @@
# remove inventory file, not needed for the documentation
rm doc/_build/html/objects.inv
+%endif
%install
+%if !%{with test}
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%endif
%check
-%python_exec setup.py test
+%if %{with test}
+export PYTHONPATH='doc'
+%pyunittest sphinxcontrib/autoprogram.py
+%endif
+%if !%{with test}
%files %{python_files}
%doc README.rst
%license LICENSE
%{python_sitelib}/*
+%endif
+%if !%{with test}
%files %{python_files doc}
%license LICENSE
%doc doc/_build/html/*
+%endif
%changelog
++++++ _multibuild ++++++
<multibuild>
<package>test</package>
</multibuild>
++++++ python-sphinxcontrib-autoprogram-0.1.5.tar.gz ->
python-sphinxcontrib-autoprogram-0.1.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/.github/workflows/build.yml
new/autoprogram-0.1.7/.github/workflows/build.yml
--- old/autoprogram-0.1.5/.github/workflows/build.yml 1970-01-01
01:00:00.000000000 +0100
+++ new/autoprogram-0.1.7/.github/workflows/build.yml 2021-02-10
18:12:43.000000000 +0100
@@ -0,0 +1,77 @@
+name: Build and Test
+
+on:
+ release:
+ types: [ published ]
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: [3.7, 3.8, 3.9]
+
+ 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
+ run: |
+ python -m pip install --upgrade pip
+ python -m pip install tox
+
+ # NOTE(lb): By creating a sdist and then testing/working with that, we
ensure
+ # its completeness.
+ - name: Move to sdist
+ run: |
+ python setup.py sdist
+ mkdir tmp
+ mv dist/*.tar.gz tmp/
+ cd tmp/
+ tar xvf *.tar.gz
+ for f in *; do
+ if [[ -d ${f} ]]; then
+ printf "Moving %s to %s\n" "${f}" "$PWD/sdist"
+ mv "${f}" sdist
+ break
+ fi
+ done
+
+ - name: Build
+ run: |
+ pwd
+ pip install wheel
+ python setup.py sdist bdist_wheel
+ working-directory: ${{ github.workspace }}/tmp/sdist
+
+ - name: Tox
+ run: |
+ tox --skip-missing-interpreters
+ working-directory: ${{ github.workspace }}/tmp/sdist
+
+ - name: Build documentation
+ run: |
+ pip install -r doc/rtd-requires.txt
+ cd doc
+ make
+ working-directory: ${{ github.workspace }}/tmp/sdist
+
+ - name: Install wheel
+ run: |
+ pip install dist/*.whl
+ working-directory: ${{ github.workspace }}/tmp/sdist
+
+ - name: Publish package
+ if: github.event_name == 'release' && startsWith(github.ref,
'refs/tags') && matrix.python-version == 3.9
+ uses: pypa/[email protected]
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_API_TOKEN }}
+ packages_dir: ${{ github.workspace }}/tmp/sdist/dist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/.gitignore
new/autoprogram-0.1.7/.gitignore
--- old/autoprogram-0.1.5/.gitignore 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/.gitignore 2021-02-10 18:12:43.000000000 +0100
@@ -1,7 +1,10 @@
*.egg-info/
+mypy_cache/
*.pyc
.*.swp
.cache/
.tox/
__pycache__/
+build
+dist
doc/_build/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/.pylintrc
new/autoprogram-0.1.7/.pylintrc
--- old/autoprogram-0.1.5/.pylintrc 1970-01-01 01:00:00.000000000 +0100
+++ new/autoprogram-0.1.7/.pylintrc 2021-02-10 18:12:43.000000000 +0100
@@ -0,0 +1,55 @@
+[MASTER]
+
+ignore=.git
+jobs=0
+suggestion-mode=yes
+
+[MESSAGES CONTROL]
+
+disable=all
+enable=assign-to-new-keyword,
+ bad-format-character,
+ bad-format-string-key,
+ bad-open-mode,
+ bad-string-format-type,
+ consider-using-get,
+ consider-using-join,
+ empty-docstring,
+ function-redefined,
+ not-in-loop,
+ redefined-builtin,
+ return-in-init,
+ too-few-format-args,
+ too-many-format-args,
+ truncated-format-string,
+ unnecessary-comprehension,
+ unused-argument,
+ unreachable,
+ unused-format-string-argument,
+ unused-format-string-key,
+ unused-import,
+ unused-variable,
+ using-constant-test
+
+[REPORTS]
+
+output-format=text
+reports=no
+score=no
+
+[BASIC]
+
+argument-naming-style=snake_case
+attr-naming-style=snake_case
+class-naming-style=PascalCase
+const-naming-style=UPPER_CASE
+function-naming-style=snake_case
+include-naming-hint=yes
+inlinevar-naming-style=snake_case
+method-naming-style=snake_case
+module-naming-style=snake_case
+variable-naming-style=snake_case
+
+[VARIABLES]
+
+redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/.travis.yml
new/autoprogram-0.1.7/.travis.yml
--- old/autoprogram-0.1.5/.travis.yml 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/.travis.yml 1970-01-01 01:00:00.000000000 +0100
@@ -1,26 +0,0 @@
-language: python
-python: [3.6, 3.5, 3.4, 3.3, pypy, 2.7, 2.6]
-install:
-- pip install tox-travis
-script:
-- tox
-- '[[ "$TRAVIS_TAG" = "" ]] || [[ "$TRAVIS_TAG" = "$(python setup.py
--version)" ]]'
-- |
- if git show --format=%B --quiet
"${TRAVIS_PULL_REQUEST_SHA:-${TRAVIS_TAG:-${TRAVIS_COMMIT}}}" \
- | grep '\[changelog skip\]' > /dev/null; then
- echo "Skip changelog checker..."
- elif [[ "$TRAVIS_TAG" != "" ]]; then
- ! grep -i "to be released" CHANGES.rst
- else
- [[ "$TRAVIS_COMMIT_RANGE" = "" ]] || \
- [[ "$(git diff --name-only "$TRAVIS_COMMIT_RANGE" | grep
doc/changelog\.rst)" != "" ]]
- fi
-deploy:
- provider: pypi
- distributions: 'sdist bdist_wheel'
- on:
- tags: true
- python: 3.6
- user: sphinxcontrib-httpdomain # shared with sphinx-contrib/httpdomain
- password:
- secure:
"a80qMBk4Z7ROd9A9BQnovTL7iBLbPp79LuNjPA68ZCgt6BHVlGcRjEzVzNeTBBEZqrBr8tMiu55CdgXj8jscFCs5MEoJJVeE/21JM6kFpLoyq3qR5moHelzj/Mm12vn2KpuRo9YjJkTZ8SSPV3yVaEhTXlpwW64C1kqotjfEUtd4Vb90TAOxRTUVHMJ8g77mGWWOI8vYyZEJBOBx1nUTasTOQOlv/yDrzQJlMTjEAbyG0YinryhOOnXTXhlb3X9dHN9LMJv0zrKLwT99SrAbKgnGFHkII0JCe8v7O2UITbfpU/tljyijzVMqjjkCzvQVQlwJWTrhSv8eqBNvZ0kchhECF7u6hfpgXUd8t96HOHEkqtdX1boxWnTVcb0+yAtoM72o3BTafumfv6dObcTAy9lwZoZOuCD3rtL5nzlQke8AfLcInfe45QZOvd+FGFSQhjDn1zkQJDBpx8hL+4WdhZ0F9sktf54q32IhoUvibUeb0BlJxtbuGDGOGnfbZLMtM0c4ok6egeYfI2+a1Q2agtzcEq+z0M9msat4FG43kSLdM2FGblSPQWYcX8trCL9kCVJFM+TMuqHtDQ2nXAeLFpjH6P1nt2U2uwgvlh75GM38DjpdH++nrdTQhlz8Tuf1X4TEWI9r4P9kk3wgYRmizqfrA9YkwP8seQaXQX6vZR0="
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/LICENSE
new/autoprogram-0.1.7/LICENSE
--- old/autoprogram-0.1.5/LICENSE 1970-01-01 01:00:00.000000000 +0100
+++ new/autoprogram-0.1.7/LICENSE 2021-02-10 18:12:43.000000000 +0100
@@ -0,0 +1,26 @@
+Copyright (c) 2014???2018 Hong Minhee <https://hongminhee.org/>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of the sphinxcontrib-autoprogram project.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/MANIFEST.in
new/autoprogram-0.1.7/MANIFEST.in
--- old/autoprogram-0.1.5/MANIFEST.in 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/MANIFEST.in 2021-02-10 18:12:43.000000000 +0100
@@ -1,3 +1,5 @@
include README
include LICENSE
include CHANGES.*
+tox.ini
+recursive-include doc *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/README.rst
new/autoprogram-0.1.7/README.rst
--- old/autoprogram-0.1.5/README.rst 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/README.rst 2021-02-10 18:12:43.000000000 +0100
@@ -9,12 +9,12 @@
:target: https://sphinxcontrib-autoprogram.readthedocs.io/
:alt: Documentation Status
-.. image:: https://travis-ci.org/sphinx-contrib/autoprogram.svg?branch=master
+.. image::
https://github.com/sphinx-contrib/autoprogram/workflows/Build%20and%20Test/badge.svg?branch=master
+ :target: https://github.com/sphinx-contrib/autoprogram/actions
:alt: Build Status
- :target: https://travis-ci.org/sphinx-contrib/autoprogram
This contrib extension, ``sphinxcontrib.autoprogram``, provides an automated
-way to document CLI programs. It scans ``arparser.ArgumentParser`` object,
+way to document CLI programs. It scans ``argparse.ArgumentParser`` object,
and then expands it into a set of ``.. program::`` and ``.. option::``
directives.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/doc/changelog.rst
new/autoprogram-0.1.7/doc/changelog.rst
--- old/autoprogram-0.1.5/doc/changelog.rst 2018-05-15 15:13:57.000000000
+0200
+++ new/autoprogram-0.1.7/doc/changelog.rst 2021-02-10 18:12:43.000000000
+0100
@@ -1,6 +1,37 @@
Changelog
=========
+..
+ TODO Uncomment this:
+
+ Version 0.1.8
+ -------------
+
+ To be released.
+
+Version 0.1.7
+-------------
+
+Released on February 10, 2021.
+
+- Publish to PyPI via Github Actions.
+
+
+Version 0.1.6
+-------------
+
+Released on February 10, 2021.
+
+- Dropped support for Python 2 and Pypy
+- Declare this extension safe for parallel reading
+- Migrate to Github Actions for CI [:issue:`28`, :pull:`32` by Langston
Barrett]
+- Test against recent versions of Sphinx [:issue:`33`, :pull:`32` by Langston
Barrett]
+- Format source code with Black [:issue:`30`, :pull:`32` by Langston Barrett]
+- Add documentation to the ``sdist`` [:issue:`26`, :pull:`32` by Langston
Barrett]
+- Fixed unwanted ``<blockquote>`` tags in multi-line command descriptions that
+ are indented to match surrounding code. [:pull:`21` by dgw]
+
+
Version 0.1.5
-------------
@@ -18,7 +49,7 @@
during build without ``:no_usage_codeblock:`` option on Python 2.
[:bbissue:`168`, :bbissue:`169`]
- Fixed an issue with Sphinx 1.7 which removed ``sphinx.util.compat``.
- [:issue:`1`, :issue:`2` by Zach Riggle]
+ [:issue:`1`, :pull:`2` by Zach Riggle]
Version 0.1.3
@@ -34,7 +65,7 @@
the top-level command usage). [:bbpull:`112` by Alex Honeywell]
- Added :ref:`new options <autoprogram-options>` to :rst:dir:`.. autoprogram::`
directive: [:bbpull:`112` by Alex Honeywell]
-
+
- ``maxdepth``
- ``no_usage_codeblock``
- ``start_command``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/doc/conf.py
new/autoprogram-0.1.7/doc/conf.py
--- old/autoprogram-0.1.5/doc/conf.py 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/doc/conf.py 2021-02-10 18:12:43.000000000 +0100
@@ -280,6 +280,10 @@
extlinks = {
+ 'pull': (
+ 'https://github.com/sphinx-contrib/autoprogram/pull/%s',
+ '#'
+ ),
'issue': (
'https://github.com/sphinx-contrib/autoprogram/issues/%s',
'#'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/doc/index.rst
new/autoprogram-0.1.7/doc/index.rst
--- old/autoprogram-0.1.5/doc/index.rst 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/doc/index.rst 2021-02-10 18:12:43.000000000 +0100
@@ -16,9 +16,9 @@
:target: https://sphinxcontrib-autoprogram.readthedocs.io/
:alt: Documentation Status
-.. image:: https://travis-ci.org/sphinx-contrib/autoprogram.svg?branch=master
+.. image::
https://github.com/sphinx-contrib/autoprogram/workflows/Build%20and%20Test/badge.svg?branch=master
+ :target: https://github.com/sphinx-contrib/autoprogram/actions
:alt: Build Status
- :target: https://travis-ci.org/sphinx-contrib/autoprogram
This contrib extension, :mod:`sphinxcontrib.autoprogram`, provides an automated
way to document CLI programs. It scans :class:`argparse.ArgumentParser`
@@ -144,7 +144,7 @@
``:start_command: subcommand``
Render document for the given subcommand. ``subcommand`` can be a space
- separated list to render a sub-sub-...-command.
+ separated list to render a sub-sub-...-command.
.. versionadded:: 0.1.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/mypy.ini
new/autoprogram-0.1.7/mypy.ini
--- old/autoprogram-0.1.5/mypy.ini 1970-01-01 01:00:00.000000000 +0100
+++ new/autoprogram-0.1.7/mypy.ini 2021-02-10 18:12:43.000000000 +0100
@@ -0,0 +1,11 @@
+[mypy]
+# TODO: Enable these
+# disallow_any_generics = True
+# disallow_incomplete_defs = True
+# disallow_untyped_defs = True
+show_error_codes = True
+ignore_missing_imports = True
+no_implicit_optional = True
+warn_redundant_casts = True
+warn_unused_configs = True
+warn_unused_ignores = True
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/setup.py
new/autoprogram-0.1.7/setup.py
--- old/autoprogram-0.1.5/setup.py 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/setup.py 2021-02-10 18:12:43.000000000 +0100
@@ -7,13 +7,10 @@
# Do not change the variable name. It's parsed by doc/conf.py script.
-version = '0.1.5'
+version = '0.1.7'
requires = ['Sphinx >= 1.2', 'six']
-if 'bdist_wheel' not in sys.argv and sys.version_info < (2, 7):
- requires.append('argparse')
-
def readme():
with open('README.rst') as f:
@@ -24,7 +21,7 @@
name='sphinxcontrib-autoprogram',
version=version,
url='https://github.com/sphinx-contrib/autoprogram',
- license='BSD',
+ license='2-Clause BSD',
author='Hong Minhee',
author_email='\x68\x6f\x6e\x67.minhee' '@' '\x67\x6d\x61\x69\x6c.com',
description='Documenting CLI programs',
@@ -38,14 +35,15 @@
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2.6',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: Implementation :: CPython',
- 'Programming Language :: Python :: Implementation :: PyPy',
'Programming Language :: Python :: Implementation :: Stackless',
'Topic :: Documentation',
'Topic :: Software Development :: Documentation',
@@ -56,6 +54,5 @@
namespace_packages=['sphinxcontrib'],
include_package_data=True,
install_requires=requires,
- extras_requires={":python_version=='2.6'": ['argparse']},
test_suite='sphinxcontrib.autoprogram.suite'
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/sphinxcontrib/__init__.py
new/autoprogram-0.1.7/sphinxcontrib/__init__.py
--- old/autoprogram-0.1.5/sphinxcontrib/__init__.py 2018-05-15
15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/sphinxcontrib/__init__.py 2021-02-10
18:12:43.000000000 +0100
@@ -10,4 +10,4 @@
:license: BSD, see LICENSE for details.
"""
-__import__('pkg_resources').declare_namespace(__name__)
+__import__("pkg_resources").declare_namespace(__name__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/sphinxcontrib/autoprogram.py
new/autoprogram-0.1.7/sphinxcontrib/autoprogram.py
--- old/autoprogram-0.1.5/sphinxcontrib/autoprogram.py 2018-05-15
15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/sphinxcontrib/autoprogram.py 2021-02-10
18:12:43.000000000 +0100
@@ -8,12 +8,16 @@
:license: BSD, see LICENSE for details.
"""
+from __future__ import annotations
+
# pylint: disable=protected-access,missing-docstring
import argparse
import collections
+import inspect
import os
import re
import sys
+from typing import Any, Dict, Iterable, List, Optional, Tuple
import unittest
from docutils import nodes
@@ -25,12 +29,20 @@
from sphinx.domains import std
from sphinx.util.nodes import nested_parse_with_titles
-__all__ = ('AutoprogramDirective',
- 'AutoprogramDirectiveTestCase', 'ScannerTestCase',
- 'import_object', 'scan_programs', 'setup', 'suite')
+__all__ = (
+ "AutoprogramDirective",
+ "AutoprogramDirectiveTestCase",
+ "ScannerTestCase",
+ "import_object",
+ "scan_programs",
+ "setup",
+ "suite",
+)
-def get_subparser_action(parser):
+def get_subparser_action(
+ parser: argparse.ArgumentParser,
+) -> Optional[argparse._SubParsersAction]:
neg1_action = parser._actions[-1]
if isinstance(neg1_action, argparse._SubParsersAction):
@@ -40,8 +52,16 @@
if isinstance(a, argparse._SubParsersAction):
return a
+ return None
+
-def scan_programs(parser, command=[], maxdepth=0, depth=0, groups=False):
+def scan_programs(
+ parser: argparse.ArgumentParser,
+ command=[],
+ maxdepth: int = 0,
+ depth: int = 0,
+ groups: bool = False,
+):
if maxdepth and depth >= maxdepth:
return
@@ -56,29 +76,28 @@
yield command, options, parser
if parser._subparsers:
- choices = ()
+ choices: Iterable[Tuple[Any, Any]] = ()
subp_action = get_subparser_action(parser)
if subp_action:
choices = subp_action.choices.items()
- if not (hasattr(collections, 'OrderedDict') and
- isinstance(choices, collections.OrderedDict)):
+ if not (
+ hasattr(collections, "OrderedDict")
+ and isinstance(choices, collections.OrderedDict)
+ ):
choices = sorted(choices, key=lambda pair: pair[0])
for cmd, sub in choices:
if isinstance(sub, argparse.ArgumentParser):
- for program in scan_programs(
- sub, command + [cmd], maxdepth, depth + 1
- ):
+ for program in scan_programs(sub, command + [cmd], maxdepth,
depth + 1):
yield program
def scan_options(actions):
for arg in actions:
- if not (arg.option_strings or
- isinstance(arg, argparse._SubParsersAction)):
+ if not (arg.option_strings or isinstance(arg,
argparse._SubParsersAction)):
yield format_positional_argument(arg)
for arg in actions:
@@ -86,36 +105,36 @@
yield format_option(arg)
-def format_positional_argument(arg):
- desc = (arg.help or '') % {'default': arg.default}
+def format_positional_argument(arg) -> Tuple[List[str], str]:
+ desc = (arg.help or "") % {"default": arg.default}
name = (arg.metavar or arg.dest).lower()
return [name], desc
-def format_option(arg):
- desc = (arg.help or '') % {'default': arg.default}
+def format_option(arg) -> Tuple[List[str], str]:
+ desc = (arg.help or "") % {"default": arg.default}
if not isinstance(arg, (argparse._StoreAction, argparse._AppendAction)):
names = list(arg.option_strings)
return names, desc
if arg.choices is not None:
- value = '{{{0}}}'.format(','.join(arg.choices))
+ value = "{{{0}}}".format(",".join(str(c) for c in arg.choices))
else:
metavar = arg.metavar or arg.dest
if not isinstance(metavar, tuple):
- metavar = metavar,
- value = '<{0}>'.format('> <'.join(metavar).lower())
+ metavar = (metavar,)
+ value = "<{0}>".format("> <".join(metavar).lower())
- names = ['{0} {1}'.format(option_string, value)
- for option_string in arg.option_strings]
+ names = [
+ "{0} {1}".format(option_string, value) for option_string in
arg.option_strings
+ ]
return names, desc
-
-def import_object(import_name):
- module_name, expr = import_name.split(':', 1)
+def import_object(import_name: str):
+ module_name, expr = import_name.split(":", 1)
try:
mod = __import__(module_name)
except ImportError:
@@ -140,10 +159,10 @@
mod = __import__("foo")
break
else:
- raise ImportError("No module named {}".format(module_name))
+ raise
- mod = reduce(getattr, module_name.split('.')[1:], mod)
- globals_ = builtins
+ mod = reduce(getattr, module_name.split(".")[1:], mod)
+ globals_: Dict[str, Any] = builtins # type: ignore[assignment]
if not isinstance(globals_, dict):
globals_ = globals_.__dict__
return eval(expr, globals_, mod.__dict__)
@@ -154,37 +173,38 @@
has_content = False
required_arguments = 1
option_spec = {
- 'prog': unchanged,
- 'maxdepth': unchanged,
- 'start_command': unchanged,
- 'strip_usage': unchanged,
- 'no_usage_codeblock': unchanged,
- 'groups': unchanged,
+ "prog": unchanged,
+ "maxdepth": unchanged,
+ "start_command": unchanged,
+ "strip_usage": unchanged,
+ "no_usage_codeblock": unchanged,
+ "groups": unchanged,
}
def make_rst(self):
- import_name, = self.arguments
- parser = import_object(import_name or '__undefined__')
- prog = self.options.get('prog')
+ (import_name,) = self.arguments
+ parser = import_object(import_name or "__undefined__")
+ prog = self.options.get("prog")
if prog:
original_prog = parser.prog
parser.prog = prog
- start_command = self.options.get('start_command', '').split(' ')
- strip_usage = 'strip_usage' in self.options
- usage_codeblock = 'no_usage_codeblock' not in self.options
- maxdepth = int(self.options.get('maxdepth', 0))
- groups = 'groups' in self.options
+ start_command = self.options.get("start_command", "").split(" ")
+ strip_usage = "strip_usage" in self.options
+ usage_codeblock = "no_usage_codeblock" not in self.options
+ maxdepth = int(self.options.get("maxdepth", 0))
+ groups = "groups" in self.options
- if start_command[0] == '':
+ if start_command[0] == "":
start_command.pop(0)
if start_command:
+
def get_start_cmd_parser(p):
looking_for = start_command.pop(0)
action = get_subparser_action(p)
if not action:
- raise ValueError('No actions for command ' + looking_for)
+ raise ValueError("No actions for command " + looking_for)
subp = action.choices[looking_for]
@@ -210,8 +230,7 @@
else:
cmd_parser = group_or_parser
if prog and cmd_parser.prog.startswith(original_prog):
- cmd_parser.prog = cmd_parser.prog.replace(
- original_prog, prog, 1)
+ cmd_parser.prog = cmd_parser.prog.replace(original_prog,
prog, 1)
title = cmd_parser.prog.rstrip()
description = cmd_parser.description
usage = cmd_parser.format_usage()
@@ -219,14 +238,17 @@
is_subgroup = bool(commands)
is_program = True
- for line in render_rst(title, options,
- is_program=is_program,
- is_subgroup=is_subgroup,
- description=description,
- usage=usage,
- usage_strip=strip_usage,
- usage_codeblock=usage_codeblock,
- epilog=epilog):
+ for line in render_rst(
+ title,
+ options,
+ is_program=is_program,
+ is_subgroup=is_subgroup,
+ description=description,
+ usage=usage,
+ usage_strip=strip_usage,
+ usage_codeblock=usage_codeblock,
+ epilog=epilog,
+ ):
yield line
def run(self):
@@ -234,61 +256,71 @@
node.document = self.state.document
result = ViewList()
for line in self.make_rst():
- result.append(line, '<autoprogram>')
+ result.append(line, "<autoprogram>")
nested_parse_with_titles(self.state, result, node)
return node.children
-def render_rst(title, options, is_program, is_subgroup, description,
- usage, usage_strip, usage_codeblock, epilog):
+def render_rst(
+ title: str,
+ options,
+ is_program: bool,
+ is_subgroup: bool,
+ description: Optional[str],
+ usage: str,
+ usage_strip: bool,
+ usage_codeblock: bool,
+ epilog: Optional[str],
+) -> Iterable[str]:
if usage_strip:
- to_strip = title.rsplit(' ', 1)[0]
+ to_strip = title.rsplit(" ", 1)[0]
len_to_strip = len(to_strip) - 4
usage_lines = usage.splitlines()
- usage = os.linesep.join([
- usage_lines[0].replace(to_strip, '...'),
- ] + [
- l[len_to_strip:] for l in usage_lines[1:]
- ])
+ usage = os.linesep.join(
+ [
+ usage_lines[0].replace(to_strip, "..."),
+ ]
+ + [line[len_to_strip:] for line in usage_lines[1:]]
+ )
- yield ''
+ yield ""
if is_program:
- yield '.. program:: ' + title
- yield ''
+ yield ".. program:: " + title
+ yield ""
yield title
- yield ('!' if is_subgroup else '?') * len(title)
- yield ''
+ yield ("!" if is_subgroup else "?") * len(title)
+ yield ""
- for line in (description or '').splitlines():
+ for line in inspect.cleandoc(description or "").splitlines():
yield line
- yield ''
+ yield ""
if usage is None:
pass
elif usage_codeblock:
- yield '.. code-block:: console'
- yield ''
+ yield ".. code-block:: console"
+ yield ""
for usage_line in usage.splitlines():
- yield ' ' + usage_line
+ yield " " + usage_line
else:
yield usage
- yield ''
+ yield ""
for option_strings, help_ in options:
- yield '.. option:: {0}'.format(', '.join(option_strings))
- yield ''
- yield ' ' + help_.replace('\n', ' \n')
- yield ''
+ yield ".. option:: {0}".format(", ".join(option_strings))
+ yield ""
+ yield " " + help_.replace("\n", " \n")
+ yield ""
- for line in (epilog or '').splitlines():
- yield line or ''
+ for line in (epilog or "").splitlines():
+ yield line or ""
-def patch_option_role_to_allow_argument_form():
+def patch_option_role_to_allow_argument_form() -> None:
"""Before Sphinx 1.2.2, :rst:dir:`.. option::` directive hadn't
allowed to not start with a dash or slash, so it hadn't been possible
to represent positional arguments (not options).
@@ -298,115 +330,139 @@
It monkeypatches the :rst:dir:`.. option::` directive's behavior.
"""
- std.option_desc_re = re.compile(r'((?:/|-|--)?[-_a-zA-Z0-9]+)(\s*.*)')
+ std.option_desc_re = re.compile(r"((?:/|-|--)?[-_a-zA-Z0-9]+)(\s*.*)")
-def setup(app):
- app.add_directive('autoprogram', AutoprogramDirective)
+def setup(app) -> Dict[str, bool]:
+ app.add_directive("autoprogram", AutoprogramDirective)
patch_option_role_to_allow_argument_form()
+ return {
+ "parallel_read_safe": True,
+ "parallel_write_safe": True,
+ }
class ScannerTestCase(unittest.TestCase):
-
- def test_simple_parser(self):
- parser = argparse.ArgumentParser(description='Process some integers.')
- parser.add_argument('integers', metavar='N', type=int, nargs='*',
- help='an integer for the accumulator')
- parser.add_argument('-i', '--identity', type=int, default=0,
- help='the default result for no arguments '
- '(default: 0)')
- parser.add_argument('--sum', dest='accumulate', action='store_const',
- const=sum, default=max,
- help='sum the integers (default: find the max)')
- parser.add_argument('--key-value', metavar=('KEY', 'VALUE'), nargs=2)
- parser.add_argument('--max', help=argparse.SUPPRESS) # must be opt-out
+ def test_simple_parser(self) -> None:
+ parser = argparse.ArgumentParser(description="Process some integers.")
+ parser.add_argument(
+ "integers",
+ metavar="N",
+ type=int,
+ nargs="*",
+ help="an integer for the accumulator",
+ )
+ parser.add_argument(
+ "-i",
+ "--identity",
+ type=int,
+ default=0,
+ help="the default result for no arguments " "(default: 0)",
+ )
+ parser.add_argument(
+ "--sum",
+ dest="accumulate",
+ action="store_const",
+ const=sum,
+ default=max,
+ help="sum the integers (default: find the max)",
+ )
+ parser.add_argument("--key-value", metavar=("KEY", "VALUE"), nargs=2)
+ parser.add_argument("--max", help=argparse.SUPPRESS) # must be opt-out
programs = scan_programs(parser)
programs = list(programs)
self.assertEqual(1, len(programs))
- parser_info, = programs
+ (parser_info,) = programs
program, options, cmd_parser = parser_info
self.assertEqual([], program)
- self.assertEqual('Process some integers.', cmd_parser.description)
+ self.assertEqual("Process some integers.", cmd_parser.description)
self.assertEqual(5, len(options))
+ self.assertEqual((["n"], "an integer for the accumulator"), options[0])
self.assertEqual(
- (['n'], 'an integer for the accumulator'),
- options[0]
- )
- self.assertEqual(
- (['-h', '--help'], 'show this help message and exit'),
- options[1]
+ (["-h", "--help"], "show this help message and exit"), options[1]
)
self.assertEqual(
- (['-i <identity>', '--identity <identity>'],
- 'the default result for no arguments (default: 0)'),
- options[2]
+ (
+ ["-i <identity>", "--identity <identity>"],
+ "the default result for no arguments (default: 0)",
+ ),
+ options[2],
)
self.assertEqual(
- (['--sum'], 'sum the integers (default: find the max)'),
- options[3]
+ (["--sum"], "sum the integers (default: find the max)"), options[3]
)
self.assertEqual(
- (['--key-value <key> <value>', ], ''),
- options[4]
+ (
+ [
+ "--key-value <key> <value>",
+ ],
+ "",
+ ),
+ options[4],
)
- def test_subcommands(self):
- parser = argparse.ArgumentParser(description='Process some integers.')
+ def test_subcommands(self) -> None:
+ parser = argparse.ArgumentParser(description="Process some integers.")
subparsers = parser.add_subparsers()
- max_parser = subparsers.add_parser('max', description='Find the max.')
+ max_parser = subparsers.add_parser("max", description="Find the max.")
max_parser.set_defaults(accumulate=max)
- max_parser.add_argument('integers', metavar='N', type=int, nargs='+',
- help='An integer for the accumulator.')
- sum_parser = subparsers.add_parser('sum',
- description='Sum the integers.')
+ max_parser.add_argument(
+ "integers",
+ metavar="N",
+ type=int,
+ nargs="+",
+ help="An integer for the accumulator.",
+ )
+ sum_parser = subparsers.add_parser("sum", description="Sum the
integers.")
sum_parser.set_defaults(accumulate=sum)
- sum_parser.add_argument('integers', metavar='N', type=int, nargs='+',
- help='An integer for the accumulator.')
+ sum_parser.add_argument(
+ "integers",
+ metavar="N",
+ type=int,
+ nargs="+",
+ help="An integer for the accumulator.",
+ )
programs = scan_programs(parser)
programs = list(programs)
self.assertEqual(3, len(programs))
# main
program, options, cmd_parser = programs[0]
self.assertEqual([], program)
- self.assertEqual('Process some integers.', cmd_parser.description)
+ self.assertEqual("Process some integers.", cmd_parser.description)
self.assertEqual(1, len(options))
self.assertEqual(
- (['-h', '--help'],
- 'show this help message and exit'),
- options[0]
+ (["-h", "--help"], "show this help message and exit"), options[0]
)
# max
program, options, cmd_parser = programs[1]
- self.assertEqual(['max'], program)
- self.assertEqual('Find the max.', cmd_parser.description)
+ self.assertEqual(["max"], program)
+ self.assertEqual("Find the max.", cmd_parser.description)
self.assertEqual(2, len(options))
- self.assertEqual((['n'], 'An integer for the accumulator.'),
- options[0])
+ self.assertEqual((["n"], "An integer for the accumulator."),
options[0])
self.assertEqual(
- (['-h', '--help'],
- 'show this help message and exit'),
- options[1]
+ (["-h", "--help"], "show this help message and exit"), options[1]
)
# sum
program, options, cmd_parser = programs[2]
- self.assertEqual(['sum'], program)
- self.assertEqual('Sum the integers.', cmd_parser.description)
+ self.assertEqual(["sum"], program)
+ self.assertEqual("Sum the integers.", cmd_parser.description)
self.assertEqual(2, len(options))
- self.assertEqual((['n'], 'An integer for the accumulator.'),
- options[0])
+ self.assertEqual((["n"], "An integer for the accumulator."),
options[0])
- def test_argument_groups(self):
- parser = argparse.ArgumentParser(description='This is a program.')
- parser.add_argument('-v', action='store_true',
- help='A global argument')
- plain_group = parser.add_argument_group('Plain Options',
- description='This is a group.')
- plain_group.add_argument('--plain', action='store_true',
- help='A plain argument.')
- fancy_group = parser.add_argument_group('Fancy Options',
- description='Another group.')
- fancy_group.add_argument('fancy', type=int, help='Set the fancyness')
+ def test_argument_groups(self) -> None:
+ parser = argparse.ArgumentParser(description="This is a program.")
+ parser.add_argument("-v", action="store_true", help="A global
argument")
+ plain_group = parser.add_argument_group(
+ "Plain Options", description="This is a group."
+ )
+ plain_group.add_argument(
+ "--plain", action="store_true", help="A plain argument."
+ )
+ fancy_group = parser.add_argument_group(
+ "Fancy Options", description="Another group."
+ )
+ fancy_group.add_argument("fancy", type=int, help="Set the fancyness")
sections = list(scan_programs(parser, groups=True))
self.assertEqual(4, len(sections))
@@ -414,91 +470,129 @@
# section: unnamed
program, options, cmd_parser = sections[0]
self.assertEqual([], program)
- self.assertEqual('This is a program.', cmd_parser.description)
+ self.assertEqual("This is a program.", cmd_parser.description)
self.assertEqual(0, len(options))
# section: default optionals
program, options, group = sections[1]
self.assertEqual([], program)
- self.assertEqual('optional arguments', group.title)
+ self.assertEqual("optional arguments", group.title)
self.assertEqual(None, group.description)
self.assertEqual(2, len(options))
- self.assertEqual((['-h', '--help'], 'show this help message and exit'),
- options[0])
- self.assertEqual((['-v'], 'A global argument'), options[1])
+ self.assertEqual(
+ (["-h", "--help"], "show this help message and exit"), options[0]
+ )
+ self.assertEqual((["-v"], "A global argument"), options[1])
# section: Plain Options
program, options, group = sections[2]
self.assertEqual([], program)
- self.assertEqual('Plain Options', group.title)
- self.assertEqual('This is a group.', group.description)
+ self.assertEqual("Plain Options", group.title)
+ self.assertEqual("This is a group.", group.description)
self.assertEqual(1, len(options))
- self.assertEqual((['--plain'], 'A plain argument.'), options[0])
+ self.assertEqual((["--plain"], "A plain argument."), options[0])
# section: Fancy Options
program, options, group = sections[3]
self.assertEqual([], program)
- self.assertEqual('Fancy Options', group.title)
- self.assertEqual('Another group.', group.description)
+ self.assertEqual("Fancy Options", group.title)
+ self.assertEqual("Another group.", group.description)
self.assertEqual(1, len(options))
- self.assertEqual((['fancy'], 'Set the fancyness'), options[0])
+ self.assertEqual((["fancy"], "Set the fancyness"), options[0])
- def test_choices(self):
+ def test_choices(self) -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--awesomeness", choices=["meh", "awesome"])
- program, options, cmd_parser = list(scan_programs(parser))[0]
+ _program, options, _cmd_parser = list(scan_programs(parser))[0]
log_option = options[1]
- self.assertEqual((["--awesomeness {meh,awesome}"], ''), log_option)
+ self.assertEqual((["--awesomeness {meh,awesome}"], ""), log_option)
- def test_parse_epilog(self):
+ def test_parse_epilog(self) -> None:
parser = argparse.ArgumentParser(
- description='Process some integers.',
- epilog='The integers will be processed.'
+ description="Process some integers.",
+ epilog="The integers will be processed.",
)
programs = scan_programs(parser)
programs = list(programs)
self.assertEqual(1, len(programs))
- parser_data, = programs
- program, options, cmd_parser = parser_data
- self.assertEqual('The integers will be processed.', cmd_parser.epilog)
+ (parser_data,) = programs
+ _program, _options, cmd_parser = parser_data
+ self.assertEqual("The integers will be processed.", cmd_parser.epilog)
class AutoprogramDirectiveTestCase(unittest.TestCase):
-
- def setUp(self):
+ def setUp(self) -> None:
self.untouched_sys_path = sys.path[:]
- sample_prog_path = os.path.join(os.path.dirname(__file__), '..', 'doc')
+ sample_prog_path = os.path.join(os.path.dirname(__file__), "..", "doc")
sys.path.insert(0, sample_prog_path)
self.directive = AutoprogramDirective(
- 'autoprogram', ['cli:parser'], {'prog': 'cli.py'},
- StringList([], items=[]), 1, 0,
- '.. autoprogram:: cli:parser\n :prog: cli.py\n',
- None, None
+ "autoprogram",
+ ["cli:parser"],
+ {"prog": "cli.py"},
+ StringList([], items=[]),
+ 1,
+ 0,
+ ".. autoprogram:: cli:parser\n :prog: cli.py\n",
+ None,
+ None,
)
- def tearDown(self):
+ def tearDown(self) -> None:
sys.path[:] = self.untouched_sys_path
- def test_make_rst(self):
- """Alt least it shouldn't raise errors during making RST string."""
- list(self.directive.make_rst())
+ def test_make_rst(self) -> None:
+ self.assertEqual(
+ "\n".join(self.directive.make_rst()).strip(),
+ inspect.cleandoc(
+ """
+ .. program:: cli.py
+ cli.py
+ ??????
-class UtilTestCase(unittest.TestCase):
+ Process some integers.
+
+ .. code-block:: console
+
+ usage: cli.py [-h] [-i IDENTITY] [--sum] N [N ...]
+
+ .. option:: n
+
+ An integer for the accumulator.
+
+ .. option:: -h, --help
+
+ show this help message and exit
- def test_import_object(self):
- cls = import_object('sphinxcontrib.autoprogram:UtilTestCase')
+ .. option:: -i <identity>, --identity <identity>
+
+ the default result for no arguments (default: 0)
+
+ .. option:: --sum
+
+ Sum the integers (default: find the max).
+ """).strip()
+ )
+
+
+
+class UtilTestCase(unittest.TestCase):
+ def test_import_object(self) -> None:
+ cls = import_object("sphinxcontrib.autoprogram:UtilTestCase")
self.assertTrue(cls is UtilTestCase)
instance = import_object(
'sphinxcontrib.autoprogram:UtilTestCase("test_import_object")'
)
self.assertIsInstance(instance, UtilTestCase)
- if not hasattr(unittest.TestCase, 'assertIsInstance'):
- def assertIsInstance(self, instance, cls):
- self.assertTrue(isinstance(instance, cls),
- '{0!r} is not an instance of {1.__module__}.'
- '{1.__name__}'.format(instance, cls))
+ if not hasattr(unittest.TestCase, "assertIsInstance"):
+
+ def assertIsInstance(self, instance, cls) -> None: # type:
ignore[override]
+ self.assertTrue(
+ isinstance(instance, cls),
+ "{0!r} is not an instance of {1.__module__}."
+ "{1.__name__}".format(instance, cls),
+ )
suite = unittest.TestSuite()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/autoprogram-0.1.5/tox.ini
new/autoprogram-0.1.7/tox.ini
--- old/autoprogram-0.1.5/tox.ini 2018-05-15 15:13:57.000000000 +0200
+++ new/autoprogram-0.1.7/tox.ini 2021-02-10 18:12:43.000000000 +0100
@@ -1,22 +1,28 @@
+# Policy:
+#
+# Always support at least two major versions of Python and Sphinx: The latest,
+# and the one just before that. For the latest major version of Sphinx, test
+# against the latest three minor versions. For older major versions, test
+# against the latest minor version until maintenance becomes a burden, then
drop
+# them.
+
[tox]
envlist =
- {py27,py33,py34,py35,py36,pypy}-{sphinx17,sphinx16,sphinx15}
- py26-{sphinx16,sphinx15,sphinx14,sphinx13,sphinx12}
- lint
+ {py37,py38,py39}-{sphinx34,sphinx33,sphinx32,sphinx24,sphinx18}
+ black flake8 mypy pylint
minversion = 2.7.0
[testenv]
deps =
- sphinx17: Sphinx >= 1.7.0, < 1.8.0
- sphinx16: Sphinx >= 1.6.0, < 1.7.0
- sphinx15: Sphinx >= 1.5.0, < 1.6.0
- sphinx14: Sphinx >= 1.4.0, < 1.5.0
- sphinx13: Sphinx >= 1.3.0, < 1.4.0
- sphinx12: Sphinx >= 1.2.0, < 1.3.0
+ sphinx34: Sphinx >= 3.4.0, < 3.5.0
+ sphinx33: Sphinx >= 3.3.0, < 3.4.0
+ sphinx32: Sphinx >= 3.2.0, < 3.3.0
+ sphinx24: Sphinx >= 2.4.0, < 3.0.0
+ sphinx18: Sphinx >= 1.8.0, < 1.9.0
commands =
python setup.py test
-[testenv:lint]
+[testenv:flake8]
deps =
flake8 >= 3.5.0, < 4.0.0
flake8-import-order-spoqa >= 1.3.0, < 2.0.0
@@ -24,12 +30,31 @@
flake8 sphinxcontrib/
[flake8]
-exclude = .tox, doc
+exclude = build, dist, doc, .tox
import-order-style = spoqa
application-import-names = sphinxcontrib.autoprogram
+max-line-length = 88
[testenv:doc]
basepython = python3
deps = -rdoc/rtd-requires.txt
commands =
python3 setup.py build_sphinx --build-dir=doc/_build
+
+[testenv:black]
+deps =
+ black
+commands =
+ black --check --diff sphinxcontrib
+
+[testenv:mypy]
+deps =
+ mypy
+commands =
+ mypy sphinxcontrib
+
+[testenv:pylint]
+deps =
+ pylint
+commands =
+ pylint sphinxcontrib
\ No newline at end of file