diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..bf9b9abe --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,15 @@ +codecov: + notify: + require_ci_to_pass: no + +coverage: + precision: 2 + round: down + range: "70...100" + status: + project: + default: + target: auto + threshold: 1% + base: auto + patch: off diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 00000000..572b9b88 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,97 @@ +name: Publish Docs + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '3.x' ] + steps: + - uses: actions/checkout@v1 + - name: Configure git + run: | + git config --global user.name 'travis-ci' + git config --global user.email 'travis@nowhere.edu' + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + + - name: Install poetry + run: | + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + rm get-poetry.py + + - name: Get poetry cache paths from config + run: | + echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') + echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + + - name: Configure poetry + shell: bash + run: poetry config virtualenvs.in-project true + + - name: Set up cache + uses: actions/cache@v2 + id: cache + with: + path: | + .venv + {{ env.poetry_cache_dir }} + {{ env.poetry_virtualenvs_path }} + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + shell: bash + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + + - name: Upgrade pip + shell: bash + run: poetry run python -m pip install pip -U + + - name: Install dependencies [w/ docs] + run: poetry install --extras "docs lint" + + - name: Build documentation + run: | + pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd + + - name: Push documentation to S3 + uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: 'us-west-1' # optional: defaults to us-east-1 + SOURCE_DIR: 'docs/_build/html' # optional: defaults to entire repository + + - name: Generate list of changed files for CloudFront to invalidate + run: | + pushd docs/_build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + for file in $FILES; do + echo $file + # add bare directory to list of updated paths when we see index.html + [[ "$file" == *"/index.html" ]] && echo $file | sed -e 's/\/index.html$/\//' + done | sort | uniq | tr '\n' ' ' > .updated_files + + - name: Invalidate on CloudFront + uses: chetan/invalidate-cloudfront-action@master + env: + DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION }} + AWS_REGION: 'us-east-1' + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + PATHS_FROM: .updated_files diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..1a171304 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,74 @@ +name: tests + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '2.7', '3.x' ] + steps: + - uses: actions/checkout@v1 + - name: Configure git + run: | + git config --global user.name 'travis-ci' + git config --global user.email 'travis@nowhere.edu' + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + + - name: Install poetry + run: | + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + rm get-poetry.py + + - name: Get poetry cache paths from config + run: | + echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') + echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + + - name: Configure poetry + shell: bash + run: poetry config virtualenvs.in-project true + + - name: Set up cache + uses: actions/cache@v2 + id: cache + with: + path: | + .venv + {{ env.poetry_cache_dir }} + {{ env.poetry_virtualenvs_path }} + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + shell: bash + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + + - name: Upgrade pip + shell: bash + run: poetry run python -m pip install pip -U + + - name: Install dependencies + run: poetry install -E "docs test coverage lint format" + + - name: Lint with flake8 + run: poetry run flake8 + + - name: Test with pytest + run: poetry run py.test --cov=./ --cov-report=xml + + - uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/vcspull-ci.yml b/.github/workflows/vcspull-ci.yml deleted file mode 100644 index 0f8c35e9..00000000 --- a/.github/workflows/vcspull-ci.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: vcspull CI - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [ '2.7', '3.x' ] - steps: - - uses: actions/checkout@v1 - - name: Configure git - run: | - git config --global user.name 'travis-ci' - git config --global user.email 'travis@nowhere.edu' - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade poetry - poetry install - - name: Lint with flake8 - run: | - poetry run flake8 - - name: Test with pytest - run: | - poetry run py.test --cov=./ --cov-report=xml - - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index b7799d7b..1b77ea7b 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover +*.cover .hypothesis/ .pytest_cache/ @@ -62,13 +62,14 @@ docs/_build/ # PyBuilder target/ -#Ipython Notebook +# ipython Notebook .ipynb_checkpoints # editors .idea .ropeproject *.swp +.vim/ # docs doc/_build/ diff --git a/.tmuxp.yaml b/.tmuxp.yaml index 1572882f..166e75d4 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -17,7 +17,7 @@ windows: layout: main-horizontal options: main-pane-height: 35 - start_directory: doc/ + start_directory: docs/ panes: - focus: true - pane diff --git a/CHANGES b/CHANGES index 15cacd2d..052107da 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,11 @@ Changelog Here you can find the recent changes to vcspull +current +------- +- #303 - Overhaul docs and packaging +- #303 - Add docs for CLI via sphinx-click + vcspull-1.4.3 (2020-08-05) -------------------------- - Bump libvcs to 0.4.4 diff --git a/MANIFEST.in b/MANIFEST.in index 97af1891..e12120ea 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ -include README.rst LICENSE CHANGES .tmuxp.yaml +include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt -recursive-include doc *.rst +recursive-include docs *.rst diff --git a/Makefile b/Makefile index 4fc7103c..a0ff888a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null +DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]css\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +SHELL := /bin/bash entr_warn: @@ -10,25 +12,31 @@ entr_warn: @echo "----------------------------------------------------------" isort: - isort `${PY_FILES}` + poetry run isort `${PY_FILES}` black: - black `${PY_FILES}` --skip-string-normalization + poetry run black `${PY_FILES}` --skip-string-normalization test: - py.test $(test) + poetry run py.test $(test) watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: - cd doc && $(MAKE) html + $(MAKE) -C docs html watch_docs: - cd doc && $(MAKE) watch_docs + if command -v entr > /dev/null; then ${DOC_FILES} | entr -c $(MAKE) build_docs; else $(MAKE) build_docs entr_warn; fi + +serve_docs: + $(MAKE) -C docs serve + +dev_docs: + $(MAKE) -j watch_docs serve_docs flake8: - flake8 vcspull tests + flake8 libvcs tests watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi diff --git a/README.rst b/README.rst index 0d055f32..b46d2cf3 100644 --- a/README.rst +++ b/README.rst @@ -128,56 +128,40 @@ See donation options at https://git-pull.com/support.html. More information ---------------- - -============== ========================================================== -Python support Python 2.7, >= 3.5 -VCS supported git(1), svn(1), hg(1) -Config formats YAML, JSON, python dict -Source https://github.com/vcs-python/vcspull -Docs https://vcspull.git-pull.com -Changelog https://vcspull.git-pull.com/en/latest/history.html -Issues https://github.com/vcs-python/vcspull/issues -Travis https://travis-ci.org/vcs-python/vcspull -Test Coverage https://codecov.io/gh/vcs-python/vcspull -pypi https://pypi.python.org/pypi/vcspull -Open Hub https://www.openhub.net/p/vcspull -License `MIT`_. -git repo .. code-block:: bash - - $ git clone https://github.com/vcs-python/vcspull.git -install dev .. code-block:: bash - - $ git clone https://github.com/vcs-python/vcspull.git vcspull - $ cd ./vcspull - $ virtualenv .venv - $ source .venv/bin/activate - $ pip install -e . -tests .. code-block:: bash - - $ py.test -run .. code-block:: bash - - $ vcspull -============== ========================================================== +- Python support: Python 2.7, >= 3.4, pypy +- VCS supported: git(1), svn(1), hg(1) +- Source: https://github.com/vcs-python/vcspull +- Docs: https://vcspull.git-pull.com +- Changelog: https://vcspull.git-pull.com/history.html +- API: https://vcspull.git-pull.com/api.html +- Issues: https://github.com/vcs-python/vcspull/issues +- Test Coverage: https://codecov.io/gh/vcs-python/vcspull +- pypi: https://pypi.python.org/pypi/vcspull +- Open Hub: https://www.openhub.net/p/vcspull +- License: `MIT`_. .. _MIT: https://opensource.org/licenses/MIT -.. _Documentation: https://vcspull.git-pull.com/en/latest/ -.. _Quickstart: https://vcspull.git-pull.com/en/latest/quickstart.html -.. _pip: http://www.pip-installer.org/en/latest/ -.. _url scheme: http://www.pip-installer.org/en/latest/logic.html#vcs-support -.. _libvcs: https://github.com/tony/libvcs +.. _Documentation: https://vcspull.git-pull.com/ +.. _Quickstart: https://vcspull.git-pull.com/quickstart.html +.. _pip: http://www.pip-installer.org/ +.. _url scheme: http://www.pip-installer.org/logic.html#vcs-support +.. _libvcs: https://github.com/vcs-python/libvcs .. _RFC3986: http://tools.ietf.org/html/rfc3986.html .. _.vcspull.yaml: https://github.com/tony/.dot-config/blob/master/.vcspull.yaml -.. _examples: https://vcspull.git-pull.com/en/latest/examples.html +.. _examples: https://vcspull.git-pull.com/examples.html .. _fnmatch: http://pubs.opengroup.org/onlinepubs/009695399/functions/fnmatch.html .. |pypi| image:: https://img.shields.io/pypi/v/vcspull.svg :alt: Python Package :target: http://badge.fury.io/py/vcspull -.. |build-status| image:: https://img.shields.io/travis/vcs-python/vcspull.svg +.. |docs| image:: https://github.com/vcs-python/vcspull/workflows/Publish%20Docs/badge.svg + :alt: Docs + :target: https://github.com/vcs-python/vcspull/actions?query=workflow%3A"Publish+Docs" + +.. |build-status| image:: https://github.com/vcs-python/vcspull/workflows/tests/badge.svg :alt: Build Status - :target: https://travis-ci.org/vcs-python/vcspull + :target: https://github.com/vcs-python/vcspull/actions?query=workflow%3A"tests" .. |coverage| image:: https://codecov.io/gh/vcs-python/vcspull/branch/master/graph/badge.svg :alt: Code Coverage @@ -185,8 +169,3 @@ run .. code-block:: bash .. |license| image:: https://img.shields.io/github/license/vcs-python/vcspull.svg :alt: License - -.. |docs| image:: https://readthedocs.org/projects/vcspull/badge/?version=latest - :alt: Documentation Status - :scale: 100% - :target: https://readthedocs.org/projects/vcspull/ diff --git a/doc/cli.rst b/doc/cli.rst deleted file mode 100644 index f8dcf057..00000000 --- a/doc/cli.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. _cli: - -====================== -Command Line Interface -====================== - -Load config ------------ - -:: - - vcspull up - - vcspull up myproject myproject - - # separate by spaces - vcspull up vim myproject diff --git a/doc/conf.py b/doc/conf.py deleted file mode 100644 index 20073881..00000000 --- a/doc/conf.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -import os - -import alagitpull - -# Get the project root dir, which is the parent dir of this -cwd = os.getcwd() -project_root = os.path.dirname(cwd) - -# package data -about = {} -with open("../vcspull/__about__.py") as fp: - exec(fp.read(), about) - -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'alagitpull', - 'sphinx_issues', -] - -releases_unstable_prehistory = True -releases_document_name = ["history"] -releases_issue_uri = "https://github.com/vcs-python/vcspull/issues/%s" -releases_release_uri = "https://github.com/vcs-python/vcspull/tree/v%s" - -issues_github_path = about['__github__'] - -templates_path = ['_templates'] - -source_suffix = '.rst' - -master_doc = 'index' - -project = about['__title__'] -copyright = about['__copyright__'] - -version = '%s' % ('.'.join(about['__version__'].split('.'))[:2]) -release = '%s' % (about['__version__']) - -exclude_patterns = ['_build'] - -pygments_style = 'sphinx' - -html_theme_path = [alagitpull.get_path()] -html_favicon = 'favicon.ico' -html_theme = 'alagitpull' -html_theme_options = { - 'logo': 'img/vcspull.svg', - 'github_user': 'vcs-python', - 'github_repo': 'vcspull', - 'github_type': 'star', - 'github_banner': True, - 'projects': alagitpull.projects, - 'project_name': about['__title__'], -} -html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', - 'more.html', - 'searchbox.html', - ] -} - -html_static_path = ['_static'] - -alagitpull_internal_hosts = ['vcspull.git-pull.com', '0.0.0.0'] -alagitpull_external_hosts_new_window = True - - -htmlhelp_basename = '%sdoc' % about['__title__'] - -latex_documents = [ - ( - 'index', - '{0}.tex'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], - 'manual', - ) -] - -man_pages = [ - ( - 'index', - about['__package_name__'], - '{0} Documentation'.format(about['__title__']), - about['__author__'], - 1, - ) -] - -texinfo_documents = [ - ( - 'index', - '{0}'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], - about['__package_name__'], - about['__description__'], - 'Miscellaneous', - ) -] - -intersphinx_mapping = { - 'py': ('https://docs.python.org/2', None), - 'libvcs': ('http://libvcs.readthedocs.io/en/latest/', None), -} diff --git a/doc/developing.rst b/doc/developing.rst deleted file mode 100644 index 69fb753d..00000000 --- a/doc/developing.rst +++ /dev/null @@ -1,129 +0,0 @@ -.. _developing: - -=========== -Development -=========== - -Testing -------- - -Our tests are inside ``tests/``. Tests are implemented using -`pytest`_. - -.. _pytest: http://pytest.org/ - -.. _install_dev_env: - -Install the latest code from git --------------------------------- - -Using pip -^^^^^^^^^ - -To begin developing, check out the code from github: - -.. code-block:: sh - - $ git clone git@github.com:vcs-python/vcspull.git - $ cd vcspull - -Now create a virtualenv, if you don't know how to, you can create a -virtualenv with: - -.. code-block:: sh - - $ virtualenv .venv - -Then activate it to current tty / terminal session with: - -.. code-block:: sh - - $ source .venv/bin/activate - -Good! Now let's run this: - -.. code-block:: sh - - $ pip install -r requirements/test.txt -e . - -This has ``pip``, a python package manager install the python package -in the current directory. ``-e`` means ``--editable``, which means you can -adjust the code and the installed software will reflect the changes. - -Using poetry -^^^^^^^^^^^^ - -To begin developing, check out the code from github: - -.. code-block:: bash - - $ git clone git@github.com:vcs-python/vcspull.git - $ cd vcspull - -You can create a virtualenv, and install all of the locked -packages as listed in poetry.lock: - -.. code-block:: bash - - $ poetry install - -If you ever need to update packages during your development session, the -following command can be used to update all packages as per poetry settings or -individual package (second command): - -.. code-block:: bash - - $ poetry update - $ poetry update requests - -Then activate it to your current tty / terminal session with: - -.. code-block:: bash - - $ poetry shell - -That is it! You are now ready to code! - -Test Runner ------------ - -As you seen above, the ``vcspull`` command will now be available to you, -since you are in the virtual environment, your `PATH` environment was -updated to include a special version of ``python`` inside your ``.venv`` -folder with its own packages. - -.. code-block:: bash - - $ make test - -You probably didn't see anything but tests scroll by. - -If you found a problem or are trying to write a test, you can file an -`issue on github`_. - -.. _test_specific_tests: - -Test runner options -~~~~~~~~~~~~~~~~~~~ - -Test only a file: - -.. code-block:: bash - - $ py.test tests/test_config.py - -will test the ``tests/test_config.py`` tests. - -.. code-block:: bash - - $ py.test tests/test_config.py::test_export_json - -tests ``test_export_json`` inside of ``tests/test_config.py``. - -Multiple can be separated by spaces: - -.. code-block:: bash - - $ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json - -.. _issue on github: https://github.com/vcs-python/vcspull/issues diff --git a/doc/requirements.txt b/doc/requirements.txt deleted file mode 100644 index 04b4dec7..00000000 --- a/doc/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --r ../requirements/doc.txt diff --git a/doc/Makefile b/docs/Makefile similarity index 96% rename from doc/Makefile rename to docs/Makefile index f0d50976..f81298c9 100644 --- a/doc/Makefile +++ b/docs/Makefile @@ -158,7 +158,7 @@ checkbuild: rm -rf $(BUILDDIR) $(SPHINXBUILD) -n -q ./ $(BUILDDIR) -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null watch: if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) html; else $(MAKE) html; fi @@ -166,13 +166,16 @@ watch: serve: @echo '=================================================' @echo - @echo 'docs server running at http://localhost${HTTP_PORT}/' + @echo 'docs server running at http://localhost:${HTTP_PORT}/' @echo @echo '=================================================' @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi serve_py2: - pushd _build/html; python -m SimpleHTTPServer ${HTTP_PORT}; popd + pushd _build/html; python2 -m SimpleHTTPServer ${HTTP_PORT}; popd serve_py3: python -m http.server ${HTTP_PORT} --directory _build/html + +dev: + $(MAKE) -j watch serve diff --git a/doc/_static/favicon.ico b/docs/_static/favicon.ico similarity index 100% rename from doc/_static/favicon.ico rename to docs/_static/favicon.ico diff --git a/docs/_static/img/icons/icon-128x128.png b/docs/_static/img/icons/icon-128x128.png new file mode 100644 index 00000000..44894545 Binary files /dev/null and b/docs/_static/img/icons/icon-128x128.png differ diff --git a/docs/_static/img/icons/icon-144x144.png b/docs/_static/img/icons/icon-144x144.png new file mode 100644 index 00000000..44f6fb14 Binary files /dev/null and b/docs/_static/img/icons/icon-144x144.png differ diff --git a/docs/_static/img/icons/icon-152x152.png b/docs/_static/img/icons/icon-152x152.png new file mode 100644 index 00000000..af3e7d9d Binary files /dev/null and b/docs/_static/img/icons/icon-152x152.png differ diff --git a/docs/_static/img/icons/icon-192x192.png b/docs/_static/img/icons/icon-192x192.png new file mode 100644 index 00000000..9b6d24c2 Binary files /dev/null and b/docs/_static/img/icons/icon-192x192.png differ diff --git a/docs/_static/img/icons/icon-384x384.png b/docs/_static/img/icons/icon-384x384.png new file mode 100644 index 00000000..a8896709 Binary files /dev/null and b/docs/_static/img/icons/icon-384x384.png differ diff --git a/docs/_static/img/icons/icon-512x512.png b/docs/_static/img/icons/icon-512x512.png new file mode 100644 index 00000000..a22f6f50 Binary files /dev/null and b/docs/_static/img/icons/icon-512x512.png differ diff --git a/docs/_static/img/icons/icon-72x72.png b/docs/_static/img/icons/icon-72x72.png new file mode 100644 index 00000000..d9e84fdc Binary files /dev/null and b/docs/_static/img/icons/icon-72x72.png differ diff --git a/docs/_static/img/icons/icon-96x96.png b/docs/_static/img/icons/icon-96x96.png new file mode 100644 index 00000000..49030592 Binary files /dev/null and b/docs/_static/img/icons/icon-96x96.png differ diff --git a/doc/_static/img/vcspull.svg b/docs/_static/img/vcspull.svg similarity index 100% rename from doc/_static/img/vcspull.svg rename to docs/_static/img/vcspull.svg diff --git a/doc/_static/vcspull-demo.gif b/docs/_static/vcspull-demo.gif similarity index 100% rename from doc/_static/vcspull-demo.gif rename to docs/_static/vcspull-demo.gif diff --git a/doc/_static/vcspull-screenshot.png b/docs/_static/vcspull-screenshot.png similarity index 100% rename from doc/_static/vcspull-screenshot.png rename to docs/_static/vcspull-screenshot.png diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 00000000..c57a16e5 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,45 @@ +{% extends "!layout.html" %} +{%- block extrahead %} + {{ super() }} + {%- if theme_show_meta_manifest_tag == true %} + + {% endif -%} + {%- if theme_show_meta_og_tags == true %} + + + + + + + + + + + + + + + + {% endif -%} + {%- if theme_show_meta_app_icon_tags == true %} + + + + + + + + + + + + + + + + + + + + {% endif -%} +{% endblock %} diff --git a/docs/cli.rst b/docs/cli.rst new file mode 100644 index 00000000..653c1a96 --- /dev/null +++ b/docs/cli.rst @@ -0,0 +1,9 @@ +.. _cli: + +====================== +Command Line Interface +====================== + +.. click:: vcspull.cli:cli + :prog: vcspull + :show-nested: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..2011fb41 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +import os + +import alagitpull +from recommonmark.transform import AutoStructify + +# Get the project root dir, which is the parent dir of this +cwd = os.getcwd() +project_root = os.path.dirname(cwd) + +# package data +about = {} +with open("../vcspull/__about__.py") as fp: + exec(fp.read(), about) + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'sphinx.ext.napoleon', + 'sphinx.ext.linkcode', + 'alagitpull', + 'sphinx_issues', + 'sphinx_click.ext', # sphinx-click + 'recommonmark', +] + +# app setup hook +def setup(app): + app.add_config_value( + 'recommonmark_config', + { + #'url_resolver': lambda url: github_doc_root + url, + 'enable_auto_toc_tree': True, + 'auto_toc_tree_section': 'Contents', + 'auto_code_block': True, + 'enable_eval_rst': True, + }, + True, + ) + app.add_transform(AutoStructify) + + +issues_github_path = about['__github__'].replace('https://github.com/', '') + +templates_path = ['_templates'] + +source_suffix = '.rst' + +master_doc = 'index' + +project = about['__title__'] +copyright = about['__copyright__'] + +version = '%s' % ('.'.join(about['__version__'].split('.'))[:2]) +release = '%s' % (about['__version__']) + +exclude_patterns = ['_build'] + +pygments_style = 'sphinx' + +html_theme_path = [alagitpull.get_path()] +html_theme = 'alagitpull' +html_theme_options = { + 'logo': 'img/vcspull.svg', + 'github_user': 'vcs-python', + 'github_repo': 'vcspull', + 'github_type': 'star', + 'github_banner': True, + 'projects': alagitpull.projects, + 'project_name': about['__title__'], + 'project_title': about['__title__'], + 'project_description': about['__description__'], + 'project_url': about['__docs__'], + 'show_meta_manifest_tag': True, + 'show_meta_og_tags': True, + 'show_meta_app_icon_tags': True, +} +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', + 'more.html', + 'searchbox.html', + ] +} + +html_static_path = ['_static'] +html_extra_path = ['manifest.json'] + +alagitpull_internal_hosts = ['vcspull.git-pull.com', '0.0.0.0'] +alagitpull_external_hosts_new_window = True + + +htmlhelp_basename = '%sdoc' % about['__title__'] + +latex_documents = [ + ( + 'index', + '{0}.tex'.format(about['__package_name__']), + '{0} Documentation'.format(about['__title__']), + about['__author__'], + 'manual', + ) +] + +man_pages = [ + ( + 'index', + about['__package_name__'], + '{0} Documentation'.format(about['__title__']), + about['__author__'], + 1, + ) +] + +texinfo_documents = [ + ( + 'index', + '{0}'.format(about['__package_name__']), + '{0} Documentation'.format(about['__title__']), + about['__author__'], + about['__package_name__'], + about['__description__'], + 'Miscellaneous', + ) +] + +intersphinx_mapping = { + 'py': ('https://docs.python.org/', None), + 'libvcs': ('http://libvcs.git-pull.com/', None), +} + + +def linkcode_resolve(domain, info): # NOQA: C901 + import inspect + import sys + from os.path import dirname, relpath + + import vcspull + + """ + Determine the URL corresponding to Python object + + Notes + ----- + From https://github.com/numpy/numpy/blob/v1.15.1/doc/source/conf.py, 7c49cfa + on Jul 31. License BSD-3. https://github.com/numpy/numpy/blob/v1.15.1/LICENSE.txt + """ + if domain != 'py': + return None + + modname = info['module'] + fullname = info['fullname'] + + submod = sys.modules.get(modname) + if submod is None: + return None + + obj = submod + for part in fullname.split('.'): + try: + obj = getattr(obj, part) + except Exception: + return None + + # strip decorators, which would resolve to the source of the decorator + # possibly an upstream bug in getsourcefile, bpo-1764286 + try: + unwrap = inspect.unwrap + except AttributeError: + pass + else: + obj = unwrap(obj) + + try: + fn = inspect.getsourcefile(obj) + except Exception: + fn = None + if not fn: + return None + + try: + source, lineno = inspect.getsourcelines(obj) + except Exception: + lineno = None + + if lineno: + linespec = "#L%d-L%d" % (lineno, lineno + len(source) - 1) + else: + linespec = "" + + fn = relpath(fn, start=dirname(vcspull.__file__)) + + if 'dev' in about['__version__']: + return "%s/blob/master/%s/%s%s" % ( + about['__github__'], + about['__package_name__'], + fn, + linespec, + ) + else: + return "%s/blob/v%s/%s/%s%s" % ( + about['__github__'], + about['__version__'], + about['__package_name__'], + fn, + linespec, + ) diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 00000000..0c2cd997 --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,60 @@ +# Development + +[poetry] is a required package to develop. + +`git clone https://github.com/vcs-python/vcspull.git` + +`cd vcspull` + +`poetry install -E "docs test coverage lint format"` + +Makefile commands prefixed with `watch_` will watch files and rerun. + +## Tests + +`poetry run py.test` + +Helpers: `make test` +Rerun tests on file change: `make watch_test` (requires [entr(1)]) + +## Documentation + +Default preview server: http://localhost:8022 + +`cd docs/` and `make html` to build. `make serve` to start http server. + +Helpers: +`make build_docs`, `make serve_docs` + +Rebuild docs on file change: `make watch_docs` (requires [entr(1)]) + +Rebuild docs and run server via one terminal: `make dev_docs` (requires above, and a +`make(1)` with `-J` support, e.g. GNU Make) + +## Formatting / Linting + +The project uses [black] and [isort] (one after the other) and runs [flake8] via +CI. See the configuration in `pyproject.toml` and `setup.cfg`: + +`make black isort`: Run `black` first, then `isort` to handle import nuances +`make flake8`, to watch (requires `entr(1)`): `make watch_flake8` + +## Releasing + +As of 0.10, [poetry] handles virtualenv creation, package requirements, versioning, +building, and publishing. Therefore there is no setup.py or requirements files. + +Update `__version__` in `__about__.py` and `pyproject.toml`:: + + git commit -m 'build(vcspull): Tag v0.1.1' + git tag v0.1.1 + git push + git push --tags + poetry build + poetry deploy + +[poetry]: https://python-poetry.org/ +[entr(1)]: http://eradman.com/entrproject/ +[black]: https://github.com/psf/black +[isort]: https://pypi.org/project/isort/ +[flake8]: https://flake8.pycqa.org/ diff --git a/doc/examples.rst b/docs/examples.rst similarity index 100% rename from doc/examples.rst rename to docs/examples.rst diff --git a/doc/history.rst b/docs/history.rst similarity index 100% rename from doc/history.rst rename to docs/history.rst diff --git a/doc/index.rst b/docs/index.rst similarity index 94% rename from doc/index.rst rename to docs/index.rst index 0c50e313..8acf3377 100644 --- a/doc/index.rst +++ b/docs/index.rst @@ -5,7 +5,7 @@ vcspull ####### .. include:: ../README.rst - :start-line: 4 + :start-line: 2 :end-before: .. image .. image:: _static/vcspull-demo.gif diff --git a/docs/manifest.json b/docs/manifest.json new file mode 100644 index 00000000..2288904a --- /dev/null +++ b/docs/manifest.json @@ -0,0 +1,53 @@ +{ + "name": "vcspull", + "short_name": "vcspull", + "description": "synchronize your projects via yaml / json files", + "theme_color": "#2196f3", + "background_color": "#fff", + "display": "browser", + "Scope": "https://vcspull.git-pull.com/", + "start_url": "https://vcspull.git-pull.com/", + "icons": [ + { + "src": "_static/img/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "_static/img/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "splash_pages": null +} diff --git a/doc/quickstart.rst b/docs/quickstart.rst similarity index 100% rename from doc/quickstart.rst rename to docs/quickstart.rst diff --git a/poetry.lock b/poetry.lock index abea0ae2..d77c807e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,8 +11,8 @@ category = "dev" description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" optional = false -python-versions = "*" -version = "0.0.23" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.1.0" [package.dependencies] alabaster = "<0.8" @@ -29,7 +29,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -38,7 +38,7 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version < \"3\" or python_version >= \"3\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -53,6 +53,7 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i [[package]] category = "dev" description = "Internationalization utilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -95,22 +96,10 @@ typed-ast = ">=1.4.0" [package.extras] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] -[[package]] -category = "dev" -description = "An easy safelist-based HTML-sanitizing tool." -name = "bleach" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.1.5" - -[package.dependencies] -packaging = "*" -six = ">=1.9.0" -webencodings = "*" - [[package]] category = "dev" description = "Python package for providing Mozilla's CA Bundle." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "certifi" optional = false python-versions = "*" @@ -119,6 +108,7 @@ version = "2020.6.20" [[package]] category = "dev" description = "Universal encoding detector for Python 2 and 3" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "chardet" optional = false python-versions = "*" @@ -152,6 +142,22 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.3" +[[package]] +category = "dev" +description = "Python parser for the CommonMark Markdown spec" +name = "commonmark" +optional = false +python-versions = "*" +version = "0.9.1" + +[package.dependencies] +[package.dependencies.future] +python = "<3" +version = ">=0.14.0" + +[package.extras] +test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] + [[package]] category = "dev" description = "Updated configparser from Python 3.7 for Python 2.6+." @@ -168,7 +174,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version < \"3\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -185,22 +191,6 @@ version = "5.2.1" [package.extras] toml = ["toml"] -[[package]] -category = "dev" -description = "Style checker for Sphinx (or other) RST documentation" -name = "doc8" -optional = false -python-versions = "*" -version = "0.8.1" - -[package.dependencies] -Pygments = "*" -chardet = "*" -docutils = "*" -restructuredtext-lint = ">=0.7" -six = "*" -stevedore = "*" - [[package]] category = "dev" description = "Docutils -- Python Documentation Utilities" @@ -269,6 +259,15 @@ optional = false python-versions = "*" version = "3.2.3-2" +[[package]] +category = "dev" +description = "Clean single-source support for Python 3 and 2" +marker = "python_version < \"3\"" +name = "future" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" + [[package]] category = "dev" description = "Backport of the concurrent.futures package from Python 3" @@ -281,6 +280,7 @@ version = "3.3.0" [[package]] category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "idna" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -289,6 +289,7 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -362,7 +363,7 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.2.2" +version = "5.3.2" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -372,6 +373,7 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] category = "dev" description = "A very fast and expressive template engine." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -399,12 +401,13 @@ category = "main" description = "vcs abstraction layer" name = "libvcs" optional = false -python-versions = "*" -version = "0.4.4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.5.0a1" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -442,6 +445,7 @@ version = "8.4.0" [[package]] category = "dev" description = "Core utilities for Python packages" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "packaging" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -496,17 +500,6 @@ optional = false python-versions = "*" version = "5.4.5" -[[package]] -category = "dev" -description = "Query metadatdata from sdists / bdists / installed packages." -name = "pkginfo" -optional = false -python-versions = "*" -version = "1.5.0.1" - -[package.extras] -testing = ["nose", "coverage"] - [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" @@ -552,6 +545,7 @@ version = "2.2.0" [[package]] category = "dev" description = "Pygments is a syntax highlighting package written in Python." +marker = "python_version < \"3\"" name = "pygments" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -560,6 +554,7 @@ version = "2.5.2" [[package]] category = "dev" description = "Pygments is a syntax highlighting package written in Python." +marker = "python_version >= \"3\"" name = "pygments" optional = false python-versions = ">=3.5" @@ -568,6 +563,7 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -576,7 +572,6 @@ version = "2.4.7" [[package]] category = "dev" description = "pytest: simple powerful testing with Python" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytest" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" @@ -617,7 +612,6 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] [[package]] category = "dev" description = "pytest: simple powerful testing with Python" -marker = "python_version >= \"3\"" name = "pytest" optional = false python-versions = ">=3.5" @@ -678,9 +672,34 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] +[[package]] +category = "dev" +description = "pytest plugin to re-run tests to eliminate flaky failures" +name = "pytest-rerunfailures" +optional = false +python-versions = "*" +version = "8.0" + +[package.dependencies] +pytest = ">=4.4" +setuptools = ">=40.0" + +[[package]] +category = "dev" +description = "pytest plugin to re-run tests to eliminate flaky failures" +name = "pytest-rerunfailures" +optional = false +python-versions = "*" +version = "9.0" + +[package.dependencies] +pytest = ">=5.0" +setuptools = ">=40.0" + [[package]] category = "dev" description = "World timezone definitions, modern and historical" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -696,20 +715,16 @@ version = "5.3.1" [[package]] category = "dev" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" -name = "readme-renderer" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +name = "recommonmark" optional = false python-versions = "*" -version = "26.0" +version = "0.6.0" [package.dependencies] -Pygments = ">=2.5.1" -bleach = ">=2.1.0" -docutils = ">=0.13.1" -six = "*" - -[package.extras] -md = ["cmarkgfm (>=0.2.0)"] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" [[package]] category = "dev" @@ -738,28 +753,6 @@ urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] -[[package]] -category = "dev" -description = "A utility belt for advanced users of python-requests" -name = "requests-toolbelt" -optional = false -python-versions = "*" -version = "0.9.1" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -category = "dev" -description = "reStructuredText linter" -name = "restructuredtext-lint" -optional = false -python-versions = "*" -version = "1.3.1" - -[package.dependencies] -docutils = ">=0.11,<1.0" - [[package]] category = "dev" description = "scandir, a better directory iterator and faster os.walk()" @@ -772,6 +765,7 @@ version = "1.10.0" [[package]] category = "dev" description = "Python 2 and 3 compatibility utilities" +marker = "python_version < \"3\" or python_version >= \"3\" or python_version >= \"3\" and python_version < \"3.6\"" name = "six" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" @@ -780,6 +774,7 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -822,7 +817,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.1.2" +version = "3.2.0" [package.dependencies] Jinja2 = ">=2.3" @@ -848,6 +843,18 @@ docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] +[[package]] +category = "dev" +description = "Sphinx extension that automatically documents click applications" +name = "sphinx-click" +optional = false +python-versions = "*" +version = "2.5.0" + +[package.dependencies] +pbr = ">=2.0" +sphinx = ">=1.5,<4.0" + [[package]] category = "dev" description = "A Sphinx extension for linking to your project's issue tracker" @@ -867,6 +874,7 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -879,6 +887,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -891,6 +900,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -903,6 +913,7 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" +marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -914,6 +925,7 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -926,6 +938,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -947,58 +960,15 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] -[[package]] -category = "dev" -description = "Manage dynamic plugins for Python applications" -name = "stevedore" -optional = false -python-versions = "*" -version = "1.32.0" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" -six = ">=1.10.0" - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false python-versions = "*" version = "0.10.1" -[[package]] -category = "dev" -description = "Fast, Extensible Progress Meter" -name = "tqdm" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.48.0" - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] - -[[package]] -category = "dev" -description = "Collection of utilities for publishing packages on PyPI" -name = "twine" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.15.0" - -[package.dependencies] -pkginfo = ">=1.4.2" -readme-renderer = ">=21.0" -requests = ">=2.5.0,<2.15 || >2.15,<2.16 || >2.16" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -setuptools = ">=0.7.0" -tqdm = ">=4.14" - -[package.extras] -keyring = ["keyring"] -with-blake2 = ["pyblake2"] - [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1020,6 +990,7 @@ version = "3.7.4.3" [[package]] category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" @@ -1044,18 +1015,10 @@ version = "0.2.5" python = "<3.2" version = ">=1.2.1" -[[package]] -category = "dev" -description = "Character encoding aliases for legacy web content" -name = "webencodings" -optional = false -python-versions = "*" -version = "0.5.1" - [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1070,8 +1033,28 @@ version = "*" docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] +[[package]] +category = "dev" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version >= \"3\" and python_version < \"3.8\"" +name = "zipp" +optional = false +python-versions = ">=3.6" +version = "3.1.0" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["jaraco.itertools", "func-timeout"] + +[extras] +coverage = [] +docs = [] +format = [] +lint = [] +test = [] + [metadata] -content-hash = "00a34f05cad908a85d1bd0eb99788a7d64fa839ec3a4b63b1274eba87abfd725" +content-hash = "00635343dbfb45da6e15586b2c644ed9ffc6efe8991f318af4d1da749d9930ef" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1081,7 +1064,8 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] alagitpull = [ - {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, + {file = "alagitpull-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b9ed87ee410c6fa40a63a91d2f25919a10e20c6d39e080356b067f3ff6f379b"}, + {file = "alagitpull-0.1.0.tar.gz", hash = "sha256:f6076f81a738c3291b598d8016b248edf5adf25d1d348c2599eff92c1eedaed9"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, @@ -1107,10 +1091,6 @@ black = [ {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, ] -bleach = [ - {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, - {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, -] certifi = [ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, @@ -1132,6 +1112,10 @@ colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, ] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] configparser = [ {file = "configparser-4.0.2-py2.py3-none-any.whl", hash = "sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c"}, {file = "configparser-4.0.2.tar.gz", hash = "sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df"}, @@ -1176,10 +1160,6 @@ coverage = [ {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, ] -doc8 = [ - {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, - {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, -] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, @@ -1201,6 +1181,9 @@ functools32 = [ {file = "functools32-3.2.3-2.tar.gz", hash = "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"}, {file = "functools32-3.2.3-2.zip", hash = "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0"}, ] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] futures = [ {file = "futures-3.3.0-py2-none-any.whl", hash = "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16"}, {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, @@ -1224,8 +1207,8 @@ iniconfig = [ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.2.2-py3-none-any.whl", hash = "sha256:aea484023188ef1c38256dd24afa96e914adafe3a911a1786800a74e433006d1"}, - {file = "isort-5.2.2.tar.gz", hash = "sha256:96b27045e3187b9bdde001143b79f9b10a462f372bff7062302818013b6c86f3"}, + {file = "isort-5.3.2-py3-none-any.whl", hash = "sha256:5196bd2f5b23dc91215734b1c96c6d28390061d69860a948094c12635d6d64e6"}, + {file = "isort-5.3.2.tar.gz", hash = "sha256:ba83762132a8661d3525f87a86549712fb7d8da79eeb452e01f327ada9e87920"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -1235,7 +1218,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] libvcs = [ - {file = "libvcs-0.4.4.tar.gz", hash = "sha256:e591bb7e3a6101c1a2634d98e5a911a6cca85c60645401a8f6005c3577ee0d00"}, + {file = "libvcs-0.5.0a1-py2.py3-none-any.whl", hash = "sha256:838b3a49be0271d219a972d84e67bf17df265b9133b3ab5baf17bd88d58562b6"}, + {file = "libvcs-0.5.0a1.tar.gz", hash = "sha256:cda37195039e3709f43fca470f44a15679d927642ae8a7632f9dddfbe28b6117"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1301,10 +1285,6 @@ pbr = [ {file = "pbr-5.4.5-py2.py3-none-any.whl", hash = "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8"}, {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, ] -pkginfo = [ - {file = "pkginfo-1.5.0.1-py2.py3-none-any.whl", hash = "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"}, - {file = "pkginfo-1.5.0.1.tar.gz", hash = "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb"}, -] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, @@ -1343,6 +1323,12 @@ pytest-cov = [ {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, ] +pytest-rerunfailures = [ + {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, + {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, + {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, + {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, +] pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, @@ -1360,9 +1346,9 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] -readme-renderer = [ - {file = "readme_renderer-26.0-py2.py3-none-any.whl", hash = "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376"}, - {file = "readme_renderer-26.0.tar.gz", hash = "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d"}, +recommonmark = [ + {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, + {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, @@ -1391,13 +1377,6 @@ requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, ] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -restructuredtext-lint = [ - {file = "restructuredtext_lint-1.3.1.tar.gz", hash = "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8"}, -] scandir = [ {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, {file = "scandir-1.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"}, @@ -1422,8 +1401,12 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.1.2-py3-none-any.whl", hash = "sha256:97dbf2e31fc5684bb805104b8ad34434ed70e6c588f6896991b2fdfd2bef8c00"}, - {file = "Sphinx-3.1.2.tar.gz", hash = "sha256:b9daeb9b39aa1ffefc2809b43604109825300300b987a24f45976c001ba1a8fd"}, + {file = "Sphinx-3.2.0-py3-none-any.whl", hash = "sha256:f7db5b76c42c8b5ef31853c2de7178ef378b985d7793829ec071e120dac1d0ca"}, + {file = "Sphinx-3.2.0.tar.gz", hash = "sha256:cf2d5bc3c6c930ab0a1fbef3ad8a82994b1bf4ae923f8098a05c7e5516f07177"}, +] +sphinx-click = [ + {file = "sphinx-click-2.5.0.tar.gz", hash = "sha256:8ba44ca446ba4bb0585069b8aabaa81e833472d6669b36924a398405311d206f"}, + {file = "sphinx_click-2.5.0-py2.py3-none-any.whl", hash = "sha256:6848ba2d084ef2feebae0ce3603c1c02a2ba5ded54fb6c0cf24fd01204a945f3"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -1457,22 +1440,10 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] -stevedore = [ - {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, - {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, -] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] -tqdm = [ - {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, - {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, -] -twine = [ - {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, - {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, -] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, @@ -1508,11 +1479,9 @@ wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, + {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, + {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, ] diff --git a/pyproject.toml b/pyproject.toml index 7a6046aa..2a8a6a2f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,42 +3,90 @@ skip-string-normalization = true [tool.poetry] name = "vcspull" -version = "1.4.3" -description = "synchronize your repos and forks via declarative yaml/json file(s)" +version = "1.5.0a2" +description = "synchronize your projects via yaml / json files" license = "MIT" authors = ["Tony Narlock "] +classifiers = [ + "Development Status :: 4 - Beta", + "License :: OSI Approved :: MIT License", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Operating System :: POSIX", + "Operating System :: MacOS :: MacOS X", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Topic :: Utilities", + "Topic :: System :: Shells" +] +packages = [ + { include = "vcspull" } +] +readme = 'README.rst' +keywords = ["vcspull", "git", "vcs", "json", "yaml"] + +homepage = "https://vcspull.git-pull.com" + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/vcs-python/vcspull/issues" +Documentation = "https://vcspull.git-pull.com" +Repository = "https://github.com/vcs-python/vcspull" + +[tool.poetry.scripts] +vcspull = 'vcspull:cli.cli' [tool.poetry.dependencies] python = "~2.7 || ^3.5" click = ">=7<8" kaptan = "*" -libvcs = "^0.4.4" +libvcs = { version = "0.5.0a1", allow-prereleases = true } colorama = ">=0.3.9" [tool.poetry.dev-dependencies] -alagitpull = "*" -black = {version="==19.10b0", python="^3.6"} -doc8 = "*" -docutils = "*" -flake8 = "*" -isort = [ - {version="<5", python="<3.6"}, - {version="*", python=">=3.6"} +### Docs ### +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} ] +alagitpull = {version = "^0.1.0"} +recommonmark = {version = "^0.6.0"} +sphinx-issues = {version = "^1.2.0"} +sphinx-click = {version = "*"} + +### Testing ### pytest = [ {version="<4.7.0", python="<3"}, {version="*", python=">=3"} ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency -sphinx = [ - {version="<2", python="<3"}, - {version="*", python=">=3"} -] -sphinx-issues = "*" -twine = "*" +pytest-rerunfailures = "*" + +### Coverage ### codecov = "*" coverage = "*" pytest-cov = [ {version="<2.10.0", python="<3"}, {version="*", python=">=3"} ] + +### Format ### +black = {version="==19.10b0", python="^3.6"} +isort = [ + {version="<5", python="<3.6"}, + {version="*", python=">=3.6"} +] + +### Lint ### +flake8 = "*" + +[tool.poetry.extras] +docs = ["sphinx", "sphinx-issues", "sphinx-click", "recommonmark", "alagitpull"] +test = ["pytest", "pathlib2", "pytest-rerunfailures"] +coverage = ["codecov", "coverage", "pytest-cov"] +format = ["black", "isort"] +lint = ["flake8"] diff --git a/vcspull/__about__.py b/vcspull/__about__.py index 271b599f..f8df9efc 100644 --- a/vcspull/__about__.py +++ b/vcspull/__about__.py @@ -1,7 +1,7 @@ __title__ = 'vcspull' __package_name__ = 'vcspull' -__description__ = 'synchronize your repos and forks via declarative yaml/json file(s)' -__version__ = '1.4.3' +__description__ = 'synchronize your projects via yaml / json files' +__version__ = '1.5.0a2' __author__ = 'Tony Narlock' __github__ = 'https://github.com/vcs-python/vcspull' __docs__ = 'https://vcspull.git-pull.com' diff --git a/vcspull/cli.py b/vcspull/cli.py index 7dfaa49a..9c363954 100644 --- a/vcspull/cli.py +++ b/vcspull/cli.py @@ -33,9 +33,10 @@ def setup_logger(log=None, level='INFO'): """Setup logging for CLI use. - :param log: instance of logger - :type log: :py:class:`Logger` - + Parameters + ---------- + log : :py:class:`Logger` + instance of logger """ if not log: log = logging.getLogger() diff --git a/vcspull/cli_defaultgroup.py b/vcspull/cli_defaultgroup.py index fbed1335..f650140b 100644 --- a/vcspull/cli_defaultgroup.py +++ b/vcspull/cli_defaultgroup.py @@ -43,10 +43,12 @@ def bar(): class DefaultGroup(click.Group): - """Invokes a subcommand marked with `default=True` if any subcommand not - chosen. - :param default_if_no_args: resolves to the default command if no arguments - passed. + """Invokes a subcommand marked with `default=True` if any subcommand not chosen. + + Parameters + ---------- + default_if_no_args : + resolves to the default command if no arguments passed. """ def __init__(self, *args, **kwargs): diff --git a/vcspull/config.py b/vcspull/config.py index 5e70584b..e9b6f75b 100644 --- a/vcspull/config.py +++ b/vcspull/config.py @@ -26,11 +26,17 @@ def expand_dir(_dir, cwd=os.getcwd()): """Return path with environmental variables and tilde ~ expanded. - :param _dir: - :type _dir: str - :param cwd: current working dir (for deciphering relative _dir paths) - :type cwd: str - :rtype; str + Parameters + ---------- + _dir : str + cwd : str, optional + current working dir (for deciphering relative _dir paths), defaults to + :py:meth:`os.getcwd()` + + Returns + ------- + str : + Absolute directory path """ _dir = os.path.expanduser(os.path.expandvars(_dir)) if not os.path.isabs(_dir): @@ -44,12 +50,16 @@ def extract_repos(config, cwd=os.getcwd()): end-user configuration permit inline configuration shortcuts, expand to identical format for parsing. - :param config: the repo config in :py:class:`dict` format. - :type config: dict - :param cwd: current working dir (for deciphering relative paths) - :type cwd: str - :rtype: list + Parameters + ---------- + config : dict + the repo config in :py:class:`dict` format. + cwd : str + current working dir (for deciphering relative paths) + Returns + ------- + list : List of normalized repository information """ configs = [] for directory, repos in config.items(): @@ -137,20 +147,26 @@ def find_config_files( ): """Return repos from a directory and match. Not recursive. - :param path: list of paths to search - :type path: list - :param match: list of globs to search against - :type match: list - :param filetype: list of filetypes to search against - :type filetype: list - :param include_home: Include home configuration files - :type include_home: bool - :raises: - - LoadConfigRepoConflict: There are two configs that have same path - and name with different repo urls. - :returns: list of absolute paths to config files. - :rtype: list - + Parameters + ---------- + path : list + list of paths to search + match : list + list of globs to search against + filetype: list + of filetypes to search against + include_home : bool + Include home configuration files + + Raises + ------ + LoadConfigRepoConflict : + There are two configs that have same path and name with different repo urls. + + Returns + ------- + list : + list of absolute paths to config files. """ configs = [] @@ -182,14 +198,21 @@ def find_config_files( def load_configs(files, cwd=os.getcwd()): """Return repos from a list of files. - :todo: Validate scheme, check for duplciate destinations, VCS urls - - :param files: paths to config file - :type files: list - :param cwd: current path (pass down for :func:`extract_repos` - :type cwd: str - :returns: expanded config dict item - :rtype: list of dict + Parameters + ---------- + files : list + paths to config file + cwd : str + current path (pass down for :func:`extract_repos` + + Returns + ------- + list of dict : + expanded config dict item + + Todo + ---- + Validate scheme, check for duplciate destinations, VCS urls """ repos = [] for f in files: @@ -215,12 +238,18 @@ def load_configs(files, cwd=os.getcwd()): def detect_duplicate_repos(repos1, repos2): """Return duplicate repos dict if repo_dir same and vcs different. - :param repos1: list of repo expanded dicts - :type repos1: list of :py:dict - :param repos2: list of repo expanded dicts - :type repos2: list of :py:dict - :rtype: list of dicts or None - :returns: Duplicate lists + Parameters + ---------- + repos1 : dict + list of repo expanded dicts + + repos2 : dict + list of repo expanded dicts + + Returns + ------- + list of dict, or None + Duplicate repos """ dupes = [] path_dupe_repos = [] @@ -249,12 +278,16 @@ def detect_duplicate_repos(repos1, repos2): def in_dir(config_dir=CONFIG_DIR, extensions=['.yml', '.yaml', '.json']): """Return a list of configs in ``config_dir``. - :param config_dir: directory to search - :type config_dir: str - :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). - :type extensions: list - :rtype: list + Parameters + ---------- + config_dir : str + directory to search + extensions : list + filetypes to check (e.g. ``['.yaml', '.json']``). + Returns + ------- + list """ configs = [] @@ -270,16 +303,21 @@ def filter_repos(config, repo_dir=None, vcs_url=None, name=None): repo_dir, vcs_url and name all support fnmatch. - :param config: the expanded repo config in :py:class:`dict` format. - :type config: dict - :param repo_dir: directory of checkout location, fnmatch pattern supported - :type repo_dir: str or None - :param vcs_url: url of vcs remote, fn match pattern supported - :type vcs_url: str or None - :param name: project name, fnmatch pattern supported - :type name: str or None - :rtype: list - + Parameters + ---------- + config : dist + the expanded repo config in :py:class:`dict` format. + repo_dir : str, Optional + directory of checkout location, fnmatch pattern supported + vcs_url : str, Optional + url of vcs remote, fn match pattern supported + name : str, Optional + project name, fnmatch pattern supported + + Returns + ------- + list : + Repos """ repo_list = [] @@ -302,12 +340,16 @@ def filter_repos(config, repo_dir=None, vcs_url=None, name=None): def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): """Return True if file has a valid config file type. - :param filename: filename to check (e.g. ``mysession.json``). - :type filename: str - :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). - :type extensions: list or str - :rtype: bool + Parameters + ---------- + filename : str + filename to check (e.g. ``mysession.json``). + extensions : list or str + filetypes to check (e.g. ``['.yaml', '.json']``). + Returns + ------- + bool : True if is a valid config file type """ extensions = [extensions] if isinstance(extensions, string_types) else extensions return any(filename.endswith(e) for e in extensions) diff --git a/vcspull/log.py b/vcspull/log.py index 1c593324..df439075 100644 --- a/vcspull/log.py +++ b/vcspull/log.py @@ -30,11 +30,11 @@ def default_log_template(self, record): """Return the prefix for the log message. Template for Formatter. - :param: record: :py:class:`logging.LogRecord` object. this is passed in - from inside the :py:meth:`logging.Formatter.format` record. - + Parameters + ---------- + record : :py:class:`logging.LogRecord` + This is passed in from inside the :py:meth:`logging.Formatter.format` record. """ - reset = [Style.RESET_ALL] levelname = [ LEVEL_COLORS.get(record.levelname), @@ -92,11 +92,12 @@ def format(self, record): def debug_log_template(self, record): - """ Return the prefix for the log message. Template for Formatter. - - :param: record: :class:`logging.LogRecord` object. this is passed in - from inside the :py:meth:`logging.Formatter.format` record. + """Return the prefix for the log message. Template for Formatter. + Parameters + ---------- + record : :class:`logging.LogRecord` + This is passed in from inside the :py:meth:`logging.Formatter.format` record. """ reset = [Style.RESET_ALL] diff --git a/vcspull/util.py b/vcspull/util.py index 133907fe..36791c34 100644 --- a/vcspull/util.py +++ b/vcspull/util.py @@ -22,14 +22,19 @@ def update_dict(d, u): """Return updated dict. - http://stackoverflow.com/a/3233356 - - :param d: dict - :type d: dict - :param u: updated dict. - :type u: dict - :rtype: dict - + Parameters + ---------- + d : dict + u : dict + + Returns + ------- + dict : + Updated dictionary + + Notes + ----- + Thanks: http://stackoverflow.com/a/3233356 """ for k, v in u.items(): if isinstance(v, Mapping):