From da881da902b9146bba4070bf91a7fe50102fb5ed Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 06:14:31 -0500 Subject: [PATCH 01/85] Add github publish action --- .github/workflows/publish-docs.yml | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/publish-docs.yml diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 00000000..8b31e34d --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,96 @@ +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 + run: poetry install + + - name: Build documentation + run: poetry run portray as_html --output_dir doc/_build --overwrite + + - 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: 'doc/_build' # optional: defaults to entire repository + + - name: Generate list of changed files for CloudFront to invalidate + run: | + pushd doc/_build; FILES=$(find . -name \* -print | 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 From 291abdb224d73e5c2504cf3954d50367a7919b8d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 06:54:48 -0500 Subject: [PATCH 02/85] ci(libvcs): Cache, use .venv with poetry --- .github/workflows/libvcs-ci.yml | 54 ++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/.github/workflows/libvcs-ci.yml b/.github/workflows/libvcs-ci.yml index 6fe4b78c..c87baa1a 100644 --- a/.github/workflows/libvcs-ci.yml +++ b/.github/workflows/libvcs-ci.yml @@ -19,16 +19,56 @@ jobs: uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies + + - 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: | - python -m pip install --upgrade poetry - poetry install - - name: Lint with flake8 + 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: | - poetry run flake8 + 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 + + - name: Lint with flake8 + run: poetry run flake8 + - name: Test with pytest - run: | - poetry run py.test --cov=./ --cov-report=xml + run: poetry run py.test --cov=./ --cov-report=xml + - uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} From 8d2cc983edb3fcff58b1e0619fcc38828403beca Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 08:50:17 -0500 Subject: [PATCH 03/85] Add art/ directory with symlinks to old static files --- art/favicon.ico | 1 + art/libvcs.svg | 1 + 2 files changed, 2 insertions(+) create mode 120000 art/favicon.ico create mode 120000 art/libvcs.svg diff --git a/art/favicon.ico b/art/favicon.ico new file mode 120000 index 00000000..04b7c5b8 --- /dev/null +++ b/art/favicon.ico @@ -0,0 +1 @@ +../docs/_static/favicon.ico \ No newline at end of file diff --git a/art/libvcs.svg b/art/libvcs.svg new file mode 120000 index 00000000..eb993893 --- /dev/null +++ b/art/libvcs.svg @@ -0,0 +1 @@ +../docs/_static/img/libvcs.svg \ No newline at end of file From ab8e087356b6903e5f9bd7ec1a8cfe1d5c200dcf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 08:50:33 -0500 Subject: [PATCH 04/85] portray: Add logos and favicon, theme colors --- pyproject.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 38ffdd5b..395c18c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,12 @@ [tool.black] skip-string-normalization = true +[tool.portray.mkdocs.theme] +favicon = "art/favicon.ico" +logo = "art/libvcs.svg" +name = "material" +palette = {primary = "blue grey", accent = "pink"} + [tool.poetry] name = "libvcs" version = "0.4.4" From 637cf11cf26cb8bf84f6d2bdfcce3d36c1754cb1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:47:38 -0500 Subject: [PATCH 05/85] build(portray): remove --- poetry.lock | 406 +------------------------------------------------ pyproject.toml | 3 - 2 files changed, 5 insertions(+), 404 deletions(-) diff --git a/poetry.lock b/poetry.lock index 039c502a..4fd732fc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -126,7 +126,7 @@ version = "3.0.4" [[package]] category = "dev" description = "Composable command line interface toolkit" -marker = "python_version >= \"3.6\" or python_version >= \"3.6\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -219,15 +219,6 @@ optional = false python-versions = "*" version = "1.1.10" -[[package]] -category = "dev" -description = "An unladen web framework for building APIs and app backends." -marker = "python_version >= \"3.6\"" -name = "falcon" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.0" - [[package]] category = "dev" description = "the modular source code checker: pep8 pyflakes and co" @@ -279,15 +270,6 @@ 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.6\"" -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" @@ -297,43 +279,6 @@ optional = false python-versions = ">=2.6, <3" version = "3.3.0" -[[package]] -category = "dev" -description = "Git Object Database" -marker = "python_version >= \"3.6\"" -name = "gitdb" -optional = false -python-versions = ">=3.4" -version = "4.0.5" - -[package.dependencies] -smmap = ">=3.0.1,<4" - -[[package]] -category = "dev" -description = "Python Git Library" -marker = "python_version >= \"3.6\"" -name = "gitpython" -optional = false -python-versions = ">=3.4" -version = "3.1.7" - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -category = "dev" -description = "A Python framework that makes developing APIs as simple as possible, but no simpler." -marker = "python_version >= \"3.6\"" -name = "hug" -optional = false -python-versions = ">=3.5" -version = "2.6.1" - -[package.dependencies] -falcon = "2.0.0" -requests = "*" - [[package]] category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" @@ -353,7 +298,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -438,85 +383,6 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] -[[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version >= \"3.6\"" -name = "joblib" -optional = false -python-versions = ">=3.6" -version = "0.16.0" - -[[package]] -category = "dev" -description = "Python LiveReload is an awesome tool for web developers" -marker = "python_version >= \"3.6\"" -name = "livereload" -optional = false -python-versions = "*" -version = "2.6.2" - -[package.dependencies] -six = "*" - -[package.dependencies.tornado] -python = ">=2.8" -version = "*" - -[[package]] -category = "dev" -description = "A Python implementation of Lunr.js" -marker = "python_version >= \"3.6\"" -name = "lunr" -optional = false -python-versions = "*" -version = "0.5.8" - -[package.dependencies] -future = ">=0.16.0" -six = ">=1.11.0" - -[package.dependencies.nltk] -optional = true -python = ">=2.8" -version = ">=3.2.5" - -[package.extras] -languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] - -[[package]] -category = "dev" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -marker = "python_version >= \"3.6\"" -name = "mako" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.3" - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["babel"] -lingua = ["lingua"] - -[[package]] -category = "dev" -description = "Python implementation of Markdown." -marker = "python_version >= \"3.6\"" -name = "markdown" -optional = false -python-versions = ">=3.5" -version = "3.2.2" - -[package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - -[package.extras] -testing = ["coverage", "pyyaml"] - [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -533,55 +399,6 @@ optional = false python-versions = "*" version = "0.6.1" -[[package]] -category = "dev" -description = "Project documentation with Markdown." -marker = "python_version >= \"3.6\"" -name = "mkdocs" -optional = false -python-versions = ">=3.5" -version = "1.1.2" - -[package.dependencies] -Jinja2 = ">=2.10.1" -Markdown = ">=3.2.1" -PyYAML = ">=3.10" -click = ">=3.3" -livereload = ">=2.5.1" -tornado = ">=5.0" - -[package.dependencies.lunr] -extras = ["languages"] -version = "0.5.8" - -[[package]] -category = "dev" -description = "A Material Design theme for MkDocs" -marker = "python_version >= \"3.6\"" -name = "mkdocs-material" -optional = false -python-versions = "*" -version = "5.5.1" - -[package.dependencies] -Pygments = ">=2.4" -markdown = ">=3.2" -mkdocs = ">=1.1" -mkdocs-material-extensions = ">=1.0" -pymdown-extensions = ">=7.0" - -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.6\"" -name = "mkdocs-material-extensions" -optional = false -python-versions = ">=3.5" -version = "1.0" - -[package.dependencies] -mkdocs-material = ">=5.0.0" - [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -623,29 +440,6 @@ optional = false python-versions = ">=3.5" version = "8.4.0" -[[package]] -category = "dev" -description = "Natural Language Toolkit" -marker = "python_version >= \"3.6\"" -name = "nltk" -optional = false -python-versions = "*" -version = "3.5" - -[package.dependencies] -click = "*" -joblib = "*" -regex = "*" -tqdm = "*" - -[package.extras] -all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] -corenlp = ["requests"] -machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - [[package]] category = "dev" description = "Core utilities for Python packages" @@ -703,20 +497,6 @@ optional = false python-versions = "*" version = "5.4.5" -[[package]] -category = "dev" -description = "A simple program and library to auto generate API documentation for Python modules." -marker = "python_version >= \"3.6\"" -name = "pdocs" -optional = false -python-versions = ">=3.6,<4.0" -version = "1.0.2" - -[package.dependencies] -Mako = ">=1.1,<2.0" -Markdown = ">=3.0.0,<4.0.0" -hug = ">=2.6,<3.0" - [[package]] category = "dev" description = "Query metadatdata from sdists / bdists / installed packages." @@ -744,25 +524,6 @@ version = ">=0.12" [package.extras] dev = ["pre-commit", "tox"] -[[package]] -category = "dev" -description = "Your Project with Great Documentation" -marker = "python_version >= \"3.6\"" -name = "portray" -optional = false -python-versions = ">=3.6,<4.0" -version = "1.4.0" - -[package.dependencies] -GitPython = ">=3.0,<4.0" -hug = ">=2.6,<3.0" -mkdocs = ">=1.0,<2.0" -mkdocs-material = ">=5.0,<6.0" -pdocs = ">=1.0.2,<2.0.0" -pymdown-extensions = ">=7.0,<8.0" -toml = ">=0.10.0,<0.11.0" -yaspin = ">=0.15.0,<0.16.0" - [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" @@ -803,18 +564,6 @@ optional = false python-versions = ">=3.5" version = "2.6.1" -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.6\"" -name = "pymdown-extensions" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "7.1" - -[package.dependencies] -Markdown = ">=3.2" - [[package]] category = "dev" description = "Python parsing module" @@ -992,15 +741,6 @@ optional = false python-versions = "*" version = "2020.1" -[[package]] -category = "dev" -description = "YAML parser and emitter for Python" -marker = "python_version >= \"3.6\"" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" - [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -1021,7 +761,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -1084,15 +824,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" version = "1.15.0" -[[package]] -category = "dev" -description = "A pure Python implementation of a sliding window memory map manager" -marker = "python_version >= \"3.6\"" -name = "smmap" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.0.4" - [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." @@ -1283,15 +1014,6 @@ optional = false python-versions = "*" version = "0.10.1" -[[package]] -category = "dev" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -marker = "python_version >= \"3.6\"" -name = "tornado" -optional = false -python-versions = ">= 3.5" -version = "6.0.4" - [[package]] category = "dev" description = "Fast, Extensible Progress Meter" @@ -1376,19 +1098,10 @@ optional = false python-versions = "*" version = "0.5.1" -[[package]] -category = "dev" -description = "Yet Another Terminal Spinner" -marker = "python_version >= \"3.6\"" -name = "yaspin" -optional = false -python-versions = "*" -version = "0.15.0" - [[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\") or python_version >= \"3.6\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" 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\" or python_version >= \"3.6\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1404,7 +1117,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "003cf090bc8cad61d9731961df2cfb5d82ecabcc4102e875fa4951b13d4a5496" +content-hash = "309df1aced75306f5132362539af7253404a0f18595d8fab5ba9ca91a3993c7a" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1522,22 +1235,6 @@ enum34 = [ {file = "enum34-1.1.10-py3-none-any.whl", hash = "sha256:c3858660960c984d6ab0ebad691265180da2b43f07e061c0f8dca9ef3cffd328"}, {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, ] -falcon = [ - {file = "falcon-2.0.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:733033ec80c896e30a43ab3e776856096836787197a44eb21022320a61311983"}, - {file = "falcon-2.0.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f93351459f110b4c1ee28556aef9a791832df6f910bea7b3f616109d534df06b"}, - {file = "falcon-2.0.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e9efa0791b5d9f9dd9689015ea6bce0a27fcd5ecbcd30e6d940bffa4f7f03389"}, - {file = "falcon-2.0.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59d1e8c993b9a37ea06df9d72cf907a46cc8063b30717cdac2f34d1658b6f936"}, - {file = "falcon-2.0.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:a5ebb22a04c9cc65081938ee7651b4e3b4d2a28522ea8ec04c7bdd2b3e9e8cd8"}, - {file = "falcon-2.0.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:95bf6ce986c1119aef12c9b348f4dee9c6dcc58391bdd0bc2b0bf353c2b15986"}, - {file = "falcon-2.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:aa184895d1ad4573fbfaaf803563d02f019ebdf4790e41cc568a330607eae439"}, - {file = "falcon-2.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:74cf1d18207381c665b9e6292d65100ce146d958707793174b03869dc6e614f4"}, - {file = "falcon-2.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24adcd2b29a8ffa9d552dc79638cd21736a3fb04eda7d102c6cebafdaadb88ad"}, - {file = "falcon-2.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:18157af2a4fc3feedf2b5dcc6196f448639acf01c68bc33d4d5a04c3ef87f494"}, - {file = "falcon-2.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e3782b7b92fefd46a6ad1fd8fe63fe6c6f1b7740a95ca56957f48d1aee34b357"}, - {file = "falcon-2.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9712975adcf8c6e12876239085ad757b8fdeba223d46d23daef82b47658f83a9"}, - {file = "falcon-2.0.0-py2.py3-none-any.whl", hash = "sha256:54f2cb4b687035b2a03206dbfc538055cc48b59a953187b0458aa1b574d47b53"}, - {file = "falcon-2.0.0.tar.gz", hash = "sha256:eea593cf466b9c126ce667f6d30503624ef24459f118c75594a69353b6c3d5fc"}, -] flake8 = [ {file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"}, {file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"}, @@ -1550,25 +1247,10 @@ 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"}, ] -gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, -] -gitpython = [ - {file = "GitPython-3.1.7-py3-none-any.whl", hash = "sha256:fa3b92da728a457dd75d62bb5f3eb2816d99a7fe6c67398e260637a40e3fafb5"}, - {file = "GitPython-3.1.7.tar.gz", hash = "sha256:2db287d71a284e22e5c2846042d0602465c7434d910406990d5b74df4afb0858"}, -] -hug = [ - {file = "hug-2.6.1-py2.py3-none-any.whl", hash = "sha256:31c8fc284f81377278629a4b94cbb619ae9ce829cdc2da9564ccc66a121046b4"}, - {file = "hug-2.6.1.tar.gz", hash = "sha256:b0edace2acb618873779c9ce6ecf9165db54fef95c22262f5700fcdd9febaec9"}, -] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, @@ -1595,25 +1277,6 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] -joblib = [ - {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, - {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, -] -livereload = [ - {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, -] -lunr = [ - {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, - {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, -] -mako = [ - {file = "Mako-1.1.3-py2.py3-none-any.whl", hash = "sha256:93729a258e4ff0747c876bd9e20df1b9758028946e976324ccd2d68245c7b6a9"}, - {file = "Mako-1.1.3.tar.gz", hash = "sha256:8195c8c1400ceb53496064314c6736719c6f25e7479cd24c77be3d9361cddc27"}, -] -markdown = [ - {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, - {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, -] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, @@ -1653,18 +1316,6 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mkdocs = [ - {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, - {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, -] -mkdocs-material = [ - {file = "mkdocs-material-5.5.1.tar.gz", hash = "sha256:7a0dd451523008d0670f8f78037822f86f868f08c0532b1add4367252bb54133"}, - {file = "mkdocs_material-5.5.1-py2.py3-none-any.whl", hash = "sha256:aee5689f87d687c75962da9d4f07eef48664c22c176b6514bd18e4798ac2ca4f"}, -] -mkdocs-material-extensions = [ - {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, - {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, -] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1676,9 +1327,6 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] -nltk = [ - {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, -] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1697,10 +1345,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"}, ] -pdocs = [ - {file = "pdocs-1.0.2-py3-none-any.whl", hash = "sha256:4d5ff87babcd0c46f12b76c887d53225bddb389dee7c6b338dbe281c729fc035"}, - {file = "pdocs-1.0.2.tar.gz", hash = "sha256:2e32432bd2736fd678ac1ce4447cd508deb62b5a12f7ba3bf0e3a374063221e2"}, -] 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"}, @@ -1709,10 +1353,6 @@ pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] -portray = [ - {file = "portray-1.4.0-py3-none-any.whl", hash = "sha256:a6a06042a6b7fcb876b1e6cdcaee5adaeb6751388cb292fc05b2f31b1a4c3fb2"}, - {file = "portray-1.4.0.tar.gz", hash = "sha256:ea2271c5e3fbe956070a6f8b1aee6dc3d6a66c18c11907e878db8faa6fd2c449"}, -] py = [ {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, @@ -1731,10 +1371,6 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] -pymdown-extensions = [ - {file = "pymdown-extensions-7.1.tar.gz", hash = "sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6"}, - {file = "pymdown_extensions-7.1-py2.py3-none-any.whl", hash = "sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"}, -] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1767,19 +1403,6 @@ pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] -pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {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"}, @@ -1835,10 +1458,6 @@ six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] -smmap = [ - {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, - {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, -] snowballstemmer = [ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, @@ -1889,17 +1508,6 @@ toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] -tornado = [ - {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, - {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, - {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, - {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, - {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, - {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, - {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, - {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, - {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, -] tqdm = [ {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, @@ -1947,10 +1555,6 @@ webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] -yaspin = [ - {file = "yaspin-0.15.0-py2.py3-none-any.whl", hash = "sha256:0ee4668936d0053de752c9a4963929faa3a832bd0ba823877d27855592dc80aa"}, - {file = "yaspin-0.15.0.tar.gz", hash = "sha256:5a938bdc7bab353fd8942d0619d56c6b5159a80997dc1c387a479b39e6dc9391"}, -] zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, diff --git a/pyproject.toml b/pyproject.toml index 395c18c8..bcd3f328 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,9 +37,6 @@ sphinx = [ {version="<2", python="<3"}, {version="*", python=">=3"} ] -portray = [ - {version="*", python=">=3.6"} -] sphinx-issues = "*" twine = "*" codecov = "*" From 2efbe0b0d8a02856e058e564bb9ecae760d57b2c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:50:09 -0500 Subject: [PATCH 06/85] build(mkdocs): Add mkdocs package --- poetry.lock | 206 +++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 1 + 2 files changed, 201 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4fd732fc..41ae89eb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -126,7 +126,7 @@ version = "3.0.4" [[package]] category = "dev" description = "Composable command line interface toolkit" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.5\" or python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -169,7 +169,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.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\" or python_version >= \"3.6\" and python_version < \"3.8\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -270,6 +270,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.5\"" +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" @@ -298,7 +307,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -383,6 +392,78 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +marker = "python_version >= \"3.5\"" +name = "joblib" +optional = false +python-versions = "*" +version = "0.14.1" + +[[package]] +category = "dev" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +marker = "python_version >= \"3.5\"" +name = "joblib" +optional = false +python-versions = ">=3.6" +version = "0.16.0" + +[[package]] +category = "dev" +description = "Python LiveReload is an awesome tool for web developers" +marker = "python_version >= \"3.5\"" +name = "livereload" +optional = false +python-versions = "*" +version = "2.6.2" + +[package.dependencies] +six = "*" + +[package.dependencies.tornado] +python = ">=2.8" +version = "*" + +[[package]] +category = "dev" +description = "A Python implementation of Lunr.js" +marker = "python_version >= \"3.5\"" +name = "lunr" +optional = false +python-versions = "*" +version = "0.5.8" + +[package.dependencies] +future = ">=0.16.0" +six = ">=1.11.0" + +[package.dependencies.nltk] +optional = true +python = ">=2.8" +version = ">=3.2.5" + +[package.extras] +languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] + +[[package]] +category = "dev" +description = "Python implementation of Markdown." +marker = "python_version >= \"3.5\"" +name = "markdown" +optional = false +python-versions = ">=3.5" +version = "3.2.2" + +[package.dependencies] +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.extras] +testing = ["coverage", "pyyaml"] + [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -399,6 +480,27 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "Project documentation with Markdown." +marker = "python_version >= \"3.5\"" +name = "mkdocs" +optional = false +python-versions = ">=3.5" +version = "1.1.2" + +[package.dependencies] +Jinja2 = ">=2.10.1" +Markdown = ">=3.2.1" +PyYAML = ">=3.10" +click = ">=3.3" +livereload = ">=2.5.1" +tornado = ">=5.0" + +[package.dependencies.lunr] +extras = ["languages"] +version = "0.5.8" + [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -440,6 +542,29 @@ optional = false python-versions = ">=3.5" version = "8.4.0" +[[package]] +category = "dev" +description = "Natural Language Toolkit" +marker = "python_version >= \"3.5\"" +name = "nltk" +optional = false +python-versions = "*" +version = "3.5" + +[package.dependencies] +click = "*" +joblib = "*" +regex = "*" +tqdm = "*" + +[package.extras] +all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] +corenlp = ["requests"] +machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + [[package]] category = "dev" description = "Core utilities for Python packages" @@ -741,6 +866,15 @@ optional = false python-versions = "*" version = "2020.1" +[[package]] +category = "dev" +description = "YAML parser and emitter for Python" +marker = "python_version >= \"3.5\"" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -761,7 +895,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3.5\"" name = "regex" optional = false python-versions = "*" @@ -1014,6 +1148,15 @@ optional = false python-versions = "*" version = "0.10.1" +[[package]] +category = "dev" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +marker = "python_version >= \"3.5\"" +name = "tornado" +optional = false +python-versions = ">= 3.5" +version = "6.0.4" + [[package]] category = "dev" description = "Fast, Extensible Progress Meter" @@ -1101,7 +1244,7 @@ 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.6\" 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\" or python_version >= \"3.6\" and python_version < \"3.8\")" +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\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1117,7 +1260,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "309df1aced75306f5132362539af7253404a0f18595d8fab5ba9ca91a3993c7a" +content-hash = "5dbf1778fedfe987ad3219f0ee7e62bc96b61d330f471dd1981248e61376c1de" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1247,6 +1390,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"}, @@ -1277,6 +1423,23 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] +joblib = [ + {file = "joblib-0.14.1-py2.py3-none-any.whl", hash = "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"}, + {file = "joblib-0.14.1.tar.gz", hash = "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8"}, + {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, + {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, +] +livereload = [ + {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, +] +lunr = [ + {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, + {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, +] +markdown = [ + {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, + {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, +] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, @@ -1316,6 +1479,10 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mkdocs = [ + {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, + {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, +] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1327,6 +1494,9 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] +nltk = [ + {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, +] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1403,6 +1573,19 @@ pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {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"}, @@ -1508,6 +1691,17 @@ toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] +tornado = [ + {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, + {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, + {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, + {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, + {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, + {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, + {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, + {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, + {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, +] tqdm = [ {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, diff --git a/pyproject.toml b/pyproject.toml index bcd3f328..d78b45e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,3 +49,4 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] +mkdocs = {version = "^1.1.2", python = ">=3.5"} From 76e08e23d26eb20bfe93693eee9f9ff1009997a4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:50:54 -0500 Subject: [PATCH 07/85] Remove art/ directory (from portray) --- art/favicon.ico | 1 - art/libvcs.svg | 1 - 2 files changed, 2 deletions(-) delete mode 120000 art/favicon.ico delete mode 120000 art/libvcs.svg diff --git a/art/favicon.ico b/art/favicon.ico deleted file mode 120000 index 04b7c5b8..00000000 --- a/art/favicon.ico +++ /dev/null @@ -1 +0,0 @@ -../docs/_static/favicon.ico \ No newline at end of file diff --git a/art/libvcs.svg b/art/libvcs.svg deleted file mode 120000 index eb993893..00000000 --- a/art/libvcs.svg +++ /dev/null @@ -1 +0,0 @@ -../docs/_static/img/libvcs.svg \ No newline at end of file From e15ccd27282d3ffcda7988c7170c025a1b7e30c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:51:13 -0500 Subject: [PATCH 08/85] Add assets/ directory (for mkdocs) --- assets/images/favicon.ico | 1 + assets/images/libvcs.svg | 1 + 2 files changed, 2 insertions(+) create mode 120000 assets/images/favicon.ico create mode 120000 assets/images/libvcs.svg diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico new file mode 120000 index 00000000..c50b150e --- /dev/null +++ b/assets/images/favicon.ico @@ -0,0 +1 @@ +../../docs/_static/favicon.ico \ No newline at end of file diff --git a/assets/images/libvcs.svg b/assets/images/libvcs.svg new file mode 120000 index 00000000..9a858af6 --- /dev/null +++ b/assets/images/libvcs.svg @@ -0,0 +1 @@ +../../docs/_static/img/libvcs.svg \ No newline at end of file From cc35d7eeb361cfcfddb21f15b1ab29ef3cbe8415 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:51:54 -0500 Subject: [PATCH 09/85] chore(mkdocs): Ignore site/ output from mkdocs build output --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 2e03763d..0c5a335b 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,6 @@ pip-wheel-metadata/ # Used by publish-docs.yml CI .updated_files + +# mkdocs +site/ From f037d49f7abb0b9cca93a7f1da6c70ec1b25fb43 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:52:03 -0500 Subject: [PATCH 10/85] ci(Makefile): Use mkdocs for doc building/watching --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 566982b4..45abc5da 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null +DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null entr_warn: @@ -22,10 +23,10 @@ watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: - cd docs && $(MAKE) html + poetry run mkdocs build watch_docs: - cd docs && $(MAKE) watch_docs + if command -v entr > /dev/null; then ${DOC_FILES} | entr -c $(MAKE) build_docs; else $(MAKE) build_docs entr_warn; fi flake8: flake8 libvcs tests From 097ed56d999e70b68db6e307afa08e07e5f80278 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:52:54 -0500 Subject: [PATCH 11/85] ci(mkdocs): Add config file --- mkdocs.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..98a068d9 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,10 @@ +# mkdocs.yml +site_name: libvcs +site_url: https://libvcs.git-pull.com +repo_url: https://github.com/vcs-python/libvcs +repo_name: 'GitHub' +theme: + name: "material" + custom_dir: . + logo: assets/images/libvcs.svg + favicon: assets/images/favicon.ico From 49282f5be7e6cad051d7f7054315762346a55698 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 09:54:16 -0500 Subject: [PATCH 12/85] ci(publish-docs): Update for mkdocs --- .github/workflows/publish-docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 8b31e34d..2b71a24a 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -64,7 +64,7 @@ jobs: run: poetry install - name: Build documentation - run: poetry run portray as_html --output_dir doc/_build --overwrite + run: poetry run mkdocs build - name: Push documentation to S3 uses: jakejarvis/s3-sync-action@master @@ -75,11 +75,11 @@ jobs: 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: 'doc/_build' # optional: defaults to entire repository + SOURCE_DIR: 'site' # optional: defaults to entire repository - name: Generate list of changed files for CloudFront to invalidate run: | - pushd doc/_build; FILES=$(find . -name \* -print | cut -c2- | sort | uniq | tr '\n' ' '); popd + pushd site; FILES=$(find . -name \* -print | 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 From aa343db4112ffdbffeb41a81d70781e052764506 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:01:12 -0500 Subject: [PATCH 13/85] ci(docs): Add dev_docs and server_docs to Makefile --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 45abc5da..36b925e0 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,12 @@ build_docs: 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: + python -m http.server --directory site + +dev_docs: + $(MAKE) -j watch_docs serve_docs + flake8: flake8 libvcs tests From c852b286147d106f955453768ffbae4a02d7fbe5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:01:53 -0500 Subject: [PATCH 14/85] build(mkdocs-material): Add package --- poetry.lock | 60 ++++++++++++++++++++++++++++++++++++++++++++++---- pyproject.toml | 1 + 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 41ae89eb..4d981bc8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -169,7 +169,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\" or python_version >= \"3.6\" and python_version < \"3.8\")" +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\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -501,6 +501,34 @@ tornado = ">=5.0" extras = ["languages"] version = "0.5.8" +[[package]] +category = "dev" +description = "A Material Design theme for MkDocs" +marker = "python_version >= \"3.5\"" +name = "mkdocs-material" +optional = false +python-versions = "*" +version = "5.5.1" + +[package.dependencies] +Pygments = ">=2.4" +markdown = ">=3.2" +mkdocs = ">=1.1" +mkdocs-material-extensions = ">=1.0" +pymdown-extensions = ">=7.0" + +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +marker = "python_version >= \"3.5\"" +name = "mkdocs-material-extensions" +optional = false +python-versions = ">=3.5" +version = "1.0" + +[package.dependencies] +mkdocs-material = ">=5.0.0" + [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -689,6 +717,18 @@ optional = false python-versions = ">=3.5" version = "2.6.1" +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +marker = "python_version >= \"3.5\"" +name = "pymdown-extensions" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "7.1" + +[package.dependencies] +Markdown = ">=3.2" + [[package]] category = "dev" description = "Python parsing module" @@ -895,7 +935,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3.5\"" +marker = "python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -1244,7 +1284,7 @@ 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\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1260,7 +1300,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "5dbf1778fedfe987ad3219f0ee7e62bc96b61d330f471dd1981248e61376c1de" +content-hash = "edd16dbfe612114641a11d734def004c943b6450401fd7be49a55c7a8d6fcfc5" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1483,6 +1523,14 @@ mkdocs = [ {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, ] +mkdocs-material = [ + {file = "mkdocs-material-5.5.1.tar.gz", hash = "sha256:7a0dd451523008d0670f8f78037822f86f868f08c0532b1add4367252bb54133"}, + {file = "mkdocs_material-5.5.1-py2.py3-none-any.whl", hash = "sha256:aee5689f87d687c75962da9d4f07eef48664c22c176b6514bd18e4798ac2ca4f"}, +] +mkdocs-material-extensions = [ + {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, + {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, +] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1541,6 +1589,10 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] +pymdown-extensions = [ + {file = "pymdown-extensions-7.1.tar.gz", hash = "sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6"}, + {file = "pymdown_extensions-7.1-py2.py3-none-any.whl", hash = "sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"}, +] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, diff --git a/pyproject.toml b/pyproject.toml index d78b45e7..0cbcb4ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,3 +50,4 @@ pytest-mock = [ {version="*", python=">=3"} ] mkdocs = {version = "^1.1.2", python = ">=3.5"} +mkdocs-material = {version = "^5.5.1", python = ">=3.5"} From 3b6338313f01e5c53a47b2e2e752b3b4e250062a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:13:18 -0500 Subject: [PATCH 15/85] ci(Makefile): Detect markdown files --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 36b925e0..8e5cc712 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null -DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null entr_warn: From 6deb8c84291520d9c49af3cc46311ac61d9cb8c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:13:49 -0500 Subject: [PATCH 16/85] refactor(docs): Convert from RST to Markdown for rst in **/*.rst; do pandoc "$rst" -f rst -t gfm -o "${rst%.*}.md"; done --- README.md | 126 +++++++++++++++++++++++++++++++++++++++++++++ docs/api.md | 73 ++++++++++++++++++++++++++ docs/developing.md | 92 +++++++++++++++++++++++++++++++++ docs/history.md | 2 + 4 files changed, 293 insertions(+) create mode 100644 README.md create mode 100644 docs/api.md create mode 100644 docs/developing.md create mode 100644 docs/history.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..a7e5e05f --- /dev/null +++ b/README.md @@ -0,0 +1,126 @@ +`libvcs` - abstraction layer for vcs, powers +[vcspull](https://www.github.com/vcs-python/vcspull/). + +[![Python Package](https://img.shields.io/pypi/v/libvcs.svg)](http://badge.fury.io/py/libvcs) +[![Documentation Status](https://readthedocs.org/projects/libvcs/badge/?version=latest)](https://readthedocs.org/projects/libvcs/) +[![Build Status](https://img.shields.io/travis/vcs-python/libvcs.svg)](https://travis-ci.org/vcs-python/libvcs) +[![Code Coverage](https://codecov.io/gh/vcs-python/libvcs/branch/master/graph/badge.svg)](https://codecov.io/gh/vcs-python/libvcs) +![License](https://img.shields.io/github/license/vcs-python/libvcs.svg) + +Install: + + $ pip install libvcs + +Open up python: + + $ python + + # or for nice autocomplete and syntax highlighting + $ pip install ptpython + $ ptpython + +Create a +[Repo](https://libvcs.git-pull.com/en/latest/api.html#creating-a-repo-object) +object of the project to inspect / checkout / update: + + >>> from libvcs.shortcuts import create_repo_from_pip_url, create_repo + + # repo is an object representation of a vcs repository. + >>> r = create_repo(url='https://www.github.com/vcs-python/libtmux', + ... vcs='git', + ... repo_dir='/tmp/libtmux') + + # or via pip-style URL + >>> r = create_repo_from_pip_url( + ... pip_url='git+https://www.github.com/vcs-python/libtmux', + ... repo_dir='/tmp/libtmux') + +Update / clone repo: + + # it may or may not be checked out/cloned on the system yet + >>> r.update_repo() + +Get revision: + + >>> r.get_revision() + u'5c227e6ab4aab44bf097da2e088b0ff947370ab8' + +# Donations + +Your donations fund development of new features, testing and support. +Your money will go directly to maintenance and development of the +project. If you are an individual, feel free to give whatever feels +right for the value you get out of the project. + +See donation options at . + +# More information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Python supportPython 2.7, >= 3.4, pypy
VCS supportedgit(1), svn(1), hg(1)
Sourcehttps://github.com/vcs-python/libvcs
Docshttps://libvcs.git-pull.com
Changeloghttps://libvcs.git-pull.com/en/latest/history.html
APIhttps://libvcs.git-pull.com/en/latest/api.html
Issueshttps://github.com/vcs-python/libvcs/issues
Travishttps://travis-ci.org/vcs-python/libvcs
Test Coveragehttps://codecov.io/gh/vcs-python/libvcs
pypihttps://pypi.python.org/pypi/libvcs
Open Hubhttps://www.openhub.net/p/libvcs
LicenseMIT.

git repo

$ git clone https://github.com/vcs-python/libvcs.git

install dev

$ git clone https://github.com/vcs-python/libvcs.git libvcs
+$ cd ./libvcs
+$ virtualenv .venv
+$ source .venv/bin/activate
+$ pip install -e .

tests

$ py.test
diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 00000000..89dfb115 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,73 @@ +# API Reference + +## Creating a repo object + +Helper methods are available in `libvcs.shortcuts` which can return a +repo object from a single entry-point. + +`libvcs.shortcuts.create_repo` +`libvcs.shortcuts.create_repo_from_pip_url` + +## Instantiating a repo by hand + +Tools like `libvcs.shortcuts.create_repo` and +`libvcs.shortcuts.create_repo_from_pip_url` are just wrappers around +instantiated these classes. + +See examples below of git, mercurial, and subversion. + +## Git + +::: libvcs.git.GitRepo + + + +
+ +libvcs.git.GitRemote + +
+ +
+ +libvcs.git.extract_status + +
+ +## Mercurial + +aka `hg(1)` + +
+ +libvcs.hg.MercurialRepo + +
+ +## Subversion + +aka `svn(1)` + +
+ +libvcs.svn.SubversionRepo + +
+ +## Adding your own VCS + +Extending libvcs can be done through subclassing `BaseRepo`. + +
+ +libvcs.base.BaseRepo + +
+ +## Utility stuff + +
+ +libvcs.util + +
diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 00000000..5fcfec2d --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,92 @@ +Development +=========== + +Testing +------- + +Our tests are inside `tests/`. Tests are implemented using +[pytest](http://pytest.org/). + +Install the latest code from git +-------------------------------- + +### Using pip + +To begin developing, check out the code from github: + + $ git clone git@github.com:vcs-python/libvcs.git + $ cd libvcs + +Now create a virtualenv, if you don't know how to, you can create a +virtualenv with: + + $ virtualenv .venv + +Then activate it to current tty / terminal session with: + + $ source .venv/bin/activate + +Good! Now let's run this: + + $ 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: + + $ git clone git@github.com:vcs-python/libvcs.git + $ cd libvcs + +You can create a virtualenv, and install all of the locked packages as +listed in poetry.lock: + + $ 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): + + $ poetry update + $ poetry update requests + +Then activate it to your current tty / terminal session with: + + $ poetry shell + +That is it! You are now ready to code! + +Test Runner +----------- + +As you seen above, the `libvcs` 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. + + $ 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](https://github.com/vcs-python/libvcs/issues). + +#### Test runner options + +Test only a file: + + $ py.test tests/test_util.py + +will test the `tests/test_util.py` tests. + + $ py.test tests/test_util.py::test_mkdir_p + +tests `test_mkdir_p` inside of `tests/test_util.py`. + +Multiple can be separated by spaces: + + $ py.test tests/test_{git,svn}.py tests/test_util.py::test_mkdir_p diff --git a/docs/history.md b/docs/history.md new file mode 100644 index 00000000..77c2b6de --- /dev/null +++ b/docs/history.md @@ -0,0 +1,2 @@ +History +======= From 1bf8cd573c92880ac236964833b1f9e7e69f283b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:14:14 -0500 Subject: [PATCH 17/85] chore(docs): Symlink docs/index.md -> README.md (for mkdocs) --- docs/index.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 docs/index.md diff --git a/docs/index.md b/docs/index.md new file mode 120000 index 00000000..32d46ee8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file From 52f12c35643b913851daf698a1a6658631c18799 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:18:02 -0500 Subject: [PATCH 18/85] build(docs): Remove sphinx packages poetry remove --dev doc8 alagitpull docutils sphinx-issues sphinx --- poetry.lock | 345 +------------------------------------------------ pyproject.toml | 8 -- 2 files changed, 4 insertions(+), 349 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4d981bc8..b8819f3c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,22 +1,3 @@ -[[package]] -category = "dev" -description = "A configurable sidebar-enabled Sphinx theme" -name = "alabaster" -optional = false -python-versions = "*" -version = "0.7.12" - -[[package]] -category = "dev" -description = "Cleverly-named alabaster sub-theme for git-pull projects" -name = "alagitpull" -optional = false -python-versions = "*" -version = "0.0.23" - -[package.dependencies] -alabaster = "<0.8" - [[package]] category = "dev" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." @@ -49,17 +30,6 @@ dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.int docs = ["sphinx", "zope.interface"] tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -[[package]] -category = "dev" -description = "Internationalization utilities" -name = "babel" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" - -[package.dependencies] -pytz = ">=2015.7" - [[package]] category = "dev" description = "Backport of functools.lru_cache" @@ -169,7 +139,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.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\" or python_version >= \"3.5\" and python_version < \"3.8\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -186,22 +156,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" @@ -296,14 +250,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.10" -[[package]] -category = "dev" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -name = "imagesize" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" - [[package]] category = "dev" description = "Read metadata from Python packages" @@ -381,6 +327,7 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] category = "dev" description = "A very fast and expressive template engine." +marker = "python_version >= \"3.5\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -467,6 +414,7 @@ testing = ["coverage", "pyyaml"] [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version >= \"3.5\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -642,14 +590,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.8.0" -[[package]] -category = "dev" -description = "Python Build Reasonableness" -name = "pbr" -optional = false -python-versions = "*" -version = "5.4.5" - [[package]] category = "dev" description = "Query metadatdata from sdists / bdists / installed packages." @@ -898,14 +838,6 @@ version = "9.0" pytest = ">=5.0" setuptools = ">=40.0" -[[package]] -category = "dev" -description = "World timezone definitions, modern and historical" -name = "pytz" -optional = false -python-versions = "*" -version = "2020.1" - [[package]] category = "dev" description = "YAML parser and emitter for Python" @@ -970,17 +902,6 @@ 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()" @@ -998,188 +919,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" version = "1.15.0" -[[package]] -category = "dev" -description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." -name = "snowballstemmer" -optional = false -python-versions = "*" -version = "2.0.0" - -[[package]] -category = "dev" -description = "Python documentation generator" -name = "sphinx" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.8.5" - -[package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" -alabaster = ">=0.7,<0.8" -babel = ">=1.3,<2.0 || >2.0" -colorama = ">=0.3.5" -docutils = ">=0.11" -imagesize = "*" -packaging = "*" -requests = ">=2.0.0" -setuptools = "*" -six = ">=1.5" -snowballstemmer = ">=1.1" -sphinxcontrib-websupport = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" - -[package.extras] -test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] -websupport = ["sqlalchemy (>=0.9)", "whoosh (>=2.0)"] - -[[package]] -category = "dev" -description = "Python documentation generator" -name = "sphinx" -optional = false -python-versions = ">=3.5" -version = "3.1.2" - -[package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = ">=0.3.5" -docutils = ">=0.12" -imagesize = "*" -packaging = "*" -requests = ">=2.5.0" -setuptools = "*" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" - -[package.extras] -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 = "A Sphinx extension for linking to your project's issue tracker" -name = "sphinx-issues" -optional = false -python-versions = "*" -version = "1.2.0" - -[package.dependencies] -sphinx = "*" - -[package.extras] -dev = ["pytest", "flake8 (3.6.0)", "pre-commit (1.13.0)", "tox", "mock", "flake8-bugbear (18.8.0)"] -lint = ["flake8 (3.6.0)", "pre-commit (1.13.0)", "flake8-bugbear (18.8.0)"] -tests = ["pytest", "mock"] - -[[package]] -category = "dev" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -name = "sphinxcontrib-applehelp" -optional = false -python-versions = ">=3.5" -version = "1.0.2" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -category = "dev" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -name = "sphinxcontrib-devhelp" -optional = false -python-versions = ">=3.5" -version = "1.0.2" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -category = "dev" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -name = "sphinxcontrib-htmlhelp" -optional = false -python-versions = ">=3.5" -version = "1.0.3" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -category = "dev" -description = "A sphinx extension which renders display math in HTML via JavaScript" -name = "sphinxcontrib-jsmath" -optional = false -python-versions = ">=3.5" -version = "1.0.1" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -category = "dev" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -name = "sphinxcontrib-qthelp" -optional = false -python-versions = ">=3.5" -version = "1.0.3" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -category = "dev" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -name = "sphinxcontrib-serializinghtml" -optional = false -python-versions = ">=3.5" -version = "1.1.4" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -category = "dev" -description = "Sphinx API for Web Apps" -marker = "python_version < \"3\"" -name = "sphinxcontrib-websupport" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -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" @@ -1300,18 +1039,11 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "edd16dbfe612114641a11d734def004c943b6450401fd7be49a55c7a8d6fcfc5" +content-hash = "8a931fd4f63989e76b054e85acdaa4e2c8e5b2eb699ade0f27b224633dabd19b" lock-version = "1.0" python-versions = "~2.7 || ^3.5" [metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -alagitpull = [ - {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, -] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -1324,10 +1056,6 @@ attrs = [ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, ] -babel = [ - {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, - {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, -] "backports.functools-lru-cache" = [ {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, {file = "backports.functools_lru_cache-1.6.1.tar.gz", hash = "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"}, @@ -1405,10 +1133,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"}, @@ -1441,10 +1165,6 @@ idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] -imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, -] importlib-metadata = [ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, @@ -1559,10 +1279,6 @@ pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, ] -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"}, @@ -1621,10 +1337,6 @@ pytest-rerunfailures = [ {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"}, -] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, @@ -1673,9 +1385,6 @@ 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"}, @@ -1693,52 +1402,6 @@ six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, - {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, -] -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"}, -] -sphinx-issues = [ - {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, - {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, - {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, - {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, -] -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"}, diff --git a/pyproject.toml b/pyproject.toml index 0cbcb4ae..05adf64a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,10 +18,7 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -alagitpull = "*" black = {version="==19.10b0", python="^3.6"} -doc8 = "*" -docutils = "*" flake8 = "*" isort = [ {version="<5", python="<3.6"}, @@ -33,11 +30,6 @@ pytest = [ ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" -sphinx = [ - {version="<2", python="<3"}, - {version="*", python=">=3"} -] -sphinx-issues = "*" twine = "*" codecov = "*" coverage = "*" From 073609156c806e6be7fdce8857a02820c64acfea Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 10:22:04 -0500 Subject: [PATCH 19/85] build(tmuxp): Update docs window to use mkdocs / root tasks --- .tmuxp.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tmuxp.yaml b/.tmuxp.yaml index b81ab27f..78ae837f 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -21,5 +21,5 @@ windows: panes: - focus: true - pane - - make serve - - make SPHINXBUILD='poetry run sphinx-build' watch + - make -C .. serve_docs + - make -C .. watch_docs From b32b24bbc1c1bd6a4cb6d56a17becdcbc5bfcb46 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:21:47 -0500 Subject: [PATCH 20/85] build(mkapi): Add package poetry add mkapi --dev --python ">=3.7" -E docs --- poetry.lock | 23 ++++++++++++++++++++--- pyproject.toml | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index b8819f3c..713874ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -253,7 +253,7 @@ version = "2.10" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -428,6 +428,19 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "An Auto API Documentation tool." +marker = "python_version >= \"3.7\"" +name = "mkapi" +optional = false +python-versions = ">=3.7" +version = "1.0.12" + +[package.dependencies] +jinja2 = "*" +markdown = "*" + [[package]] category = "dev" description = "Project documentation with Markdown." @@ -1023,7 +1036,7 @@ 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.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1039,7 +1052,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "8a931fd4f63989e76b054e85acdaa4e2c8e5b2eb699ade0f27b224633dabd19b" +content-hash = "b23d9c4972a38a265afb54e90537295541dca747603c38a598d00a7d4f0036e6" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1239,6 +1252,10 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mkapi = [ + {file = "mkapi-1.0.12-py3-none-any.whl", hash = "sha256:57acce0d2ed08305c8ed5cfc8c5158b0149da9f42884f8af12a4fb46137bedfb"}, + {file = "mkapi-1.0.12.tar.gz", hash = "sha256:8982eb8b6420d3535d932e6b8aeb0c40c010d32b0392ac627e76eb44f95eb8d0"}, +] mkdocs = [ {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, diff --git a/pyproject.toml b/pyproject.toml index 05adf64a..2f354420 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,3 +43,4 @@ pytest-mock = [ ] mkdocs = {version = "^1.1.2", python = ">=3.5"} mkdocs-material = {version = "^5.5.1", python = ">=3.5"} +mkapi = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} From 30abf106293b57e089f5c65c719453442d8f40b8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:23:02 -0500 Subject: [PATCH 21/85] build(mkdocs): Remove (to reinstall again with --extras) --- poetry.lock | 241 ++----------------------------------------------- pyproject.toml | 2 - 2 files changed, 8 insertions(+), 235 deletions(-) diff --git a/poetry.lock b/poetry.lock index 713874ca..55e3d154 100644 --- a/poetry.lock +++ b/poetry.lock @@ -96,7 +96,7 @@ version = "3.0.4" [[package]] category = "dev" description = "Composable command line interface toolkit" -marker = "python_version >= \"3.5\" or python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -224,15 +224,6 @@ 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.5\"" -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" @@ -253,7 +244,7 @@ version = "2.10" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -327,7 +318,7 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version >= \"3.5\"" +marker = "python_version >= \"3.7\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -339,65 +330,10 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] -[[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version >= \"3.5\"" -name = "joblib" -optional = false -python-versions = "*" -version = "0.14.1" - -[[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version >= \"3.5\"" -name = "joblib" -optional = false -python-versions = ">=3.6" -version = "0.16.0" - -[[package]] -category = "dev" -description = "Python LiveReload is an awesome tool for web developers" -marker = "python_version >= \"3.5\"" -name = "livereload" -optional = false -python-versions = "*" -version = "2.6.2" - -[package.dependencies] -six = "*" - -[package.dependencies.tornado] -python = ">=2.8" -version = "*" - -[[package]] -category = "dev" -description = "A Python implementation of Lunr.js" -marker = "python_version >= \"3.5\"" -name = "lunr" -optional = false -python-versions = "*" -version = "0.5.8" - -[package.dependencies] -future = ">=0.16.0" -six = ">=1.11.0" - -[package.dependencies.nltk] -optional = true -python = ">=2.8" -version = ">=3.2.5" - -[package.extras] -languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] - [[package]] category = "dev" description = "Python implementation of Markdown." -marker = "python_version >= \"3.5\"" +marker = "python_version >= \"3.7\"" name = "markdown" optional = false python-versions = ">=3.5" @@ -414,7 +350,7 @@ testing = ["coverage", "pyyaml"] [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version >= \"3.5\"" +marker = "python_version >= \"3.7\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -441,55 +377,6 @@ version = "1.0.12" jinja2 = "*" markdown = "*" -[[package]] -category = "dev" -description = "Project documentation with Markdown." -marker = "python_version >= \"3.5\"" -name = "mkdocs" -optional = false -python-versions = ">=3.5" -version = "1.1.2" - -[package.dependencies] -Jinja2 = ">=2.10.1" -Markdown = ">=3.2.1" -PyYAML = ">=3.10" -click = ">=3.3" -livereload = ">=2.5.1" -tornado = ">=5.0" - -[package.dependencies.lunr] -extras = ["languages"] -version = "0.5.8" - -[[package]] -category = "dev" -description = "A Material Design theme for MkDocs" -marker = "python_version >= \"3.5\"" -name = "mkdocs-material" -optional = false -python-versions = "*" -version = "5.5.1" - -[package.dependencies] -Pygments = ">=2.4" -markdown = ">=3.2" -mkdocs = ">=1.1" -mkdocs-material-extensions = ">=1.0" -pymdown-extensions = ">=7.0" - -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.5\"" -name = "mkdocs-material-extensions" -optional = false -python-versions = ">=3.5" -version = "1.0" - -[package.dependencies] -mkdocs-material = ">=5.0.0" - [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -531,29 +418,6 @@ optional = false python-versions = ">=3.5" version = "8.4.0" -[[package]] -category = "dev" -description = "Natural Language Toolkit" -marker = "python_version >= \"3.5\"" -name = "nltk" -optional = false -python-versions = "*" -version = "3.5" - -[package.dependencies] -click = "*" -joblib = "*" -regex = "*" -tqdm = "*" - -[package.extras] -all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] -corenlp = ["requests"] -machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - [[package]] category = "dev" description = "Core utilities for Python packages" @@ -670,18 +534,6 @@ optional = false python-versions = ">=3.5" version = "2.6.1" -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.5\"" -name = "pymdown-extensions" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "7.1" - -[package.dependencies] -Markdown = ">=3.2" - [[package]] category = "dev" description = "Python parsing module" @@ -851,15 +703,6 @@ version = "9.0" pytest = ">=5.0" setuptools = ">=40.0" -[[package]] -category = "dev" -description = "YAML parser and emitter for Python" -marker = "python_version >= \"3.5\"" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" - [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -880,7 +723,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -940,15 +783,6 @@ optional = false python-versions = "*" version = "0.10.1" -[[package]] -category = "dev" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -marker = "python_version >= \"3.5\"" -name = "tornado" -optional = false -python-versions = ">= 3.5" -version = "6.0.4" - [[package]] category = "dev" description = "Fast, Extensible Progress Meter" @@ -1036,7 +870,7 @@ 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.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1052,7 +886,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "b23d9c4972a38a265afb54e90537295541dca747603c38a598d00a7d4f0036e6" +content-hash = "d622551a03efb71fe15e97407321db515dd94b5a2303db6df9f7d4e47334b2e2" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1167,9 +1001,6 @@ 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"}, @@ -1196,19 +1027,6 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] -joblib = [ - {file = "joblib-0.14.1-py2.py3-none-any.whl", hash = "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"}, - {file = "joblib-0.14.1.tar.gz", hash = "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8"}, - {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, - {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, -] -livereload = [ - {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, -] -lunr = [ - {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, - {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, -] markdown = [ {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, @@ -1256,18 +1074,6 @@ mkapi = [ {file = "mkapi-1.0.12-py3-none-any.whl", hash = "sha256:57acce0d2ed08305c8ed5cfc8c5158b0149da9f42884f8af12a4fb46137bedfb"}, {file = "mkapi-1.0.12.tar.gz", hash = "sha256:8982eb8b6420d3535d932e6b8aeb0c40c010d32b0392ac627e76eb44f95eb8d0"}, ] -mkdocs = [ - {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, - {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, -] -mkdocs-material = [ - {file = "mkdocs-material-5.5.1.tar.gz", hash = "sha256:7a0dd451523008d0670f8f78037822f86f868f08c0532b1add4367252bb54133"}, - {file = "mkdocs_material-5.5.1-py2.py3-none-any.whl", hash = "sha256:aee5689f87d687c75962da9d4f07eef48664c22c176b6514bd18e4798ac2ca4f"}, -] -mkdocs-material-extensions = [ - {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, - {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, -] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1279,9 +1085,6 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] -nltk = [ - {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, -] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1322,10 +1125,6 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] -pymdown-extensions = [ - {file = "pymdown-extensions-7.1.tar.gz", hash = "sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6"}, - {file = "pymdown_extensions-7.1-py2.py3-none-any.whl", hash = "sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"}, -] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1354,19 +1153,6 @@ pytest-rerunfailures = [ {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, ] -pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {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"}, @@ -1423,17 +1209,6 @@ toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] -tornado = [ - {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, - {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, - {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, - {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, - {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, - {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, - {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, - {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, - {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, -] tqdm = [ {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, diff --git a/pyproject.toml b/pyproject.toml index 2f354420..43a9fa26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,4 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -mkdocs = {version = "^1.1.2", python = ">=3.5"} -mkdocs-material = {version = "^5.5.1", python = ">=3.5"} mkapi = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} From 979bbac916587bc2e97266f750db6213f8ad56f0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:24:55 -0500 Subject: [PATCH 22/85] build(mkdocs,mkdocs-mateiral): Reinstall in --extras docs poetry add mkdocs --dev --python ">=3.5" -E docs poetry add mkdocs-material --dev --python ">=3.5" -E docs --- poetry.lock | 243 +++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 2 + 2 files changed, 236 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 55e3d154..4b21b816 100644 --- a/poetry.lock +++ b/poetry.lock @@ -96,7 +96,7 @@ version = "3.0.4" [[package]] category = "dev" description = "Composable command line interface toolkit" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.5\" or python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -139,7 +139,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\" or python_version >= \"3.5\" and python_version < \"3.8\")" +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\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -224,6 +224,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.5\"" +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" @@ -244,7 +253,7 @@ version = "2.10" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -318,7 +327,7 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version >= \"3.7\"" +marker = "python_version >= \"3.5\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -330,10 +339,65 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +marker = "python_version >= \"3.5\"" +name = "joblib" +optional = false +python-versions = "*" +version = "0.14.1" + +[[package]] +category = "dev" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +marker = "python_version >= \"3.5\"" +name = "joblib" +optional = false +python-versions = ">=3.6" +version = "0.16.0" + +[[package]] +category = "dev" +description = "Python LiveReload is an awesome tool for web developers" +marker = "python_version >= \"3.5\"" +name = "livereload" +optional = false +python-versions = "*" +version = "2.6.2" + +[package.dependencies] +six = "*" + +[package.dependencies.tornado] +python = ">=2.8" +version = "*" + +[[package]] +category = "dev" +description = "A Python implementation of Lunr.js" +marker = "python_version >= \"3.5\"" +name = "lunr" +optional = false +python-versions = "*" +version = "0.5.8" + +[package.dependencies] +future = ">=0.16.0" +six = ">=1.11.0" + +[package.dependencies.nltk] +optional = true +python = ">=2.8" +version = ">=3.2.5" + +[package.extras] +languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] + [[package]] category = "dev" description = "Python implementation of Markdown." -marker = "python_version >= \"3.7\"" +marker = "python_version >= \"3.5\"" name = "markdown" optional = false python-versions = ">=3.5" @@ -350,7 +414,7 @@ testing = ["coverage", "pyyaml"] [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version >= \"3.7\"" +marker = "python_version >= \"3.5\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -377,6 +441,55 @@ version = "1.0.12" jinja2 = "*" markdown = "*" +[[package]] +category = "dev" +description = "Project documentation with Markdown." +marker = "python_version >= \"3.5\"" +name = "mkdocs" +optional = false +python-versions = ">=3.5" +version = "1.1.2" + +[package.dependencies] +Jinja2 = ">=2.10.1" +Markdown = ">=3.2.1" +PyYAML = ">=3.10" +click = ">=3.3" +livereload = ">=2.5.1" +tornado = ">=5.0" + +[package.dependencies.lunr] +extras = ["languages"] +version = "0.5.8" + +[[package]] +category = "dev" +description = "A Material Design theme for MkDocs" +marker = "python_version >= \"3.5\"" +name = "mkdocs-material" +optional = false +python-versions = "*" +version = "5.5.1" + +[package.dependencies] +Pygments = ">=2.4" +markdown = ">=3.2" +mkdocs = ">=1.1" +mkdocs-material-extensions = ">=1.0" +pymdown-extensions = ">=7.0" + +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +marker = "python_version >= \"3.5\"" +name = "mkdocs-material-extensions" +optional = false +python-versions = ">=3.5" +version = "1.0" + +[package.dependencies] +mkdocs-material = ">=5.0.0" + [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -418,6 +531,29 @@ optional = false python-versions = ">=3.5" version = "8.4.0" +[[package]] +category = "dev" +description = "Natural Language Toolkit" +marker = "python_version >= \"3.5\"" +name = "nltk" +optional = false +python-versions = "*" +version = "3.5" + +[package.dependencies] +click = "*" +joblib = "*" +regex = "*" +tqdm = "*" + +[package.extras] +all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] +corenlp = ["requests"] +machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + [[package]] category = "dev" description = "Core utilities for Python packages" @@ -534,6 +670,18 @@ optional = false python-versions = ">=3.5" version = "2.6.1" +[[package]] +category = "dev" +description = "Extension pack for Python Markdown." +marker = "python_version >= \"3.5\"" +name = "pymdown-extensions" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "7.1" + +[package.dependencies] +Markdown = ">=3.2" + [[package]] category = "dev" description = "Python parsing module" @@ -703,6 +851,15 @@ version = "9.0" pytest = ">=5.0" setuptools = ">=40.0" +[[package]] +category = "dev" +description = "YAML parser and emitter for Python" +marker = "python_version >= \"3.5\"" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -723,7 +880,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -783,6 +940,15 @@ optional = false python-versions = "*" version = "0.10.1" +[[package]] +category = "dev" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +marker = "python_version >= \"3.5\"" +name = "tornado" +optional = false +python-versions = ">= 3.5" +version = "6.0.4" + [[package]] category = "dev" description = "Fast, Extensible Progress Meter" @@ -870,7 +1036,7 @@ 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.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -886,7 +1052,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "d622551a03efb71fe15e97407321db515dd94b5a2303db6df9f7d4e47334b2e2" +content-hash = "aa6df2148870a26053f1ae0f736462d8247ae9e9379f6c404f3ab0d4ec78cc88" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1001,6 +1167,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"}, @@ -1027,6 +1196,19 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] +joblib = [ + {file = "joblib-0.14.1-py2.py3-none-any.whl", hash = "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"}, + {file = "joblib-0.14.1.tar.gz", hash = "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8"}, + {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, + {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, +] +livereload = [ + {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, +] +lunr = [ + {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, + {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, +] markdown = [ {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, @@ -1074,6 +1256,18 @@ mkapi = [ {file = "mkapi-1.0.12-py3-none-any.whl", hash = "sha256:57acce0d2ed08305c8ed5cfc8c5158b0149da9f42884f8af12a4fb46137bedfb"}, {file = "mkapi-1.0.12.tar.gz", hash = "sha256:8982eb8b6420d3535d932e6b8aeb0c40c010d32b0392ac627e76eb44f95eb8d0"}, ] +mkdocs = [ + {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, + {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, +] +mkdocs-material = [ + {file = "mkdocs-material-5.5.1.tar.gz", hash = "sha256:7a0dd451523008d0670f8f78037822f86f868f08c0532b1add4367252bb54133"}, + {file = "mkdocs_material-5.5.1-py2.py3-none-any.whl", hash = "sha256:aee5689f87d687c75962da9d4f07eef48664c22c176b6514bd18e4798ac2ca4f"}, +] +mkdocs-material-extensions = [ + {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, + {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, +] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1085,6 +1279,9 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] +nltk = [ + {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, +] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1125,6 +1322,10 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] +pymdown-extensions = [ + {file = "pymdown-extensions-7.1.tar.gz", hash = "sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6"}, + {file = "pymdown_extensions-7.1-py2.py3-none-any.whl", hash = "sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"}, +] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1153,6 +1354,19 @@ pytest-rerunfailures = [ {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, ] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {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"}, @@ -1209,6 +1423,17 @@ toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] +tornado = [ + {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, + {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, + {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, + {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, + {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, + {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, + {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, + {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, + {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, +] tqdm = [ {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, diff --git a/pyproject.toml b/pyproject.toml index 43a9fa26..761e57ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,3 +42,5 @@ pytest-mock = [ {version="*", python=">=3"} ] mkapi = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} +mkdocs = {version = "^1.1.2", extras = ["docs"], python = ">=3.5"} +mkdocs-material = {version = "^5.5.1", extras = ["docs"], python = ">=3.5"} From c203140997ff19d1ca4199c816c00c4bdeafb76a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:36:21 -0500 Subject: [PATCH 23/85] build(mkdocs): Add mkapi --- mkdocs.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index 98a068d9..75614f7e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,3 +8,17 @@ theme: custom_dir: . logo: assets/images/libvcs.svg favicon: assets/images/favicon.ico + +markdown_extensions: + - admonition + - codehilite + +plugins: + - search + - mkapi + +nav: + - index.md + - history.md + - api.md + - API: mkapi/api/libvcs From 598f32654aa3791ead7f2c11867b6af9b66b866c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:41:13 -0500 Subject: [PATCH 24/85] style(CHANGES): Use markdown (vim highlighting only atm) --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f49d6e53..289f4364 100644 --- a/CHANGES +++ b/CHANGES @@ -217,4 +217,4 @@ libvcs 0.1.0 (2016-06-20) .. _vcspull: https://github.com/vcs-python/vcspull .. _#43: https://github.com/vcs-python/vcspull/issues/43 -.. vim: set filetype=rst: +.. vim: set filetype=md: From d9c80b606657b5b60f7c812c1c0e0a9b5b7ada58 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 11:43:41 -0500 Subject: [PATCH 25/85] docs(history): Symlink to CHANGES (mkdocs) --- docs/history.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) mode change 100644 => 120000 docs/history.md diff --git a/docs/history.md b/docs/history.md deleted file mode 100644 index 77c2b6de..00000000 --- a/docs/history.md +++ /dev/null @@ -1,2 +0,0 @@ -History -======= diff --git a/docs/history.md b/docs/history.md new file mode 120000 index 00000000..3e8bc8c0 --- /dev/null +++ b/docs/history.md @@ -0,0 +1 @@ +../CHANGES \ No newline at end of file From 5203b3fb5342c7e99faa017f1dd8285b411173ce Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:30:03 -0500 Subject: [PATCH 26/85] build(Makefile): Watch css files in doc watcher --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8e5cc712..1773111c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null -DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.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 entr_warn: From 98def4e60ea044d0c3fcd975d0e75f209fba74f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:32:34 -0500 Subject: [PATCH 27/85] style(libvcs.git): Begin transitioning rST to markdown --- libvcs/git.py | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/libvcs/git.py b/libvcs/git.py index 54e3e44d..d3cef88b 100644 --- a/libvcs/git.py +++ b/libvcs/git.py @@ -1,22 +1,18 @@ # -*- coding: utf-8 -*- """Git Repo object for libvcs. -libvcs.git -~~~~~~~~~~ - From https://github.com/saltstack/salt (Apache License): -- :py:meth:`GitRepo.remote` -- :py:meth:`GitRepo.remote_get` (renamed to ``remote``) -- :py:meth:`GitRepo.remote_set` (renamed to ``set_remote``) +- [`GitRepo.remote`](libvcs.git.GitRepo.remote) (renamed to ``remote``) +- [`GitRepo.remote`](libvcs.git.GitRepo.remote_set) (renamed to ``set_remote``) From pip (MIT Licnese): -- :py:meth:`GitRepo.get_url_and_revision_from_pip_url` (get_url_rev) -- :py:meth:`GitRepo.get_revision` -- :py:meth:`GitRepo.get_git_version` - -""" +- [`GitRepo.remote`](libvcs.git.GitRepo.remote_set) (renamed to ``set_remote``) +- [`GitRepo.get_url_and_revision_from_pip_url`](libvcs.git.GitRepo.get_url_and_revision_from_pip_url`) (``get_url_rev``) +- [`GitRepo.get_revision`](libvcs.git.GitRepo.get_revision) +- [`GitRepo.get_git_version`](libvcs.git.GitRepo.get_git_version) +""" # NOQA: E501 from __future__ import absolute_import, print_function, unicode_literals import collections @@ -541,25 +537,23 @@ def status(self): Wraps ``git status --sb --porcelain=2``. Does not include changed files, yet. - Examples - -------- - - :: - - print(git_repo.status()) - { - "branch_oid": 'de6185fde0806e5c7754ca05676325a1ea4d6348', - "branch_head": 'fix-current-remote-name', - "branch_upstream": 'origin/fix-current-remote-name', - "branch_ab": '+0 -0', - "branch_ahead": '0', - "branch_behind": '0', - } - Returns ------- - dict : + dict Status of current checked out repository + + Examples + -------- + + >>> git_repo.status() + { + "branch_oid": 'de6185fde0806e5c7754ca05676325a1ea4d6348', + "branch_head": 'fix-current-remote-name', + "branch_upstream": 'origin/fix-current-remote-name', + "branch_ab": '+0 -0', + "branch_ahead": '0', + "branch_behind": '0' + } """ return extract_status(self.run(['status', '-sb', '--porcelain=2'])) From 0d8cf1aa9bacad8ad3967abed7adb6c1c7abb0d2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:33:00 -0500 Subject: [PATCH 28/85] style(mkdocs/mkapi): Add styling to make font size smaller --- assets/css/custom.css | 23 +++++++++++++++++++++++ mkdocs.yml | 3 +++ 2 files changed, 26 insertions(+) create mode 100644 assets/css/custom.css diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 00000000..c5cefcc8 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,23 @@ +.mkapi-node { + font-size: 0.85em; +} + +.mkapi-node .mkapi-item-name, +.mkapi-node .mkapi-object, +.mkapi-node .mkapi-object code, +.mkapi-node .mkapi-object.code h2.mkapi-object-body, +.mkapi-node h2 .mkapi-object { + font-size: 1em; +} + +.mkapi-node ul.mkapi-items li::before { + font-size: 80%; +} + +.mkapi-section-name { + padding: 0px 8px 2px 8px; +} + +.mkapi-object.plain .mkapi-object-kind { + font-weight: normal; +} diff --git a/mkdocs.yml b/mkdocs.yml index 75614f7e..0870c62d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -9,6 +9,9 @@ theme: logo: assets/images/libvcs.svg favicon: assets/images/favicon.ico +extra_css: + - assets/css/custom.css + markdown_extensions: - admonition - codehilite From fd9956747f2f0d805210d47ced1a1b62c0f8140f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:33:35 -0500 Subject: [PATCH 29/85] Remove api.md, use mkapi's autogenerated stuff --- docs/api.md | 73 ----------------------------------------------------- mkdocs.yml | 1 - 2 files changed, 74 deletions(-) delete mode 100644 docs/api.md diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index 89dfb115..00000000 --- a/docs/api.md +++ /dev/null @@ -1,73 +0,0 @@ -# API Reference - -## Creating a repo object - -Helper methods are available in `libvcs.shortcuts` which can return a -repo object from a single entry-point. - -`libvcs.shortcuts.create_repo` -`libvcs.shortcuts.create_repo_from_pip_url` - -## Instantiating a repo by hand - -Tools like `libvcs.shortcuts.create_repo` and -`libvcs.shortcuts.create_repo_from_pip_url` are just wrappers around -instantiated these classes. - -See examples below of git, mercurial, and subversion. - -## Git - -::: libvcs.git.GitRepo - - - -
- -libvcs.git.GitRemote - -
- -
- -libvcs.git.extract_status - -
- -## Mercurial - -aka `hg(1)` - -
- -libvcs.hg.MercurialRepo - -
- -## Subversion - -aka `svn(1)` - -
- -libvcs.svn.SubversionRepo - -
- -## Adding your own VCS - -Extending libvcs can be done through subclassing `BaseRepo`. - -
- -libvcs.base.BaseRepo - -
- -## Utility stuff - -
- -libvcs.util - -
diff --git a/mkdocs.yml b/mkdocs.yml index 0870c62d..87c9c030 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,5 +23,4 @@ plugins: nav: - index.md - history.md - - api.md - API: mkapi/api/libvcs From d2c51634e3c35dcbd9c365f4d7f0dbb70dc5be18 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:35:38 -0500 Subject: [PATCH 30/85] build(sphinx): Remove reStructuredText files --- README.rst | 117 -------------------------------------- docs/api.rst | 70 ----------------------- docs/conf.py | 111 ------------------------------------ docs/developing.rst | 129 ------------------------------------------ docs/history.rst | 8 --- docs/index.rst | 17 ------ docs/requirements.txt | 1 - requirements/dev.txt | 3 - 8 files changed, 456 deletions(-) delete mode 100644 README.rst delete mode 100644 docs/api.rst delete mode 100644 docs/conf.py delete mode 100644 docs/developing.rst delete mode 100644 docs/history.rst delete mode 100644 docs/index.rst delete mode 100644 docs/requirements.txt delete mode 100644 requirements/dev.txt diff --git a/README.rst b/README.rst deleted file mode 100644 index d6490e3c..00000000 --- a/README.rst +++ /dev/null @@ -1,117 +0,0 @@ -``libvcs`` - abstraction layer for vcs, powers `vcspull`_. - -|pypi| |docs| |build-status| |coverage| |license| - -Install: - -.. code-block:: sh - - $ pip install libvcs - -Open up python: - -.. code-block:: sh - - $ python - - # or for nice autocomplete and syntax highlighting - $ pip install ptpython - $ ptpython - -Create a `Repo`_ object of the project to inspect / checkout / update: - -.. code-block:: python - - >>> from libvcs.shortcuts import create_repo_from_pip_url, create_repo - - # repo is an object representation of a vcs repository. - >>> r = create_repo(url='https://www.github.com/vcs-python/libtmux', - ... vcs='git', - ... repo_dir='/tmp/libtmux') - - # or via pip-style URL - >>> r = create_repo_from_pip_url( - ... pip_url='git+https://www.github.com/vcs-python/libtmux', - ... repo_dir='/tmp/libtmux') - -Update / clone repo: - -.. code-block:: python - - # it may or may not be checked out/cloned on the system yet - >>> r.update_repo() - -Get revision: - -.. code-block:: python - - >>> r.get_revision() - u'5c227e6ab4aab44bf097da2e088b0ff947370ab8' - -Donations ---------- - -Your donations fund development of new features, testing and support. -Your money will go directly to maintenance and development of the project. -If you are an individual, feel free to give whatever feels right for the -value you get out of the project. - -See donation options at https://www.git-pull.com/support.html. - -More information ----------------- - -============== ========================================================== -Python support Python 2.7, >= 3.4, pypy -VCS supported git(1), svn(1), hg(1) -Source https://github.com/vcs-python/libvcs -Docs https://libvcs.git-pull.com -Changelog https://libvcs.git-pull.com/en/latest/history.html -API https://libvcs.git-pull.com/en/latest/api.html -Issues https://github.com/vcs-python/libvcs/issues -Travis https://travis-ci.org/vcs-python/libvcs -Test Coverage https://codecov.io/gh/vcs-python/libvcs -pypi https://pypi.python.org/pypi/libvcs -Open Hub https://www.openhub.net/p/libvcs -License `MIT`_. -git repo .. code-block:: bash - - $ git clone https://github.com/vcs-python/libvcs.git -install dev .. code-block:: bash - - $ git clone https://github.com/vcs-python/libvcs.git libvcs - $ cd ./libvcs - $ virtualenv .venv - $ source .venv/bin/activate - $ pip install -e . -tests .. code-block:: bash - - $ py.test -============== ========================================================== - -.. _MIT: https://opensource.org/licenses/MIT -.. _Documentation: https://libvcs.git-pull.com/en/latest/ -.. _API: https://libvcs.git-pull.com/en/latest/api.html -.. _pip: http://www.pip-installer.org/en/latest/ -.. _vcspull: https://www.github.com/vcs-python/vcspull/ -.. _Repo: https://libvcs.git-pull.com/en/latest/api.html#creating-a-repo-object - -.. |pypi| image:: https://img.shields.io/pypi/v/libvcs.svg - :alt: Python Package - :target: http://badge.fury.io/py/libvcs - -.. |build-status| image:: https://img.shields.io/travis/vcs-python/libvcs.svg - :alt: Build Status - :target: https://travis-ci.org/vcs-python/libvcs - -.. |coverage| image:: https://codecov.io/gh/vcs-python/libvcs/branch/master/graph/badge.svg - :alt: Code Coverage - :target: https://codecov.io/gh/vcs-python/libvcs - -.. |license| image:: https://img.shields.io/github/license/vcs-python/libvcs.svg - :alt: License - -.. |docs| image:: https://readthedocs.org/projects/libvcs/badge/?version=latest - :alt: Documentation Status - :scale: 100% - :target: https://readthedocs.org/projects/libvcs/ diff --git a/docs/api.rst b/docs/api.rst deleted file mode 100644 index 51be33cc..00000000 --- a/docs/api.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. _api: - -============= -API Reference -============= - -Creating a repo object ----------------------- - -Helper methods are available in ``libvcs.shortcuts`` which -can return a repo object from a single entry-point. - -.. autofunction:: libvcs.shortcuts.create_repo - -.. autofunction:: libvcs.shortcuts.create_repo_from_pip_url - -Instantiating a repo by hand ----------------------------- - -Tools like :func:`libvcs.shortcuts.create_repo` and -:func:`libvcs.shortcuts.create_repo_from_pip_url` are just wrappers -around instantiated these classes. - -See examples below of git, mercurial, and subversion. - -Git ---- - -.. autoclass:: libvcs.git.GitRepo - :members: - :show-inheritance: - -.. autoclass:: libvcs.git.GitRemote - :members: - :show-inheritance: - -.. autofunction:: libvcs.git.extract_status - -Mercurial ---------- - -aka ``hg(1)`` - -.. autoclass:: libvcs.hg.MercurialRepo - :members: - :show-inheritance: - -Subversion ----------- - -aka ``svn(1)`` - -.. autoclass:: libvcs.svn.SubversionRepo - :members: - :show-inheritance: - -Adding your own VCS -------------------- - -Extending libvcs can be done through subclassing ``BaseRepo``. - -.. autoclass:: libvcs.base.BaseRepo - :members: - :show-inheritance: - -Utility stuff -------------- - -.. automodule:: libvcs.util - :members: diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index fe2fade4..00000000 --- a/docs/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("../libvcs/__about__.py") as fp: - exec(fp.read(), about) - -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.napoleon', - 'alagitpull', - 'sphinx_issues', -] - -releases_unstable_prehistory = True -releases_document_name = ["history"] -releases_issue_uri = "https://github.com/vcs-python/libvcs/issues/%s" -releases_release_uri = "https://github.com/vcs-python/libvcs/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/libvcs.svg', - 'github_user': 'vcs-python', - 'github_repo': 'libvcs', - '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'] -htmlhelp_basename = '%sdoc' % about['__title__'] - -alagitpull_internal_hosts = ['libvcs.git-pull.com', '0.0.0.0'] -alagitpull_external_hosts_new_window = True - - -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), - 'pip': ('http://pip.readthedocs.io/en/latest/', None), -} diff --git a/docs/developing.rst b/docs/developing.rst deleted file mode 100644 index f0f4b67b..00000000 --- a/docs/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/libvcs.git - $ cd libvcs - -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/libvcs.git - $ cd libvcs - -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 ``libvcs`` 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_util.py - -will test the ``tests/test_util.py`` tests. - -.. code-block:: bash - - $ py.test tests/test_util.py::test_mkdir_p - -tests ``test_mkdir_p`` inside of ``tests/test_util.py``. - -Multiple can be separated by spaces: - -.. code-block:: bash - - $ py.test tests/test_{git,svn}.py tests/test_util.py::test_mkdir_p - -.. _issue on github: https://github.com/vcs-python/libvcs/issues diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 37c6fae3..00000000 --- a/docs/history.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _history: - -======= -History -======= - -.. include:: ../CHANGES - :start-line: 5 diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index f49e189a..00000000 --- a/docs/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. _index: - -###### -libvcs -###### - - -.. include:: ../README.rst - :start-line: 4 - -.. toctree:: - :maxdepth: 2 - :hidden: - - api - developing - history diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 04b4dec7..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --r ../requirements/doc.txt diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index 55161885..00000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,3 +0,0 @@ -flake8==3.7.7 -isort<=4.4;python_version<'3.6' -isort>=5;python_version>='3.6' From 835f50d6a42f2232bf79db1a3755e6b5c61174f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:37:06 -0500 Subject: [PATCH 31/85] chore(images): Move favicon/logo to assets/images --- assets/images/favicon.ico | Bin 30 -> 18686 bytes assets/images/libvcs.svg | 2 +- docs/_static/favicon.ico | Bin 18686 -> 0 bytes docs/_static/img/libvcs.svg | 1 - 4 files changed, 1 insertion(+), 2 deletions(-) mode change 120000 => 100644 assets/images/favicon.ico mode change 120000 => 100644 assets/images/libvcs.svg delete mode 100644 docs/_static/favicon.ico delete mode 100644 docs/_static/img/libvcs.svg diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico deleted file mode 120000 index c50b150e..00000000 --- a/assets/images/favicon.ico +++ /dev/null @@ -1 +0,0 @@ -../../docs/_static/favicon.ico \ No newline at end of file diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c64e90c06307207971450a4d9f55579de415f2f GIT binary patch literal 18686 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 V++UgT{`ty$cuMvENB{qj{{_}r1jzsZ literal 0 HcmV?d00001 diff --git a/assets/images/libvcs.svg b/assets/images/libvcs.svg deleted file mode 120000 index 9a858af6..00000000 --- a/assets/images/libvcs.svg +++ /dev/null @@ -1 +0,0 @@ -../../docs/_static/img/libvcs.svg \ No newline at end of file diff --git a/assets/images/libvcs.svg b/assets/images/libvcs.svg new file mode 100644 index 00000000..733305ed --- /dev/null +++ b/assets/images/libvcs.svg @@ -0,0 +1 @@ +libvcs \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico deleted file mode 100644 index 5c64e90c06307207971450a4d9f55579de415f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18686 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 V++UgT{`ty$cuMvENB{qj{{_}r1jzsZ diff --git a/docs/_static/img/libvcs.svg b/docs/_static/img/libvcs.svg deleted file mode 100644 index 733305ed..00000000 --- a/docs/_static/img/libvcs.svg +++ /dev/null @@ -1 +0,0 @@ -libvcs \ No newline at end of file From c5babb6145878d87d8f1929c526b88f3dd2d165e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:38:10 -0500 Subject: [PATCH 32/85] chore(docs/Makefile): Remove, in favor of root Makefile commands make build_docs make serve_docs make watch_docs make dev_docs --- docs/Makefile | 178 -------------------------------------------------- 1 file changed, 178 deletions(-) delete mode 100644 docs/Makefile diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index b6c24566..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,178 +0,0 @@ -# Makefile for Sphinx documentation -# -PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") -HTTP_PORT = 8068 - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libvcs.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libvcs.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/libvcs" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libvcs" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -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: - if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) html; else $(MAKE) html; fi - -serve: - @echo '==============================================================' - @echo - @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' - @echo - @echo '==============================================================' - @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi - -serve_py2: - python -m SimpleHTTPServer ${HTTP_PORT} - -serve_py3: - python -m http.server ${HTTP_PORT} From 01aa77f5b2f2e24380fa9931cddf1ac3fb19c419 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:39:49 -0500 Subject: [PATCH 33/85] build(README): Use README.md instead of README.rst --- MANIFEST.in | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 6336b37e..98cccae4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ -include README.rst LICENSE CHANGES .tmuxp.yaml +include README.md LICENSE CHANGES .tmuxp.yaml include requirements/*.txt recursive-include docs *.rst diff --git a/setup.py b/setup.py index 5d8a10d3..896ec417 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ with open('requirements/test.txt') as f: tests_reqs = [line for line in f.read().split('\n') if line] -readme = open('README.rst').read() +readme = open('README.md').read() history = open('CHANGES').read().replace('.. :changelog:', '') From 49eb1bb393b095172157dfea474e337c322337c0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:43:14 -0500 Subject: [PATCH 34/85] ci(codecov): Ignore changes less than 0.1% --- .codecov.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..86d633b0 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,7 @@ +coverage: + status: + project: + default: + target: auto + threshold: 0.1% + base: auto From 704a5188defd5e8219d6a18c5eec6b9ff6cdcd52 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 12:45:46 -0500 Subject: [PATCH 35/85] ci(codecov): Try another tweak to quiet codecov down --- .codecov.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.codecov.yml b/.codecov.yml index 86d633b0..bf9b9abe 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,7 +1,15 @@ +codecov: + notify: + require_ci_to_pass: no + coverage: + precision: 2 + round: down + range: "70...100" status: project: default: target: auto - threshold: 0.1% + threshold: 1% base: auto + patch: off From 4265026f48f2739f4b0d8dceef77e7d1889baa4d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 13:09:23 -0500 Subject: [PATCH 36/85] style(mkdocs/mkapi): CSS Tweaks to make font size smaller --- assets/css/custom.css | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/assets/css/custom.css b/assets/css/custom.css index c5cefcc8..8f578b18 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -2,6 +2,30 @@ font-size: 0.85em; } +.mkapi-node a.mkapi-src-link, a.mkapi-docs-link { + font-size: 0.8em; +} + +.mkapi-node .mkapi-object.code h3.mkapi-object-body { + font-size: 1.2em; +} + +.mkapi-node .mkapi-section-name .mkapi-section-name-body { + font-size: 1em; +} + +.mkapi-node .mkapi-base { + font-size: .9em; +} + +.mkapi-node code.mkapi-item-name, +.mkapi-node code.mkapi-object-signature, +.mkapi-node code.mkapi-object-parenthesis, +.mkapi-node span.mkapi-item-dash, +.mkapi-node span.mkapi-item-type { + font-size: 0.9em; +} + .mkapi-node .mkapi-item-name, .mkapi-node .mkapi-object, .mkapi-node .mkapi-object code, From 919c28b9fe4e3dba2f36404d120be74660379ec7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 14:57:29 -0500 Subject: [PATCH 37/85] style(CHANGES): Reformat to markdown with pandoc / sed(1) pandoc --from rst --to gfm CHANGES --atx-headers | \ sed s/"<"/"\("/g | sed s/">"/"\)"/g | \ sed s/"- "/"- "/g > tmp; mv tmp CHANGES --- CHANGES | 336 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 165 insertions(+), 171 deletions(-) diff --git a/CHANGES b/CHANGES index 289f4364..8ad84925 100644 --- a/CHANGES +++ b/CHANGES @@ -1,220 +1,214 @@ -========= -Changelog -========= +# Changelog Here are the changes for libvcs. -libvcs 0.5-current ------------------- +## libvcs 0.5-current + Generally speaking, refactor / magic is in the process of being stripped out in the next few releases. The API is subject to change significantly in pre-1.0 builds. -libvcs 0.4.4 (2020-08-05) -------------------------- -- :issue:`268` :class:`libvcs.base.BaseRepo`: - - - no longer sets ``**kwargs`` to dictionary on the object - - remove ``__slot__`` and rename ``name`` attribute to ``repo_name`` - -libvcs 0.4.3 (2020-08-01) -------------------------- -- [bug] :func:`libvcs.git.extract_status()` Fix issue capturing branch names - with special characters - -libvcs 0.4.2 (2020-08-01) -------------------------- -- [bug] :meth:`libvcs.git.GitRepo.get_current_remote_name()` Handle case where - upstream is unpushed -- [feature] :meth:`libvcs.git.GitRepo.status()` - Retrieve status of repo -- [feature] :func:`libvcs.git.extract_status()` - Return structured info from - ``git status`` - -libvcs 0.4.1 (2020-08-01) -------------------------- +## libvcs 0.4.4 (2020-08-05) + +- `268` `libvcs.base.BaseRepo`: + - no longer sets `**kwargs` to dictionary on the object + - remove `__slot__` and rename `name` attribute to `repo_name` + +## libvcs 0.4.3 (2020-08-01) + +- \[bug\] `libvcs.git.extract_status()` Fix issue capturing branch + names with special characters + +## libvcs 0.4.2 (2020-08-01) + +- \[bug\] `libvcs.git.GitRepo.get_current_remote_name()` Handle case + where upstream is unpushed +- \[feature\] `libvcs.git.GitRepo.status()` - Retrieve status of repo +- \[feature\] `libvcs.git.extract_status()` - Return structured info + from `git status` + +## libvcs 0.4.1 (2020-08-01) + - Remove log statement -libvcs 0.4 (2020-08-01) ------------------------ +## libvcs 0.4 (2020-08-01) **Breaking changes** -Internal functionality relating to remotes have been reorganized to avoid -implicit behavior. +Internal functionality relating to remotes have been reorganized to +avoid implicit behavior. + +- `~libvcs.git.GitRepo` methods have been renamed, they will be + deprecated in 0.5: + + - `GitRepo.remotes_get` renamed to `libvcs.git.GitRepo.remotes()` + - `GitRepo.remote_get` renamed to `libvcs.git.GitRepo.remote()` + - `GitRepo.remote_set` renamed to + `libvcs.git.GitRepo.set_remote()` + +- `~libvcs.git.GitRepo` the `remotes` argument is deprecated and no + longer used. Use `libvcs.git.GitRepo.set_remote` after repo is + instantiated. -- :class:`~libvcs.git.GitRepo` methods have been renamed, they will be deprecated - in 0.5: +- `libvcs.git.GitRepo.obtain` no longer set remotes based on a `dict` + passed to `~libvcs.git.GitRepo`. This was deemed to specialized / + implicit. - - ``GitRepo.remotes_get`` renamed to :meth:`libvcs.git.GitRepo.remotes()` - - ``GitRepo.remote_get`` renamed to :meth:`libvcs.git.GitRepo.remote()` - - ``GitRepo.remote_set`` renamed to :meth:`libvcs.git.GitRepo.set_remote()` +- `libvcs.git.GitRepo.set_remote()` (formerly `remote_set`) -- :class:`~libvcs.git.GitRepo` the ``remotes`` argument is deprecated and no longer - used. Use :meth:`libvcs.git.GitRepo.set_remote` after repo is instantiated. + The new method accepts `name` and `url` (in that order). `name` no + longer has a default value (was `origin`). -- :meth:`libvcs.git.GitRepo.obtain` no longer set remotes based on a ``dict`` passed - to :class:`~libvcs.git.GitRepo`. This was deemed to specialized / implicit. +- `libvcs.git.GitRepo.remote()` (formerly `remote_get`): -- :meth:`libvcs.git.GitRepo.set_remote()` (formerly ``remote_set``) + - `remote` argument renamed to `name`. It will be removed in 0.5.0 - The new method accepts ``name`` and ``url`` (in that order). ``name`` no longer - has a default value (was ``origin``). + The default value of `'origin'` has been removed -- :meth:`libvcs.git.GitRepo.remote()` (formerly ``remote_get``): + - Now returns `~libvcs.git.GitRemote` (a + :py`collections.namedtuple` object) - - ``remote`` argument renamed to ``name``. It will be removed in 0.5.0 + The tuple is similar to the old output, except there is an + additional value at the beginning, the name of the remote, e.g. + `('origin', '', '')` - The default value of ``'origin'`` has been removed - - Now returns :meth:`~libvcs.git.GitRemote` (a :py:class:`collections.namedtuple` object) +- `libvcs.git.GitRepo.remotes()` (formerly `remotes_get`) are now + methods instead of properties. - The tuple is similar to the old output, except there is an additional value at - the beginning, the name of the remote, e.g. ``('origin', '', '')`` + Passing `flat=True` to return a `dict` of `tuple` instead of `dict` -- :meth:`libvcs.git.GitRepo.remotes()` (formerly ``remotes_get``) are now methods - instead of properties. +- New method: `libvcs.git.GitRepo.get_git_version()` - Passing ``flat=True`` to return a ``dict`` of ``tuple`` instead of ``dict`` -- New method: :meth:`libvcs.git.GitRepo.get_git_version()` -- New method: :meth:`libvcs.git.GitRepo.get_current_remote_name()` +- New method: `libvcs.git.GitRepo.get_current_remote_name()` +## libvcs 0.3.3 (2020-07-29) -libvcs 0.3.3 (2020-07-29) -------------------------- - Remove f-string from test -- :meth:`libvcs.git.GitRepo.obtain` Overwrite remote if exists +- `libvcs.git.GitRepo.obtain` Overwrite remote if exists -libvcs 0.3.2 (2020-07-26) -------------------------- -- :issue:`258` :meth:`libvcs.git.GitRepo.remote_set` +## libvcs 0.3.2 (2020-07-26) - - Fix updating of remote URLs - - Add new param: ``overwrite``, usage: ``repo.remote_set(url, 'origin', overwrite=True)`` +- `258` `libvcs.git.GitRepo.remote_set` + - Fix updating of remote URLs + - Add new param: `overwrite`, usage: + `repo.remote_set(url, 'origin', overwrite=True)` + +## libvcs 0.3.1post1 (2020-07-26) -libvcs 0.3.1post1 (2020-07-26) ------------------------------- - Fix version in pyroject.toml - Update developer docs -libvcs 0.3.1 (2020-07-25) -------------------------- +## libvcs 0.3.1 (2020-07-25) + - Fix issue with subprocess.Popen loud warning on Python 3.8 -- :issue:`296` - Move from Pipfile to poetry +- `296` - Move from Pipfile to poetry - Sort imports - Add isort package, isort configuration in setup.cfg, and - ``make isort`` task to Makefile. -- Add ``project_urls`` to setup.py + `make isort` task to Makefile. +- Add `project_urls` to setup.py + +## libvcs 0.3.0 (2018-03-12) -libvcs 0.3.0 (2018-03-12) -------------------------- - Move vcspull to the vcs-python organization -- Fix issue where VCS objects failed to set attribute in Ubuntu - 18.04. +- Fix issue where VCS objects failed to set attribute in Ubuntu 18.04. + +## libvcs 0.2.3 (2016-12-22) -libvcs 0.2.3 (2016-12-22) -------------------------- - Update documentation to point to libvcs.git-pull.com - Switch doc theme to alabaster - Pin and update libraries via pyup - - update vulture 0.8.1 to 0.11 - - update flake8 from 2.5.4 to 3.2.1 - - update pytest-mock from 1.4.0 to 1.5.0 - - update pytest from 3.0.4 to 3.0.5 - - pin alabaster to 0.7.9 - - pin sphinx to 1.5.1 - -libvcs 0.2.2 (2016-11-23) -------------------------- -- Fix bug with unused ``support`` module in vcspull. See `#43`_ - -libvcs 0.2.1 (2016-09-13) -------------------------- + - update vulture 0.8.1 to 0.11 + - update flake8 from 2.5.4 to 3.2.1 + - update pytest-mock from 1.4.0 to 1.5.0 + - update pytest from 3.0.4 to 3.0.5 + - pin alabaster to 0.7.9 + - pin sphinx to 1.5.1 + +## libvcs 0.2.2 (2016-11-23) + +- Fix bug with unused `support` module in vcspull. See + [\#43](https://github.com/vcs-python/vcspull/issues/43) + +## libvcs 0.2.1 (2016-09-13) + - Update pytest to 3.0.2, remove unused pytest-raisesregexp - dependency. -- Fix bug in ``which`` when executable is not found. Allow - specifying search paths manually. -- Better support for missing VCS when testing on git and - subversion. - -libvcs 0.2.0 (2016-06-24) -------------------------- -- :issue:`9` Support for ``progress_callback`` to use realtime output - from commands in progress (such as ``git fetch``). -- :issue:`9` More tests, internal factoring and documentation, thanks - @jcfr -- :issue:`9` Official support for pypy, pypy3 -- :issue:`11` : Fix unbound local when updating git repos - -libvcs 0.1.7 (2016-06-21) -------------------------- -- :issue:`7` Add ``check_returncode`` property to run, thanks @jcfr -- :issue:`8` Remove all cases of ``run_buffered`` / buffering from - the library. - -libvcs 0.1.6 (2016-06-21) -------------------------- -- :issue:`5` Remove colorama dependency -- :issue:`6` Remove log module. Logging defaults. - - The library user can still use formatters and set log levels, - for an example, see the vcspull logging setup. - - An example:: - - import logging - - # your app - log.setLevel(level) - log.addHandler(logging.StreamHandler()) - - # vcslib logging options - vcslogger = logging.getLogger('libvcs') - vcslogger.propagate = False # don't pass libvcs settings up scope - vcslogger.addHandler(logging.StreamHandler()) - vcslogger.setLevel(level) - - You can also use ``logging.Formatter`` variables ``repo_name`` - and ``repo_vcs`` with repos:: - - repo_channel = logging.StreamHandler() - repo_formatter = logging.Formatter( - '[%(repo_name)s] (%(repo_vcs)s) %(levelname)1.1s: %(message)s' - ) - repo_channel.setFormatter(repo_formatter) - vcslogger = logging.getLogger('libvcs') - vcslogger.propagate = False # don't pass libvcs settings up scope - vcslogger.addHandler(repo_channel) - vcslogger.setLevel(level) - -libvcs 0.1.5 (2016-06-21) -------------------------- -- Fix issue where repo context wouldn't pass to repo logging - adapter - -libvcs 0.1.4 (2016-06-20) -------------------------- -- Fix print_stdout_on_progress_end signature in git update - -libvcs 0.1.3 (2016-06-20) -------------------------- -- ``create_repo`` function for regular vcs urls + dependency. +- Fix bug in `which` when executable is not found. Allow specifying + search paths manually. +- Better support for missing VCS when testing on git and subversion. + +## libvcs 0.2.0 (2016-06-24) + +- `9` Support for `progress_callback` to use realtime output from + commands in progress (such as `git fetch`). +- `9` More tests, internal factoring and documentation, thanks @jcfr +- `9` Official support for pypy, pypy3 +- `11` : Fix unbound local when updating git repos + +## libvcs 0.1.7 (2016-06-21) + +- `7` Add `check_returncode` property to run, thanks @jcfr +- `8` Remove all cases of `run_buffered` / buffering from the library. + +## libvcs 0.1.6 (2016-06-21) + +- `5` Remove colorama dependency + +- `6` Remove log module. Logging defaults. + + The library user can still use formatters and set log levels, for an + example, see the vcspull logging setup. + + An example: + + import logging + + # your app + log.setLevel(level) + log.addHandler(logging.StreamHandler()) + + # vcslib logging options + vcslogger = logging.getLogger('libvcs') + vcslogger.propagate = False # don't pass libvcs settings up scope + vcslogger.addHandler(logging.StreamHandler()) + vcslogger.setLevel(level) + + You can also use `logging.Formatter` variables `repo_name` and + `repo_vcs` with repos: + + repo_channel = logging.StreamHandler() + repo_formatter = logging.Formatter( + '[%(repo_name)s] (%(repo_vcs)s) %(levelname)1.1s: %(message)s' + ) + repo_channel.setFormatter(repo_formatter) + vcslogger = logging.getLogger('libvcs') + vcslogger.propagate = False # don't pass libvcs settings up scope + vcslogger.addHandler(repo_channel) + vcslogger.setLevel(level) + +## libvcs 0.1.5 (2016-06-21) + +- Fix issue where repo context wouldn't pass to repo logging adapter + +## libvcs 0.1.4 (2016-06-20) + +- Fix print\_stdout\_on\_progress\_end signature in git update + +## libvcs 0.1.3 (2016-06-20) + +- `create_repo` function for regular vcs urls - API docs updated -libvcs 0.1.2 (2016-06-20) -------------------------- -- change signature on ``create_repo_from_pip_url`` to accept - ``pip_url`` insetad of ``url``. -- ``Base`` to accept ``repo_dir`` instead of ``name`` and - ``parent_dir``. +## libvcs 0.1.2 (2016-06-20) -libvcs 0.1.1 (2016-06-20) -------------------------- -- remove unneeded pyyaml, kaptan and click dependencies +- change signature on `create_repo_from_pip_url` to accept `pip_url` + insetad of `url`. +- `Base` to accept `repo_dir` instead of `name` and `parent_dir`. -libvcs 0.1.0 (2016-06-20) -------------------------- -- libvcs split from `vcspull`_ +## libvcs 0.1.1 (2016-06-20) + +- remove unneeded pyyaml, kaptan and click dependencies -.. _vcspull: https://github.com/vcs-python/vcspull -.. _#43: https://github.com/vcs-python/vcspull/issues/43 +## libvcs 0.1.0 (2016-06-20) -.. vim: set filetype=md: +- libvcs split from [vcspull](https://github.com/vcs-python/vcspull) From 9b5bf15ab7f4952aa9d4f2fd917eb489b37fc573 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 15:33:05 -0500 Subject: [PATCH 38/85] build(mkapi): Use forked version with trailing slash fix, other PRs included See also: - https://github.com/tony/mkapi/pull/1 - https://github.com/daizutabi/mkapi/pull/23 - https://github.com/daizutabi/mkapi/pull/24 --- poetry.lock | 13 +++++++------ pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4b21b816..6c22f6c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -441,6 +441,10 @@ version = "1.0.12" jinja2 = "*" markdown = "*" +[package.source] +reference = "b2888ec059f548e1ca65d2c3f96c639c0a5e5b36" +type = "git" +url = "https://github.com/tony/mkapi" [[package]] category = "dev" description = "Project documentation with Markdown." @@ -1036,7 +1040,7 @@ 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.7\" 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\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1052,7 +1056,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "aa6df2148870a26053f1ae0f736462d8247ae9e9379f6c404f3ab0d4ec78cc88" +content-hash = "4b02b21ac9455add55e32c6373d8de8da9c955e9b2cb1ac32e7f583b94313c4b" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1252,10 +1256,7 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mkapi = [ - {file = "mkapi-1.0.12-py3-none-any.whl", hash = "sha256:57acce0d2ed08305c8ed5cfc8c5158b0149da9f42884f8af12a4fb46137bedfb"}, - {file = "mkapi-1.0.12.tar.gz", hash = "sha256:8982eb8b6420d3535d932e6b8aeb0c40c010d32b0392ac627e76eb44f95eb8d0"}, -] +mkapi = [] mkdocs = [ {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, diff --git a/pyproject.toml b/pyproject.toml index 761e57ad..b6749c5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,6 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -mkapi = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} +mkapi = {git = "https://github.com/tony/mkapi", rev = "git-pull", extras = ["docs"], python = ">=3.7"} mkdocs = {version = "^1.1.2", extras = ["docs"], python = ">=3.5"} mkdocs-material = {version = "^5.5.1", extras = ["docs"], python = ">=3.5"} From 34e9968f289a164fcbf5ddccce6e83ffc5aa39a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 15:49:16 -0500 Subject: [PATCH 39/85] build(poetry): poetry lock --- poetry.lock | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 234 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6c22f6c2..389371a7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -10,7 +10,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\"" +marker = "python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -19,6 +19,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\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -85,6 +86,18 @@ optional = false python-versions = "*" version = "2020.6.20" +[[package]] +category = "dev" +description = "Foreign Function Interface for Python calling C code." +marker = "sys_platform == \"linux\"" +name = "cffi" +optional = false +python-versions = "*" +version = "1.14.1" + +[package.dependencies] +pycparser = "*" + [[package]] category = "dev" description = "Universal encoding detector for Python 2 and 3" @@ -117,7 +130,6 @@ requests = ">=2.7.9" [[package]] category = "dev" description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\" and python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\"" name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -139,7 +151,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\" or python_version >= \"3.7\" 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.*" @@ -156,6 +168,27 @@ version = "5.2.1" [package.extras] toml = ["toml"] +[[package]] +category = "dev" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +marker = "sys_platform == \"linux\"" +name = "cryptography" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "3.0" + +[package.dependencies] +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +idna = ["idna (>=2.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] + [[package]] category = "dev" description = "Docutils -- Python Documentation Utilities" @@ -281,6 +314,7 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" +marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" @@ -324,6 +358,18 @@ colors = ["colorama (>=0.4.3,<0.5.0)"] pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] requirements_deprecated_finder = ["pipreqs", "pip-api"] +[[package]] +category = "dev" +description = "Low-level, pure Python DBus protocol wrapper." +marker = "sys_platform == \"linux\"" +name = "jeepney" +optional = false +python-versions = ">=3.5" +version = "0.4.3" + +[package.extras] +dev = ["testpath"] + [[package]] category = "dev" description = "A very fast and expressive template engine." @@ -357,6 +403,27 @@ optional = false python-versions = ">=3.6" version = "0.16.0" +[[package]] +category = "dev" +description = "Store and access your passwords safely." +name = "keyring" +optional = false +python-versions = ">=3.6" +version = "21.2.1" + +[package.dependencies] +SecretStorage = ">=3" +jeepney = ">=0.4.2" +pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov"] + [[package]] category = "dev" description = "Python LiveReload is an awesome tool for web developers" @@ -530,6 +597,7 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -589,7 +657,7 @@ version = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -621,6 +689,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -637,6 +706,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -650,6 +720,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.6.0" +[[package]] +category = "dev" +description = "C parser in Python" +marker = "sys_platform == \"linux\"" +name = "pycparser" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.20" + [[package]] category = "dev" description = "passive checker of Python programs" @@ -689,6 +768,7 @@ Markdown = ">=3.2" [[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.*" @@ -855,6 +935,15 @@ version = "9.0" pytest = ">=5.0" setuptools = ">=40.0" +[[package]] +category = "dev" +description = "" +marker = "sys_platform == \"win32\"" +name = "pywin32-ctypes" +optional = false +python-versions = "*" +version = "0.2.0" + [[package]] category = "dev" description = "YAML parser and emitter for Python" @@ -919,6 +1008,17 @@ version = "0.9.1" [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +category = "dev" +description = "Validating URI References per RFC 3986" +name = "rfc3986" +optional = false +python-versions = "*" +version = "1.4.0" + +[package.extras] +idna2008 = ["idna"] + [[package]] category = "dev" description = "scandir, a better directory iterator and faster os.walk()" @@ -928,6 +1028,19 @@ optional = false python-versions = "*" version = "1.10.0" +[[package]] +category = "dev" +description = "Python bindings to FreeDesktop.org Secret Service API" +marker = "sys_platform == \"linux\"" +name = "secretstorage" +optional = false +python-versions = ">=3.5" +version = "3.1.2" + +[package.dependencies] +cryptography = "*" +jeepney = ">=0.4.2" + [[package]] category = "dev" description = "Python 2 and 3 compatibility utilities" @@ -939,6 +1052,7 @@ version = "1.15.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\"" name = "toml" optional = false python-versions = "*" @@ -984,6 +1098,29 @@ tqdm = ">=4.14" keyring = ["keyring"] with-blake2 = ["pyblake2"] +[[package]] +category = "dev" +description = "Collection of utilities for publishing packages on PyPI" +name = "twine" +optional = false +python-versions = ">=3.6" +version = "3.2.0" + +[package.dependencies] +colorama = ">=0.4.3" +keyring = ">=15.1" +pkginfo = ">=1.4.2" +readme-renderer = ">=21.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +setuptools = ">=0.7.0" +tqdm = ">=4.14" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1040,7 +1177,7 @@ 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.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1055,6 +1192,19 @@ 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\" or python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\" or python_version >= \"3.5\" 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"] + [metadata] content-hash = "4b02b21ac9455add55e32c6373d8de8da9c955e9b2cb1ac32e7f583b94313c4b" lock-version = "1.0" @@ -1089,6 +1239,36 @@ certifi = [ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ] +cffi = [ + {file = "cffi-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:66dd45eb9530e3dde8f7c009f84568bc7cac489b93d04ac86e3111fb46e470c2"}, + {file = "cffi-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:4f53e4128c81ca3212ff4cf097c797ab44646a40b42ec02a891155cd7a2ba4d8"}, + {file = "cffi-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:833401b15de1bb92791d7b6fb353d4af60dc688eaa521bd97203dcd2d124a7c1"}, + {file = "cffi-1.14.1-cp27-cp27m-win32.whl", hash = "sha256:26f33e8f6a70c255767e3c3f957ccafc7f1f706b966e110b855bfe944511f1f9"}, + {file = "cffi-1.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:b87dfa9f10a470eee7f24234a37d1d5f51e5f5fa9eeffda7c282e2b8f5162eb1"}, + {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:effd2ba52cee4ceff1a77f20d2a9f9bf8d50353c854a282b8760ac15b9833168"}, + {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bac0d6f7728a9cc3c1e06d4fcbac12aaa70e9379b3025b27ec1226f0e2d404cf"}, + {file = "cffi-1.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d6033b4ffa34ef70f0b8086fd4c3df4bf801fee485a8a7d4519399818351aa8e"}, + {file = "cffi-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8416ed88ddc057bab0526d4e4e9f3660f614ac2394b5e019a628cdfff3733849"}, + {file = "cffi-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:892daa86384994fdf4856cb43c93f40cbe80f7f95bb5da94971b39c7f54b3a9c"}, + {file = "cffi-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:c991112622baee0ae4d55c008380c32ecfd0ad417bcd0417ba432e6ba7328caa"}, + {file = "cffi-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fcf32bf76dc25e30ed793145a57426064520890d7c02866eb93d3e4abe516948"}, + {file = "cffi-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f960375e9823ae6a07072ff7f8a85954e5a6434f97869f50d0e41649a1c8144f"}, + {file = "cffi-1.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a6d28e7f14ecf3b2ad67c4f106841218c8ab12a0683b1528534a6c87d2307af3"}, + {file = "cffi-1.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cda422d54ee7905bfc53ee6915ab68fe7b230cacf581110df4272ee10462aadc"}, + {file = "cffi-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:4a03416915b82b81af5502459a8a9dd62a3c299b295dcdf470877cb948d655f2"}, + {file = "cffi-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:4ce1e995aeecf7cc32380bc11598bfdfa017d592259d5da00fc7ded11e61d022"}, + {file = "cffi-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e23cb7f1d8e0f93addf0cae3c5b6f00324cccb4a7949ee558d7b6ca973ab8ae9"}, + {file = "cffi-1.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ddff0b2bd7edcc8c82d1adde6dbbf5e60d57ce985402541cd2985c27f7bec2a0"}, + {file = "cffi-1.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f90c2267101010de42f7273c94a1f026e56cbc043f9330acd8a80e64300aba33"}, + {file = "cffi-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:3cd2c044517f38d1b577f05927fb9729d3396f1d44d0c659a445599e79519792"}, + {file = "cffi-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fa72a52a906425416f41738728268072d5acfd48cbe7796af07a923236bcf96"}, + {file = "cffi-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc"}, + {file = "cffi-1.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939"}, + {file = "cffi-1.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe"}, + {file = "cffi-1.14.1-cp38-cp38-win32.whl", hash = "sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995"}, + {file = "cffi-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90"}, + {file = "cffi-1.14.1.tar.gz", hash = "sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f"}, +] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, @@ -1150,6 +1330,27 @@ coverage = [ {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, ] +cryptography = [ + {file = "cryptography-3.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83"}, + {file = "cryptography-3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a"}, + {file = "cryptography-3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f"}, + {file = "cryptography-3.0-cp27-cp27m-win32.whl", hash = "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6"}, + {file = "cryptography-3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f"}, + {file = "cryptography-3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b"}, + {file = "cryptography-3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67"}, + {file = "cryptography-3.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd"}, + {file = "cryptography-3.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77"}, + {file = "cryptography-3.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c"}, + {file = "cryptography-3.0-cp35-cp35m-win32.whl", hash = "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b"}, + {file = "cryptography-3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07"}, + {file = "cryptography-3.0-cp36-cp36m-win32.whl", hash = "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559"}, + {file = "cryptography-3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71"}, + {file = "cryptography-3.0-cp37-cp37m-win32.whl", hash = "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2"}, + {file = "cryptography-3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756"}, + {file = "cryptography-3.0-cp38-cp38-win32.whl", hash = "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261"}, + {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, + {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, +] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, @@ -1196,6 +1397,10 @@ isort = [ {file = "isort-5.2.2-py3-none-any.whl", hash = "sha256:aea484023188ef1c38256dd24afa96e914adafe3a911a1786800a74e433006d1"}, {file = "isort-5.2.2.tar.gz", hash = "sha256:96b27045e3187b9bdde001143b79f9b10a462f372bff7062302818013b6c86f3"}, ] +jeepney = [ + {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, + {file = "jeepney-0.4.3.tar.gz", hash = "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e"}, +] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, @@ -1206,6 +1411,10 @@ joblib = [ {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, ] +keyring = [ + {file = "keyring-21.2.1-py3-none-any.whl", hash = "sha256:3401234209015144a5d75701e71cb47239e552b0882313e9f51e8976f9e27843"}, + {file = "keyring-21.2.1.tar.gz", hash = "sha256:c53e0e5ccde3ad34284a40ce7976b5b3a3d6de70344c3f8ee44364cc340976ec"}, +] livereload = [ {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, ] @@ -1313,6 +1522,10 @@ pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] pyflakes = [ {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, @@ -1355,6 +1568,10 @@ pytest-rerunfailures = [ {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, ] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, @@ -1403,6 +1620,10 @@ 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"}, ] +rfc3986 = [ + {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, + {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, +] 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"}, @@ -1416,6 +1637,10 @@ scandir = [ {file = "scandir-1.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d"}, {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, ] +secretstorage = [ + {file = "SecretStorage-3.1.2-py3-none-any.whl", hash = "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b"}, + {file = "SecretStorage-3.1.2.tar.gz", hash = "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6"}, +] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, @@ -1442,6 +1667,8 @@ tqdm = [ twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, + {file = "twine-3.2.0-py3-none-any.whl", hash = "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472"}, + {file = "twine-3.2.0.tar.gz", hash = "sha256:34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, @@ -1485,4 +1712,6 @@ webencodings = [ 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"}, ] From d4d92892def7a91183665f0becd9a4dd4ca50cdf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 15:59:54 -0500 Subject: [PATCH 40/85] build(libvcs): Use pypi fork See also: - https://pypi.org/project/mkapi-git-pull/ - https://github.com/python-poetry/poetry/issues/2176 - https://github.com/python-poetry/poetry/issues/2391 --- poetry.lock | 31 +++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index 389371a7..2cd3cc00 100644 --- a/poetry.lock +++ b/poetry.lock @@ -10,7 +10,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\" or python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -19,7 +19,6 @@ 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\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -151,7 +150,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\"" +marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -314,7 +313,6 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" -marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" @@ -497,9 +495,9 @@ version = "0.6.1" [[package]] category = "dev" -description = "An Auto API Documentation tool." +description = "Fork of mkapi since poetry fails with git + python verson constraint" marker = "python_version >= \"3.7\"" -name = "mkapi" +name = "mkapi-git-pull" optional = false python-versions = ">=3.7" version = "1.0.12" @@ -508,10 +506,6 @@ version = "1.0.12" jinja2 = "*" markdown = "*" -[package.source] -reference = "b2888ec059f548e1ca65d2c3f96c639c0a5e5b36" -type = "git" -url = "https://github.com/tony/mkapi" [[package]] category = "dev" description = "Project documentation with Markdown." @@ -597,7 +591,6 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" -marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -657,7 +650,7 @@ version = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -689,7 +682,6 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -706,7 +698,6 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -768,7 +759,6 @@ Markdown = ">=3.2" [[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.*" @@ -1052,7 +1042,6 @@ version = "1.15.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\"" name = "toml" optional = false python-versions = "*" @@ -1177,7 +1166,7 @@ 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.5\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1195,7 +1184,7 @@ 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\" or python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=3.6" @@ -1206,7 +1195,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "4b02b21ac9455add55e32c6373d8de8da9c955e9b2cb1ac32e7f583b94313c4b" +content-hash = "de585c376ed01e73efa6774d7dd539ad3cd3be1ab0c1cf0abb0361293ee37368" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1465,7 +1454,9 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mkapi = [] +mkapi-git-pull = [ + {file = "mkapi-git-pull-1.0.12.tar.gz", hash = "sha256:8114e70a71f9b68184eb0bcc72fbb34ae031f49074d6bf64c28b8e4164c24b0a"}, +] mkdocs = [ {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, diff --git a/pyproject.toml b/pyproject.toml index b6749c5f..93537aa7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,6 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -mkapi = {git = "https://github.com/tony/mkapi", rev = "git-pull", extras = ["docs"], python = ">=3.7"} mkdocs = {version = "^1.1.2", extras = ["docs"], python = ">=3.5"} mkdocs-material = {version = "^5.5.1", extras = ["docs"], python = ">=3.5"} +mkapi-git-pull = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} From 73e2f002fe4452310c39866748d4f064c6ac1cec Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 16:11:13 -0500 Subject: [PATCH 41/85] docs: Add instructions for editing documentation --- docs/developing.md | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/docs/developing.md b/docs/developing.md index 5fcfec2d..ee42b86e 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -1,14 +1,11 @@ -Development -=========== +# Development -Testing -------- +## Testing Our tests are inside `tests/`. Tests are implemented using [pytest](http://pytest.org/). -Install the latest code from git --------------------------------- +## Install the latest code from git ### Using pip @@ -59,8 +56,7 @@ Then activate it to your current tty / terminal session with: That is it! You are now ready to code! -Test Runner ------------ +## Test Runner As you seen above, the `libvcs` command will now be available to you, since you are in the virtual environment, your Date: Sun, 2 Aug 2020 16:11:30 -0500 Subject: [PATCH 42/85] docs(mkdocs): Add developing.md to navbar --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 87c9c030..c0d51356 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,4 +23,5 @@ plugins: nav: - index.md - history.md + - developing.md - API: mkapi/api/libvcs From d6e369c82b13df0686faf407ccf9f755ac183b14 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 16:37:07 -0500 Subject: [PATCH 43/85] build: ignore .vim/ --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0c5a335b..991b92c1 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,6 @@ pip-wheel-metadata/ # mkdocs site/ + +# vim +.vim/ From e3fc2cb60d9a426e3d8df4e550fe8ea4b149638f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 17:39:08 -0500 Subject: [PATCH 44/85] docs(hg,svn,util,shortcuts): Update to use markdown, numpy styling --- libvcs/hg.py | 12 +++----- libvcs/shortcuts.py | 63 +++++++++++++++++++------------------ libvcs/svn.py | 45 +++++++++++---------------- libvcs/util.py | 75 +++++++++++++++++++++++++-------------------- 4 files changed, 98 insertions(+), 97 deletions(-) diff --git a/libvcs/hg.py b/libvcs/hg.py index 4f6ba3a8..06e8624c 100644 --- a/libvcs/hg.py +++ b/libvcs/hg.py @@ -1,16 +1,12 @@ # -*- coding: utf-8 -*- """Mercurial Repo object for libvcs. -libvcs.hg -~~~~~~~~~ - The following is from pypa/pip (MIT license): -- :py:meth:`MercurialRepo.get_url_and_revision_from_pip_url` -- :py:meth:`MercurialRepo.get_url` -- :py:meth:`MercurialRepo.get_revision` - -""" +- [`MercurialRepo.get_url_and_revision_from_pip_url`](libvcs.hg.get_url_and_revision_from_pip_url) +- [`MercurialRepo.get_url`](libvcs.hg.MercurialRepo.get_url) +- [`MercurialRepo.get_revision`](libvcs.hg.MercurialRepo.get_revision) +""" # NOQA E5 from __future__ import absolute_import, print_function, unicode_literals import logging diff --git a/libvcs/shortcuts.py b/libvcs/shortcuts.py index d374d604..a5210a25 100644 --- a/libvcs/shortcuts.py +++ b/libvcs/shortcuts.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +"""Shortcuts""" from __future__ import absolute_import, print_function, unicode_literals from libvcs import GitRepo, MercurialRepo, SubversionRepo @@ -8,20 +9,23 @@ def create_repo(url, vcs, **kwargs): r"""Return a object representation of a VCS repository. - :returns: instance of a repository object - :rtype: :class:`libvcs.svn.SubversionRepo`, :class:`libvcs.git.GitRepo` or - :class:`libvcs.hg.MercurialRepo`. + Returns + ------- + `libvcs.svn.SubversionRepo`, `libvcs.git.GitRepo`, or `libvcs.hg.MercurialRepo`. - Usage Example:: + Examples + -------- - >>> from libvcs.shortcuts import create_repo + >>> from libvcs.shortcuts import create_repo + >>> + >>> r = create_repo( + ... url='https://www.github.com/you/myrepo', + ... vcs='git', + ... repo_dir='/tmp/myrepo' + ... ) - >>> r = create_repo( - ... url='https://www.github.com/you/myrepo', - ... vcs='git', - ... repo_dir='/tmp/myrepo') + >>> r.update_repo() - >>> r.update_repo() |myrepo| (git) Repo directory for myrepo (git) does not exist @ \ /tmp/myrepo |myrepo| (git) Cloning. @@ -46,29 +50,30 @@ def create_repo(url, vcs, **kwargs): def create_repo_from_pip_url(pip_url, **kwargs): r"""Return a object representation of a VCS repository via pip-style url. - :returns: instance of a repository object - :rtype: :class:`libvcs.svn.SubversionRepo`, :class:`libvcs.git.GitRepo` or - :class:`libvcs.hg.MercurialRepo`. + Returns + ------- + `libvcs.svn.SubversionRepo`, `libvcs.git.GitRepo`, or `libvcs.hg.MercurialRepo`. - Usage Example:: + Examples + -------- - >>> from libvcs.shortcuts import create_repo_from_pip_url + >>> from libvcs.shortcuts import create_repo_from_pip_url - >>> r = create_repo_from_pip_url( - ... pip_url='git+https://www.github.com/you/myrepo', - ... repo_dir='/tmp/myrepo') + >>> r = create_repo_from_pip_url( + ... pip_url='git+https://www.github.com/you/myrepo', + ... repo_dir='/tmp/myrepo') - >>> r.update_repo() - |myrepo| (git) Repo directory for myrepo (git) does not exist @ \ - /tmp/myrepo - |myrepo| (git) Cloning. - |myrepo| (git) git clone https://www.github.com/tony/myrepo \ - /tmp/myrepo - Cloning into '/tmp/myrepo'... - Checking connectivity... done. - |myrepo| (git) git fetch - |myrepo| (git) git pull - Already up-to-date. + >>> r.update_repo() + |myrepo| (git) Repo directory for myrepo (git) does not exist @ \ + /tmp/myrepo + |myrepo| (git) Cloning. + |myrepo| (git) git clone https://www.github.com/tony/myrepo \ + /tmp/myrepo + Cloning into '/tmp/myrepo'... + Checking connectivity... done. + |myrepo| (git) git fetch + |myrepo| (git) git pull + Already up-to-date. """ if pip_url.startswith('git+'): return GitRepo.from_pip_url(pip_url, **kwargs) diff --git a/libvcs/svn.py b/libvcs/svn.py index f0a66bd6..dbec084d 100644 --- a/libvcs/svn.py +++ b/libvcs/svn.py @@ -2,21 +2,17 @@ # -*- coding: utf-8 -*- """Subversion object for libvcs. -libvcs.svn -~~~~~~~~~~ - The follow are from saltstack/salt (Apache license): -- :py:meth:`SubversionRepo.get_revision_file` +- [`SubversionRepo.get_revision_file`](libvcs.svn.SubversionRepo.get_revision_file) The following are pypa/pip (MIT license): -- :py:meth:`SubversionRepo.get_url_and_revision_from_pip_url` -- :py:meth:`SubversionRepo.get_url` -- :py:meth:`SubversionRepo.get_revision` -- :py:meth:`~.get_rev_options` - -""" +- [`SubversionRepo.get_url_and_revision_from_pip_url`](libvcs.svn.SubversionRepo.get_url_and_revision_from_pip_url) +- [`SubversionRepo.get_url`](libvcs.svn.SubversionRepo.get_url) +- [`SubversionRepo.get_revision`](libvcs.svn.SubversionRepo.get_revision) +- [`get_rev_options`](libvcs.svn.get_rev_options) +""" # NOQA: E5 from __future__ import absolute_import, print_function, unicode_literals import logging @@ -36,18 +32,19 @@ class SubversionRepo(BaseRepo): def __init__(self, url, **kwargs): """A svn repository. - :param url: URL in subversion repository - :type url: str + Parameters + ---------- + url : str + URL in subversion repository - :param svn_username: username to use for checkout and update - :type svn_username: str or None + svn_username : str, optional + username to use for checkout and update - :param svn_password: password to use for checkout and update - :type svn_password: str or None + svn_password : str, optional + password to use for checkout and update - :param svn_trust_cert: trust the Subversion server site certificate - (default False) - :type svn_trust_cert: bool + svn_trust_cert : bool + trust the Subversion server site certificate, default False """ if 'svn_trust_cert' not in kwargs: self.svn_trust_cert = False @@ -87,9 +84,7 @@ def get_revision_file(self, location): return int(dict(info_list)['Revision']) def get_revision(self, location=None): - """ - Return the maximum revision for all files under a given location - """ + """Return maximum revision for all files under a given location""" if not location: location = self.url @@ -146,11 +141,7 @@ def update_repo(self, dest=None): def get_rev_options(url, rev): - """Return revision options. - - from pip pip.vcs.subversion. - - """ + """Return revision options. From pip pip.vcs.subversion.""" if rev: rev_options = ['-r', rev] else: diff --git a/libvcs/util.py b/libvcs/util.py index dc7df95c..bfaeaf89 100644 --- a/libvcs/util.py +++ b/libvcs/util.py @@ -1,10 +1,5 @@ # -*- coding: utf-8 -*- -"""Utility functions for libvcs. - -libvcs.util -~~~~~~~~~~~ - -""" +"""Utility functions for libvcs.""" from __future__ import absolute_import, print_function, unicode_literals import datetime @@ -26,11 +21,17 @@ def which( from salt.util - https://www.github.com/saltstack/salt - license apache - :param exe: Application to search PATHs for. - :type exe: str - :param default_path: Application to search PATHs for. - :type default_path: list - :rtype: str + Parameters + ---------- + exe : str + Application to search PATHs for. + default_path : list + Application to search PATHs for. + + Returns + ------- + str : + Path to binary """ def _is_executable_file_or_link(exe): @@ -66,8 +67,10 @@ def _is_executable_file_or_link(exe): def mkdir_p(path): """Make directories recursively. - :param path: path to create - :type path: str + Parameters + ---------- + path : str + path to create """ try: os.makedirs(path) @@ -82,7 +85,7 @@ class RepoLoggingAdapter(logging.LoggerAdapter): """Adapter for adding Repo related content to logger. - Extends :class:`logging.LoggerAdapter`'s functionality. + Extends `logging.LoggerAdapter`'s functionality. The standard library :py:mod:`logging` facility is pretty complex, so this warrants and explanation of what's happening. @@ -96,7 +99,6 @@ class RepoLoggingAdapter(logging.LoggerAdapter): logging.LoggerAdapter.process()` to be made use of when the user of this library wishes to use a custom :class:`logging.Formatter` to output results. - """ def __init__(self, *args, **kwargs): @@ -124,30 +126,37 @@ def run( """ Run 'cmd' in a shell and return the combined contents of stdout and stderr (Blocking). Throws an exception if the command exits non-zero. - :param cmd: list of str (or single str, if shell==True) indicating + Parameters + ---------- + cmd : list or str, or single str, if shell=True the command to run - :param shell: boolean indicating whether we are using advanced shell + + shell : boolean + boolean indicating whether we are using advanced shell features. Use only when absolutely necessary, since this allows a lot more freedom which could be exploited by malicious code. See the warning here: http://docs.python.org/library/subprocess.html#popen-constructor - :param cwd: dir command is run from. - :type cwd: str - :param log_in_real_time: boolean indicating whether to read stdout from the + + cwd : str + dir command is run from. Defaults to ``path``. + + log_in_real_time : boolean + boolean indicating whether to read stdout from the subprocess in real time instead of when the process finishes. - :param check_returncode: Indicate whether a :exc:`~exc.CommandError` - should be raised if return code is different from 0. - :type check_returncode: :class:`bool` - :param cwd: dir command is run from, defaults :attr:`~.path`. - :type cwd: str - :param callback: callback to return output as a command executes, accepts - a function signature of ``(output, timestamp)``. Example usage:: - - def progress_cb(output, timestamp): - sys.stdout.write(output) - sys.stdout.flush() - run(['git', 'pull'], callback=progrses_cb) - :type callback: func + + check_returncode : bool + Indicate whether a `libvcs.exc.CommandError` should be raised if return code is + different from 0. + + callback : callable + callback to return output as a command executes, accepts a function signature + of `(output, timestamp)`. Example usage: + + def progress_cb(output, timestamp): + sys.stdout.write(output) + sys.stdout.flush() + run(['git', 'pull'], callback=progrses_cb) """ proc = subprocess.Popen( cmd, shell=shell, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd=cwd, From 7a947dccdbebe824cadcef28ac29dfd73d1aca55 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 17:56:34 -0500 Subject: [PATCH 45/85] build(mkapi): Update fork to 1.0.12post1 Includes fix for https://github.com/daizutabi/mkapi/pull/27 --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2cd3cc00..90364d97 100644 --- a/poetry.lock +++ b/poetry.lock @@ -500,7 +500,7 @@ marker = "python_version >= \"3.7\"" name = "mkapi-git-pull" optional = false python-versions = ">=3.7" -version = "1.0.12" +version = "1.0.12.post1" [package.dependencies] jinja2 = "*" @@ -1166,7 +1166,7 @@ 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.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1184,7 +1184,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[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.5\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=3.6" @@ -1455,7 +1455,7 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mkapi-git-pull = [ - {file = "mkapi-git-pull-1.0.12.tar.gz", hash = "sha256:8114e70a71f9b68184eb0bcc72fbb34ae031f49074d6bf64c28b8e4164c24b0a"}, + {file = "mkapi-git-pull-1.0.12.post1.tar.gz", hash = "sha256:eba245518808a67ba0e6068269d68224ccff324460ecf179cacae8c2122c3ef4"}, ] mkdocs = [ {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, From 7837f34a4d4ffcfcf628fc17034be91a01d4856e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 18:03:47 -0500 Subject: [PATCH 46/85] docs(base): Port to markdown, numpy styling --- libvcs/base.py | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/libvcs/base.py b/libvcs/base.py index ed355e10..2bf0a11f 100644 --- a/libvcs/base.py +++ b/libvcs/base.py @@ -1,10 +1,5 @@ # -*- coding: utf-8 -*- -"""Base class for Repository objects. - -libvcs.base -~~~~~~~~~~~ - -""" +"""Base class for Repository objects.""" from __future__ import absolute_import, print_function, unicode_literals import logging @@ -22,7 +17,6 @@ class BaseRepo(RepoLoggingAdapter, object): """Base class for repositories. Extends :py:class:`logging.LoggerAdapter`. - """ #: log command output to buffer @@ -33,14 +27,16 @@ class BaseRepo(RepoLoggingAdapter, object): def __init__(self, url, repo_dir, progress_callback=None, *args, **kwargs): """ - :param callback: Retrieve live progress from ``sys.stderr`` (useful for - certain vcs commands like ``git pull``. Use ``progress_callback``:: - - def progress_cb(output, timestamp): - sys.stdout.write(output) - sys.stdout.flush() - create_repo(..., progress_callback=progress_cb) - :type callback: func + Parameters + ---------- + callback : func + Retrieve live progress from ``sys.stderr`` (useful for certain vcs commands + like ``git pull``. Use ``progress_callback``: + + >>> def progress_cb(output, timestamp): + >>> sys.stdout.write(output) + >>> sys.stdout.flush() + >>> create_repo(..., progress_callback=progress_cb) """ self.progress_callback = progress_callback self.url = url @@ -77,17 +73,21 @@ def run( """Return combined stderr/stdout from a command. This method will also prefix the VCS command bin_name. By default runs - using the cwd :attr:`~.path` of the repo. + using the cwd `libvcs.base.BaseRepo.path` of the repo. - :param cwd: dir command is run from, defaults :attr:`~.path`. - :type cwd: str + Parameters + ---------- + cwd : str + dir command is run from, defaults to `libvcs.base.BaseRepo.path`. - :param check_returncode: Indicate whether a :exc:`~exc.CommandError` - should be raised if return code is different from 0. - :type check_returncode: :class:`bool` + check_returncode : bool + Indicate whether a :exc:`~exc.CommandError` should be raised if return code + is different from 0. - :returns: combined stdout/stderr in a big string, newlines retained - :rtype: str + Returns + ------- + str + combined stdout/stderr in a big string, newlines retained """ if cwd is None: @@ -124,7 +124,7 @@ def check_destination(self, *args, **kwargs): @classmethod def get_url_and_revision_from_pip_url(cls, pip_url): - """Return repo URL and revision by parsing :attr:`~.url`.""" + """Return repo URL and revision by parsing `libvcs.base.BaseRepo.url`.""" error_message = ( "Sorry, '%s' is a malformed VCS url. " "The format is +://, " From 99f3bb534b619d02abbab8bb55e9c623aad40cee Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 18:19:23 -0500 Subject: [PATCH 47/85] docs: Remove tilde style header --- libvcs/__init__.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libvcs/__init__.py b/libvcs/__init__.py index a184ff00..4c7effe9 100644 --- a/libvcs/__init__.py +++ b/libvcs/__init__.py @@ -1,10 +1,5 @@ # -*- coding: utf-8 -*- -"""Repo package for libvcs. - -libvcs -~~~~~~ - -""" +"""Repo package for libvcs.""" from __future__ import absolute_import, print_function, unicode_literals import logging From 009e2307a91fed1f0445cc6862e2db59a03d9758 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 18:29:18 -0500 Subject: [PATCH 48/85] docs(git): Remove admonitions, fix return types --- libvcs/git.py | 103 ++++++++++++++++---------------------------------- 1 file changed, 32 insertions(+), 71 deletions(-) diff --git a/libvcs/git.py b/libvcs/git.py index d3cef88b..7469514e 100644 --- a/libvcs/git.py +++ b/libvcs/git.py @@ -30,9 +30,7 @@ GitRemote = collections.namedtuple('GitRemote', ['name', 'fetch_url', 'push_url']) """Structure containing git repo information. -Supports :meth:`collections.namedtuple._asdict()` - -.. versionadded:: 0.4.0 +Supports `collections.namedtuple._asdict()` """ @@ -41,7 +39,7 @@ def extract_status(value): Returns ------- - dict : + dict Dictionary of git repo's status """ pattern = re.compile( @@ -98,24 +96,20 @@ class GitRepo(BaseRepo): def __init__(self, url, **kwargs): """A git repository. - :param url: URL of repo - :type url: str - - :param git_shallow: clone with ``--depth 1`` (default False) - :type git_shallow: bool - - :param git_submodules: Git submodules that shall be updated, all if empty - :type git_submodules: list + Parameters + ---------- + url : str + URL of repo - :param tls_verify: Should certificate for https be checked (default False) - :type tls_verify: bool + git_shallow : bool + clone with `--depth 1`, default `False` - .. versionchanged:: 0.4.0 + git_submodules : list + Git submodules that shall be updated, all if empty - The ``remotes`` argument is ignored. Use :meth:`~.set_remote` to set remotes - before running :meth:`~.obtain`. + tls_verify : bool + Should certificate for https be checked (default False) - The ``remotes`` argument is deprecated and will be removed in 0.5 """ if 'git_shallow' not in kwargs: self.git_shallow = False @@ -165,13 +159,7 @@ def get_url_and_revision_from_pip_url(cls, pip_url): return url, rev def obtain(self): - """Retrieve the repository, clone if doesn't exist. - - .. versionchanged:: 0.4.0 - - No longer sets remotes. This is now done manually through - :meth:`~.set_remote`. - """ + """Retrieve the repository, clone if doesn't exist.""" self.check_destination() url = self.url @@ -345,25 +333,14 @@ def update_repo(self): def remotes(self, flat=False): """Return remotes like git remote -v. - :param flat: Return a dict of ``tuple`` instead of ``dict``. Default False. - :type flat: bool - - .. versionchanged:: 0.4.0 - - Has been changed from property to method - - .. versionchanged:: 0.4.0 - - The ``flat`` argument has been added to return remotes in ``tuple`` form - - .. versionchanged:: 0.4.0 - - This used to return a dict of tuples, it now returns a dict of dictionaries - with ``name``, ``fetch_url``, and ``push_url``. + Parameters + ---------- + flat : bool + Return a dict of ``tuple`` instead of ``dict``, default `False`. Returns ------- - dict : + dict dict of git upstream / remote URLs """ remotes = {} @@ -379,12 +356,6 @@ def remotes(self, flat=False): @property def remotes_get(self): - """ - .. versionchanged:: 0.4.0 - - The ``remotes_get`` property is deprecated and will be removed in 0.5. It - has been renamed ``remotes()`` and changed from property to a method. - """ warnings.warn( "'remotes_get' is deprecated and will be removed in 0.5. " "Use 'remotes()' method instead.", @@ -404,13 +375,8 @@ def remote(self, name, **kwargs): Returns ------- - :class:`libvcs.git.GitRemote` : + [`GitRemote`](libvcs.git.GitRemote) Remote name and url in tuple form - - .. versionchanged:: 0.4.0 - - The ``remote`` argument was renamed to ``name`` and will be deprecated - in 0.5. """ if kwargs.get('remote') is not None: @@ -437,11 +403,11 @@ def remote(self, name, **kwargs): return None def remote_get(self, name='origin', **kwargs): - """ - .. versionchanged:: 0.4.0 + """Retrieve remote - The ``remote_get`` method is deprecated and will be removed in 0.5.0. It has - been renamed ``remote`` + !!! note + The ``remote_get`` method is deprecated and will be removed in 0.5.0. It has + been renamed ``remote`` """ warnings.warn( "'remote_get' is deprecated and will be removed in 0.5. " @@ -455,12 +421,13 @@ def remote_get(self, name='origin', **kwargs): def set_remote(self, name, url, overwrite=False): """Set remote with name and URL like git remote add. - :param name: defines the remote name. - :type name: str - :param url: defines the remote URL - :type url: str + Parameters + ---------- + name : str + defines the remote name. - .. versionadded:: 0.4.0 + url : str + defines the remote URL """ url = self.chomp_protocol(url) @@ -472,12 +439,6 @@ def set_remote(self, name, url, overwrite=False): return self.remote(name=name) def remote_set(self, url, name='origin', overwrite=False, **kwargs): - """ - .. versionchanged:: 0.4.0 - - The ``remote_set`` method is deprecated and will be removed in 0.5.0. It has - been renamed ``set_remote``. - """ warnings.warn( "'remote_set' is deprecated and will be removed in 0.5. " "Use 'set_remote' instead.", @@ -498,7 +459,7 @@ def chomp_protocol(url): Returns ------- - str : + str URL as VCS software would accept it """ if '+' in url: @@ -521,7 +482,7 @@ def get_git_version(self): Returns ------- - str : + str git version """ VERSION_PFX = 'git version ' @@ -562,7 +523,7 @@ def get_current_remote_name(self): Returns ------- - str : + str If upstream the same, returns ``branch_name``. If upstream mismatches, returns ``remote_name/branch_name``. """ From dbd630c7060e0455fbb0bec9ba74d8828d448fc4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Aug 2020 21:01:19 -0500 Subject: [PATCH 49/85] Revert "ci(poetry): Remove virtualdirs being configured locally by default" This reverts commit a94cd4fd11e87d05d80cc6ee59809fb908ac82cc. --- poetry.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 poetry.toml diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 00000000..ab1033bd --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true From 11b0e6a4e9adafb60fd6fe3985e0dd4c2c36d58d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Aug 2020 05:52:50 -0500 Subject: [PATCH 50/85] build(publish-docs): Only invalidate html files --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 2b71a24a..74cd7c53 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -79,7 +79,7 @@ jobs: - name: Generate list of changed files for CloudFront to invalidate run: | - pushd site; FILES=$(find . -name \* -print | cut -c2- | sort | uniq | tr '\n' ' '); popd + pushd site; 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 From 80d16d1a48ead46e0a0b158e34680ebfd75801f4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Aug 2020 18:30:53 -0500 Subject: [PATCH 51/85] Revert "build(sphinx): Remove reStructuredText files" This reverts commit 6f5df558daa2a1ed37608627b3de873e59f513bf. --- README.rst | 117 ++++++++++++++++++++++++++++++++++++++ docs/api.rst | 70 +++++++++++++++++++++++ docs/conf.py | 111 ++++++++++++++++++++++++++++++++++++ docs/developing.rst | 129 ++++++++++++++++++++++++++++++++++++++++++ docs/history.rst | 8 +++ docs/index.rst | 17 ++++++ docs/requirements.txt | 1 + requirements/dev.txt | 3 + 8 files changed, 456 insertions(+) create mode 100644 README.rst create mode 100644 docs/api.rst create mode 100644 docs/conf.py create mode 100644 docs/developing.rst create mode 100644 docs/history.rst create mode 100644 docs/index.rst create mode 100644 docs/requirements.txt create mode 100644 requirements/dev.txt diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..d6490e3c --- /dev/null +++ b/README.rst @@ -0,0 +1,117 @@ +``libvcs`` - abstraction layer for vcs, powers `vcspull`_. + +|pypi| |docs| |build-status| |coverage| |license| + +Install: + +.. code-block:: sh + + $ pip install libvcs + +Open up python: + +.. code-block:: sh + + $ python + + # or for nice autocomplete and syntax highlighting + $ pip install ptpython + $ ptpython + +Create a `Repo`_ object of the project to inspect / checkout / update: + +.. code-block:: python + + >>> from libvcs.shortcuts import create_repo_from_pip_url, create_repo + + # repo is an object representation of a vcs repository. + >>> r = create_repo(url='https://www.github.com/vcs-python/libtmux', + ... vcs='git', + ... repo_dir='/tmp/libtmux') + + # or via pip-style URL + >>> r = create_repo_from_pip_url( + ... pip_url='git+https://www.github.com/vcs-python/libtmux', + ... repo_dir='/tmp/libtmux') + +Update / clone repo: + +.. code-block:: python + + # it may or may not be checked out/cloned on the system yet + >>> r.update_repo() + +Get revision: + +.. code-block:: python + + >>> r.get_revision() + u'5c227e6ab4aab44bf097da2e088b0ff947370ab8' + +Donations +--------- + +Your donations fund development of new features, testing and support. +Your money will go directly to maintenance and development of the project. +If you are an individual, feel free to give whatever feels right for the +value you get out of the project. + +See donation options at https://www.git-pull.com/support.html. + +More information +---------------- + +============== ========================================================== +Python support Python 2.7, >= 3.4, pypy +VCS supported git(1), svn(1), hg(1) +Source https://github.com/vcs-python/libvcs +Docs https://libvcs.git-pull.com +Changelog https://libvcs.git-pull.com/en/latest/history.html +API https://libvcs.git-pull.com/en/latest/api.html +Issues https://github.com/vcs-python/libvcs/issues +Travis https://travis-ci.org/vcs-python/libvcs +Test Coverage https://codecov.io/gh/vcs-python/libvcs +pypi https://pypi.python.org/pypi/libvcs +Open Hub https://www.openhub.net/p/libvcs +License `MIT`_. +git repo .. code-block:: bash + + $ git clone https://github.com/vcs-python/libvcs.git +install dev .. code-block:: bash + + $ git clone https://github.com/vcs-python/libvcs.git libvcs + $ cd ./libvcs + $ virtualenv .venv + $ source .venv/bin/activate + $ pip install -e . +tests .. code-block:: bash + + $ py.test +============== ========================================================== + +.. _MIT: https://opensource.org/licenses/MIT +.. _Documentation: https://libvcs.git-pull.com/en/latest/ +.. _API: https://libvcs.git-pull.com/en/latest/api.html +.. _pip: http://www.pip-installer.org/en/latest/ +.. _vcspull: https://www.github.com/vcs-python/vcspull/ +.. _Repo: https://libvcs.git-pull.com/en/latest/api.html#creating-a-repo-object + +.. |pypi| image:: https://img.shields.io/pypi/v/libvcs.svg + :alt: Python Package + :target: http://badge.fury.io/py/libvcs + +.. |build-status| image:: https://img.shields.io/travis/vcs-python/libvcs.svg + :alt: Build Status + :target: https://travis-ci.org/vcs-python/libvcs + +.. |coverage| image:: https://codecov.io/gh/vcs-python/libvcs/branch/master/graph/badge.svg + :alt: Code Coverage + :target: https://codecov.io/gh/vcs-python/libvcs + +.. |license| image:: https://img.shields.io/github/license/vcs-python/libvcs.svg + :alt: License + +.. |docs| image:: https://readthedocs.org/projects/libvcs/badge/?version=latest + :alt: Documentation Status + :scale: 100% + :target: https://readthedocs.org/projects/libvcs/ diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 00000000..51be33cc --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,70 @@ +.. _api: + +============= +API Reference +============= + +Creating a repo object +---------------------- + +Helper methods are available in ``libvcs.shortcuts`` which +can return a repo object from a single entry-point. + +.. autofunction:: libvcs.shortcuts.create_repo + +.. autofunction:: libvcs.shortcuts.create_repo_from_pip_url + +Instantiating a repo by hand +---------------------------- + +Tools like :func:`libvcs.shortcuts.create_repo` and +:func:`libvcs.shortcuts.create_repo_from_pip_url` are just wrappers +around instantiated these classes. + +See examples below of git, mercurial, and subversion. + +Git +--- + +.. autoclass:: libvcs.git.GitRepo + :members: + :show-inheritance: + +.. autoclass:: libvcs.git.GitRemote + :members: + :show-inheritance: + +.. autofunction:: libvcs.git.extract_status + +Mercurial +--------- + +aka ``hg(1)`` + +.. autoclass:: libvcs.hg.MercurialRepo + :members: + :show-inheritance: + +Subversion +---------- + +aka ``svn(1)`` + +.. autoclass:: libvcs.svn.SubversionRepo + :members: + :show-inheritance: + +Adding your own VCS +------------------- + +Extending libvcs can be done through subclassing ``BaseRepo``. + +.. autoclass:: libvcs.base.BaseRepo + :members: + :show-inheritance: + +Utility stuff +------------- + +.. automodule:: libvcs.util + :members: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..fe2fade4 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,111 @@ +# -*- 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("../libvcs/__about__.py") as fp: + exec(fp.read(), about) + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'sphinx.ext.napoleon', + 'alagitpull', + 'sphinx_issues', +] + +releases_unstable_prehistory = True +releases_document_name = ["history"] +releases_issue_uri = "https://github.com/vcs-python/libvcs/issues/%s" +releases_release_uri = "https://github.com/vcs-python/libvcs/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/libvcs.svg', + 'github_user': 'vcs-python', + 'github_repo': 'libvcs', + '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'] +htmlhelp_basename = '%sdoc' % about['__title__'] + +alagitpull_internal_hosts = ['libvcs.git-pull.com', '0.0.0.0'] +alagitpull_external_hosts_new_window = True + + +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), + 'pip': ('http://pip.readthedocs.io/en/latest/', None), +} diff --git a/docs/developing.rst b/docs/developing.rst new file mode 100644 index 00000000..f0f4b67b --- /dev/null +++ b/docs/developing.rst @@ -0,0 +1,129 @@ +.. _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/libvcs.git + $ cd libvcs + +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/libvcs.git + $ cd libvcs + +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 ``libvcs`` 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_util.py + +will test the ``tests/test_util.py`` tests. + +.. code-block:: bash + + $ py.test tests/test_util.py::test_mkdir_p + +tests ``test_mkdir_p`` inside of ``tests/test_util.py``. + +Multiple can be separated by spaces: + +.. code-block:: bash + + $ py.test tests/test_{git,svn}.py tests/test_util.py::test_mkdir_p + +.. _issue on github: https://github.com/vcs-python/libvcs/issues diff --git a/docs/history.rst b/docs/history.rst new file mode 100644 index 00000000..37c6fae3 --- /dev/null +++ b/docs/history.rst @@ -0,0 +1,8 @@ +.. _history: + +======= +History +======= + +.. include:: ../CHANGES + :start-line: 5 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..f49e189a --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,17 @@ +.. _index: + +###### +libvcs +###### + + +.. include:: ../README.rst + :start-line: 4 + +.. toctree:: + :maxdepth: 2 + :hidden: + + api + developing + history diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..04b4dec7 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +-r ../requirements/doc.txt diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 00000000..55161885 --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,3 @@ +flake8==3.7.7 +isort<=4.4;python_version<'3.6' +isort>=5;python_version>='3.6' From 897a60f316a4b5c9e23c97cf2fc1c73817548ae8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Aug 2020 18:47:18 -0500 Subject: [PATCH 52/85] Revert "build(docs): Remove sphinx packages" This reverts commit 9641247e9db97ea1ff6f7cdeb4e6151bef788735. --- poetry.lock | 370 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 8 ++ 2 files changed, 376 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 90364d97..392dbda5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,22 @@ +[[package]] +category = "dev" +description = "A configurable sidebar-enabled Sphinx theme" +name = "alabaster" +optional = false +python-versions = "*" +version = "0.7.12" + +[[package]] +category = "dev" +description = "Cleverly-named alabaster sub-theme for git-pull projects" +name = "alagitpull" +optional = false +python-versions = "*" +version = "0.0.23" + +[package.dependencies] +alabaster = "<0.8" + [[package]] category = "dev" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." @@ -30,6 +49,18 @@ dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.int docs = ["sphinx", "zope.interface"] tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +[[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.*" +version = "2.8.0" + +[package.dependencies] +pytz = ">=2015.7" + [[package]] category = "dev" description = "Backport of functools.lru_cache" @@ -188,6 +219,22 @@ pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] +[[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" @@ -282,6 +329,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 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.*" +version = "1.2.0" + [[package]] category = "dev" description = "Read metadata from Python packages" @@ -371,7 +427,7 @@ dev = ["testpath"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version >= \"3.5\"" +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.*" @@ -668,6 +724,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.8.0" +[[package]] +category = "dev" +description = "Python Build Reasonableness" +name = "pbr" +optional = false +python-versions = "*" +version = "5.4.5" + [[package]] category = "dev" description = "Query metadatdata from sdists / bdists / installed packages." @@ -925,6 +989,15 @@ version = "9.0" 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 = "*" +version = "2020.1" + [[package]] category = "dev" description = "" @@ -998,6 +1071,17 @@ 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 = "Validating URI References per RFC 3986" @@ -1039,6 +1123,210 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 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 = "*" +version = "2.0.0" + +[[package]] +category = "dev" +description = "Python documentation generator" +name = "sphinx" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.8.5" + +[package.dependencies] +Jinja2 = ">=2.3" +Pygments = ">=2.0" +alabaster = ">=0.7,<0.8" +babel = ">=1.3,<2.0 || >2.0" +colorama = ">=0.3.5" +docutils = ">=0.11" +imagesize = "*" +packaging = "*" +requests = ">=2.0.0" +setuptools = "*" +six = ">=1.5" +snowballstemmer = ">=1.1" +sphinxcontrib-websupport = "*" + +[package.dependencies.typing] +python = "<3.5" +version = "*" + +[package.extras] +test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] +websupport = ["sqlalchemy (>=0.9)", "whoosh (>=2.0)"] + +[[package]] +category = "dev" +description = "Python documentation generator" +name = "sphinx" +optional = false +python-versions = ">=3.5" +version = "3.1.2" + +[package.dependencies] +Jinja2 = ">=2.3" +Pygments = ">=2.0" +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = ">=0.3.5" +docutils = ">=0.12" +imagesize = "*" +packaging = "*" +requests = ">=2.5.0" +setuptools = "*" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +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 = "A Sphinx extension for linking to your project's issue tracker" +name = "sphinx-issues" +optional = false +python-versions = "*" +version = "1.2.0" + +[package.dependencies] +sphinx = "*" + +[package.extras] +dev = ["pytest", "flake8 (3.6.0)", "pre-commit (1.13.0)", "tox", "mock", "flake8-bugbear (18.8.0)"] +lint = ["flake8 (3.6.0)", "pre-commit (1.13.0)", "flake8-bugbear (18.8.0)"] +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" +version = "1.0.2" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +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" +version = "1.0.2" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +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" +version = "1.0.3" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +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" +version = "1.0.1" + +[package.extras] +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" +version = "1.0.3" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +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" +version = "1.1.4" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +category = "dev" +description = "Sphinx API for Web Apps" +marker = "python_version < \"3\"" +name = "sphinxcontrib-websupport" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +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 = "Manage dynamic plugins for Python applications" +name = "stevedore" +optional = false +python-versions = ">=3.6" +version = "3.2.0" + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=1.7.0" + [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1195,11 +1483,18 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "de585c376ed01e73efa6774d7dd539ad3cd3be1ab0c1cf0abb0361293ee37368" +content-hash = "4c94aabb38ff80b5ca0e0e7693996cc14b2fc4a235125f59778daf589720193a" lock-version = "1.0" python-versions = "~2.7 || ^3.5" [metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +alagitpull = [ + {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, +] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -1212,6 +1507,10 @@ attrs = [ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, ] +babel = [ + {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, + {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, +] "backports.functools-lru-cache" = [ {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, {file = "backports.functools_lru_cache-1.6.1.tar.gz", hash = "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"}, @@ -1340,6 +1639,10 @@ cryptography = [ {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, ] +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"}, @@ -1372,6 +1675,10 @@ idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] +imagesize = [ + {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, + {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, +] importlib-metadata = [ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, @@ -1497,6 +1804,10 @@ pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, ] +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"}, @@ -1559,6 +1870,10 @@ pytest-rerunfailures = [ {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"}, +] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, @@ -1611,6 +1926,9 @@ 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"}, +] rfc3986 = [ {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, @@ -1636,6 +1954,54 @@ six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] +snowballstemmer = [ + {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, + {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, +] +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"}, +] +sphinx-issues = [ + {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, + {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, + {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, + {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, +] +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"}, + {file = "stevedore-3.2.0-py3-none-any.whl", hash = "sha256:c8f4f0ebbc394e52ddf49de8bcc3cf8ad2b4425ebac494106bbc5e3661ac7633"}, + {file = "stevedore-3.2.0.tar.gz", hash = "sha256:38791aa5bed922b0a844513c5f9ed37774b68edc609e5ab8ab8d8fe0ce4315e5"}, +] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, diff --git a/pyproject.toml b/pyproject.toml index 93537aa7..a176ecfe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,10 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] +alagitpull = "*" black = {version="==19.10b0", python="^3.6"} +doc8 = "*" +docutils = "*" flake8 = "*" isort = [ {version="<5", python="<3.6"}, @@ -30,6 +33,11 @@ pytest = [ ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} +] +sphinx-issues = "*" twine = "*" codecov = "*" coverage = "*" From 3257d9330b7d08a0c129191df58c8778aec5bf7e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Aug 2020 18:47:45 -0500 Subject: [PATCH 53/85] Revert "chore(docs/Makefile): Remove, in favor of root Makefile commands" This reverts commit 5caac6a60e82b8268db7a862143dea0893c963c2. --- docs/Makefile | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 docs/Makefile diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..b6c24566 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,178 @@ +# Makefile for Sphinx documentation +# +PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") +HTTP_PORT = 8068 + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libvcs.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libvcs.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/libvcs" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libvcs" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +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: + if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) html; else $(MAKE) html; fi + +serve: + @echo '==============================================================' + @echo + @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' + @echo + @echo '==============================================================' + @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi + +serve_py2: + python -m SimpleHTTPServer ${HTTP_PORT} + +serve_py3: + python -m http.server ${HTTP_PORT} From 24d08f3106f19be6796288baf4b32d102b0765d6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 05:53:21 -0500 Subject: [PATCH 54/85] build(recommonmark): Add markdown support --- poetry.lock | 53 +++++++++++++++++++++++++++++++++++++------------- pyproject.toml | 1 + 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 392dbda5..55ee38b9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -52,7 +52,6 @@ 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.*" @@ -165,6 +164,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+." @@ -306,7 +321,7 @@ version = "3.2.3-2" [[package]] category = "dev" description = "Clean single-source support for Python 3 and 2" -marker = "python_version >= \"3.5\"" +marker = "python_version < \"3\" or python_version >= \"3.5\"" name = "future" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -332,7 +347,6 @@ 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.*" @@ -427,7 +441,6 @@ dev = ["testpath"] [[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.*" @@ -535,7 +548,7 @@ testing = ["coverage", "pyyaml"] [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version >= \"3.5\"" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -1033,6 +1046,19 @@ six = "*" [package.extras] md = ["cmarkgfm (>=0.2.0)"] +[[package]] +category = "dev" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +name = "recommonmark" +optional = false +python-versions = "*" +version = "0.6.0" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + [[package]] category = "dev" description = "Alternative regular expression module, to replace re." @@ -1126,7 +1152,6 @@ 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 = "*" @@ -1214,7 +1239,6 @@ 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" @@ -1227,7 +1251,6 @@ 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" @@ -1240,7 +1263,6 @@ 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" @@ -1253,7 +1275,6 @@ 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" @@ -1265,7 +1286,6 @@ 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" @@ -1278,7 +1298,6 @@ 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" @@ -1483,7 +1502,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "4c94aabb38ff80b5ca0e0e7693996cc14b2fc4a235125f59778daf589720193a" +content-hash = "82e549e4616363f9dfc4565f17ad046029d7deac8c82b7f5a57d378bc000d200" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1574,6 +1593,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"}, @@ -1895,6 +1918,10 @@ 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"}, {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, diff --git a/pyproject.toml b/pyproject.toml index a176ecfe..3a774dcc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,3 +52,4 @@ pytest-mock = [ mkdocs = {version = "^1.1.2", extras = ["docs"], python = ">=3.5"} mkdocs-material = {version = "^5.5.1", extras = ["docs"], python = ">=3.5"} mkapi-git-pull = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} +recommonmark = "^0.6.0" From 7a2347930d61432f7f1ca49bbe4cc3f4877da6b7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 05:53:28 -0500 Subject: [PATCH 55/85] build(sphinx): Port back to sphinx --- docs/.prettierignore | 1 + docs/Makefile | 10 ++- docs/{api.rst => api.md} | 37 +++++------ docs/conf.py | 23 ++++++- docs/developing.rst | 129 --------------------------------------- docs/history.rst | 8 --- docs/index.md | 1 - 7 files changed, 50 insertions(+), 159 deletions(-) create mode 100644 docs/.prettierignore rename docs/{api.rst => api.md} (79%) delete mode 100644 docs/developing.rst delete mode 100644 docs/history.rst delete mode 120000 docs/index.md diff --git a/docs/.prettierignore b/docs/.prettierignore new file mode 100644 index 00000000..40925f88 --- /dev/null +++ b/docs/.prettierignore @@ -0,0 +1 @@ +api.md diff --git a/docs/Makefile b/docs/Makefile index b6c24566..11211341 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,5 +1,6 @@ # Makefile for Sphinx documentation # +SHELL := /bin/bash PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8068 @@ -166,13 +167,16 @@ watch: serve: @echo '==============================================================' @echo - @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' + @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/' @echo @echo '==============================================================' @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi serve_py2: - python -m SimpleHTTPServer ${HTTP_PORT} + pushd _build/html; python2 -m SimpleHTTPServer ${HTTP_PORT}; popd serve_py3: - python -m http.server ${HTTP_PORT} + python -m http.server ${HTTP_PORT} --directory _build/html + +dev: + $(MAKE) -j watch serve diff --git a/docs/api.rst b/docs/api.md similarity index 79% rename from docs/api.rst rename to docs/api.md index 51be33cc..34c5fc42 100644 --- a/docs/api.rst +++ b/docs/api.md @@ -1,21 +1,19 @@ .. _api: -============= -API Reference -============= +# API Reference -Creating a repo object ----------------------- +## Creating a repo object Helper methods are available in ``libvcs.shortcuts`` which can return a repo object from a single entry-point. +```eval_rst .. autofunction:: libvcs.shortcuts.create_repo .. autofunction:: libvcs.shortcuts.create_repo_from_pip_url +``` -Instantiating a repo by hand ----------------------------- +## Instantiating a repo by hand Tools like :func:`libvcs.shortcuts.create_repo` and :func:`libvcs.shortcuts.create_repo_from_pip_url` are just wrappers @@ -23,9 +21,9 @@ around instantiated these classes. See examples below of git, mercurial, and subversion. -Git ---- +### Git +```eval_rst .. autoclass:: libvcs.git.GitRepo :members: :show-inheritance: @@ -35,36 +33,41 @@ Git :show-inheritance: .. autofunction:: libvcs.git.extract_status +``` -Mercurial ---------- +### Mercurial aka ``hg(1)`` +```eval_rst .. autoclass:: libvcs.hg.MercurialRepo :members: :show-inheritance: +``` -Subversion ----------- +### Subversion aka ``svn(1)`` +```eval_rst .. autoclass:: libvcs.svn.SubversionRepo :members: :show-inheritance: +``` -Adding your own VCS -------------------- +### Adding your own VCS Extending libvcs can be done through subclassing ``BaseRepo``. +```eval_rst .. autoclass:: libvcs.base.BaseRepo :members: :show-inheritance: +``` -Utility stuff -------------- +### Utility stuff +```eval_rst .. automodule:: libvcs.util :members: +``` diff --git a/docs/conf.py b/docs/conf.py index fe2fade4..46ffd466 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,6 +12,9 @@ with open("../libvcs/__about__.py") as fp: exec(fp.read(), about) +import recommonmark +from recommonmark.transform import AutoStructify + extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', @@ -19,6 +22,7 @@ 'sphinx.ext.napoleon', 'alagitpull', 'sphinx_issues', + 'recommonmark', ] releases_unstable_prehistory = True @@ -30,10 +34,27 @@ templates_path = ['_templates'] -source_suffix = '.rst' +source_suffix = {'.rst': 'restructuredtext', '.md': 'markdown'} master_doc = 'index' +# 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', + 'enable_auto_doc_ref': True, + 'auto_code_block': True, + 'enable_eval_rst': True, + }, + True, + ) + app.add_transform(AutoStructify) + + project = about['__title__'] copyright = about['__copyright__'] diff --git a/docs/developing.rst b/docs/developing.rst deleted file mode 100644 index f0f4b67b..00000000 --- a/docs/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/libvcs.git - $ cd libvcs - -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/libvcs.git - $ cd libvcs - -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 ``libvcs`` 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_util.py - -will test the ``tests/test_util.py`` tests. - -.. code-block:: bash - - $ py.test tests/test_util.py::test_mkdir_p - -tests ``test_mkdir_p`` inside of ``tests/test_util.py``. - -Multiple can be separated by spaces: - -.. code-block:: bash - - $ py.test tests/test_{git,svn}.py tests/test_util.py::test_mkdir_p - -.. _issue on github: https://github.com/vcs-python/libvcs/issues diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 37c6fae3..00000000 --- a/docs/history.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _history: - -======= -History -======= - -.. include:: ../CHANGES - :start-line: 5 diff --git a/docs/index.md b/docs/index.md deleted file mode 120000 index 32d46ee8..00000000 --- a/docs/index.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file From 985531567cdae42f0c897122851e32de2088261c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 05:53:58 -0500 Subject: [PATCH 56/85] Revert "chore(images): Move favicon/logo to assets/images" This reverts commit bd6bb0ad8b6ddb2728426d06d8c93c9050c3e359. --- assets/images/favicon.ico | Bin 18686 -> 30 bytes assets/images/libvcs.svg | 2 +- docs/_static/favicon.ico | Bin 0 -> 18686 bytes docs/_static/img/libvcs.svg | 1 + 4 files changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 120000 assets/images/favicon.ico mode change 100644 => 120000 assets/images/libvcs.svg create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/img/libvcs.svg diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico deleted file mode 100644 index 5c64e90c06307207971450a4d9f55579de415f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18686 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 V++UgT{`ty$cuMvENB{qj{{_}r1jzsZ diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico new file mode 120000 index 00000000..c50b150e --- /dev/null +++ b/assets/images/favicon.ico @@ -0,0 +1 @@ +../../docs/_static/favicon.ico \ No newline at end of file diff --git a/assets/images/libvcs.svg b/assets/images/libvcs.svg deleted file mode 100644 index 733305ed..00000000 --- a/assets/images/libvcs.svg +++ /dev/null @@ -1 +0,0 @@ -libvcs \ No newline at end of file diff --git a/assets/images/libvcs.svg b/assets/images/libvcs.svg new file mode 120000 index 00000000..9a858af6 --- /dev/null +++ b/assets/images/libvcs.svg @@ -0,0 +1 @@ +../../docs/_static/img/libvcs.svg \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c64e90c06307207971450a4d9f55579de415f2f GIT binary patch literal 18686 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 V++UgT{`ty$cuMvENB{qj{{_}r1jzsZ literal 0 HcmV?d00001 diff --git a/docs/_static/img/libvcs.svg b/docs/_static/img/libvcs.svg new file mode 100644 index 00000000..733305ed --- /dev/null +++ b/docs/_static/img/libvcs.svg @@ -0,0 +1 @@ +libvcs \ No newline at end of file From 9c3906312cf1aeaea5e0b7e23e635fdb0db31d6b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 05:59:06 -0500 Subject: [PATCH 57/85] build(publish-docs): Use sphinx --- .github/workflows/publish-docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 74cd7c53..6794d082 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -64,7 +64,7 @@ jobs: run: poetry install - name: Build documentation - run: poetry run mkdocs build + run: pushd docs; make SPHINXBUILD='poetry run sphinx-build' build; popd - name: Push documentation to S3 uses: jakejarvis/s3-sync-action@master @@ -75,11 +75,11 @@ jobs: 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: 'site' # optional: defaults to entire repository + SOURCE_DIR: '_build/html' # optional: defaults to entire repository - name: Generate list of changed files for CloudFront to invalidate run: | - pushd site; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + pushd _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 From 128dc1ebe5201df2a3a9c110d4068dc43c0833e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:01:05 -0500 Subject: [PATCH 58/85] chore(recommonmark): Remove unused enable_auto_doc_ref --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 46ffd466..064b3fff 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -46,7 +46,6 @@ def setup(app): #'url_resolver': lambda url: github_doc_root + url, 'enable_auto_toc_tree': True, 'auto_toc_tree_section': 'Contents', - 'enable_auto_doc_ref': True, 'auto_code_block': True, 'enable_eval_rst': True, }, From 7f9e43ac2b2f97c06955f4ced468d2d7964c3fd6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:01:39 -0500 Subject: [PATCH 59/85] docs(shortcuts,util): Fix autodoc formatting --- libvcs/shortcuts.py | 21 ++++++++++----------- libvcs/util.py | 10 +++++----- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/libvcs/shortcuts.py b/libvcs/shortcuts.py index a5210a25..c06ba97f 100644 --- a/libvcs/shortcuts.py +++ b/libvcs/shortcuts.py @@ -25,17 +25,16 @@ def create_repo(url, vcs, **kwargs): ... ) >>> r.update_repo() - - |myrepo| (git) Repo directory for myrepo (git) does not exist @ \ - /tmp/myrepo - |myrepo| (git) Cloning. - |myrepo| (git) git clone https://www.github.com/tony/myrepo \ - /tmp/myrepo - Cloning into '/tmp/myrepo'... - Checking connectivity... done. - |myrepo| (git) git fetch - |myrepo| (git) git pull - Already up-to-date. + |myrepo| (git) Repo directory for myrepo (git) does not exist @ \ + /tmp/myrepo + |myrepo| (git) Cloning. + |myrepo| (git) git clone https://www.github.com/tony/myrepo \ + /tmp/myrepo + Cloning into '/tmp/myrepo'... + Checking connectivity... done. + |myrepo| (git) git fetch + |myrepo| (git) git pull + Already up-to-date. """ if vcs == 'git': return GitRepo(url, **kwargs) diff --git a/libvcs/util.py b/libvcs/util.py index bfaeaf89..38bfc52b 100644 --- a/libvcs/util.py +++ b/libvcs/util.py @@ -151,12 +151,12 @@ def run( callback : callable callback to return output as a command executes, accepts a function signature - of `(output, timestamp)`. Example usage: + of `(output, timestamp)`. Example usage:: - def progress_cb(output, timestamp): - sys.stdout.write(output) - sys.stdout.flush() - run(['git', 'pull'], callback=progrses_cb) + def progress_cb(output, timestamp): + sys.stdout.write(output) + sys.stdout.flush() + run(['git', 'pull'], callback=progrses_cb) """ proc = subprocess.Popen( cmd, shell=shell, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd=cwd, From c2f65b8f25ec4ee4000708dc1acf6e1ce605d5ae Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:03:16 -0500 Subject: [PATCH 60/85] build(publish-docs): Fix makefile task --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 6794d082..c582ba9d 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -64,7 +64,7 @@ jobs: run: poetry install - name: Build documentation - run: pushd docs; make SPHINXBUILD='poetry run sphinx-build' build; popd + run: pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd - name: Push documentation to S3 uses: jakejarvis/s3-sync-action@master From 4587247e62587a30fb143d86423843523b02248b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:04:49 -0500 Subject: [PATCH 61/85] style(flake8): Fix imports --- docs/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 064b3fff..9a21fcd1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,6 +2,7 @@ import os import alagitpull +from recommonmark.transform import AutoStructify # Get the project root dir, which is the parent dir of this cwd = os.getcwd() @@ -12,9 +13,6 @@ with open("../libvcs/__about__.py") as fp: exec(fp.read(), about) -import recommonmark -from recommonmark.transform import AutoStructify - extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', From c6e25eb5aa251408f8bc380090f76ff960d0c73d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:05:59 -0500 Subject: [PATCH 62/85] build(publish-docs): Update build dir --- .github/workflows/publish-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index c582ba9d..311eb2d9 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -75,11 +75,11 @@ jobs: 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: '_build/html' # optional: defaults to entire repository + SOURCE_DIR: 'docs/_build/html' # optional: defaults to entire repository - name: Generate list of changed files for CloudFront to invalidate run: | - pushd _build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + 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 From 6bdc94ee2bef6ead88b703ebe7bc6b36c1ea2d90 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:09:04 -0500 Subject: [PATCH 63/85] docs(api): Remove section header --- docs/api.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/api.md b/docs/api.md index 34c5fc42..d73eaee2 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,5 +1,3 @@ -.. _api: - # API Reference ## Creating a repo object From bc8126c6bdb4bd11d41bda86467870b9a363a176 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:38:36 -0500 Subject: [PATCH 64/85] Add manifest.json (hardcoded for now) --- docs/manifest.json | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/manifest.json diff --git a/docs/manifest.json b/docs/manifest.json new file mode 100644 index 00000000..7b9246b6 --- /dev/null +++ b/docs/manifest.json @@ -0,0 +1,33 @@ +{ + "name": "libvcs", + "short_name": "libvcs", + "start_url": ".", + "display": "standalone", + "background_color": "#fff", + "description": "vcs abstraction layer", + "icons": [{ + "src": "_static/img/libvcs.svg", + "sizes": "48x48", + "type": "image/svg" + }, { + "src": "_static/img/libvcs.svg", + "sizes": "72x72", + "type": "image/svg" + }, { + "src": "_static/img/libvcs.svg", + "sizes": "96x96", + "type": "image/svg" + }, { + "src": "_static/img/libvcs.svg", + "sizes": "144x144", + "type": "image/svg" + }, { + "src": "_static/img/libvcs.svg", + "sizes": "168x168", + "type": "image/svg" + }, { + "src": "_static/img/libvcs.svg", + "sizes": "192x192", + "type": "image/svg" + }] +} From 2f9be9ec99ea85c95709cd797bac0b7bf117aec1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:43:39 -0500 Subject: [PATCH 65/85] Add example manifest --- docs/_static/img/icons/icon-128x128.png | Bin 0 -> 10194 bytes docs/_static/img/icons/icon-144x144.png | Bin 0 -> 11666 bytes docs/_static/img/icons/icon-152x152.png | Bin 0 -> 12377 bytes docs/_static/img/icons/icon-192x192.png | Bin 0 -> 16131 bytes docs/_static/img/icons/icon-384x384.png | Bin 0 -> 36305 bytes docs/_static/img/icons/icon-512x512.png | Bin 0 -> 33073 bytes docs/_static/img/icons/icon-72x72.png | Bin 0 -> 5457 bytes docs/_static/img/icons/icon-96x96.png | Bin 0 -> 7360 bytes docs/manifest.json | 76 +++++++++++++++--------- 9 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 docs/_static/img/icons/icon-128x128.png create mode 100644 docs/_static/img/icons/icon-144x144.png create mode 100644 docs/_static/img/icons/icon-152x152.png create mode 100644 docs/_static/img/icons/icon-192x192.png create mode 100644 docs/_static/img/icons/icon-384x384.png create mode 100644 docs/_static/img/icons/icon-512x512.png create mode 100644 docs/_static/img/icons/icon-72x72.png create mode 100644 docs/_static/img/icons/icon-96x96.png diff --git a/docs/_static/img/icons/icon-128x128.png b/docs/_static/img/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..159eca80c2482bb121fecf0a788caff7b5423709 GIT binary patch literal 10194 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%0DsxW(eJbsv(l(d)b_*=TE?f^X*(F+csP%xij z1tLHQd8^YWSDXc4Wdkq0RQk42YL2UqYCVTbxJ4QPpkL@aoL-Mjo$9v+GLmEdaNm8B zTNqJ>nfvj9*LaORe=;Gl`bP^T@<$8&k{Rg&`;rqA;|YnE7-6-ZAn8q0s~Kk~`diJYnQ-4d_qZ#6 znlSkgXPKa!cMQc(ar`_*&2Oa%U3{jbv~*c=a`GU%&6W*b;%l0lWD+u0JSZ6xfk7@= zvP5*c-~y5Dg9re~A4F|@WFWy*0#*f#n`2z9CmVJBve3>SVnz%>@=Q_N>0*>0{O5U(oa9SFC9D0K? z;S~GF6Hmy4pEv``EXZT^Xijlr>V}OQL6B?d;4iw!7WwTujJssaGHH z23%E}4^Twv^TbJ$6mvKa?tB74aQfOz2Be`vx4S=z;lYN&jIdOh`ZZ+<@HA56ag8oiI{UgTzG{+(9D z#0CqsZ?@+_0OKEg(684_3m_uOm4c8cqXOj-;Z%sLLtq86Y2as&eHU)C6Uau|6gFt! zuSY|v+cp^)(#AF`r#F&_dSd!?S?Yz67AQ0=BAP2D)awaq51F}_Y0R~0(a653}{vA`3Itmc>>0O+6buI3+`lP4dh1UyaEOJ zpHRDjnszxc9}rNFhzMH6Mn!!@ns8q$i2wj30r5kxx=M^1HA;FA!&Oe+2*CPT^!exF zUvuWjGk-kK>j@O3h@$@oiJR5d)j{dInwoYHrXL6xW3*D+B)VL4NtqjFr89=_g_Fdv z&ke^B6h$_2X0h?Bc*~8KA&@r&ueHCjC6bcR= z1QEd3JBZqzK<{T+FUdUYLFVB*H1IsDhyXGg6N=ga>^ERL98tw^wZbGr`nj(SCaVE5 z9YL?C*abEZ#S*OEN?pYhF!tm0-13TweBnO+eZ3X;wUkV=($YFOVq>2p6LFXoIstP5 zZ~)IE)VQEDo`L%MFw>y1!*YOqj?dzK9A=>xU`FmQD3CD?a5@!`;)UW_@HwDwMhjV) z0c?03K5_)5T~RFXern!Nlr#aB^QrXo^w#k)F$>@=4D?>iNg(sJeC6ugIM(VD2=VZa zVV?n^W^gsb2D6zgCvSqIlaV>KfZ*w%%o%h$0q-hQVh3Lq4_g+Mr)d(z}n zO4spb4hTRNQ&cu~@O1W8s=bP#0vTRUrs^?L_{e1akUknCR5^W?J;&-BsvtHuGxIMr zlJPWw(ME`XkqFxvL8F08Jcs}l!_}vdXvNQaZZn4q@a(eka>#rH=b{|=6yZ+nupEME zSl1PomVQAico$9Or8FqrB|llV0{MZ;SNvW&VT3s2a465F-Zuz$V9ANXLKJgEF87_( zW>C{#3d|q`-Lq0sTDmzoJ|3G#7t%y$`MaL|@Nmmo<(Xq|pHv(pw4MNZgZ>>oejJ+q zYI=J!wMD^xZb)2fC1qtt98pnkMLV6a)qcW3C7xn|Su>nJE}h$}dV%v6Ww}&UMU6-y z1SpwDjvqfoav$kbIFw0OKu4eu^3mtCYj+W8(9>z+<;llP1T6Pqxsq|0UkbjlvI6?XJ{AK}<)J z1Q3Ee4^b&J$=?O-xx&5Cb+V|aj@noB_IJV^y&E(|&tHGS4Yu}~nf=o&NH$g19kQwqyyDB;N4I@Wq&AH{UMAeRdtrk}AOHs2#eMq@rHOfvxBxaf z!czP}W*k>m$_OPE4_akev_MU~Qp^xR6&4ji&VNZC!LI*Q_{i1?B}5VdNa)q8SCrG~ z9BH@N#?nmoBw~=}KsdRA%<@rL4!#JJ{R|)^vr`?VKh{3eV+OVzw2uD_s+I$3us36_p*wLd$ z3X6*u(dtLQ>?#o?_pO!CEC@giUAuN|?Q*#;cGzscCIq19Kn^$q`wcv6Es+uDDYHG_dlHCzkKhx9-D8)KR(Kixs-U{Eaw~nmmrS_bq|Kw`I-2f8j7WoK zO#m7Y)2mCDOfssoV_dHGHMOo$bYRHwrcM~bG4UOVB5BL%OHWOXH7 zbBg{Kk>YoVl+a@(B_;c94#$oYCr<1owvI5YgQ6L*btCZq0{{U3|2}vMNvQC(0RR91 M07*qoM6N<$g7586mjD0& literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/icon-144x144.png b/docs/_static/img/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..265b4687af170cfa958c94221f811e2fdd450fe5 GIT binary patch literal 11666 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 VYejaGLplHe002ovPDHLkV1l4Qvx)!! literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/icon-384x384.png b/docs/_static/img/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbe4cf531a362082f206a15ac78b4d01d5358e5 GIT binary patch literal 36305 zcmW(+WmFv965Pez-Q9z`E)Ky$g1ZHG2rdgO?(R;o;7)J}gy8NT+=Khu@69>;XV00L zo-5VW)pa93smi0Hke~nn0CYtKna=~$#8QI000Ik%1CN><(wKK=HSi0 z28whniVVBF9#VCMAeBdy*PF7{n<*)q;oLgOtHeY_ETM8`4dTSsf03y}Ws&tkJUWYm zjobCvTz!7;b~-Rj+ihE2&Hnk^oj+-QpSGSUz;p5HTB~I9kSm z3dpFdgy+s=9=yCMKke*JqAGvb9f_FDO_lSU#VIO00K=DY6A~^Z>0$?$mX-z~hleuS zUS2fVn>Bf1VKp*2v$+`ZVY7S3e_e&YL_~Pf(VX-8_TS##ju{$XFqEq67#bRa+{Bcx z{~Qb)t$oon>Mm<2EsY4W0S9@>H@7#YC0t5z1CSdN@bK~HdAQiwdALPIXUBE;v1i?r zN@pXyO0f&oXph7~Hz@CE6;8EeXWMajOf)q$V|Y_wvL2{^Z41h*CO=uByuF zYOz0^%6$$C2K1-M?IQFqa(a4to1C&o>K7iEuA!l^Zo;|d5xw%+Vzr;($)+^t=lN1K zHGkO9zU$~3cIAk#%Dp%LI&D{6f=vP{G=+_w#>5oTZHFuwE7$r{%_By~iW7kkfVenZ zFj@y5PW06#MmD<3u1~e|ymy&m638de8I8on!pBd|%*pUF%9!=`5i>8tn!ea}7Zg@V za&kZ#LbLqzMPL83wsvb{QG+XMm$Ab8D}AhJ;{lWD2L%Kw>V%A>Bv&nEi@$qKOscfD zNkzS#wBP;pVa5Q+j-0sOBqS_r-@d_z$5X6>CSCbo@2z;_vc%+(uc?Va*0eMtA|kpr z)@>_=O!w1fhaiZwWjG@9aU^wu+$ZDDpIuXQp3r9S#7#C{LRcCP7)&wfV38y(zL(rM zw;8-fEWP&=6Yxh8NM+lg$0Lk%|qkU~_?ot>Gu z5zMs`!rx<)RS)}Uv^P8a zYfI`;i$;D~m+ylTL>57yanY zVC~G-;0nmNiH|gTBtI=bE9=PFLw>TbODV##Yve}U$8rogFaC4d5RWXEA z<;+D>wvK{jq|dN*m^sVD#OWf2HSfjY{GSL+lj~qel+@1*3C&^G+mseavdx~ z9&YvW+77bkNvga&l*9o!r|D0t@bSWgbK_ z#i)^ytAiTm%H@t-I#3lz1$ERlZxQ@oNMcDE4+#Dwp!JGEk_Q9zG-L)fe2|Ju+_Y&l z0OM&*!23d4`Gu)x37*Xw47vJq9z8%DX6H# zDyn{bB3FE^WsTyN!U;r_Fb3h)&J$L%3ps<8(0;i6ReTjZkURBeb(G1FRV zC1DD=X_)AY&q~9>;xiP51)r=@W5swy8PvvG65v=tCD7|T9pk3b$rb$3-_!(73==q0 zc5Mx4=E1+EP-DBkqp#ugHS&O10Dx4iAI@%m|Nc#w6XlAF9hm;#YCz(n`pm>2OmcJ5 z^z`&32_4p~-hjq~uL24PQ*!PTf1W}{_k4zqoPQ%xA|vAhRj7nnqGTcAo>mycy3Nha zobc8EJsk=_Z?vUK2NRR57{mT_w`Cb(#84FD=r>@OBk?w~@qWxiM@QEkTMbgyBD{rW zorj>YIC5VPWz~RaB#DngzmIcqa0p=kA(#~v4;&vKhjpxsl zBG(E&_LXsXQH;m$I$dPs(f%X%q7*oq(4U%`+G-X?2bbc|xW6hOIJ*jpSXstt8`PBH z$r790S4h_~9B8D(L5a(&&8g)EHx9Q(6R|>M3-RBQGE4_&!E@K222dcPMI?`@ ztApNf3d{SQgN;S_lcpwoe(x;r0u)ewNZJBa5|R_SB#}{lKa3rTW=90Th$jz1H%S0k zk%@(yI|$MSgzj(!GU*S6hL)3~AEB!sQ7AJrJ#p@xrx+WXc!WIIT1X*_JRRX`gYW@L;K&(Y9DRP(SK8U?eAC4LQCamjl?nJl z0D*(OaG~flQ&>XOp?!99J2?@{BfdHK!uxS7FF6y*1|ea#-ux#H{;i(jkfwcooqH?!u8b*Az{057-bZ*%3z{J9` z({pX8&*;lxD!N9eftQ|AH`Bn)ThJ35TJ9!Dr)|2~?LT10!fITi^6J}ofMa`^dfcwa zAew`Tb=}m&yHMt2yile_xsWXvPa&p5rg-}hm~Pu&&jMjqjG>i}t82DfsQa#zR+r!E z_%$4paz9_XqnGtOq_%~MIQXiUN6__#=|_2$U+P2>|G04RY6l)h}^4*}oJdIR=pGH8MjYB{gD2`od)6~vA zo~OnMljN`RjSrQ!g8c4ra8QPTl5#RqWMcp_8`ul*Sjpg8OQWn5^f)D2t@jssemux; z4+G>&Vf$;rm44C~B!)ew_ah)mB0faq3?Meg2H&rn3}d&H%cEj^`g@SR#Ot z=h@nbR;|&viXtazA07j7ka#&w;rGhQKZXW+Ph!`W=z%tOIWZuGs?waXF;r+y<|`|* z;E%mZvnCyUz4nidi`&O}eYo0P-YS&Voy-#xs!y_}ECBX;);V1mwV3q5@O$3bPcWIV zz?58oM7G4uKBQ}F)D;iM?fHsQJRnN&`5O7q9%`#GK=HJwQ*y8;dD*R=$Is!ZZdYDb zwtl0_w=r5_CExjOxypPvE(crT5Y}3|!}G#&)9;lpTf&KAwI@&l^GoPHy+6VVOgp7K z3JS`}+IhBa0#8tZ5f_vL5w_<{ybI#dZ=AL-5mO||m@e%bVvdUr(b-c6=5t z`~E70j2W2BFI@?ZnAPhuo}zTZoqP;YUrqO&p2r(Jp~7`s=qIlmCjFb&`%^@clf{}n zJs2WD6K~`lkh*9OAK#h&|`$t;p7M}1{A(OV7vb)RFWG)A3J&>R22V==m_5( zXPBaOn3FtElP#K=>-qM$R>4}NLU)QN7@KI%f3h3DT&3Hna~=e{W{Ot8kR&Y}`-&jt zeEskGL<}9hbt>N}ON{aZHZLm`D=TXh!Ob$=h z0TK#HW^V5K`kwQek`p5?ZbE$oBakkD&4SJbHa8q4{Ck}cJWm+{TarESfc&dx*((ndV?ZRIlG`73#*X0L1Mb@I*{Ierp zl9xw8y^2c0?kP-ky31LC)#m{u>6sVP(&l>#ll7$0j745LWO18pfgJaV1sutg&X=Z7 zD-?C$n7+Q=Y8%%tzTa}RcuwXG1-rY7I?bWQZwiRYImqYrMoLUB=aHG(9rtV zOiL_z4M>iOi*nUioI|S&H;kyKv|i#qoN9saFftyrMh$SmhOU&Apj65qJAD=n2&X+$d z*0h{t##%}OT73O#xFZGYIls-CUPhR(vh`O*P0cFZ*ag1h;O)7OX*@3t5(`GDIe6V6 zJWctcx?Rn2f3eEQ7nBT82J-^Hmo&Mvy|#x8X+bAOYbg%sJ~1XbTfy{Bb7V~5c?~QH zu%9tD@?q|H-tb+H71$gr_NSwR0V;=E#ZgW^Q#frjDf0J9AUmtso*dJh93Kx&=iAww za`~z{1XVBjc<8M-YkNKD%N#ysiV?B`_9;yN34K?iyenIEG`C7bp(He$7UR_YySI1s zQ&3*fR<`T|uiG#a2kS0<0ILmEur%OXoUM(Ftjr~h?Y3>;cEoRmw6#Lm3sb5mqDxDD zMa9lV$@0vZ0{G7N4c}Aa_Xk7~xeNRwI&t7sC+gt_bVeMDBxc3Lmj@oB$2h zYVDrz&4-ra8wVw3s*ExisnQlxJjnR>FqtQe7m1%a->Bpg5>tQqxL-`H>J&L~;T&Np zT|BRwz?_o{r;G9V3qM~CQ+iugu}S)i*6shpAn$*A=6LmnMQ>ep`-j-#?UT#HGwCXr z>ogOFZd1%3K|rUA^#%=~K_X#JBB&%l1XhOh*TK}s29jD{=U8}X0;h*2Z@wQ|^=Bd; z&Lb3y99f>c4(GEeM9txXd|wGvwtY{RmUJAsk5tD1{&Bwft|+4uBSHQdva<4S`(RVg zGvMUWS?h+`yZ^nRkv#_SkO|C;`l&2&&cSdTdBJV)ap7i$7-gVIbXi(*q6^7~hBERf zSEy{kg)2ouA?Qq1yBreifVAF7>wzP=+2TN2s|_m^KSU@K;l=B&W{BMK$7N?nVAnE5W>2=O9{*rIyzM=RojkZpO(`!+oc!}VY$ zDU}OKs_cnv6g_9U)I>;L(ZCZjamwH_H+^qi|P1u+#;^`Vmi9?Iz$HXs0 z7z6Zh7u8N#ksEQau+A3`5OwM_Z~eDQ8Ti8GYyAh$@n@sR?gEPM{RQIgdz^PBsABnA zh`8#dgv_v^@m&t}SgVoI3<0hXknsCU zB)#53+TWPwwbKCfMvK!Z&HRL7JFNxEh|i+g#%|~xyAvYb%a*LL zGnDoZqiO74IeKnz;uo;*93;`CGO3yn`p_WBq_7M{(d<7Xa>ZO|MvvAqd5~CP6Ln`J zk^N+2D3w3Vy~1Gm#NiQWP4jf+zvYau{f1*}r)`{_9S&o-|b>bTzWu!?@qT#H{&K$en<+ws`nfPqjFdz*Y@P06ARDH z#Nfp}2X@|(_+G~fczHRN-^a5vfA|_IE31GZEl^KyIa$Wc)|xakJ1Zh5n0vvjYV~{h zHB<Fu_NY8*d4gIRgHcLK+n8-pazV@2SE2KHQ9qPaCp5C=@MM&9 z99(@Q2Q#I2Ncn8>d>>P_y?z(qU(L>ZUps2`7$;#rE57>#haDg*2R_6QjN_W>Ec3kB zu-_3ns2ix)3EfpAO#U%gl?J>wC332d_r-w7?PGVxv{$pWvBLZu^!Z@_fx??Y45gZm+lbJl>sHlY`0Km4Rv7;kj zS69xEA5?`fNoCwF2=()ajNY<+z_5$r5e6VjGnr0Bm$Z+v_v9F=7AMQn1xo@- z{ZC(pP{1iIFJ<{looW(a-3})9WanfYaz3p!c?3<-ZL=P(RFig`|2$cOMB?h!8ZC_E zuXQ_+KJQkyHhj=;f!I^-ybOdVzIcH*iULM48V}5o2ORWlk1h02lC5PS5X8iE^nyh@ z>tykNhsB)+V0?i7*`|?CWY^2T(H!JU80$(!YCM4-xm4WcSDjJO(cb^aZJ7!yl(alr z=vfA7hD{Hr3hkj_YybZCO5I*VrI4zvQNT18Kq8STPT9zqke8RYtC12;7Bw?|+D-&4 zABaekJlgL#@6Jvq;U}dcnxzQL8K>Lnv0vtPG{?|H{y+riN2xx$ER+`IFrWXE+WDC! zYA%!fJ3Q_|MOp3;>G#aFg-CG#)*oe52{|V4vz_%ORPMEe)+t!;7vnkc6=(oWam9aud5%%dU�XW8%|X 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 Hu0mjfB+z$` literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/icon-96x96.png b/docs/_static/img/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..7585b96eb61b167a050898bf21e1fb0013139901 GIT binary patch literal 7360 zcmV;x96#fUP)XHl~x~>W+CwDl>YP(2)v3C6YMNkA zPfSd-#Kv|ao2{FbD8oh6*0Khx;ocYTYHB8 zJ5^Oxl~rC=mQ__-yN}yD!ljT)bt8|<3oMP@0SRr|wCNgQvt4JkSo$-vGx)P5|J{-i zYvbasdHokNC=GT(U#@z(D)f zkl=7Qk`iNM``hgHG0d?;nbVs~bh{d;LzpQwEV?QxD#%$}oWq}Mc&04pOY6DhH$WFI z^rfL5)S^X;`1q)(am?-aF#T#6gw*ROod6QtKwfhg?d+`rL3f-abA3FKoFy#A2qq z{I9XO-5;QDY(aqtR9IB>EC2Njm;Z$AdEscZRjXDlqobncvH5bR{I97aUJK}JaY+f~ zB}5enMnK#G8!#!T2o|>+cEq5~3m_DLyWa*yqSBD=!~O zZgI3Tl+OqmR+5vG9Z3lZ&oQF!5Pv|y{tl6@2VkDkvNAe*{ya?CSNX5$_7&u_@EOjT2Cw_f*|SjA-}BE&Tn^N?&3gB?eOlUZ ztKGhg8){wOwj@a8!f}F$hyujg?RJWailRss4ftfoP1J$XgiT*rSt$zc$2FVHCJG=_ zghAT{g@u$~Sa^oqL|9p$_UhFumiME0fN%5H*idl2L?+r|JwnY=Qm9Kt23>T~Mb!0@ zOQ>zzw(ut?K0clz6#}>v@3yqGl=4_%o;Y!WjvP5cdw%_uvJM@hv&^yO<>jKy2yPSi z)VH6wA68OMUS1jhyp_wx!L}82Fs^;uwv$=pJWcgPKJKlluBIw3KzL?mCJnv*dg|P{ zGj-_L5f)XjU8F+h)Z@SXM#qjFqwhCvq;J0YhR&QiMQj=iV$`S4j>JTKjbS1zBjN7Q z;$Yeest1hxyVx?o11-TKANNUd(Xmq}8aZ+#jT$|gIx^D31?SG4qjleXNAJA-HtqcB zC#q%9CTCJGfN`_;Ou2b^keO4sED5-cKyQH9;SRsS4^Iph`4BT0bl)qlq#H(zpy7Z1 zGbJS@1>8=s0DZAx!v^~Nv(ISFS6@*H+xyTd!Hfm>oXg3fqT*sF{~XWdlYs6Iq%tFa znAK+cm~V;+2KkWj6)cZ4Sf^idi-cyQ3%7b^H^#}0aN(IWbK?OLI*q38nz;32=D zfbt3opc6)OS!McOvlY|Q(lR1!w(k+A4+i<*y4cuQ`s*#X(3GiDg)%h*P_9KqMU;K~ zxRB*gvboH0h}mE!0clXm$<3NkT575gXX)wbl$4w-{x<`#vR;4fHCpn@D?(|*$_jLR zsDFa>OGRbnIsW-4E{9CrXQooKX3Y{4AH}QuhaE&YYoV zo_dNt{NMxO1zT-_1q#rQW7*mG{DFTC=i>Btk10%cY}alnJlsH$56-G&q}?`d9L;>> z5lVDh4nE<>?c3?&<;!X9nl%C$06QZAR*Mu>M$cC}YSM?mC-lozfBYle_P4)@PjI*| zz$)6SOPA8Z=bsk@2SEb?%*t$LAO^&b?(kRNFE-iY8P68aGBb76fPuus#Lxo|K1dTL zP4YNIT7V_=#pj>XXPTehTYuDOQRuU{|f2Vx<` zG6S+{n#^BOzVubk=ZM+lyqU$uyQZH=Zsf!A0Ot?5_FCOK`}Xdohne%XZrLI@-j`?! z1|;(18JS=LUj&s5g)jzNEy&2A$JjvV)3>i~{euS%(0JA#@TwyN5Jx3!!6Aama5I

qF@SNLe2j7e|Q> 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 m35t|JlS!%#2mc=c0RR6)kLroR)GkH<0000 Date: Tue, 4 Aug 2020 06:44:53 -0500 Subject: [PATCH 66/85] build(publish-docs): Copy manifest.json --- .github/workflows/publish-docs.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 311eb2d9..ff553da4 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -64,7 +64,9 @@ jobs: run: poetry install - name: Build documentation - run: pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd + run: | + pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd + pushd docs; cp manifest.json _build/html; popd - name: Push documentation to S3 uses: jakejarvis/s3-sync-action@master From ed27b26da3c0c64835a246283ecd0649b69b7f1b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 06:52:43 -0500 Subject: [PATCH 67/85] build(manifest.json): Icon paths --- docs/manifest.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/manifest.json b/docs/manifest.json index 3a0f85d1..7f34c012 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -9,42 +9,42 @@ "start_url": "https://libvcs.git-pull.com/", "icons": [ { - "src": "images/icons/icon-72x72.png", + "src": "_static/img/icons/icon-72x72.png", "sizes": "72x72", "type": "image/png" }, { - "src": "images/icons/icon-96x96.png", + "src": "_static/img/icons/icon-96x96.png", "sizes": "96x96", "type": "image/png" }, { - "src": "images/icons/icon-128x128.png", + "src": "_static/img/icons/icon-128x128.png", "sizes": "128x128", "type": "image/png" }, { - "src": "images/icons/icon-144x144.png", + "src": "_static/img/icons/icon-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "images/icons/icon-152x152.png", + "src": "_static/img/icons/icon-152x152.png", "sizes": "152x152", "type": "image/png" }, { - "src": "images/icons/icon-192x192.png", + "src": "_static/img/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "images/icons/icon-384x384.png", + "src": "_static/img/icons/icon-384x384.png", "sizes": "384x384", "type": "image/png" }, { - "src": "images/icons/icon-512x512.png", + "src": "_static/img/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png" } From 4e9c12b29d80b32ddffec3c146c3130b5b3297f8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 07:05:25 -0500 Subject: [PATCH 68/85] Template: Add manifest.json --- docs/_templates/layout.html | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/_templates/layout.html diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 00000000..0e6b15c6 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,5 @@ +{% extends "!layout.html" %} +{%- block extrahead %} + {{ super() }} + +{% endblock %} From a0df911f0a51fbf0c8b6a676ba08b2d8bc54c0d8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 16:22:24 -0500 Subject: [PATCH 69/85] build(alagitpull): Update to 0.0.24 --- poetry.lock | 6 ++---- requirements/doc.txt | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 55ee38b9..4385f093 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,7 +12,7 @@ description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" optional = false python-versions = "*" -version = "0.0.23" +version = "0.0.24" [package.dependencies] alabaster = "<0.8" @@ -548,7 +548,6 @@ testing = ["coverage", "pyyaml"] [[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.*" @@ -1005,7 +1004,6 @@ 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 = "*" @@ -1512,7 +1510,7 @@ 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.0.24.tar.gz", hash = "sha256:f6688534c4c8d437fc16eb2bfd0d2d7174b69b2ed7e4d5c3cdbd09f67c6d375f"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, diff --git a/requirements/doc.txt b/requirements/doc.txt index ed09c96b..f8e9b368 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,4 +1,4 @@ -r ./base.txt sphinx>=2.0.0 -alagitpull>=0.0.23 +alagitpull>=0.0.24 sphinx_issues==1.2.0 From 620294ccf0c6b2f1a6ead8973c96bb98d6e89261 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 16:31:32 -0500 Subject: [PATCH 70/85] docs(sphinx): Add app icons, manifest, favicon --- docs/_templates/layout.html | 34 ++++++++++++++++++++++++++++++++++ docs/conf.py | 4 ++++ 2 files changed, 38 insertions(+) diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index 0e6b15c6..e5e2180c 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -1,5 +1,39 @@ {% 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/conf.py b/docs/conf.py index 9a21fcd1..08c9c3a1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -73,6 +73,10 @@ def setup(app): 'github_banner': True, 'projects': alagitpull.projects, 'project_name': about['__title__'], + 'project_url': 'https://libvcs.git-pull.com', + 'show_meta_manifest_tag': True, + 'show_meta_og_tags': True, + 'show_meta_app_icon_tags': True, } html_sidebars = { '**': [ From 5183d9b3aa2d468bc22952500698fb1e171b24de Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Aug 2020 17:16:46 -0500 Subject: [PATCH 71/85] build(alagitpull): 0.0.25rc1: built by poetry --- poetry.lock | 9 +++++---- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4385f093..e4324f26 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.24" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.0.25rc1" [package.dependencies] alabaster = "<0.8" @@ -1500,7 +1500,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "82e549e4616363f9dfc4565f17ad046029d7deac8c82b7f5a57d378bc000d200" +content-hash = "c74072b3a36e4fd679cc7f06849c5dae59e45d61a923b9d1bf7a85c787b5b882" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1510,7 +1510,8 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] alagitpull = [ - {file = "alagitpull-0.0.24.tar.gz", hash = "sha256:f6688534c4c8d437fc16eb2bfd0d2d7174b69b2ed7e4d5c3cdbd09f67c6d375f"}, + {file = "alagitpull-0.0.25rc1-py2.py3-none-any.whl", hash = "sha256:6a881a03e85610722b35125af152262ac0cb49879ea8d70bca05d74bf06e6c37"}, + {file = "alagitpull-0.0.25rc1.tar.gz", hash = "sha256:c539203ce6572e73ce056b6ffb234bd9cfafb1094c9458495d008fd6ee567945"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, diff --git a/pyproject.toml b/pyproject.toml index 3a774dcc..64adddbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -alagitpull = "*" +alagitpull = {version="*", allow-prereleases=true} black = {version="==19.10b0", python="^3.6"} doc8 = "*" docutils = "*" From 26067683f156e84a8f60a5d7097b8d7d9c715547 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Aug 2020 05:48:39 -0500 Subject: [PATCH 72/85] build(alagitpull): Update to 0.0.25rc2 (fix entry point) --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index e4324f26..a2a5ed68 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,7 +12,7 @@ description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.0.25rc1" +version = "0.0.25rc2" [package.dependencies] alabaster = "<0.8" @@ -1510,8 +1510,8 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] alagitpull = [ - {file = "alagitpull-0.0.25rc1-py2.py3-none-any.whl", hash = "sha256:6a881a03e85610722b35125af152262ac0cb49879ea8d70bca05d74bf06e6c37"}, - {file = "alagitpull-0.0.25rc1.tar.gz", hash = "sha256:c539203ce6572e73ce056b6ffb234bd9cfafb1094c9458495d008fd6ee567945"}, + {file = "alagitpull-0.0.25rc2-py2.py3-none-any.whl", hash = "sha256:02a347cdca1bf1d6ceabbeb75430fd185a35541f5880609c8c79e584ab31de5e"}, + {file = "alagitpull-0.0.25rc2.tar.gz", hash = "sha256:2bfe712a56be4e41c3e452b51a9fc76e5f44e0968673deb35e59e71bb023eebc"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, From 1c9575725df799942ef684a593ed04e6611682d1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Aug 2020 06:33:40 -0500 Subject: [PATCH 73/85] Add missing 16/32 icons, android and ms icons --- docs/_static/img/icons/android-icon-144x144.png | Bin 0 -> 13949 bytes docs/_static/img/icons/android-icon-192x192.png | Bin 0 -> 17202 bytes docs/_static/img/icons/android-icon-72x72.png | Bin 0 -> 6451 bytes docs/_static/img/icons/android-icon-96x96.png | Bin 0 -> 8707 bytes docs/_static/img/icons/browserconfig.xml | 2 ++ docs/_static/img/icons/icon-16x16.png | Bin 0 -> 1397 bytes docs/_static/img/icons/icon-32x32.png | Bin 0 -> 2850 bytes docs/_static/img/icons/ms-icon-144x144.png | Bin 0 -> 13949 bytes docs/_static/img/icons/ms-icon-150x150.png | Bin 0 -> 14689 bytes docs/_static/img/icons/ms-icon-310x310.png | Bin 0 -> 39415 bytes docs/_static/img/icons/ms-icon-70x70.png | Bin 0 -> 6324 bytes 11 files changed, 2 insertions(+) create mode 100644 docs/_static/img/icons/android-icon-144x144.png create mode 100644 docs/_static/img/icons/android-icon-192x192.png create mode 100644 docs/_static/img/icons/android-icon-72x72.png create mode 100644 docs/_static/img/icons/android-icon-96x96.png create mode 100644 docs/_static/img/icons/browserconfig.xml create mode 100644 docs/_static/img/icons/icon-16x16.png create mode 100644 docs/_static/img/icons/icon-32x32.png create mode 100644 docs/_static/img/icons/ms-icon-144x144.png create mode 100644 docs/_static/img/icons/ms-icon-150x150.png create mode 100644 docs/_static/img/icons/ms-icon-310x310.png create mode 100644 docs/_static/img/icons/ms-icon-70x70.png diff --git a/docs/_static/img/icons/android-icon-144x144.png b/docs/_static/img/icons/android-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..742a7fb1a8de9274c778b7200ecca4d0b2cfe298 GIT binary patch literal 13949 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/android-icon-72x72.png b/docs/_static/img/icons/android-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..f7248e8ef14749010de1ac36c02a5bb2f770dcd2 GIT binary patch literal 6451 zcmZ`-2Q-`C-w)M@t)*zIO3hRe1QD}Fk&0@J+I!`Piikam>QF^hP_b*bYE)~l7FB!1 zs2$X%X3gS#`akbE@9%xjc~A1>p69ur`~BYB`@Ns<=lewJ>uE93U!ezqKukK?8W^C} z{(C{dz^~DIxfamSINwI!27$_A8UEOw2kxo7Fj{J$;vVj0;D*;;8-oUc0)#-I&2^!wKPCye?OV^`SHLLI-Itt7tsF4C+JSQ zt1<}0k*A|^+t6>UJ2jACG@pE?vN3f$;q{OXEFeI2@zq_735wC>epp-?hkHI!y0{-X zJht3wY8kUmF#d3UOmFpN$IFV}a;|3M$j@WO`DU##%*Iqqec*x{l{76A5SsW`-%Xcd-5sqKT{_lM}fmgQPbmXtA>po<;s2k3JNv(&o&-Jb#VV3Bi{muA?)4mG=`Va zkIMPzGY#wcfKXWq7mmxt5cQdX&nzrNwSHs(f4faWoL2;t4rg@@bq#G*g=|vA=*Xtf zfWxdZseUl8fta%l+0k?L3kzqBRH$>==XSz|n%crd!)BL%G3YlPH$9{XW-=qF-jLgk z$Wlv1?(pkXOb1tOc;Xjd7h*2DfYYhd)e6}{14=&sZa!a7_ldo6Ab$iC?~tUR zxoeHd)=wi49v7BdXV*GI@937-!`R|L~9=t?GbB{#p-j4CK7%E`%z&_}!+nY%5=m_rnp^#p^#OF?JBBvK02%_VcW zejnkrz&JTMnS&`T3?DilbnQU?)fDU-2=;DnUNyX z=GoRLG1a;$x_hu>-GS-p-eq$BsO5vU)sn^@1zKj-=sWq;hAf+*;aaUUs#nVA;RrB} zc9Wvk5{T&^1a$2%hE2(2)VeScW66JSMRqGYw2ZP;m1{M~nzE2#@rZlqe z+o`MP=(3?9sp6bgC7iKskBb*a_{&UQ9;uwhWhkE_YJJu}R!-3rGE`{^#owcA&VNGB*%w3f&eVg~x28LL>mdhTvx;nbur@l5` z$&x#$;Yentc!UkpQNbIF7@HzlSJwz0qUzYm`J?D3-*w ztVN|_hzd4RwaYn^eaYF0x+}fre{B=}O_Dm7*i}+M$!OeHDsEUH*_yx0&VHQn=b%mT z4=}~a+9YiOJ8UX6ls`h142PrnlXdYQKSbBaP5(5p=g-Z}W#{A^52mH25-<7SXk!z~ z|BQt{m%BuT$`HcGOpjLJ**soe-RNb~zmH&qaUM_^!(4T79AZ{oDv$PSEv(F4S=3PN z#WhG-kFgeDu1ypQg~+66IkI(p;uox}$kSV$F%s3e{Bw7iJUB8EkIFSE#bt?QDDto* zSp`7r>+6BtcDP~bA4X5vC$ZKmnI={+_0@fpqGw=;Y_+qdQSRn4zl+k@>PmK-_!Jpi zY~_AWIazmmVE99jD_Q7D438$n)9RNRn7bL)R~~X_VG##okH&9OZU+PgRQ-H?ck}30 zo^PPyE$fEVy*;0pYYMV)o?T$%Vj^*nFJe9B2k6pMwHCWF6eX~!E9iqr?&e`o(7LO& zeKV8Xk88pg=|WCh*c5juj|o0LdUxV~3RsRnH;>zl#?>IYsDFC*+l8)-nq?v7vsQ_*Tka&G z#^7J_6^egg!NI}tGGqAH%`;8Xw_O!>biKT!g~!KC8iM2-;KEOuZJl~Zt=IR~Y;ibT z-JTQ3IZW=Dr^G`EN_uux5B#jKu;!LQzx2wID*OzUl8-m#`{19vsZ5mB)P~N?jy~$?sQFw7m zA2stk;P6>V(37DDmX6jcp0hM5au0K=tNkb3Ws=*G*O(`GdUL{L44_l;xKLHzrjL%D zZt{rQoQRXaeLTR8wsYSl^FW)-n?4BkkNlxlHs|bHUgZ*t3JPaxVuQOHWa03Z*wY;q zEFyrQiz75QU5BtTg1yYX%1;mt2q_joT7JI$2q&Gz_)?DQTYaz~wg2K_+ zO&h}O%yX9;SYzNEJP6JkAE=AD-rHA>cely8@v=gGj98s!oXz-}SH{TOBz0aB9HOsVd0& z_U*kl#oG3E=Lk&pF5*zZsH9uA-6Wa4&kYUA>Brq3&oyrN3$NmA{9ljubt7YCNGlF+-RmYIJ|ZGEmHGq3bfoSa;o`s7PkhtN@k8V+@r#)JQ18 z1a6gocHAKf97S_I-oAk`6#PneyAohbm$^MeZ^RpXbgYw$sj?8Ccqqr5@6`cza(XLX znUa;o7sHKgiS(Uz#2Q@!IXXH9IgCo_Whg7Xi|zWVllz>RSv(PwcvXquMwq?S_@6Gbn-(ig5S*$210sVM~WpI4`=pl1TREebll~d!KTQ}RoQC4Iwv)hejWUY&kqL2Y2#Bs_!e8PWE+P-%5W4*@ zFE7<7ubDQ()}C;xAyW066TTp<07E# z*fr|Q?ft;{`51C?ze-Rb6ejKJ6Dlr)>SFfbBXAzO-c{B(OIeBm0KQxq3-O$(6 z(c69(gSvV1X4P5BGz}ku-2bINTPwdimy3buAftN`E)TPp_&tV$p3hAWS7QN0 zW{iw1eh0|6wRp##3Z`b8))$wWiv=&zole`wdhV@_x`9Q8nzQv2#la$*+~;j`jJx~N?9nlF9e$vE40LRKe0hC+ zetT>zuDC^HtlCTXZ0m=8a~DT0d%ufeCx~be>{c}cZV2jC%0`-$+E7s+03_Nx+kioJ z8Pex>$`p!;*ayuosH2RJuz z+8QIk+T_K79J$HSDRL|ft`0!>aY&e|nVVmYj*iZ*xPqD?R0}z*CFfy1yZicx2%+nA ze6KM0*%rEvjt(G2%@k~X%1~@ie8w|tVm}AN%`Rtq2nq%u*lS{o#DsDk0D22r9iPst zsX=al0ID!DGJ?y(`^LtQMLUK!9TlSO!{br?Bh&X3c`{^e?u5euuKV(s7DyF&fVgTH z0koXG$^lj2-r8kwOfsr}dO8;CiC1HJrndi@V<6c+A@EmyQmo~plPYdj2)NLqG&DGH ze_(P_=|%jvv41cqKwLg|KGfl)&jEM{si0t5jTby0q7tbQE*!EaZ8cFdBzswECsyOe zD1&U~Gxe-S{@{h;Ritmwf^^WYos5i9S(3afN4Zn?+tb)b+?NIji}FZgl&PMFvB<32 z)h8j8v<=w{1ID!3ILZRYuUdkc2ozP({JSyxF(f!e9M;nO~~LjjgQEbBlI;{VwqQ zVRkjj$FE{KlviO13o75a_+lS#)Tuvu)OhXT$@hJ!?6Vp76HW{8O{-7k(M;+4t zG$BYy?t!ox1lan~a%YyLTV@XYL6hDiTlpu)&z?xPWjjbE%YnW4v{5=}G}GDMcYeQm zDg zdpnE%ocu3u`&GNByXTlWPLKe_q;p=mmLIsW%6GU)Lltl7pdl|NrXoZcw#Fw*qFKX4+L zirPA^Ub*wsmV$a_P+L=j2wGxINJs!`K8DhthFB~VNc47GV0TmJgFI|{Wj1N+1HsaH z=$(<dw%e4fBf4_tvNQE(ph_|t8k+E5Oba?p4>YOs+bS)+8yKj-a9G9s>QV(M_vZVQv^*8d5ax; z1mWwl4BTT3bVB7qMk6Ol#rzSO2XCXQc8Y5c2GMd%=IGLJ3LvPRj{#oq=#(H24#IVL zMxTYI8q|*FLTZYo?Y}W5idpvnGMe&2v?QmXz{L>y^)&dnsO7gVM+X-L!UsrQzxt^( zwdajSsLwBHgjH0%7Q=})308VlZ(7%V%1?XGQhTSoIq$xIhvz5QbCN5f zZ^S{=)zycw+E;i>dY|-S7klr;CDV;+&k;L6V{mKG*@VVrXc5k&y;>?*=V0L3bcYynVvx zLEGMrNISdQF0hKUPQB?TOEz%QcdiHnFyv{1_GFCFJ6ylth70KqP_!iL)poZyi`OjO zaOx&Ga_(|)aqza-j|xahA-TA@{j6sbUP5?1EnhSpe2*O)iHeGPq|6m9 z#LTUTP|jp?mwzAfyCl>@GKR8u7{q>Xk_|^M2uG-rgtq)9ZnE?epNMMSh~wpnl7!bg z&TLSp&?shqD>O*EsA@y^P%yWTP|xw+ZRRFEDCX-je!d%bO$X2!4O3RHP0Lo+CNi+R zbahk{&Zt9LG-L=K8Jn()`e$$N_kEWkVpGE<9;l9$I-eXVoyISg&k;s!x^S!3y?lIqDn(nU zyB*(M>WMz=zV)tpO$yVVBeHqCco*tnfSP>a{SrQ3)MI#4Q;~x|UHcVEXvb+ZuhQ}BPxrPdO#2d2C8SRgh*~RsdE*$XsT9BY=LU6Dp zI3n%wjz9yFf=R)|UA2fEJECo!vG%UKvf^^$2r+qHDVQW2@FylI#d}{;me&Q~1f+z7 zudlB-_AeT^0JOLV-g)BbI$#jQ_1B`Ii?_QS5~<-~@9pmRkbp$$15huJWd2#L#Q(wk z$0ri$;)r#2A%G<1rC31tCjf@?Uv~Z*^8o8WaQO=%7x6&=$mM@Q&{%gzfg;r%|kC6aHU(2_Xpp literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/android-icon-96x96.png b/docs/_static/img/icons/android-icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..5821c1894f2d395873ddf771c09732d6dccd5c29 GIT binary patch literal 8707 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/browserconfig.xml b/docs/_static/img/icons/browserconfig.xml new file mode 100644 index 00000000..c5541482 --- /dev/null +++ b/docs/_static/img/icons/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/docs/_static/img/icons/icon-16x16.png b/docs/_static/img/icons/icon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4081c90032063201dfdc784d6feeaf0d4b1005ec GIT binary patch literal 1397 zcmZ`(ZA?>F7(OVVXbH>y*lr-@bA{60d;8rBbhNb4PTN$dfH+()?QLnK6rl{LOzKbv z8?Xgy23i>c4iGe=%n3piaX;K(S;9Qj3kcV*A$%u39(K}5GDD$ANlHrQa5xDG0vv}_s$347kRmYb zJ*_rAHdct^Nr{PZ(b3V7krI)Jl*!~$sZ1gf5(JOS4W!uYSBkvk5Pj`1paxz$eHYO)03-a=`8qGjoUq*VmR3rj- z32|}YVxYf&d3kwoaPaH1XTR#~RI60yhlcWY?*?B}H*eZ$nwyjaZ{Um8){ge}#JIRq z9UU&GQ>jqgx^?TI#{<6VJRY#Wx3KWW_3NkoexqJ576@{U#!kOqtyHFyaiOn& zN!J!S%zVaN%P%kX>o)m&BJV>%Q1OmzbyFmjI1NEqxpq$_%-Xe)b$h=80Go7brHMIf zF`La+%fovQ78V|u?G`JlV2#$+gfm*2^^6xaS6M6;bM(*foio$Cl$7&B;V(v6tl%0( zY3b6_sL0d)nIc9_F!Ps?BIo>EIwNgje5S7M=ni00z#+ow+MEvzg2mErSs+~~{=EBmb^xYlr@BjnKsdE%;YJSlI^Pr#p zAn$Oxhws9>NpNcl+*Zm>la>k^CM3WGI1iWcaIuLXNFh#&2`-M4IIeAcnfadrr_1WF z)&75h{ElW73bFzUl`fmRnyR3Y&Pmy6J!N-T_Om5?DPP8uvjsRI0zDofVDBO%>=L)T zoW!u|>T13tfQA8RzN^AMcWem=5i`JODyec7lcd^ZsdCa~Zjv+tv=R}0tJkpCFl(A5 zSwcJPC2mB>1rey?C}6g&n^00LBPbhT6~TXo4;6gq@7%rTt)PH( L8iV?R%KY))3;NTS literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/icon-32x32.png b/docs/_static/img/icons/icon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5f017088241f18001cc8e68ddec4063fcf5eda9d GIT binary patch literal 2850 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/ms-icon-310x310.png b/docs/_static/img/icons/ms-icon-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..f740c30071f815aa3bb3c33766fe4ac1b341055f GIT binary patch literal 39415 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 UKZcg$01F_TiS^kMV|>`Z0N+AwYybcN literal 0 HcmV?d00001 diff --git a/docs/_static/img/icons/ms-icon-70x70.png b/docs/_static/img/icons/ms-icon-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..a09239d8ba930d3b66fcd9153fafcd098541dfe4 GIT binary patch literal 6324 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 OfYg+<70VPXU;Piefbj$X literal 0 HcmV?d00001 From ac8ce1da791eaa5bcc8d1e701e0d36356cdd262e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Aug 2020 06:36:00 -0500 Subject: [PATCH 74/85] Add metadata for 192 android icon, MS icons --- docs/_templates/layout.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index e5e2180c..669538a2 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -27,7 +27,9 @@ + + @@ -35,5 +37,9 @@ + + + + {% endif -%} {% endblock %} From 8491e54abe4e254b2521dab8a16ea2a3cb58e260 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 16:36:37 -0500 Subject: [PATCH 75/85] build: Remove mkdocs packages --- poetry.lock | 309 +++++++------------------------------------------ pyproject.toml | 3 - 2 files changed, 39 insertions(+), 273 deletions(-) diff --git a/poetry.lock b/poetry.lock index a2a5ed68..31e1e196 100644 --- a/poetry.lock +++ b/poetry.lock @@ -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\" or sys_platform == \"win32\"" +marker = "python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -38,6 +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\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -52,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.*" @@ -138,7 +140,7 @@ version = "3.0.4" [[package]] category = "dev" description = "Composable command line interface toolkit" -marker = "python_version >= \"3.5\" or python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "click" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -196,7 +198,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\"" +marker = "python_version < \"3\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -321,7 +323,7 @@ version = "3.2.3-2" [[package]] category = "dev" description = "Clean single-source support for Python 3 and 2" -marker = "python_version < \"3\" or python_version >= \"3.5\"" +marker = "python_version < \"3\"" name = "future" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -347,6 +349,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.*" @@ -355,7 +358,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -383,6 +386,7 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" +marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" @@ -419,7 +423,7 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.2.2" +version = "5.3.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -441,6 +445,7 @@ dev = ["testpath"] [[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.*" @@ -452,31 +457,13 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] -[[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version >= \"3.5\"" -name = "joblib" -optional = false -python-versions = "*" -version = "0.14.1" - -[[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version >= \"3.5\"" -name = "joblib" -optional = false -python-versions = ">=3.6" -version = "0.16.0" - [[package]] category = "dev" description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "21.2.1" +version = "21.3.0" [package.dependencies] SecretStorage = ">=3" @@ -489,65 +476,12 @@ version = "*" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov"] - -[[package]] -category = "dev" -description = "Python LiveReload is an awesome tool for web developers" -marker = "python_version >= \"3.5\"" -name = "livereload" -optional = false -python-versions = "*" -version = "2.6.2" - -[package.dependencies] -six = "*" - -[package.dependencies.tornado] -python = ">=2.8" -version = "*" - -[[package]] -category = "dev" -description = "A Python implementation of Lunr.js" -marker = "python_version >= \"3.5\"" -name = "lunr" -optional = false -python-versions = "*" -version = "0.5.8" - -[package.dependencies] -future = ">=0.16.0" -six = ">=1.11.0" - -[package.dependencies.nltk] -optional = true -python = ">=2.8" -version = ">=3.2.5" - -[package.extras] -languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] - -[[package]] -category = "dev" -description = "Python implementation of Markdown." -marker = "python_version >= \"3.5\"" -name = "markdown" -optional = false -python-versions = ">=3.5" -version = "3.2.2" - -[package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - -[package.extras] -testing = ["coverage", "pyyaml"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy"] [[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.*" @@ -561,68 +495,6 @@ optional = false python-versions = "*" version = "0.6.1" -[[package]] -category = "dev" -description = "Fork of mkapi since poetry fails with git + python verson constraint" -marker = "python_version >= \"3.7\"" -name = "mkapi-git-pull" -optional = false -python-versions = ">=3.7" -version = "1.0.12.post1" - -[package.dependencies] -jinja2 = "*" -markdown = "*" - -[[package]] -category = "dev" -description = "Project documentation with Markdown." -marker = "python_version >= \"3.5\"" -name = "mkdocs" -optional = false -python-versions = ">=3.5" -version = "1.1.2" - -[package.dependencies] -Jinja2 = ">=2.10.1" -Markdown = ">=3.2.1" -PyYAML = ">=3.10" -click = ">=3.3" -livereload = ">=2.5.1" -tornado = ">=5.0" - -[package.dependencies.lunr] -extras = ["languages"] -version = "0.5.8" - -[[package]] -category = "dev" -description = "A Material Design theme for MkDocs" -marker = "python_version >= \"3.5\"" -name = "mkdocs-material" -optional = false -python-versions = "*" -version = "5.5.1" - -[package.dependencies] -Pygments = ">=2.4" -markdown = ">=3.2" -mkdocs = ">=1.1" -mkdocs-material-extensions = ">=1.0" -pymdown-extensions = ">=7.0" - -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.5\"" -name = "mkdocs-material-extensions" -optional = false -python-versions = ">=3.5" -version = "1.0" - -[package.dependencies] -mkdocs-material = ">=5.0.0" - [[package]] category = "dev" description = "Rolling backport of unittest.mock for all Pythons" @@ -659,34 +531,12 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" version = "8.4.0" -[[package]] -category = "dev" -description = "Natural Language Toolkit" -marker = "python_version >= \"3.5\"" -name = "nltk" -optional = false -python-versions = "*" -version = "3.5" - -[package.dependencies] -click = "*" -joblib = "*" -regex = "*" -tqdm = "*" - -[package.extras] -all = ["requests", "numpy", "python-crfsuite", "scikit-learn", "twython", "pyparsing", "scipy", "matplotlib", "gensim"] -corenlp = ["requests"] -machine_learning = ["gensim", "numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - [[package]] category = "dev" description = "Core utilities for Python packages" @@ -718,7 +568,7 @@ version = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -758,6 +608,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -774,6 +625,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -820,21 +672,10 @@ optional = false python-versions = ">=3.5" version = "2.6.1" -[[package]] -category = "dev" -description = "Extension pack for Python Markdown." -marker = "python_version >= \"3.5\"" -name = "pymdown-extensions" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "7.1" - -[package.dependencies] -Markdown = ">=3.2" - [[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.*" @@ -1004,6 +845,7 @@ 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 = "*" @@ -1018,15 +860,6 @@ optional = false python-versions = "*" version = "0.2.0" -[[package]] -category = "dev" -description = "YAML parser and emitter for Python" -marker = "python_version >= \"3.5\"" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" - [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -1060,7 +893,7 @@ sphinx = ">=1.3.1" [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.5\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -1150,6 +983,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 = "*" @@ -1237,6 +1071,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" @@ -1249,6 +1084,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" @@ -1261,6 +1097,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" @@ -1273,6 +1110,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" @@ -1284,6 +1122,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" @@ -1296,6 +1135,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" @@ -1347,27 +1187,19 @@ version = ">=1.7.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\"" name = "toml" optional = false python-versions = "*" version = "0.10.1" -[[package]] -category = "dev" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -marker = "python_version >= \"3.5\"" -name = "tornado" -optional = false -python-versions = ">= 3.5" -version = "6.0.4" - [[package]] category = "dev" description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.48.0" +version = "4.48.2" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] @@ -1471,7 +1303,7 @@ 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.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" +marker = "python_version < \"3\" or python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1489,7 +1321,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[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.5\" and python_version < \"3.8\" or python_version >= \"3.7\" 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\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.5\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\") or python_version >= \"3.7\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version >= \"3.7\" and python_version < \"3.8\")" +marker = "python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1500,7 +1332,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "c74072b3a36e4fd679cc7f06849c5dae59e45d61a923b9d1bf7a85c787b5b882" +content-hash = "3d2f04efaebe566ff321fd20eca45353b2b93cf80b2c65fa9f99f857328c5e0c" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1712,8 +1544,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.0-py3-none-any.whl", hash = "sha256:723de131d9ae9d2561844f0ee525ce33a396a11bcda57174f036ed5ab3d6a122"}, + {file = "isort-5.3.0.tar.gz", hash = "sha256:cdca22530d093ed16983ba52c41560fa0219d1b958e44fd2ae2995dcc7b785be"}, ] jeepney = [ {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, @@ -1723,26 +1555,9 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] -joblib = [ - {file = "joblib-0.14.1-py2.py3-none-any.whl", hash = "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"}, - {file = "joblib-0.14.1.tar.gz", hash = "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8"}, - {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, - {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, -] keyring = [ - {file = "keyring-21.2.1-py3-none-any.whl", hash = "sha256:3401234209015144a5d75701e71cb47239e552b0882313e9f51e8976f9e27843"}, - {file = "keyring-21.2.1.tar.gz", hash = "sha256:c53e0e5ccde3ad34284a40ce7976b5b3a3d6de70344c3f8ee44364cc340976ec"}, -] -livereload = [ - {file = "livereload-2.6.2.tar.gz", hash = "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"}, -] -lunr = [ - {file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"}, - {file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"}, -] -markdown = [ - {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, - {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, + {file = "keyring-21.3.0-py3-none-any.whl", hash = "sha256:e7a17caf40c40b6bb8c4772224a487e4a63013560ed0c521065aeba7ecd42182"}, + {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1783,21 +1598,6 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mkapi-git-pull = [ - {file = "mkapi-git-pull-1.0.12.post1.tar.gz", hash = "sha256:eba245518808a67ba0e6068269d68224ccff324460ecf179cacae8c2122c3ef4"}, -] -mkdocs = [ - {file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"}, - {file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"}, -] -mkdocs-material = [ - {file = "mkdocs-material-5.5.1.tar.gz", hash = "sha256:7a0dd451523008d0670f8f78037822f86f868f08c0532b1add4367252bb54133"}, - {file = "mkdocs_material-5.5.1-py2.py3-none-any.whl", hash = "sha256:aee5689f87d687c75962da9d4f07eef48664c22c176b6514bd18e4798ac2ca4f"}, -] -mkdocs-material-extensions = [ - {file = "mkdocs-material-extensions-1.0.tar.gz", hash = "sha256:17d7491e189af75700310b7ec33c6c48a22060b8b445001deca040cb60471cde"}, - {file = "mkdocs_material_extensions-1.0-py3-none-any.whl", hash = "sha256:09569c3694b5acc1e8334c9730e52b4bcde65fc9d613cc20e49af131ef1a9ca0"}, -] mock = [ {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, @@ -1809,9 +1609,6 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] -nltk = [ - {file = "nltk-3.5.zip", hash = "sha256:845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35"}, -] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1860,10 +1657,6 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] -pymdown-extensions = [ - {file = "pymdown-extensions-7.1.tar.gz", hash = "sha256:5bf93d1ccd8281948cd7c559eb363e59b179b5373478e8a7195cf4b78e3c11b6"}, - {file = "pymdown_extensions-7.1-py2.py3-none-any.whl", hash = "sha256:8f415b21ee86d80bb2c3676f4478b274d0a8ccb13af672a4c86b9ffd22bd005c"}, -] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1900,19 +1693,6 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] -pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {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"}, @@ -2032,20 +1812,9 @@ toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] -tornado = [ - {file = "tornado-6.0.4-cp35-cp35m-win32.whl", hash = "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d"}, - {file = "tornado-6.0.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"}, - {file = "tornado-6.0.4-cp36-cp36m-win32.whl", hash = "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673"}, - {file = "tornado-6.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a"}, - {file = "tornado-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6"}, - {file = "tornado-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b"}, - {file = "tornado-6.0.4-cp38-cp38-win32.whl", hash = "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52"}, - {file = "tornado-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9"}, - {file = "tornado-6.0.4.tar.gz", hash = "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc"}, -] tqdm = [ - {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"}, - {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"}, + {file = "tqdm-4.48.2-py2.py3-none-any.whl", hash = "sha256:1a336d2b829be50e46b84668691e0a2719f26c97c62846298dd5ae2937e4d5cf"}, + {file = "tqdm-4.48.2.tar.gz", hash = "sha256:564d632ea2b9cb52979f7956e093e831c28d441c11751682f84c86fc46e4fd21"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, diff --git a/pyproject.toml b/pyproject.toml index 64adddbd..f123143b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,4 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -mkdocs = {version = "^1.1.2", extras = ["docs"], python = ">=3.5"} -mkdocs-material = {version = "^5.5.1", extras = ["docs"], python = ">=3.5"} -mkapi-git-pull = {version = "^1.0.12", extras = ["docs"], python = ">=3.7"} recommonmark = "^0.6.0" From fa99a12de2200515a0be9bd2e1e7bc7930dc2d10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 16:37:14 -0500 Subject: [PATCH 76/85] build(pyproject): Remove mkdocs config --- pyproject.toml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f123143b..cc08ace0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,6 @@ [tool.black] skip-string-normalization = true -[tool.portray.mkdocs.theme] -favicon = "art/favicon.ico" -logo = "art/libvcs.svg" -name = "material" -palette = {primary = "blue grey", accent = "pink"} - [tool.poetry] name = "libvcs" version = "0.4.4" From e5f3be8ecf30b0ce4a55d812985e81d5f948d51a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 16:37:25 -0500 Subject: [PATCH 77/85] build(mkdocs): Remove more mkdocs config --- mkdocs.yml | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index c0d51356..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,27 +0,0 @@ -# mkdocs.yml -site_name: libvcs -site_url: https://libvcs.git-pull.com -repo_url: https://github.com/vcs-python/libvcs -repo_name: 'GitHub' -theme: - name: "material" - custom_dir: . - logo: assets/images/libvcs.svg - favicon: assets/images/favicon.ico - -extra_css: - - assets/css/custom.css - -markdown_extensions: - - admonition - - codehilite - -plugins: - - search - - mkapi - -nav: - - index.md - - history.md - - developing.md - - API: mkapi/api/libvcs From dabd2e70423295b7cddb9c9320088bde99bf0c9d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 16:40:38 -0500 Subject: [PATCH 78/85] build(sphinx): Rework sphinx packages to be optional + extra poetry add sphinx-issues --dev --extras docs --optional poetry add alagitpull --dev --extras docs --optional --allow-prereleases --- poetry.lock | 84 +++----------------------------------------------- pyproject.toml | 19 ++++++------ 2 files changed, 14 insertions(+), 89 deletions(-) diff --git a/poetry.lock b/poetry.lock index 31e1e196..b6f61a12 100644 --- a/poetry.lock +++ b/poetry.lock @@ -236,22 +236,6 @@ pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] -[[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" @@ -586,14 +570,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.8.0" -[[package]] -category = "dev" -description = "Python Build Reasonableness" -name = "pbr" -optional = false -python-versions = "*" -version = "5.4.5" - [[package]] category = "dev" description = "Query metadatdata from sdists / bdists / installed packages." @@ -928,17 +904,6 @@ 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 = "Validating URI References per RFC 3986" @@ -1157,33 +1122,6 @@ 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 = "Manage dynamic plugins for Python applications" -name = "stevedore" -optional = false -python-versions = ">=3.6" -version = "3.2.0" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=1.7.0" - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1331,8 +1269,11 @@ version = "3.1.0" docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] +[extras] +docs = [] + [metadata] -content-hash = "3d2f04efaebe566ff321fd20eca45353b2b93cf80b2c65fa9f99f857328c5e0c" +content-hash = "a2e8de7dac106ab0c84f0a8f04568daa78a8c9abd941542b38c8fbc3b8f60bab" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1493,10 +1434,6 @@ cryptography = [ {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, ] -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"}, @@ -1623,10 +1560,6 @@ pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, ] -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"}, @@ -1732,9 +1665,6 @@ 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"}, -] rfc3986 = [ {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, @@ -1802,12 +1732,6 @@ 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"}, - {file = "stevedore-3.2.0-py3-none-any.whl", hash = "sha256:c8f4f0ebbc394e52ddf49de8bcc3cf8ad2b4425ebac494106bbc5e3661ac7633"}, - {file = "stevedore-3.2.0.tar.gz", hash = "sha256:38791aa5bed922b0a844513c5f9ed37774b68edc609e5ab8ab8d8fe0ce4315e5"}, -] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, diff --git a/pyproject.toml b/pyproject.toml index cc08ace0..ced54b5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,10 +12,7 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -alagitpull = {version="*", allow-prereleases=true} black = {version="==19.10b0", python="^3.6"} -doc8 = "*" -docutils = "*" flake8 = "*" isort = [ {version="<5", python="<3.6"}, @@ -27,11 +24,6 @@ pytest = [ ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" -sphinx = [ - {version="<2", python="<3"}, - {version="*", python=">=3"} -] -sphinx-issues = "*" twine = "*" codecov = "*" coverage = "*" @@ -43,4 +35,13 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -recommonmark = "^0.6.0" +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} +] +recommonmark = {version = "^0.6.0"} +alagitpull = {version = "^0.0.25-rc.2", allow-prereleases = true} +sphinx-issues = {version = "^1.2.0"} + +[tool.poetry.extras] +docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull"] From c4fe90906d5b6fc65f383c817693ceb4cc1c26bb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 16:42:34 -0500 Subject: [PATCH 79/85] ci(publish-docs): Install docs via --extras docs --- .github/workflows/publish-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index ff553da4..94826c76 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -60,8 +60,8 @@ jobs: shell: bash run: poetry run python -m pip install pip -U - - name: Install dependencies - run: poetry install + - name: Install dependencies [w/ docs] + run: poetry install -E docs - name: Build documentation run: | From 94f78539d91dc48ae2e34c5f8d2512b23aafc03b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 17:01:44 -0500 Subject: [PATCH 80/85] build(poetry): Organize more packages to use extras --- poetry.lock | 15 ++++++++++----- pyproject.toml | 48 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index b6f61a12..bf521d12 100644 --- a/poetry.lock +++ b/poetry.lock @@ -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.*" @@ -1125,7 +1125,7 @@ test = ["pytest", "mock"] [[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 = "*" @@ -1241,7 +1241,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3\" 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" @@ -1270,10 +1270,15 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [extras] +coverage = [] +deploy = [] docs = [] +format = [] +lint = [] +test = [] [metadata] -content-hash = "a2e8de7dac106ab0c84f0a8f04568daa78a8c9abd941542b38c8fbc3b8f60bab" +content-hash = "b23cfef0071a7d17f6449adf4f9001b8460769070cf1b96aaafb9941875c6325" lock-version = "1.0" python-versions = "~2.7 || ^3.5" diff --git a/pyproject.toml b/pyproject.toml index ced54b5c..0f9ae7c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,36 +12,52 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -black = {version="==19.10b0", python="^3.6"} -flake8 = "*" -isort = [ - {version="<5", python="<3.6"}, - {version="*", python=">=3.6"} +### Docs ### +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} ] +recommonmark = {version = "^0.6.0"} +alagitpull = {version = "^0.0.25-rc.2", allow-prereleases = true} +sphinx-issues = {version = "^1.2.0"} + +### Testing ### pytest = [ {version="<4.7.0", python="<3"}, {version="*", python=">=3"} ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" -twine = "*" +pytest-mock = [ + {version="<3.0.0", python="<3"}, + {version="*", python=">=3"} +] + +### Coverage ### codecov = "*" coverage = "*" pytest-cov = [ {version="<2.10.0", python="<3"}, {version="*", python=">=3"} ] -pytest-mock = [ - {version="<3.0.0", python="<3"}, - {version="*", python=">=3"} -] -sphinx = [ - {version="<2", python="<3"}, - {version="*", python=">=3"} + +### Format ### +black = {version="==19.10b0", python="^3.6"} +isort = [ + {version="<5", python="<3.6"}, + {version="*", python=">=3.6"} ] -recommonmark = {version = "^0.6.0"} -alagitpull = {version = "^0.0.25-rc.2", allow-prereleases = true} -sphinx-issues = {version = "^1.2.0"} + +### Lint ### +flake8 = "*" + +### Deploy ### +twine = "*" [tool.poetry.extras] docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull"] +test = ["pytest", "pathlib2", "pytest-rerunfailures", "pytest-mock"] +coverage = ["codecov", "coverage", "pytest-cov"] +format = ["black", "isort"] +lint = ["flake8"] +deploy = ["deploy"] From ef158c9cf2912bf0f284987bc8fd12362224851a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 17:02:00 -0500 Subject: [PATCH 81/85] ci(publish-docs): Use extras packages --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 94826c76..1d9eff42 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -61,7 +61,7 @@ jobs: run: poetry run python -m pip install pip -U - name: Install dependencies [w/ docs] - run: poetry install -E docs + run: poetry install --extras "docs lint" - name: Build documentation run: | From 4c849c27e141cd0432416cb0f253a24b0b9d7ee8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 17:02:34 -0500 Subject: [PATCH 82/85] ci(libvcs-ci): Install --extras packages --- .github/workflows/libvcs-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/libvcs-ci.yml b/.github/workflows/libvcs-ci.yml index c87baa1a..3b7d5675 100644 --- a/.github/workflows/libvcs-ci.yml +++ b/.github/workflows/libvcs-ci.yml @@ -61,7 +61,7 @@ jobs: run: poetry run python -m pip install pip -U - name: Install dependencies - run: poetry install + run: poetry install -E "docs test coverage lint format deploy" - name: Lint with flake8 run: poetry run flake8 From 0f4d80e9267f363bebb6cfe3ce6912c04fa4dc75 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 17:09:38 -0500 Subject: [PATCH 83/85] docs: Update CHANGES for doc restructure --- CHANGES | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGES b/CHANGES index 8ad84925..ef7e398d 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,17 @@ Generally speaking, refactor / magic is in the process of being stripped out in the next few releases. The API is subject to change significantly in pre-1.0 builds. +- [refactor] [#267](https://github.com/vcs-python/libvcs/pull/267) overhaul docs + + - Move sphinx api format to Numpy-style + + - Move from reStructuredText to Markdown (via recommonmark). The master plan is to eliminate + docutils and sphinx as a bottleneck completely in favor of something else (e.g. gatsby with + a source that inspects our modules and can source intersphinx) + + - Move from RTD to GitHub Action, full support of poetry extras packages, deploys straight to + S3 and CloudFront + ## libvcs 0.4.4 (2020-08-05) - `268` `libvcs.base.BaseRepo`: From 83623824ec4ea63f39c1105ded24cbb171deda89 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 19:15:20 -0500 Subject: [PATCH 84/85] build(gatsby): Add astroid and sphinx-autoapi --- poetry.lock | 133 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 5 ++ 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index bf521d12..90409e4c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -26,6 +26,24 @@ optional = false python-versions = "*" version = "1.4.4" +[[package]] +category = "dev" +description = "An abstract syntax tree for Python with inference support." +marker = "python_version >= \"3.6\"" +name = "astroid" +optional = false +python-versions = ">=3.5" +version = "2.4.2" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0,<1.5.0" +six = ">=1.12,<2.0" +wrapt = ">=1.11,<2.0" + +[package.dependencies.typed-ast] +python = "<3.8" +version = ">=1.4.0,<1.5" + [[package]] category = "dev" description = "Atomic file writes." @@ -462,6 +480,15 @@ version = "*" docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy"] +[[package]] +category = "dev" +description = "A fast and thorough lazy object proxy." +marker = "python_version >= \"3.6\"" +name = "lazy-object-proxy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.3" + [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -836,6 +863,15 @@ optional = false python-versions = "*" version = "0.2.0" +[[package]] +category = "dev" +description = "YAML parser and emitter for Python" +marker = "python_version >= \"3.6\"" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -1017,6 +1053,29 @@ 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 API documentation generator" +marker = "python_version >= \"3.6\"" +name = "sphinx-autoapi" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +version = "1.4.0" + +[package.dependencies] +Jinja2 = "*" +PyYAML = "*" +sphinx = ">=1.6" +unidecode = "*" + +[package.dependencies.astroid] +python = ">=3" +version = "*" + +[package.extras] +dotnet = ["sphinxcontrib-dotnetdomain"] +go = ["sphinxcontrib-golangdomain"] + [[package]] category = "dev" description = "A Sphinx extension for linking to your project's issue tracker" @@ -1188,7 +1247,7 @@ version = "*" [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or implementation_name == \"cpython\" and python_version < \"3.8\" and python_version >= \"3.6\"" name = "typed-ast" optional = false python-versions = "*" @@ -1203,6 +1262,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "3.7.4.3" +[[package]] +category = "dev" +description = "ASCII transliterations of Unicode text" +marker = "python_version >= \"3.6\"" +name = "unidecode" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.1.1" + [[package]] category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." @@ -1238,6 +1306,15 @@ optional = false python-versions = "*" version = "0.5.1" +[[package]] +category = "dev" +description = "Module for decorators, wrappers and monkey patching." +marker = "python_version >= \"3.6\"" +name = "wrapt" +optional = false +python-versions = "*" +version = "1.12.1" + [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" @@ -1274,11 +1351,12 @@ coverage = [] deploy = [] docs = [] format = [] +gatsby = [] lint = [] test = [] [metadata] -content-hash = "b23cfef0071a7d17f6449adf4f9001b8460769070cf1b96aaafb9941875c6325" +content-hash = "11a274cdadaf48d8bf54b3af356488e71e3b370fc8948c92690ae0a367f78bde" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1295,6 +1373,10 @@ appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] +astroid = [ + {file = "astroid-2.4.2-py3-none-any.whl", hash = "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386"}, + {file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1501,6 +1583,29 @@ keyring = [ {file = "keyring-21.3.0-py3-none-any.whl", hash = "sha256:e7a17caf40c40b6bb8c4772224a487e4a63013560ed0c521065aeba7ecd42182"}, {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, ] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win32.whl", hash = "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a"}, + {file = "lazy_object_proxy-1.4.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win32.whl", hash = "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e"}, + {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win_amd64.whl", hash = "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db"}, + {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531"}, + {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142"}, + {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"}, + {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"}, +] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, @@ -1631,6 +1736,19 @@ pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {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"}, @@ -1705,6 +1823,10 @@ sphinx = [ {file = "Sphinx-3.1.2-py3-none-any.whl", hash = "sha256:97dbf2e31fc5684bb805104b8ad34434ed70e6c588f6896991b2fdfd2bef8c00"}, {file = "Sphinx-3.1.2.tar.gz", hash = "sha256:b9daeb9b39aa1ffefc2809b43604109825300300b987a24f45976c001ba1a8fd"}, ] +sphinx-autoapi = [ + {file = "sphinx-autoapi-1.4.0.tar.gz", hash = "sha256:f76ef71d443c6a9ad5e1b326d4dfc196e2080e8b46141c45d1bb47a73a34f190"}, + {file = "sphinx_autoapi-1.4.0-py2.py3-none-any.whl", hash = "sha256:eb86024fb04f6f1c61d8be73f56db40bf730a932cf0c8d0456a43bae4c11b508"}, +] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, @@ -1778,6 +1900,10 @@ typing = [ {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] +unidecode = [ + {file = "Unidecode-1.1.1-py2.py3-none-any.whl", hash = "sha256:1d7a042116536098d05d599ef2b8616759f02985c85b4fef50c78a5aaf10822a"}, + {file = "Unidecode-1.1.1.tar.gz", hash = "sha256:2b6aab710c2a1647e928e36d69c21e76b453cd455f4e2621000e54b2a9b8cce8"}, +] urllib3 = [ {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, @@ -1790,6 +1916,9 @@ webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, diff --git a/pyproject.toml b/pyproject.toml index 0f9ae7c1..7151f6c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,10 @@ flake8 = "*" ### Deploy ### twine = "*" +### Gatsby Source ### +sphinx-autoapi = {version = "^1.4.0", python = ">=3.6"} +astroid = {version = "^2.4.2", python = ">=3.6"} + [tool.poetry.extras] docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull"] test = ["pytest", "pathlib2", "pytest-rerunfailures", "pytest-mock"] @@ -61,3 +65,4 @@ coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] deploy = ["deploy"] +gatsby = ["astroid", "sphinx-autoapi"] From 03a32e068cf0a5175be5a79f8ff1b8e3d6698447 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Aug 2020 20:01:51 -0500 Subject: [PATCH 85/85] build(sphobjinv): For parsing object.inv (intersphinx) from other projects See also: https://github.com/bskinn/sphobjinv --- poetry.lock | 87 +++++++++++++++++++++++++++++++++++++++++++++++--- pyproject.toml | 3 +- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 90409e4c..84d1d091 100644 --- a/poetry.lock +++ b/poetry.lock @@ -56,7 +56,7 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" +marker = "python_version >= \"3\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -340,6 +340,18 @@ optional = false python-versions = ">=2.6, <3" version = "3.3.0" +[[package]] +category = "dev" +description = "Fuzzy string matching in python" +marker = "python_version >= \"3.5\"" +name = "fuzzywuzzy" +optional = false +python-versions = "*" +version = "0.18.0" + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + [[package]] category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" @@ -360,7 +372,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -459,6 +471,29 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "An implementation of JSON Schema validation for Python" +marker = "python_version >= \"3.5\"" +name = "jsonschema" +optional = false +python-versions = "*" +version = "3.2.0" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + [[package]] category = "dev" description = "Store and access your passwords safely." @@ -684,6 +719,18 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" +[[package]] +category = "dev" +description = "Persistent/Functional/Immutable data structures" +marker = "python_version >= \"3.5\"" +name = "pyrsistent" +optional = false +python-versions = "*" +version = "0.16.0" + +[package.dependencies] +six = "*" + [[package]] category = "dev" description = "pytest: simple powerful testing with Python" @@ -1181,6 +1228,21 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] +[[package]] +category = "dev" +description = "Sphinx objects.inv Inspection/Manipulation Tool" +marker = "python_version >= \"3.5\"" +name = "sphobjinv" +optional = false +python-versions = ">=3.5" +version = "2.0.1" + +[package.dependencies] +attrs = ">=17.4" +certifi = "*" +fuzzywuzzy = ">=0.3" +jsonschema = ">=2.0" + [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1318,7 +1380,7 @@ version = "1.12.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1336,7 +1398,7 @@ 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\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3.5\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1356,7 +1418,7 @@ lint = [] test = [] [metadata] -content-hash = "11a274cdadaf48d8bf54b3af356488e71e3b370fc8948c92690ae0a367f78bde" +content-hash = "9c93f719e790564725fcf1c27b84074955e13ac270a6c12cadfaae9562ba503e" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1549,6 +1611,10 @@ futures = [ {file = "futures-3.3.0-py2-none-any.whl", hash = "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16"}, {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, ] +fuzzywuzzy = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, @@ -1579,6 +1645,10 @@ jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] keyring = [ {file = "keyring-21.3.0-py3-none-any.whl", hash = "sha256:e7a17caf40c40b6bb8c4772224a487e4a63013560ed0c521065aeba7ecd42182"}, {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, @@ -1704,6 +1774,9 @@ pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] +pyrsistent = [ + {file = "pyrsistent-0.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, +] pytest = [ {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, @@ -1859,6 +1932,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"}, ] +sphobjinv = [ + {file = "sphobjinv-2.0.1-py3-none-any.whl", hash = "sha256:57fcf0672882ce542ce4c6773416c804eeb31c99e5bb83599a12032bd053cad9"}, + {file = "sphobjinv-2.0.1.tar.gz", hash = "sha256:fde7fc6391bb7b8dd274e0af0bd254ef0043c9552294c8dcf08a24464a7dd488"}, +] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, diff --git a/pyproject.toml b/pyproject.toml index 7151f6c1..b4c2862f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,6 +57,7 @@ twine = "*" ### Gatsby Source ### sphinx-autoapi = {version = "^1.4.0", python = ">=3.6"} astroid = {version = "^2.4.2", python = ">=3.6"} +sphobjinv = {version = "^2.0.1", python = ">=3.5"} [tool.poetry.extras] docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull"] @@ -65,4 +66,4 @@ coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] deploy = ["deploy"] -gatsby = ["astroid", "sphinx-autoapi"] +gatsby = ["astroid", "sphinx-autoapi", "sphobjinv"]